Merge "Fix stale background blur drawable in DecorView" into sc-dev
diff --git a/Android.bp b/Android.bp
index 7b30056..955cfab 100644
--- a/Android.bp
+++ b/Android.bp
@@ -150,7 +150,6 @@
":incidentcompanion_aidl",
":inputconstants_aidl",
":installd_aidl",
- ":keystore_aidl",
":libaudioclient_aidl",
":libbinder_aidl",
":libbluetooth-binder-aidl",
diff --git a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
index d5ed95f..90dca25 100644
--- a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
+++ b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt
@@ -159,7 +159,15 @@
PARALLEL_MAX_THREADS, "package-parsing-test",
Process.THREAD_PRIORITY_FOREGROUND)
- fun submit(file: File) = service.submit { queue.put(parse(file)) }
+ fun submit(file: File) {
+ service.submit {
+ try {
+ queue.put(parse(file))
+ } catch (e: Exception) {
+ queue.put(e)
+ }
+ }
+ }
fun take() = queue.poll(QUEUE_POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS)
diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
index cb1fccf..d459c05 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
@@ -183,6 +183,10 @@
public static final int REASON_APPOP = 66;
/** @hide */
public static final int REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD = 67;
+ /** @hide */
+ public static final int REASON_OP_ACTIVATE_VPN = 68;
+ /** @hide */
+ public static final int REASON_OP_ACTIVATE_PLATFORM_VPN = 69;
/* BG-FGS-launch is allowed by temp-allow-list or system-allow-list.
Reason code for temp and system allow list starts here.
@@ -344,6 +348,8 @@
REASON_ALLOWLISTED_PACKAGE,
REASON_APPOP,
REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD,
+ REASON_OP_ACTIVATE_VPN,
+ REASON_OP_ACTIVATE_PLATFORM_VPN,
// temp and system allow list reasons.
REASON_GEOFENCING,
REASON_PUSH_MESSAGING,
@@ -603,6 +609,10 @@
return "APPOP";
case REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD:
return "ACTIVITY_VISIBILITY_GRACE_PERIOD";
+ case REASON_OP_ACTIVATE_VPN:
+ return "OP_ACTIVATE_VPN";
+ case REASON_OP_ACTIVATE_PLATFORM_VPN:
+ return "OP_ACTIVATE_PLATFORM_VPN";
case REASON_GEOFENCING:
return "GEOFENCING";
case REASON_PUSH_MESSAGING:
diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp
index 3cf585e..7020f18 100644
--- a/apex/media/framework/Android.bp
+++ b/apex/media/framework/Android.bp
@@ -133,9 +133,6 @@
":updatable-media-srcs",
],
- api_lint: {
- enabled: false,
- },
impl_library_visibility: ["//frameworks/av/apex:__subpackages__"],
}
diff --git a/apex/media/framework/api/system-current.txt b/apex/media/framework/api/system-current.txt
index 8d83309..7df0b4b 100644
--- a/apex/media/framework/api/system-current.txt
+++ b/apex/media/framework/api/system-current.txt
@@ -60,8 +60,8 @@
method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest build();
method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setClientPid(int);
method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setClientUid(int);
- method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setDestinationFileDescriptor(android.os.ParcelFileDescriptor);
- method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setSourceFileDescriptor(android.os.ParcelFileDescriptor);
+ method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setDestinationFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
+ method @NonNull public android.media.MediaTranscodeManager.VideoTranscodingRequest.Builder setSourceFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
}
}
diff --git a/apex/media/framework/java/android/media/MediaTranscodeManager.java b/apex/media/framework/java/android/media/MediaTranscodeManager.java
index 775b0e5..a7de602 100644
--- a/apex/media/framework/java/android/media/MediaTranscodeManager.java
+++ b/apex/media/framework/java/android/media/MediaTranscodeManager.java
@@ -1207,14 +1207,14 @@
@Override
@NonNull
- public Builder setSourceFileDescriptor(ParcelFileDescriptor fd) {
+ public Builder setSourceFileDescriptor(@NonNull ParcelFileDescriptor fd) {
super.setSourceFileDescriptor(fd);
return self();
}
@Override
@NonNull
- public Builder setDestinationFileDescriptor(ParcelFileDescriptor fd) {
+ public Builder setDestinationFileDescriptor(@NonNull ParcelFileDescriptor fd) {
super.setDestinationFileDescriptor(fd);
return self();
}
diff --git a/boot/Android.bp b/boot/Android.bp
index 4f7c44e..71edea2 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -23,7 +23,24 @@
default_applicable_licenses: ["frameworks_base_license"],
}
-boot_image {
- name: "framework-boot-image",
- image_name: "boot",
+// This module provides access to information Soong has related to the
+// whole platform bootclasspath. Currently, that information is provided solely
+// through configuration but additional information will be added here.
+//
+// This will provide support for the following:
+// * Hidden API processing for those parts of the bootclasspath that are not
+// part of an APEX.
+// * Compatibility checking to ensure that the hidden API bits encoded into the
+// dex files by the modularized hidden API processing is compatible with the
+// runtimes of earlier releases which expect the bits to have been computed
+// over the entirety of the bootclasspath in one go not separately.
+// * Dexpreopting apps and other libraries not on the platform bootclasspath.
+// * Generating and installing the appropriate files to the device which will
+// allow it to generate the bootclasspath related environment variables
+// dynamically.
+//
+// This module needs to be present in the build for the above processing to be
+// done correctly.
+platform_bootclasspath {
+ name: "platform-bootclasspath",
}
diff --git a/config/hiddenapi-unsupported.txt b/config/hiddenapi-unsupported.txt
index 48aa8b2..4281b0d 100644
--- a/config/hiddenapi-unsupported.txt
+++ b/config/hiddenapi-unsupported.txt
@@ -208,7 +208,6 @@
Landroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager;
Landroid/security/IKeyChainService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/IKeyChainService;
-Landroid/security/keystore/IKeystoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/keystore/IKeystoreService;
Landroid/service/dreams/IDreamManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/dreams/IDreamManager;
Landroid/service/notification/INotificationListener$Stub;-><init>()V
Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService;
diff --git a/core/api/current.txt b/core/api/current.txt
index 89cf257..3d00bda 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -174,6 +174,7 @@
field public static final String USE_FULL_SCREEN_INTENT = "android.permission.USE_FULL_SCREEN_INTENT";
field public static final String USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER = "android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER";
field public static final String USE_SIP = "android.permission.USE_SIP";
+ field public static final String UWB_RANGING = "android.permission.UWB_RANGING";
field public static final String VIBRATE = "android.permission.VIBRATE";
field public static final String WAKE_LOCK = "android.permission.WAKE_LOCK";
field public static final String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS";
@@ -303,7 +304,7 @@
field public static final int allowAudioPlaybackCapture = 16844289; // 0x1010601
field public static final int allowBackup = 16843392; // 0x1010280
field public static final int allowClearUserData = 16842757; // 0x1010005
- field public static final int allowClickWhenDisabled = 16844312; // 0x1010618
+ field public static final int allowClickWhenDisabled;
field public static final int allowEmbedded = 16843765; // 0x10103f5
field public static final int allowNativeHeapPointerTagging = 16844306; // 0x1010612
field public static final int allowParallelSyncs = 16843570; // 0x1010332
@@ -334,7 +335,7 @@
field public static final int apiKey = 16843281; // 0x1010211
field public static final int appCategory = 16844101; // 0x1010545
field public static final int appComponentFactory = 16844154; // 0x101057a
- field public static final int attributionTags = 16844354; // 0x1010642
+ field public static final int attributionTags;
field public static final int author = 16843444; // 0x10102b4
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
@@ -400,7 +401,7 @@
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
field public static final int canControlMagnification = 16844039; // 0x1010507
- field public static final int canPauseRecording = 16844314; // 0x101061a
+ field public static final int canPauseRecording;
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
field @Deprecated public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
@@ -442,7 +443,7 @@
field public static final int clickable = 16842981; // 0x10100e5
field public static final int clipChildren = 16842986; // 0x10100ea
field public static final int clipOrientation = 16843274; // 0x101020a
- field public static final int clipToOutline = 16844328; // 0x1010628
+ field public static final int clipToOutline;
field public static final int clipToPadding = 16842987; // 0x10100eb
field public static final int closeIcon = 16843905; // 0x1010481
field @Deprecated public static final int codes = 16843330; // 0x1010242
@@ -512,7 +513,7 @@
field public static final int dashGap = 16843175; // 0x10101a7
field public static final int dashWidth = 16843174; // 0x10101a6
field public static final int data = 16842798; // 0x101002e
- field public static final int dataExtractionRules = 16844350; // 0x101063e
+ field public static final int dataExtractionRules;
field public static final int datePickerDialogTheme = 16843948; // 0x10104ac
field public static final int datePickerMode = 16843955; // 0x10104b3
field public static final int datePickerStyle = 16843612; // 0x101035c
@@ -534,8 +535,8 @@
field public static final int detailSocialSummary = 16843428; // 0x10102a4
field public static final int detailsElementBackground = 16843598; // 0x101034e
field public static final int dial = 16843010; // 0x1010102
- field public static final int dialTint = 16844342; // 0x1010636
- field public static final int dialTintMode = 16844343; // 0x1010637
+ field public static final int dialTint;
+ field public static final int dialTintMode;
field public static final int dialogCornerRadius = 16844145; // 0x1010571
field public static final int dialogIcon = 16843252; // 0x10101f4
field public static final int dialogLayout = 16843255; // 0x10101f7
@@ -583,7 +584,7 @@
field public static final int dropDownWidth = 16843362; // 0x1010262
field public static final int duplicateParentState = 16842985; // 0x10100e9
field public static final int duration = 16843160; // 0x1010198
- field public static final int edgeEffectType = 16844329; // 0x1010629
+ field public static final int edgeEffectType;
field public static final int editTextBackground = 16843602; // 0x1010352
field public static final int editTextColor = 16843601; // 0x1010351
field public static final int editTextPreferenceStyle = 16842898; // 0x1010092
@@ -669,7 +670,7 @@
field @Deprecated public static final int fontProviderCerts = 16844125; // 0x101055d
field @Deprecated public static final int fontProviderPackage = 16844119; // 0x1010557
field @Deprecated public static final int fontProviderQuery = 16844113; // 0x1010551
- field public static final int fontProviderSystemFontFamily = 16844322; // 0x1010622
+ field public static final int fontProviderSystemFontFamily;
field public static final int fontStyle = 16844095; // 0x101053f
field public static final int fontVariationSettings = 16844144; // 0x1010570
field public static final int fontWeight = 16844083; // 0x1010533
@@ -733,14 +734,14 @@
field public static final int groupIndicator = 16843019; // 0x101010b
field public static final int gwpAsanMode = 16844310; // 0x1010616
field public static final int hand_hour = 16843011; // 0x1010103
- field public static final int hand_hourTint = 16844344; // 0x1010638
- field public static final int hand_hourTintMode = 16844345; // 0x1010639
+ field public static final int hand_hourTint;
+ field public static final int hand_hourTintMode;
field public static final int hand_minute = 16843012; // 0x1010104
- field public static final int hand_minuteTint = 16844346; // 0x101063a
- field public static final int hand_minuteTintMode = 16844347; // 0x101063b
- field public static final int hand_second = 16844323; // 0x1010623
- field public static final int hand_secondTint = 16844348; // 0x101063c
- field public static final int hand_secondTintMode = 16844349; // 0x101063d
+ field public static final int hand_minuteTint;
+ field public static final int hand_minuteTintMode;
+ field public static final int hand_second;
+ field public static final int hand_secondTint;
+ field public static final int hand_secondTintMode;
field public static final int handle = 16843354; // 0x101025a
field public static final int handleProfiling = 16842786; // 0x1010022
field public static final int hapticFeedbackEnabled = 16843358; // 0x101025e
@@ -824,7 +825,7 @@
field public static final int installLocation = 16843447; // 0x10102b7
field public static final int interactiveUiTimeout = 16844181; // 0x1010595
field public static final int interpolator = 16843073; // 0x1010141
- field public static final int isAccessibilityTool = 16844353; // 0x1010641
+ field public static final int isAccessibilityTool;
field public static final int isAlwaysSyncable = 16843571; // 0x1010333
field public static final int isAsciiCapable = 16843753; // 0x10103e9
field public static final int isAuxiliary = 16843647; // 0x101037f
@@ -866,8 +867,8 @@
field public static final int keyboardNavigationCluster = 16844096; // 0x1010540
field public static final int keycode = 16842949; // 0x10100c5
field public static final int killAfterRestore = 16843420; // 0x101029c
- field public static final int knownCerts = 16844330; // 0x101062a
- field public static final int lStar = 16844359; // 0x1010647
+ field public static final int knownCerts;
+ field public static final int lStar;
field public static final int label = 16842753; // 0x1010001
field public static final int labelFor = 16843718; // 0x10103c6
field @Deprecated public static final int labelTextSize = 16843317; // 0x1010235
@@ -977,8 +978,8 @@
field public static final int maxLines = 16843091; // 0x1010153
field public static final int maxLongVersionCode = 16844163; // 0x1010583
field public static final int maxRecents = 16843846; // 0x1010446
- field public static final int maxResizeHeight = 16844339; // 0x1010633
- field public static final int maxResizeWidth = 16844338; // 0x1010632
+ field public static final int maxResizeHeight;
+ field public static final int maxResizeWidth;
field public static final int maxRows = 16843059; // 0x1010133
field public static final int maxSdkVersion = 16843377; // 0x1010271
field public static final int maxWidth = 16843039; // 0x101011f
@@ -987,7 +988,7 @@
field public static final int measureWithLargestChild = 16843476; // 0x10102d4
field public static final int mediaRouteButtonStyle = 16843693; // 0x10103ad
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
- field public static final int memtagMode = 16844324; // 0x1010624
+ field public static final int memtagMode;
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeGroup = 16844309; // 0x1010615
field public static final int mimeType = 16842790; // 0x1010026
@@ -1011,7 +1012,7 @@
field public static final int multiArch = 16843918; // 0x101048e
field public static final int multiprocess = 16842771; // 0x1010013
field public static final int name = 16842755; // 0x1010003
- field public static final int nativeHeapZeroInitialized = 16844325; // 0x1010625
+ field public static final int nativeHeapZeroInitialized;
field public static final int navigationBarColor = 16843858; // 0x1010452
field public static final int navigationBarDividerColor = 16844141; // 0x101056d
field public static final int navigationContentDescription = 16843969; // 0x10104c1
@@ -1081,13 +1082,13 @@
field public static final int panelTextAppearance = 16842850; // 0x1010062
field public static final int parentActivityName = 16843687; // 0x10103a7
field @Deprecated public static final int password = 16843100; // 0x101015c
- field public static final int passwordsActivity = 16844351; // 0x101063f
+ field public static final int passwordsActivity;
field public static final int path = 16842794; // 0x101002a
- field public static final int pathAdvancedPattern = 16844320; // 0x1010620
+ field public static final int pathAdvancedPattern;
field public static final int pathData = 16843781; // 0x1010405
field public static final int pathPattern = 16842796; // 0x101002c
field public static final int pathPrefix = 16842795; // 0x101002b
- field public static final int pathSuffix = 16844318; // 0x101061e
+ field public static final int pathSuffix;
field public static final int patternPathData = 16843978; // 0x10104ca
field public static final int permission = 16842758; // 0x1010006
field public static final int permissionFlags = 16843719; // 0x10103c7
@@ -1124,7 +1125,7 @@
field public static final int presentationTheme = 16843712; // 0x10103c0
field public static final int preserveLegacyExternalStorage = 16844308; // 0x1010614
field public static final int previewImage = 16843482; // 0x10102da
- field public static final int previewLayout = 16844327; // 0x1010627
+ field public static final int previewLayout;
field public static final int primaryContentAlpha = 16844114; // 0x1010552
field public static final int priority = 16842780; // 0x101001c
field public static final int privateImeOptions = 16843299; // 0x1010223
@@ -1181,8 +1182,8 @@
field public static final int reqNavigation = 16843306; // 0x101022a
field public static final int reqTouchScreen = 16843303; // 0x1010227
field public static final int requestLegacyExternalStorage = 16844291; // 0x1010603
- field public static final int requestOptimizedExternalStorageAccess = 16844357; // 0x1010645
- field public static final int requireDeviceScreenOn = 16844317; // 0x101061d
+ field public static final int requestOptimizedExternalStorageAccess;
+ field public static final int requireDeviceScreenOn;
field public static final int requireDeviceUnlock = 16843756; // 0x10103ec
field public static final int required = 16843406; // 0x101028e
field public static final int requiredAccountType = 16843734; // 0x10103d6
@@ -1207,7 +1208,7 @@
field public static final int right = 16843183; // 0x10101af
field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
field public static final int ringtoneType = 16843257; // 0x10101f9
- field public static final int rollbackDataPolicy = 16844311; // 0x1010617
+ field public static final int rollbackDataPolicy;
field public static final int rotation = 16843558; // 0x1010326
field public static final int rotationAnimation = 16844090; // 0x101053a
field public static final int rotationX = 16843559; // 0x1010327
@@ -1268,7 +1269,7 @@
field public static final int segmentedButtonStyle = 16843568; // 0x1010330
field public static final int selectAllOnFocus = 16843102; // 0x101015e
field public static final int selectable = 16843238; // 0x10101e6
- field public static final int selectableAsDefault = 16844352; // 0x1010640
+ field public static final int selectableAsDefault;
field public static final int selectableItemBackground = 16843534; // 0x101030e
field public static final int selectableItemBackgroundBorderless = 16843868; // 0x101045c
field @Deprecated public static final int selectedDateVerticalBar = 16843591; // 0x1010347
@@ -1296,7 +1297,7 @@
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showForAllUsers = 16844015; // 0x10104ef
- field public static final int showInInputMethodPicker = 16844361; // 0x1010649
+ field public static final int showInInputMethodPicker;
field public static final int showMetadataInPreview = 16844079; // 0x101052f
field @Deprecated public static final int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
@@ -1319,17 +1320,17 @@
field public static final int spinnerMode = 16843505; // 0x10102f1
field public static final int spinnerStyle = 16842881; // 0x1010081
field public static final int spinnersShown = 16843595; // 0x101034b
- field public static final int splashScreenTheme = 16844337; // 0x1010631
+ field public static final int splashScreenTheme;
field public static final int splitMotionEvents = 16843503; // 0x10102ef
field public static final int splitName = 16844105; // 0x1010549
field public static final int splitTrack = 16843852; // 0x101044c
field public static final int spotShadowAlpha = 16843967; // 0x10104bf
field public static final int src = 16843033; // 0x1010119
field public static final int ssp = 16843747; // 0x10103e3
- field public static final int sspAdvancedPattern = 16844321; // 0x1010621
+ field public static final int sspAdvancedPattern;
field public static final int sspPattern = 16843749; // 0x10103e5
field public static final int sspPrefix = 16843748; // 0x10103e4
- field public static final int sspSuffix = 16844319; // 0x101061f
+ field public static final int sspSuffix;
field public static final int stackFromBottom = 16843005; // 0x10100fd
field public static final int stackViewStyle = 16843838; // 0x101043e
field public static final int starStyle = 16842882; // 0x1010082
@@ -1402,7 +1403,7 @@
field public static final int supportsRtl = 16843695; // 0x10103af
field public static final int supportsSwitchingToNextInputMethod = 16843755; // 0x10103eb
field public static final int supportsUploading = 16843419; // 0x101029b
- field public static final int suppressesSpellChecker = 16844355; // 0x1010643
+ field public static final int suppressesSpellChecker;
field public static final int switchMinWidth = 16843632; // 0x1010370
field public static final int switchPadding = 16843633; // 0x1010371
field public static final int switchPreferenceStyle = 16843629; // 0x101036d
@@ -1417,8 +1418,8 @@
field public static final int tabWidgetStyle = 16842883; // 0x1010083
field public static final int tag = 16842961; // 0x10100d1
field public static final int targetActivity = 16843266; // 0x1010202
- field public static final int targetCellHeight = 16844341; // 0x1010635
- field public static final int targetCellWidth = 16844340; // 0x1010634
+ field public static final int targetCellHeight;
+ field public static final int targetCellWidth;
field public static final int targetClass = 16842799; // 0x101002f
field @Deprecated public static final int targetDescriptions = 16843680; // 0x10103a0
field public static final int targetId = 16843740; // 0x10103dc
@@ -1588,7 +1589,7 @@
field public static final int useLevel = 16843167; // 0x101019f
field public static final int userVisible = 16843409; // 0x1010291
field public static final int usesCleartextTraffic = 16844012; // 0x10104ec
- field public static final int usesPermissionFlags = 16844356; // 0x1010644
+ field public static final int usesPermissionFlags;
field public static final int value = 16842788; // 0x1010024
field public static final int valueFrom = 16843486; // 0x10102de
field public static final int valueTo = 16843487; // 0x10102df
@@ -1643,10 +1644,10 @@
field public static final int windowAllowReturnTransitionOverlap = 16843835; // 0x101043b
field public static final int windowAnimationStyle = 16842926; // 0x10100ae
field public static final int windowBackground = 16842836; // 0x1010054
- field public static final int windowBackgroundBlurRadius = 16844331; // 0x101062b
+ field public static final int windowBackgroundBlurRadius;
field public static final int windowBackgroundFallback = 16844035; // 0x1010503
- field public static final int windowBlurBehindEnabled = 16844316; // 0x101061c
- field public static final int windowBlurBehindRadius = 16844315; // 0x101061b
+ field public static final int windowBlurBehindEnabled;
+ field public static final int windowBlurBehindRadius;
field public static final int windowClipToOutline = 16843947; // 0x10104ab
field public static final int windowCloseOnTouchOutside = 16843611; // 0x101035b
field public static final int windowContentOverlay = 16842841; // 0x1010059
@@ -1665,7 +1666,7 @@
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
- field public static final int windowLayoutAffinity = 16844313; // 0x1010619
+ field public static final int windowLayoutAffinity;
field public static final int windowLayoutInDisplayCutoutMode = 16844166; // 0x1010586
field public static final int windowLightNavigationBar = 16844140; // 0x101056c
field public static final int windowLightStatusBar = 16844000; // 0x10104e0
@@ -1684,11 +1685,11 @@
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
- field public static final int windowSplashScreenAnimatedIcon = 16844333; // 0x101062d
- field public static final int windowSplashScreenAnimationDuration = 16844334; // 0x101062e
- field public static final int windowSplashScreenBackground = 16844332; // 0x101062c
- field public static final int windowSplashScreenBrandingImage = 16844335; // 0x101062f
- field public static final int windowSplashScreenIconBackgroundColor = 16844336; // 0x1010630
+ field public static final int windowSplashScreenAnimatedIcon;
+ field public static final int windowSplashScreenAnimationDuration;
+ field public static final int windowSplashScreenBackground;
+ field public static final int windowSplashScreenBrandingImage;
+ field public static final int windowSplashScreenIconBackgroundColor;
field @Deprecated public static final int windowSplashscreenContent = 16844132; // 0x1010564
field @Deprecated public static final int windowSwipeToDismiss = 16843763; // 0x10103f3
field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
@@ -1736,66 +1737,66 @@
field @Deprecated public static final int secondary_text_dark_nodisable = 17170438; // 0x1060006
field @Deprecated public static final int secondary_text_light = 17170439; // 0x1060007
field @Deprecated public static final int secondary_text_light_nodisable = 17170440; // 0x1060008
- field public static final int system_accent1_0 = 17170485; // 0x1060035
- field public static final int system_accent1_100 = 17170487; // 0x1060037
- field public static final int system_accent1_1000 = 17170496; // 0x1060040
- field public static final int system_accent1_200 = 17170488; // 0x1060038
- field public static final int system_accent1_300 = 17170489; // 0x1060039
- field public static final int system_accent1_400 = 17170490; // 0x106003a
- field public static final int system_accent1_50 = 17170486; // 0x1060036
- field public static final int system_accent1_500 = 17170491; // 0x106003b
- field public static final int system_accent1_600 = 17170492; // 0x106003c
- field public static final int system_accent1_700 = 17170493; // 0x106003d
- field public static final int system_accent1_800 = 17170494; // 0x106003e
- field public static final int system_accent1_900 = 17170495; // 0x106003f
- field public static final int system_accent2_0 = 17170497; // 0x1060041
- field public static final int system_accent2_100 = 17170499; // 0x1060043
- field public static final int system_accent2_1000 = 17170508; // 0x106004c
- field public static final int system_accent2_200 = 17170500; // 0x1060044
- field public static final int system_accent2_300 = 17170501; // 0x1060045
- field public static final int system_accent2_400 = 17170502; // 0x1060046
- field public static final int system_accent2_50 = 17170498; // 0x1060042
- field public static final int system_accent2_500 = 17170503; // 0x1060047
- field public static final int system_accent2_600 = 17170504; // 0x1060048
- field public static final int system_accent2_700 = 17170505; // 0x1060049
- field public static final int system_accent2_800 = 17170506; // 0x106004a
- field public static final int system_accent2_900 = 17170507; // 0x106004b
- field public static final int system_accent3_0 = 17170509; // 0x106004d
- field public static final int system_accent3_100 = 17170511; // 0x106004f
- field public static final int system_accent3_1000 = 17170520; // 0x1060058
- field public static final int system_accent3_200 = 17170512; // 0x1060050
- field public static final int system_accent3_300 = 17170513; // 0x1060051
- field public static final int system_accent3_400 = 17170514; // 0x1060052
- field public static final int system_accent3_50 = 17170510; // 0x106004e
- field public static final int system_accent3_500 = 17170515; // 0x1060053
- field public static final int system_accent3_600 = 17170516; // 0x1060054
- field public static final int system_accent3_700 = 17170517; // 0x1060055
- field public static final int system_accent3_800 = 17170518; // 0x1060056
- field public static final int system_accent3_900 = 17170519; // 0x1060057
- field public static final int system_neutral1_0 = 17170461; // 0x106001d
- field public static final int system_neutral1_100 = 17170463; // 0x106001f
- field public static final int system_neutral1_1000 = 17170472; // 0x1060028
- field public static final int system_neutral1_200 = 17170464; // 0x1060020
- field public static final int system_neutral1_300 = 17170465; // 0x1060021
- field public static final int system_neutral1_400 = 17170466; // 0x1060022
- field public static final int system_neutral1_50 = 17170462; // 0x106001e
- field public static final int system_neutral1_500 = 17170467; // 0x1060023
- field public static final int system_neutral1_600 = 17170468; // 0x1060024
- field public static final int system_neutral1_700 = 17170469; // 0x1060025
- field public static final int system_neutral1_800 = 17170470; // 0x1060026
- field public static final int system_neutral1_900 = 17170471; // 0x1060027
- field public static final int system_neutral2_0 = 17170473; // 0x1060029
- field public static final int system_neutral2_100 = 17170475; // 0x106002b
- field public static final int system_neutral2_1000 = 17170484; // 0x1060034
- field public static final int system_neutral2_200 = 17170476; // 0x106002c
- field public static final int system_neutral2_300 = 17170477; // 0x106002d
- field public static final int system_neutral2_400 = 17170478; // 0x106002e
- field public static final int system_neutral2_50 = 17170474; // 0x106002a
- field public static final int system_neutral2_500 = 17170479; // 0x106002f
- field public static final int system_neutral2_600 = 17170480; // 0x1060030
- field public static final int system_neutral2_700 = 17170481; // 0x1060031
- field public static final int system_neutral2_800 = 17170482; // 0x1060032
- field public static final int system_neutral2_900 = 17170483; // 0x1060033
+ field public static final int system_accent1_0;
+ field public static final int system_accent1_100;
+ field public static final int system_accent1_1000;
+ field public static final int system_accent1_200;
+ field public static final int system_accent1_300;
+ field public static final int system_accent1_400;
+ field public static final int system_accent1_50;
+ field public static final int system_accent1_500;
+ field public static final int system_accent1_600;
+ field public static final int system_accent1_700;
+ field public static final int system_accent1_800;
+ field public static final int system_accent1_900;
+ field public static final int system_accent2_0;
+ field public static final int system_accent2_100;
+ field public static final int system_accent2_1000;
+ field public static final int system_accent2_200;
+ field public static final int system_accent2_300;
+ field public static final int system_accent2_400;
+ field public static final int system_accent2_50;
+ field public static final int system_accent2_500;
+ field public static final int system_accent2_600;
+ field public static final int system_accent2_700;
+ field public static final int system_accent2_800;
+ field public static final int system_accent2_900;
+ field public static final int system_accent3_0;
+ field public static final int system_accent3_100;
+ field public static final int system_accent3_1000;
+ field public static final int system_accent3_200;
+ field public static final int system_accent3_300;
+ field public static final int system_accent3_400;
+ field public static final int system_accent3_50;
+ field public static final int system_accent3_500;
+ field public static final int system_accent3_600;
+ field public static final int system_accent3_700;
+ field public static final int system_accent3_800;
+ field public static final int system_accent3_900;
+ field public static final int system_neutral1_0;
+ field public static final int system_neutral1_100;
+ field public static final int system_neutral1_1000;
+ field public static final int system_neutral1_200;
+ field public static final int system_neutral1_300;
+ field public static final int system_neutral1_400;
+ field public static final int system_neutral1_50;
+ field public static final int system_neutral1_500;
+ field public static final int system_neutral1_600;
+ field public static final int system_neutral1_700;
+ field public static final int system_neutral1_800;
+ field public static final int system_neutral1_900;
+ field public static final int system_neutral2_0;
+ field public static final int system_neutral2_100;
+ field public static final int system_neutral2_1000;
+ field public static final int system_neutral2_200;
+ field public static final int system_neutral2_300;
+ field public static final int system_neutral2_400;
+ field public static final int system_neutral2_50;
+ field public static final int system_neutral2_500;
+ field public static final int system_neutral2_600;
+ field public static final int system_neutral2_700;
+ field public static final int system_neutral2_800;
+ field public static final int system_neutral2_900;
field public static final int tab_indicator_text = 17170441; // 0x1060009
field @Deprecated public static final int tertiary_text_dark = 17170448; // 0x1060010
field @Deprecated public static final int tertiary_text_light = 17170449; // 0x1060011
@@ -1811,9 +1812,9 @@
field public static final int dialog_min_width_minor = 17104900; // 0x1050004
field public static final int notification_large_icon_height = 17104902; // 0x1050006
field public static final int notification_large_icon_width = 17104901; // 0x1050005
- field public static final int system_app_widget_background_radius = 17104904; // 0x1050008
- field public static final int system_app_widget_inner_radius = 17104905; // 0x1050009
- field public static final int system_app_widget_internal_padding = 17104906; // 0x105000a
+ field public static final int system_app_widget_background_radius;
+ field public static final int system_app_widget_inner_radius;
+ field public static final int system_app_widget_internal_padding;
field public static final int thumbnail_height = 17104897; // 0x1050001
field public static final int thumbnail_width = 17104898; // 0x1050002
}
@@ -9934,9 +9935,9 @@
public static final class AttributionSource.Builder {
ctor public AttributionSource.Builder(int);
method @NonNull public android.content.AttributionSource build();
- method @NonNull public android.content.AttributionSource.Builder setAttributionTag(@NonNull String);
- method @NonNull public android.content.AttributionSource.Builder setNext(@NonNull android.content.AttributionSource);
- method @NonNull public android.content.AttributionSource.Builder setPackageName(@NonNull String);
+ method @NonNull public android.content.AttributionSource.Builder setAttributionTag(@Nullable String);
+ method @NonNull public android.content.AttributionSource.Builder setNext(@Nullable android.content.AttributionSource);
+ method @NonNull public android.content.AttributionSource.Builder setPackageName(@Nullable String);
}
public abstract class BroadcastReceiver {
@@ -18660,6 +18661,7 @@
method @NonNull public java.util.List<android.util.Size> getAvailableSizes();
method public int getFormat();
method public boolean isInput();
+ method public boolean isMaximumSize();
method public boolean isUltraHighResolution();
}
@@ -27093,12 +27095,13 @@
public final class VcnGatewayConnectionConfig {
method @NonNull public int[] getExposedCapabilities();
+ method @NonNull public String getGatewayConnectionName();
method @IntRange(from=android.net.vcn.VcnGatewayConnectionConfig.MIN_MTU_V6) public int getMaxMtu();
method @NonNull public long[] getRetryInterval();
}
public static final class VcnGatewayConnectionConfig.Builder {
- ctor public VcnGatewayConnectionConfig.Builder(@NonNull android.net.vcn.VcnControlPlaneConfig);
+ ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.vcn.VcnControlPlaneConfig);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder addExposedCapability(int);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig build();
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);
@@ -27122,7 +27125,7 @@
public abstract static class VcnManager.VcnStatusCallback {
ctor public VcnManager.VcnStatusCallback();
- method public abstract void onGatewayConnectionError(@NonNull int[], int, @Nullable Throwable);
+ method public abstract void onGatewayConnectionError(@NonNull String, int, @Nullable Throwable);
method public abstract void onStatusChanged(int);
}
@@ -38529,6 +38532,7 @@
method public final java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups(@NonNull String, @NonNull android.os.UserHandle);
method public final java.util.List<android.app.NotificationChannel> getNotificationChannels(@NonNull String, @NonNull android.os.UserHandle);
method public final android.service.notification.StatusBarNotification[] getSnoozedNotifications();
+ method public final void migrateNotificationFilter(int, @Nullable java.util.List<java.lang.String>);
method public android.os.IBinder onBind(android.content.Intent);
method public void onInterruptionFilterChanged(int);
method public void onListenerConnected();
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 4fb9926..869d790 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -61,6 +61,7 @@
public abstract class Context {
method @NonNull public android.os.UserHandle getUser();
+ field public static final String PAC_PROXY_SERVICE = "pac_proxy";
field public static final String TEST_NETWORK_SERVICE = "test_network";
}
@@ -78,14 +79,6 @@
}
-package android.content.rollback {
-
- public class RollbackManagerFrameworkInitializer {
- method public static void initialize();
- }
-
-}
-
package android.hardware.usb {
public class UsbManager {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 2551b77..a81411b 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -313,15 +313,15 @@
public static final class R.attr {
field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600
- field public static final int hotwordDetectionService = 16844326; // 0x1010626
+ field public static final int hotwordDetectionService;
field public static final int isVrOnly = 16844152; // 0x1010578
field public static final int minExtensionVersion = 16844305; // 0x1010611
- field public static final int playHomeTransitionSound = 16844358; // 0x1010646
+ field public static final int playHomeTransitionSound;
field public static final int requiredSystemPropertyName = 16844133; // 0x1010565
field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566
field public static final int sdkVersion = 16844304; // 0x1010610
field public static final int supportsAmbientMode = 16844173; // 0x101058d
- field public static final int throttleDurationMillis = 16844360; // 0x1010648
+ field public static final int throttleDurationMillis;
field public static final int userRestriction = 16844164; // 0x1010584
}
@@ -350,8 +350,8 @@
}
public static final class R.string {
- field public static final int config_customMediaKeyDispatcher = 17039404; // 0x104002c
- field public static final int config_customMediaSessionPolicyProvider = 17039405; // 0x104002d
+ field public static final int config_customMediaKeyDispatcher;
+ field public static final int config_customMediaSessionPolicyProvider;
field public static final int config_defaultAssistant = 17039393; // 0x1040021
field public static final int config_defaultBrowser = 17039394; // 0x1040022
field public static final int config_defaultCallRedirection = 17039397; // 0x1040025
@@ -364,15 +364,15 @@
field public static final int config_helpIntentNameKey = 17039390; // 0x104001e
field public static final int config_helpPackageNameKey = 17039387; // 0x104001b
field public static final int config_helpPackageNameValue = 17039388; // 0x104001c
- field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
- field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
- field public static final int config_systemContacts = 17039403; // 0x104002b
+ field public static final int config_systemAutomotiveCluster;
+ field public static final int config_systemAutomotiveProjection;
+ field public static final int config_systemContacts;
field public static final int config_systemGallery = 17039399; // 0x1040027
- field public static final int config_systemShell = 17039402; // 0x104002a
- field public static final int config_systemSpeechRecognizer = 17039406; // 0x104002e
- field public static final int config_systemTelevisionNotificationHandler = 17039409; // 0x1040031
- field public static final int config_systemWellbeing = 17039408; // 0x1040030
- field public static final int config_systemWifiCoexManager = 17039407; // 0x104002f
+ field public static final int config_systemShell;
+ field public static final int config_systemSpeechRecognizer;
+ field public static final int config_systemTelevisionNotificationHandler;
+ field public static final int config_systemWellbeing;
+ field public static final int config_systemWifiCoexManager;
}
public static final class R.style {
@@ -2235,7 +2235,7 @@
}
public static final class AttributionSource.Builder {
- method @NonNull @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) public android.content.AttributionSource.Builder setRenouncedPermissions(@NonNull java.util.Set<java.lang.String>);
+ method @NonNull @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) public android.content.AttributionSource.Builder setRenouncedPermissions(@Nullable java.util.Set<java.lang.String>);
}
public abstract class BroadcastReceiver {
@@ -5274,7 +5274,7 @@
method @NonNull public java.util.List<android.media.MediaRoute2Info> getAllRoutes();
method @Nullable public String getClientPackageName();
method @Nullable public android.media.MediaRouter2.RoutingController getController(@NonNull String);
- method @Nullable public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String);
+ method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String);
method public void setRouteVolume(@NonNull android.media.MediaRoute2Info, int);
method public void startScan();
method public void stopScan();
@@ -8766,6 +8766,8 @@
public final class PermissionControllerManager {
method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
+ method @Nullable public String getGroupOfPlatformPermission(@NonNull String);
+ method @NonNull public java.util.Set<java.lang.String> getPlatformPermissionsForGroup(@NonNull String);
method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>);
method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle);
@@ -8787,7 +8789,9 @@
method @NonNull public final android.os.IBinder onBind(android.content.Intent);
method @BinderThread public abstract void onCountPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull java.util.function.IntConsumer);
method @BinderThread public abstract void onGetAppPermissions(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionPresentationInfo>>);
+ method @BinderThread public void onGetGroupOfPlatformPermission(@NonNull String, @NonNull java.util.function.Consumer<java.lang.String>);
method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionUsageInfo>>);
+ method @BinderThread public void onGetPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<java.lang.String>>);
method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable);
method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable);
method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String);
@@ -13587,7 +13591,7 @@
method @NonNull public byte[] getEncodedMessage();
method @NonNull public String getHeaderSection();
method @NonNull public String getStartLine();
- method @Nullable public String getViaBranchParameter();
+ method @NonNull public String getViaBranchParameter();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipMessage> CREATOR;
}
@@ -14233,7 +14237,7 @@
public final class UwbManager {
method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public long elapsedRealtimeResolutionNanos();
method @NonNull @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public android.os.PersistableBundle getSpecificationInfo();
- method @NonNull @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public android.os.CancellationSignal openRangingSession(@NonNull android.os.PersistableBundle, @NonNull java.util.concurrent.Executor, @NonNull android.uwb.RangingSession.Callback);
+ method @NonNull @RequiresPermission(allOf={android.Manifest.permission.UWB_PRIVILEGED, android.Manifest.permission.UWB_RANGING}) public android.os.CancellationSignal openRangingSession(@NonNull android.os.PersistableBundle, @NonNull java.util.concurrent.Executor, @NonNull android.uwb.RangingSession.Callback);
method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void registerAdapterStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.uwb.UwbManager.AdapterStateCallback);
method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void unregisterAdapterStateCallback(@NonNull android.uwb.UwbManager.AdapterStateCallback);
}
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 6745a69..90a3667 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -58,8 +58,8 @@
public static final class R.string {
field public static final int config_defaultAssistant = 17039393; // 0x1040021
field public static final int config_defaultDialer = 17039395; // 0x1040023
- field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
- field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
+ field public static final int config_systemAutomotiveCluster;
+ field public static final int config_systemAutomotiveProjection;
field public static final int config_systemGallery = 17039399; // 0x1040027
}
@@ -666,6 +666,7 @@
public final class AttributionSource implements android.os.Parcelable {
ctor public AttributionSource(int, @Nullable String, @Nullable String);
ctor public AttributionSource(int, @Nullable String, @Nullable String, @Nullable android.content.AttributionSource);
+ ctor public AttributionSource(int, @Nullable String, @Nullable String, @Nullable java.util.Set<java.lang.String>, @Nullable android.content.AttributionSource);
}
public final class AutofillOptions implements android.os.Parcelable {
@@ -1985,6 +1986,7 @@
public final class PermissionManager {
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermGroupUsage> getIndicatorAppOpUsageData();
+ method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource);
}
}
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index d536821..483defa 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -886,7 +886,7 @@
* them, otherwise an empty list.
*/
public List<AccessibilityWindowInfo> getWindows() {
- return AccessibilityInteractionClient.getInstance().getWindows(mConnectionId);
+ return AccessibilityInteractionClient.getInstance(this).getWindows(mConnectionId);
}
/**
@@ -914,7 +914,8 @@
*/
@NonNull
public final SparseArray<List<AccessibilityWindowInfo>> getWindowsOnAllDisplays() {
- return AccessibilityInteractionClient.getInstance().getWindowsOnAllDisplays(mConnectionId);
+ return AccessibilityInteractionClient.getInstance(this).getWindowsOnAllDisplays(
+ mConnectionId);
}
/**
@@ -940,7 +941,8 @@
* @return The root node if this service can retrieve window content.
*/
public AccessibilityNodeInfo getRootInActiveWindow() {
- return AccessibilityInteractionClient.getInstance().getRootInActiveWindow(mConnectionId);
+ return AccessibilityInteractionClient.getInstance(this).getRootInActiveWindow(
+ mConnectionId);
}
/**
@@ -949,7 +951,7 @@
*/
public final void disableSelf() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
connection.disableSelf();
@@ -970,7 +972,7 @@
private void setDefaultTokenInternal(Context context, int displayId) {
final WindowManagerImpl wm = (WindowManagerImpl) context.getSystemService(WINDOW_SERVICE);
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
IBinder token = null;
if (connection != null) {
synchronized (mLock) {
@@ -1042,7 +1044,7 @@
public final @NonNull FingerprintGestureController getFingerprintGestureController() {
if (mFingerprintGestureController == null) {
mFingerprintGestureController = new FingerprintGestureController(
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId));
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId));
}
return mFingerprintGestureController;
}
@@ -1074,8 +1076,7 @@
@Nullable GestureResultCallback callback,
@Nullable Handler handler) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
- mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection == null) {
return false;
}
@@ -1287,7 +1288,7 @@
private void setMagnificationCallbackEnabled(boolean enabled) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1348,7 +1349,7 @@
*/
public float getScale() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1377,7 +1378,7 @@
*/
public float getCenterX() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1406,7 +1407,7 @@
*/
public float getCenterY() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1440,7 +1441,7 @@
@NonNull
public Region getMagnificationRegion() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1469,7 +1470,7 @@
*/
public boolean reset(boolean animate) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1497,7 +1498,7 @@
*/
public boolean setScale(float scale, boolean animate) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1529,7 +1530,7 @@
*/
public boolean setCenter(float centerX, float centerY, boolean animate) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1701,7 +1702,7 @@
private void setSoftKeyboardCallbackEnabled(boolean enabled) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1760,7 +1761,7 @@
@SoftKeyboardShowMode
public int getShowMode() {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1789,7 +1790,7 @@
*/
public boolean setShowMode(@SoftKeyboardShowMode int showMode) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1835,7 +1836,7 @@
*/
public boolean switchToInputMethod(@NonNull String imeId) {
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
+ AccessibilityInteractionClient.getInstance(mService).getConnection(
mService.mConnectionId);
if (connection != null) {
try {
@@ -1888,7 +1889,7 @@
displayId);
if (controller == null) {
controller = new AccessibilityButtonController(
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId));
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId));
mAccessibilityButtonControllers.put(displayId, controller);
}
return controller;
@@ -1922,7 +1923,7 @@
*/
public final @NonNull List<AccessibilityAction> getSystemActions() {
IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
return connection.getSystemActions();
@@ -1955,7 +1956,7 @@
*/
public final boolean performGlobalAction(int action) {
IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
return connection.performGlobalAction(action);
@@ -1996,7 +1997,7 @@
* @see AccessibilityNodeInfo#FOCUS_ACCESSIBILITY
*/
public AccessibilityNodeInfo findFocus(int focus) {
- return AccessibilityInteractionClient.getInstance().findFocus(mConnectionId,
+ return AccessibilityInteractionClient.getInstance(this).findFocus(mConnectionId,
AccessibilityWindowInfo.ANY_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID, focus);
}
@@ -2012,7 +2013,7 @@
*/
public final AccessibilityServiceInfo getServiceInfo() {
IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
return connection.getServiceInfo();
@@ -2044,12 +2045,12 @@
*/
private void sendServiceInfo() {
IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (mInfo != null && connection != null) {
try {
connection.setServiceInfo(mInfo);
mInfo = null;
- AccessibilityInteractionClient.getInstance().clearCache();
+ AccessibilityInteractionClient.getInstance(this).clearCache();
} catch (RemoteException re) {
Log.w(LOG_TAG, "Error while setting AccessibilityServiceInfo", re);
re.rethrowFromSystemServer();
@@ -2096,8 +2097,7 @@
Preconditions.checkNotNull(executor, "executor cannot be null");
Preconditions.checkNotNull(callback, "callback cannot be null");
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(
- mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection == null) {
sendScreenshotFailure(ERROR_TAKE_SCREENSHOT_INTERNAL_ERROR, executor, callback);
return;
@@ -2136,7 +2136,7 @@
*/
public void setAccessibilityFocusAppearance(int strokeWidth, @ColorInt int color) {
IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
connection.setFocusAppearance(strokeWidth, color);
@@ -2261,12 +2261,14 @@
private final HandlerCaller mCaller;
private final Callbacks mCallback;
+ private final Context mContext;
private int mConnectionId = AccessibilityInteractionClient.NO_ID;
public IAccessibilityServiceClientWrapper(Context context, Looper looper,
Callbacks callback) {
mCallback = callback;
+ mContext = context;
mCaller = new HandlerCaller(context, looper, this, true /*asyncHandler*/);
}
@@ -2366,7 +2368,8 @@
boolean serviceWantsEvent = message.arg1 != 0;
if (event != null) {
// Send the event to AccessibilityCache via AccessibilityInteractionClient
- AccessibilityInteractionClient.getInstance().onAccessibilityEvent(event);
+ AccessibilityInteractionClient.getInstance(mContext).onAccessibilityEvent(
+ event);
if (serviceWantsEvent
&& (mConnectionId != AccessibilityInteractionClient.NO_ID)) {
// Send the event to AccessibilityService
@@ -2395,15 +2398,15 @@
IBinder windowToken = (IBinder) args.arg2;
args.recycle();
if (connection != null) {
- AccessibilityInteractionClient.getInstance().addConnection(mConnectionId,
- connection);
+ AccessibilityInteractionClient.getInstance(mContext).addConnection(
+ mConnectionId, connection);
mCallback.init(mConnectionId, windowToken);
mCallback.onServiceConnected();
} else {
- AccessibilityInteractionClient.getInstance().removeConnection(
+ AccessibilityInteractionClient.getInstance(mContext).removeConnection(
mConnectionId);
mConnectionId = AccessibilityInteractionClient.NO_ID;
- AccessibilityInteractionClient.getInstance().clearCache();
+ AccessibilityInteractionClient.getInstance(mContext).clearCache();
mCallback.init(AccessibilityInteractionClient.NO_ID, null);
}
return;
@@ -2415,14 +2418,14 @@
return;
}
case DO_CLEAR_ACCESSIBILITY_CACHE: {
- AccessibilityInteractionClient.getInstance().clearCache();
+ AccessibilityInteractionClient.getInstance(mContext).clearCache();
return;
}
case DO_ON_KEY_EVENT: {
KeyEvent event = (KeyEvent) message.obj;
try {
IAccessibilityServiceConnection connection = AccessibilityInteractionClient
- .getInstance().getConnection(mConnectionId);
+ .getInstance(mContext).getConnection(mConnectionId);
if (connection != null) {
final boolean result = mCallback.onKeyEvent(event);
final int sequence = message.arg1;
@@ -2637,7 +2640,7 @@
public void setGestureDetectionPassthroughRegion(int displayId, @NonNull Region region) {
Preconditions.checkNotNull(region, "region cannot be null");
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
connection.setGestureDetectionPassthroughRegion(displayId, region);
@@ -2663,7 +2666,7 @@
public void setTouchExplorationPassthroughRegion(int displayId, @NonNull Region region) {
Preconditions.checkNotNull(region, "region cannot be null");
final IAccessibilityServiceConnection connection =
- AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId);
if (connection != null) {
try {
connection.setTouchExplorationPassthroughRegion(displayId, region);
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
index ab21dc9..923b6f4 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
@@ -117,4 +117,7 @@
void setTouchExplorationPassthroughRegion(int displayId, in Region region);
void setFocusAppearance(int strokeWidth, int color);
+
+ oneway void logTrace(long timestamp, String where, String callingParams, int processId,
+ long threadId, int callingUid, in Bundle serializedCallingStackInBundle);
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 0f38b5f..f0d5a89 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -5254,32 +5254,17 @@
return;
}
- List<String> filteredPermissions = null;
-
if (!getAttributionSource().getRenouncedPermissions().isEmpty()) {
final int permissionCount = permissions.length;
for (int i = 0; i < permissionCount; i++) {
if (getAttributionSource().getRenouncedPermissions().contains(permissions[i])) {
- if (filteredPermissions == null) {
- filteredPermissions = new ArrayList<>(i);
- for (int j = 0; j < i; j++) {
- filteredPermissions.add(permissions[i]);
- }
- }
- } else if (filteredPermissions != null) {
- filteredPermissions.add(permissions[i]);
+ throw new IllegalArgumentException("Cannot request renounced permission: "
+ + permissions[i]);
}
}
}
- final Intent intent;
- if (filteredPermissions == null) {
- intent = getPackageManager().buildRequestPermissionsIntent(permissions);
- } else {
- intent = getPackageManager().buildRequestPermissionsIntent(
- filteredPermissions.toArray(new String[0]));
- }
-
+ final Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null);
mHasCurrentPermissionsRequest = true;
}
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 6ce0b22..5a35bbe 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -1223,8 +1223,11 @@
public static final int OP_MANAGE_MEDIA = AppProtoEnums.APP_OP_MANAGE_MEDIA;
/** @hide */
+ public static final int OP_UWB_RANGING = AppProtoEnums.APP_OP_UWB_RANGING;
+
+ /** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public static final int _NUM_OP = 112;
+ public static final int _NUM_OP = 113;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -1637,6 +1640,8 @@
* @hide
*/
public static final String OPSTR_MANAGE_MEDIA = "android:manage_media";
+ /** @hide */
+ public static final String OPSTR_UWB_RANGING = "android:uwb_ranging";
/** {@link #sAppOpsToNote} not initialized yet for this op */
private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0;
@@ -1706,6 +1711,7 @@
// Nearby devices
OP_BLUETOOTH_SCAN,
OP_BLUETOOTH_CONNECT,
+ OP_UWB_RANGING,
// APPOP PERMISSIONS
OP_ACCESS_NOTIFICATIONS,
@@ -1846,6 +1852,7 @@
OP_COARSE_LOCATION, // OP_COARSE_LOCATION_SOURCE
OP_MANAGE_MEDIA, // MANAGE_MEDIA
OP_BLUETOOTH_CONNECT, // OP_BLUETOOTH_CONNECT
+ OP_UWB_RANGING, // OP_UWB_RANGING
};
/**
@@ -1964,6 +1971,7 @@
OPSTR_COARSE_LOCATION_SOURCE,
OPSTR_MANAGE_MEDIA,
OPSTR_BLUETOOTH_CONNECT,
+ OPSTR_UWB_RANGING,
};
/**
@@ -2083,6 +2091,7 @@
"COARSE_LOCATION_SOURCE",
"MANAGE_MEDIA",
"BLUETOOTH_CONNECT",
+ "UWB_RANGING"
};
/**
@@ -2203,6 +2212,7 @@
null, // no permission for OP_ACCESS_COARSE_LOCATION_SOURCE,
Manifest.permission.MANAGE_MEDIA,
Manifest.permission.BLUETOOTH_CONNECT,
+ Manifest.permission.UWB_RANGING,
};
/**
@@ -2323,6 +2333,7 @@
null, // ACCESS_COARSE_LOCATION_SOURCE
null, // MANAGE_MEDIA
null, // BLUETOOTH_CONNECT
+ null, // UWB_RANGING
};
/**
@@ -2442,6 +2453,7 @@
null, // ACCESS_COARSE_LOCATION_SOURCE
null, // MANAGE_MEDIA
null, // BLUETOOTH_CONNECT
+ null, // UWB_RANGING
};
/**
@@ -2560,6 +2572,7 @@
AppOpsManager.MODE_ALLOWED, // ACCESS_COARSE_LOCATION_SOURCE
AppOpsManager.MODE_DEFAULT, // MANAGE_MEDIA
AppOpsManager.MODE_ALLOWED, // BLUETOOTH_CONNECT
+ AppOpsManager.MODE_ALLOWED, // UWB_RANGING
};
/**
@@ -2682,6 +2695,7 @@
false, // ACCESS_COARSE_LOCATION_SOURCE
false, // MANAGE_MEDIA
false, // BLUETOOTH_CONNECT
+ false, // UWB_RANGING
};
/**
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index eb31b52..89312f4 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -115,6 +115,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.Executor;
class ReceiverRestrictedContext extends ContextWrapper {
@@ -3074,14 +3075,16 @@
mOpPackageName = overrideOpPackageName != null ? overrideOpPackageName : opPackageName;
mParams = Objects.requireNonNull(params);
- mAttributionSource = createAttributionSource(attributionTag, nextAttributionSource);
+ mAttributionSource = createAttributionSource(attributionTag, nextAttributionSource,
+ params.getRenouncedPermissions());
mContentResolver = new ApplicationContentResolver(this, mainThread);
}
private @NonNull AttributionSource createAttributionSource(@Nullable String attributionTag,
- @Nullable AttributionSource nextAttributionSource) {
- AttributionSource attributionSource = new AttributionSource(Process.myUid(), mOpPackageName,
- attributionTag, nextAttributionSource);
+ @Nullable AttributionSource nextAttributionSource,
+ @Nullable Set<String> renouncedPermissions) {
+ AttributionSource attributionSource = new AttributionSource(Process.myUid(),
+ mOpPackageName, attributionTag, renouncedPermissions, nextAttributionSource);
// If we want to access protected data on behalf of another app we need to
// tell the OS that we opt in to participate in the attribution chain.
if (nextAttributionSource != null) {
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index d0e17f0..dab5aff 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -228,6 +228,7 @@
NotificationListenerFilter getListenerFilter(in ComponentName cn, int userId);
void setListenerFilter(in ComponentName cn, int userId, in NotificationListenerFilter nlf);
+ void migrateNotificationFilter(in INotificationListener token, int defaultTypes, in List<String> disallowedPkgs);
void setToastRateLimitingEnabled(boolean enable);
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 2fbea28..92f707e 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3744,10 +3744,8 @@
private int mTextColorsAreForBackground = COLOR_INVALID;
private int mPrimaryTextColor = COLOR_INVALID;
private int mSecondaryTextColor = COLOR_INVALID;
- private boolean mRebuildStyledRemoteViews;
private boolean mTintActionButtons;
- private boolean mTintWithThemeAccent;
private boolean mInNightMode;
/**
@@ -3783,7 +3781,6 @@
mContext = context;
Resources res = mContext.getResources();
mTintActionButtons = res.getBoolean(R.bool.config_tintNotificationActionButtons);
- mTintWithThemeAccent = res.getBoolean(R.bool.config_tintNotificationsWithTheme);
if (res.getBoolean(R.bool.config_enableNightMode)) {
Configuration currentConfig = res.getConfiguration();
@@ -5208,15 +5205,21 @@
|| mSecondaryTextColor == COLOR_INVALID
|| mTextColorsAreForBackground != backgroundColor) {
mTextColorsAreForBackground = backgroundColor;
- mPrimaryTextColor = ContrastColorUtil.resolvePrimaryColor(mContext,
+ int defaultPrimaryTextColor = ContrastColorUtil.resolvePrimaryColor(mContext,
backgroundColor, mInNightMode);
- mSecondaryTextColor = ContrastColorUtil.resolveSecondaryColor(mContext,
+ int defaultSecondaryTextColor = ContrastColorUtil.resolveSecondaryColor(mContext,
backgroundColor, mInNightMode);
- if (backgroundColor != COLOR_DEFAULT && isColorized(p)) {
+ boolean colorized = backgroundColor != COLOR_DEFAULT;
+ if (colorized) {
mPrimaryTextColor = ContrastColorUtil.findAlphaToMeetContrast(
- mPrimaryTextColor, backgroundColor, 4.5);
+ defaultPrimaryTextColor, backgroundColor, 4.5);
mSecondaryTextColor = ContrastColorUtil.findAlphaToMeetContrast(
- mSecondaryTextColor, backgroundColor, 4.5);
+ defaultSecondaryTextColor, backgroundColor, 4.5);
+ } else {
+ mPrimaryTextColor = obtainThemeColor(R.attr.textColorPrimary,
+ defaultPrimaryTextColor);
+ mSecondaryTextColor = obtainThemeColor(R.attr.textColorSecondary,
+ defaultSecondaryTextColor);
}
}
}
@@ -5243,11 +5246,9 @@
contentView.setProgressBar(R.id.progress, max, progress, ind);
contentView.setProgressBackgroundTintList(R.id.progress,
mContext.getColorStateList(R.color.notification_progress_background_color));
- if (mTintWithThemeAccent || getRawColor(p) != COLOR_DEFAULT) {
- ColorStateList progressTint = ColorStateList.valueOf(getAccentColor(p));
- contentView.setProgressTintList(R.id.progress, progressTint);
- contentView.setProgressIndeterminateTintList(R.id.progress, progressTint);
- }
+ ColorStateList progressTint = ColorStateList.valueOf(getAccentColor(p));
+ contentView.setProgressTintList(R.id.progress, progressTint);
+ contentView.setProgressIndeterminateTintList(R.id.progress, progressTint);
return true;
} else {
contentView.setViewVisibility(R.id.progress, View.GONE);
@@ -5810,8 +5811,7 @@
}
private boolean useExistingRemoteView() {
- return mStyle == null || (!mStyle.displayCustomViewInline()
- && !mRebuildStyledRemoteViews);
+ return mStyle == null || !mStyle.displayCustomViewInline();
}
/**
@@ -6083,8 +6083,7 @@
background = outResultColor[0].getDefaultColor();
textColor = ContrastColorUtil.resolvePrimaryColor(mContext,
background, mInNightMode);
- } else if (mTintActionButtons && !mInNightMode
- && getRawColor(p) != COLOR_DEFAULT && !isColorized(p)) {
+ } else if (mTintActionButtons && !mInNightMode && !isColorized(p)) {
textColor = getAccentColor(p);
} else {
textColor = getPrimaryTextColor(p);
@@ -6262,7 +6261,7 @@
* is the primary text color, otherwise it's the contrast-adjusted app-provided color.
*/
private @ColorInt int getSmallIconColor(StandardTemplateParams p) {
- return isColorized(p) ? getPrimaryTextColor(p) : getContrastColor(p);
+ return getContrastColor(p);
}
/**
@@ -6274,11 +6273,9 @@
if (isColorized(p)) {
return getPrimaryTextColor(p);
}
- if (mTintWithThemeAccent) {
- int color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID);
- if (color != COLOR_INVALID) {
- return color;
- }
+ int color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID);
+ if (color != COLOR_INVALID) {
+ return color;
}
return getContrastColor(p);
}
@@ -6288,7 +6285,7 @@
* color when colorized, or when not using theme color tints.
*/
private @ColorInt int getProtectionColor(StandardTemplateParams p) {
- if (mTintWithThemeAccent && !isColorized(p)) {
+ if (!isColorized(p)) {
int color = obtainThemeColor(R.attr.colorBackgroundFloating, COLOR_INVALID);
if (color != COLOR_INVALID) {
return color;
@@ -6307,12 +6304,10 @@
if (isColorized(p)) {
return getPrimaryTextColor(p);
}
- if (mTintWithThemeAccent) {
- int color = obtainThemeColor(com.android.internal.R.attr.colorAccentTertiary,
- COLOR_INVALID);
- if (color != COLOR_INVALID) {
- return color;
- }
+ int color = obtainThemeColor(com.android.internal.R.attr.colorAccentTertiary,
+ COLOR_INVALID);
+ if (color != COLOR_INVALID) {
+ return color;
}
return getContrastColor(p);
}
@@ -6342,6 +6337,9 @@
* Gets the contrast-adjusted version of the color provided by the app.
*/
private @ColorInt int getContrastColor(StandardTemplateParams p) {
+ if (isColorized(p)) {
+ return getPrimaryTextColor(p);
+ }
int rawColor = getRawColor(p);
if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) {
return mCachedContrastColor;
@@ -6352,9 +6350,10 @@
int background = getDefaultBackgroundColor();
if (rawColor == COLOR_DEFAULT) {
ensureColors(p);
- color = ContrastColorUtil.resolveDefaultColor(mContext, background, mInNightMode);
- if (mTintWithThemeAccent) {
- color = obtainThemeColor(R.attr.colorAccent, color);
+ color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID);
+ if (color == COLOR_INVALID) {
+ color = ContrastColorUtil.resolveDefaultColor(mContext, background,
+ mInNightMode);
}
} else {
color = ContrastColorUtil.resolveContrastColor(mContext, rawColor,
@@ -6375,11 +6374,6 @@
* @param p the template params to inflate this with
*/
private @ColorInt int getRawColor(StandardTemplateParams p) {
- // When notifications are theme-tinted, the raw color is only used for the icon, so go
- // ahead and keep that color instead of changing the color for minimized notifs.
- if (p.mReduceHighlights && !mTintWithThemeAccent) {
- return COLOR_DEFAULT;
- }
return mN.color;
}
@@ -6486,6 +6480,7 @@
+ " notification: " + mN.mShortcutId
+ " vs bubble: " + mN.mBubbleMetadata.getShortcutId());
}
+ validateColorizedHasColor();
// first, add any extras from the calling code
if (mUserExtras != null) {
@@ -6539,6 +6534,21 @@
return mN;
}
+ // This code is executed on behalf of other apps' notifications, sometimes even by 3p apps,
+ // a use case that is not supported by the Compat Framework library.
+ @SuppressWarnings("AndroidFrameworkCompatChange")
+ private void validateColorizedHasColor() {
+ if (mN.color == COLOR_DEFAULT && mN.extras.getBoolean(EXTRA_COLORIZED)) {
+ if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.S) {
+ throw new IllegalArgumentException(
+ "Colorized notifications must set a color (other than COLOR_DEFAULT).");
+ } else {
+ Log.w(TAG, "Colorized notifications must set a color (other than "
+ + "COLOR_DEFAULT). This is required for apps targeting S.");
+ }
+ }
+ }
+
/**
* Returns the color for the given Theme.DeviceDefault.DayNight attribute, or
* defValue if that could not be completed
@@ -6551,13 +6561,9 @@
}
theme = new ContextThemeWrapper(mContext, R.style.Theme_DeviceDefault_DayNight)
.getTheme();
- TypedArray ta = theme.obtainStyledAttributes(new int[]{attrRes});
- if (ta == null) {
- return defaultColor;
+ try (TypedArray ta = theme.obtainStyledAttributes(new int[]{attrRes})) {
+ return ta == null ? defaultColor : ta.getColor(0, defaultColor);
}
- int background = ta.getColor(0, defaultColor);
- ta.recycle();
- return background;
}
/**
@@ -6671,11 +6677,7 @@
* which must be resolved by the caller before being used.
*/
private @ColorInt int getUnresolvedBackgroundColor(StandardTemplateParams p) {
- if (isColorized(p)) {
- return getRawColor(p);
- } else {
- return COLOR_DEFAULT;
- }
+ return isColorized(p) ? getRawColor(p) : COLOR_DEFAULT;
}
/**
@@ -6700,18 +6702,6 @@
}
/**
- * Forces all styled remoteViews to be built from scratch and not use any cached
- * RemoteViews.
- * This is needed for legacy apps that are baking in their remoteviews into the
- * notification.
- *
- * @hide
- */
- public void setRebuildStyledRemoteViews(boolean rebuild) {
- mRebuildStyledRemoteViews = rebuild;
- }
-
- /**
* Get the text that should be displayed in the statusBar when heads upped. This is
* usually just the app name, but may be different depending on the style.
*
@@ -6878,7 +6868,7 @@
* @hide
*/
public boolean isColorized() {
- return extras.getBoolean(EXTRA_COLORIZED)
+ return color != COLOR_DEFAULT && extras.getBoolean(EXTRA_COLORIZED)
&& (hasColorizedPermission() || isForegroundService());
}
@@ -8389,27 +8379,6 @@
return true;
}
- private CharSequence createConversationTitleFromMessages() {
- ArraySet<CharSequence> names = new ArraySet<>();
- for (int i = 0; i < mMessages.size(); i++) {
- Message m = mMessages.get(i);
- Person sender = m.getSenderPerson();
- if (sender != null) {
- names.add(sender.getName());
- }
- }
- SpannableStringBuilder title = new SpannableStringBuilder();
- int size = names.size();
- for (int i = 0; i < size; i++) {
- CharSequence name = names.valueAt(i);
- if (!TextUtils.isEmpty(title)) {
- title.append(", ");
- }
- title.append(BidiFormatter.getInstance().unicodeWrap(name));
- }
- return title;
- }
-
/**
* @hide
*/
@@ -8423,11 +8392,6 @@
return remoteViews;
}
- private static TextAppearanceSpan makeFontColorSpan(int color) {
- return new TextAppearanceSpan(null, 0, 0,
- ColorStateList.valueOf(color), null);
- }
-
public static final class Message {
/** @hide */
public static final String KEY_TEXT = "text";
@@ -9096,10 +9060,8 @@
container.setDrawableTint(buttonId, false, tintColor,
PorterDuff.Mode.SRC_ATOP);
- final TypedArray typedArray = mBuilder.mContext.obtainStyledAttributes(
- new int[]{ android.R.attr.colorControlHighlight });
- int rippleAlpha = Color.alpha(typedArray.getColor(0, 0));
- typedArray.recycle();
+ int rippleAlpha = Color.alpha(mBuilder.obtainThemeColor(
+ android.R.attr.colorControlHighlight, COLOR_DEFAULT));
int rippleColor = Color.argb(rippleAlpha, Color.red(tintColor), Color.green(tintColor),
Color.blue(tintColor));
container.setRippleDrawableColor(buttonId, ColorStateList.valueOf(rippleColor));
@@ -9186,9 +9148,12 @@
* </pre>
*/
public static class CallStyle extends Style {
- private static final int CALL_TYPE_INCOMING = 1;
- private static final int CALL_TYPE_ONGOING = 2;
- private static final int CALL_TYPE_SCREENING = 3;
+ /** @hide */
+ public static final int CALL_TYPE_INCOMING = 1;
+ /** @hide */
+ public static final int CALL_TYPE_ONGOING = 2;
+ /** @hide */
+ public static final int CALL_TYPE_SCREENING = 3;
/**
* This is a key used privately on the action.extras to give spacing priority
@@ -9889,23 +9854,6 @@
// Comparison done for all custom RemoteViews, independent of style
return false;
}
-
- private RemoteViews buildIntoRemoteView(RemoteViews template, RemoteViews customContent,
- boolean headerless) {
- if (customContent != null) {
- // Need to clone customContent before adding, because otherwise it can no longer be
- // parceled independently of remoteViews.
- customContent = customContent.clone();
- customContent.overrideTextColors(mBuilder.getPrimaryTextColor(mBuilder.mParams));
- if (headerless) {
- template.removeFromParent(R.id.notification_top_line);
- }
- template.removeAllViews(R.id.notification_main_column);
- template.addView(R.id.notification_main_column, customContent);
- template.addFlags(RemoteViews.FLAG_REAPPLY_DISALLOWED);
- }
- return template;
- }
}
/**
diff --git a/core/java/android/app/NotificationHistory.java b/core/java/android/app/NotificationHistory.java
index 0c8188b..eb9ec86 100644
--- a/core/java/android/app/NotificationHistory.java
+++ b/core/java/android/app/NotificationHistory.java
@@ -404,6 +404,26 @@
}
/**
+ * Removes all notifications from a channel and regenerates the string pool
+ */
+ public boolean removeChannelFromWrite(String packageName, String channelId) {
+ boolean removed = false;
+ for (int i = mNotificationsToWrite.size() - 1; i >= 0; i--) {
+ HistoricalNotification hn = mNotificationsToWrite.get(i);
+ if (packageName.equals(hn.getPackage())
+ && Objects.equals(channelId, hn.getChannelId())) {
+ removed = true;
+ mNotificationsToWrite.remove(i);
+ }
+ }
+ if (removed) {
+ poolStringsFromNotifications();
+ }
+
+ return removed;
+ }
+
+ /**
* Gets pooled strings in order to write them to disk
*/
public @NonNull String[] getPooledStringsToWrite() {
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 31b0d41..47a9fbb 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -722,7 +722,7 @@
new CachedServiceFetcher<UwbManager>() {
@Override
public UwbManager createService(ContextImpl ctx) {
- return UwbManager.getInstance();
+ return UwbManager.getInstance(ctx);
}
});
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index e412091..843aa2e 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1774,19 +1774,6 @@
= "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
/**
- * Broadcast action to notify ManagedProvisioning that
- * {@link UserManager#DISALLOW_SHARE_INTO_MANAGED_PROFILE} restriction has changed.
- * @hide
- * @deprecated No longer needed as ManagedProvisioning no longer handles
- * {@link UserManager#DISALLOW_SHARE_INTO_MANAGED_PROFILE} restriction changing.
- */
- // TODO(b/177221010): Remove when Managed Provisioning no longer depend on it.
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- @Deprecated
- public static final String ACTION_DATA_SHARING_RESTRICTION_CHANGED =
- "android.app.action.DATA_SHARING_RESTRICTION_CHANGED";
-
- /**
* Broadcast action from ManagedProvisioning to notify that the latest change to
* {@link UserManager#DISALLOW_SHARE_INTO_MANAGED_PROFILE} restriction has been successfully
* applied (cross profile intent filters updated). Only usesd for CTS tests.
@@ -2678,8 +2665,8 @@
* A boolean extra which determines whether to skip the ownership disclaimer screen during the
* provisioning flow. The default value is {@code false}.
*
- * If the value is {@code true}, it is the responsibility of the provisioning initiator to
- * show the relevant disclaimer.
+ * If the value is {@code true}, the provisioning initiator must display a device ownership
+ * disclaimer screen similar to that provided in AOSP.
*
* <p>This extra is only respected when provided alongside the {@link
* #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE} intent action.
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index 053bfc1..c851519 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -179,6 +179,15 @@
}
/** @hide */
+ @TestApi
+ public AttributionSource(int uid, @Nullable String packageName,
+ @Nullable String attributionTag, @Nullable Set<String> renouncedPermissions,
+ @Nullable AttributionSource next) {
+ this(uid, packageName, attributionTag, /*token*/ null,
+ renouncedPermissions, next);
+ }
+
+ /** @hide */
public AttributionSource(@NonNull AttributionSource current,
@Nullable AttributionSource next) {
this(current.getUid(), current.getPackageName(), current.getAttributionTag(),
@@ -526,7 +535,7 @@
/**
* The package that is accessing the permission protected data.
*/
- public @NonNull Builder setPackageName(@NonNull String value) {
+ public @NonNull Builder setPackageName(@Nullable String value) {
checkNotUsed();
mBuilderFieldsSet |= 0x2;
mPackageName = value;
@@ -536,7 +545,7 @@
/**
* The attribution tag of the app accessing the permission protected data.
*/
- public @NonNull Builder setAttributionTag(@NonNull String value) {
+ public @NonNull Builder setAttributionTag(@Nullable String value) {
checkNotUsed();
mBuilderFieldsSet |= 0x4;
mAttributionTag = value;
@@ -550,7 +559,7 @@
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS)
- public @NonNull Builder setRenouncedPermissions(@NonNull Set<String> value) {
+ public @NonNull Builder setRenouncedPermissions(@Nullable Set<String> value) {
checkNotUsed();
mBuilderFieldsSet |= 0x10;
mRenouncedPermissions = value;
@@ -560,7 +569,7 @@
/**
* The next app to receive the permission protected data.
*/
- public @NonNull Builder setNext(@NonNull AttributionSource value) {
+ public @NonNull Builder setNext(@Nullable AttributionSource value) {
checkNotUsed();
mBuilderFieldsSet |= 0x20;
mNext = value;
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 232daa8..3676982 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -4165,6 +4165,7 @@
* @see android.net.PacProxyManager
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final String PAC_PROXY_SERVICE = "pac_proxy";
/**
diff --git a/core/java/android/content/ContextParams.java b/core/java/android/content/ContextParams.java
index bd3eaea..ace2ba7 100644
--- a/core/java/android/content/ContextParams.java
+++ b/core/java/android/content/ContextParams.java
@@ -16,10 +16,13 @@
package android.content;
+import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.app.ActivityThread;
+import android.content.pm.PackageManager;
import java.util.Collections;
import java.util.Objects;
@@ -179,6 +182,13 @@
@RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS)
public @NonNull Builder setRenouncedPermissions(
@Nullable Set<String> renouncedPermissions) {
+ // This is not a security check but a fail fast - the OS enforces the permission too
+ if (renouncedPermissions != null && !renouncedPermissions.isEmpty()
+ && ActivityThread.currentApplication().checkSelfPermission(Manifest.permission
+ .RENOUNCE_PERMISSIONS) != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Renouncing permissions requires: "
+ + Manifest.permission.RENOUNCE_PERMISSIONS);
+ }
mRenouncedPermissions = renouncedPermissions;
return this;
}
diff --git a/core/java/android/content/PermissionChecker.java b/core/java/android/content/PermissionChecker.java
index fc963fe..049bfe7 100644
--- a/core/java/android/content/PermissionChecker.java
+++ b/core/java/android/content/PermissionChecker.java
@@ -979,7 +979,9 @@
int uid, @NonNull Set<String> renouncedPermissions) {
final boolean permissionGranted = context.checkPermission(permission, /*pid*/ -1,
uid) == PackageManager.PERMISSION_GRANTED;
- if (permissionGranted && renouncedPermissions.contains(permission)) {
+ if (permissionGranted && renouncedPermissions.contains(permission)
+ && context.checkPermission(Manifest.permission.RENOUNCE_PERMISSIONS,
+ /*pid*/ -1, uid) == PackageManager.PERMISSION_GRANTED) {
return false;
}
return permissionGranted;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 0952b3e..fa9142c 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -896,11 +896,13 @@
};
/**
- * This change id forces the packages it is applied to to be resizable. We only allow resizing
- * in fullscreen windowing mode, but not forcing the app into resizable multi-windowing mode.
+ * This change id forces the packages it is applied to be resizable. It won't change whether
+ * the app can be put into multi-windowing mode, but allow the app to resize when the window
+ * container resizes, such as display size change.
* @hide
*/
@ChangeId
+ @Overridable
@Disabled
@TestApi
public static final long FORCE_RESIZE_APP = 174042936L; // buganizer id
@@ -910,6 +912,7 @@
* @hide
*/
@ChangeId
+ @Overridable
@Disabled
@TestApi
public static final long FORCE_NON_RESIZE_APP = 181136395L; // buganizer id
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index 7696cbe..7ecb112 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -42,7 +42,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import libcore.io.IoUtils;
@@ -162,20 +161,18 @@
intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addDataScheme("package");
- Handler handler = BackgroundThread.getHandler();
- mContext.registerReceiverAsUser(
- mPackageReceiver, UserHandle.ALL, intentFilter, null, handler);
+ mContext.registerReceiverAsUser(mPackageReceiver, UserHandle.ALL, intentFilter, null, null);
// Register for events related to sdcard installation.
IntentFilter sdFilter = new IntentFilter();
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
- mContext.registerReceiver(mExternalReceiver, sdFilter, null, handler);
+ mContext.registerReceiver(mExternalReceiver, sdFilter);
// Register for user-related events
IntentFilter userFilter = new IntentFilter();
sdFilter.addAction(Intent.ACTION_USER_REMOVED);
- mContext.registerReceiver(mUserRemovedReceiver, userFilter, null, handler);
+ mContext.registerReceiver(mUserRemovedReceiver, userFilter);
}
private void handlePackageEvent(Intent intent, int userId) {
@@ -268,7 +265,7 @@
public void setListener(RegisteredServicesCacheListener<V> listener, Handler handler) {
if (handler == null) {
- handler = BackgroundThread.getHandler();
+ handler = new Handler(mContext.getMainLooper());
}
synchronized (this) {
mHandler = handler;
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index 72c9879..97e1b54 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -72,7 +72,6 @@
import com.android.internal.util.Parcelling.BuiltIn.ForStringSet;
import java.security.PublicKey;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -1346,7 +1345,7 @@
this.gwpAsanMode = in.readInt();
this.minExtensionVersions = in.readSparseIntArray();
this.mBooleans = in.readLong();
- this.mProperties = in.createTypedArrayMap(Property.CREATOR);
+ this.mProperties = in.readHashMap(boot);
this.memtagMode = in.readInt();
this.nativeHeapZeroInitialized = in.readInt();
this.requestOptimizedExternalStorageAccess = sForBoolean.unparcel(in);
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index cdd8265..4c6255d 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -376,10 +376,13 @@
int[] stateSpec = new int[numAttrs];
for (int i = 0; i < numAttrs; i++) {
final int stateResId = attrs.getAttributeNameResource(i);
+ if (stateResId == R.attr.lStar) {
+ // Non-finalized resource ids cannot be used in switch statements.
+ continue;
+ }
switch (stateResId) {
case R.attr.color:
case R.attr.alpha:
- case R.attr.lStar:
// Recognized attribute, ignore.
break;
default:
diff --git a/core/java/android/content/rollback/RollbackManagerFrameworkInitializer.java b/core/java/android/content/rollback/RollbackManagerFrameworkInitializer.java
index c5e4f99..24617a0 100644
--- a/core/java/android/content/rollback/RollbackManagerFrameworkInitializer.java
+++ b/core/java/android/content/rollback/RollbackManagerFrameworkInitializer.java
@@ -15,7 +15,6 @@
*/
package android.content.rollback;
-import android.annotation.SystemApi;
import android.app.SystemServiceRegistry;
import android.content.Context;
@@ -24,7 +23,6 @@
*
* @hide
*/
-@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public class RollbackManagerFrameworkInitializer {
private RollbackManagerFrameworkInitializer() {}
diff --git a/core/java/android/hardware/biometrics/BiometricTestSession.java b/core/java/android/hardware/biometrics/BiometricTestSession.java
index ff1a17e..41672b7 100644
--- a/core/java/android/hardware/biometrics/BiometricTestSession.java
+++ b/core/java/android/hardware/biometrics/BiometricTestSession.java
@@ -38,7 +38,7 @@
*/
@TestApi
public class BiometricTestSession implements AutoCloseable {
- private static final String TAG = "BiometricTestSession";
+ private static final String BASE_TAG = "BiometricTestSession";
/**
* @hide
@@ -66,12 +66,12 @@
private final ITestSessionCallback mCallback = new ITestSessionCallback.Stub() {
@Override
public void onCleanupStarted(int userId) {
- Log.d(TAG, "onCleanupStarted, sensor: " + mSensorId + ", userId: " + userId);
+ Log.d(getTag(), "onCleanupStarted, sensor: " + mSensorId + ", userId: " + userId);
}
@Override
public void onCleanupFinished(int userId) {
- Log.d(TAG, "onCleanupFinished, sensor: " + mSensorId
+ Log.d(getTag(), "onCleanupFinished, sensor: " + mSensorId
+ ", userId: " + userId
+ ", remaining users: " + mUsersCleaningUp.size());
mUsersCleaningUp.remove(userId);
@@ -107,7 +107,7 @@
@RequiresPermission(TEST_BIOMETRIC)
private void setTestHalEnabled(boolean enabled) {
try {
- Log.w(TAG, "setTestHalEnabled, sensor: " + mSensorId + " enabled: " + enabled);
+ Log.w(getTag(), "setTestHalEnabled, sensor: " + mSensorId + " enabled: " + enabled);
mTestSession.setTestHalEnabled(enabled);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -217,7 +217,7 @@
public void cleanupInternalState(int userId) {
try {
if (mUsersCleaningUp.contains(userId)) {
- Log.w(TAG, "Cleanup already in progress for user: " + userId);
+ Log.w(getTag(), "Cleanup already in progress for user: " + userId);
}
mUsersCleaningUp.add(userId);
@@ -230,6 +230,7 @@
@Override
@RequiresPermission(TEST_BIOMETRIC)
public void close() {
+ Log.d(getTag(), "Close, mTestedUsers size; " + mTestedUsers.size());
// Cleanup can be performed using the test HAL, since it always responds to enumerate with
// zero enrollments.
if (!mTestedUsers.isEmpty()) {
@@ -239,15 +240,19 @@
}
try {
- Log.d(TAG, "Awaiting latch...");
- mCloseLatch.await(10, TimeUnit.SECONDS);
- Log.d(TAG, "Finished awaiting");
+ Log.d(getTag(), "Awaiting latch...");
+ mCloseLatch.await(3, TimeUnit.SECONDS);
+ Log.d(getTag(), "Finished awaiting");
} catch (InterruptedException e) {
- Log.e(TAG, "Latch interrupted", e);
+ Log.e(getTag(), "Latch interrupted", e);
}
}
// Disable the test HAL after the sensor becomes idle.
setTestHalEnabled(false);
}
+
+ private String getTag() {
+ return BASE_TAG + "_" + mSensorId;
+ }
}
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 726bca4..c1009ff 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -1382,6 +1382,8 @@
// devices going offline (in real world scenarios, these permissions aren't
// changeable). Future calls to getCameraIdList() will reflect the changes in
// the camera id list after getCameraIdListNoLazy() is called.
+ // We need to remove the torch ids which may have been associated with the
+ // devices removed as well. This is the same situation.
cameraStatuses = mCameraService.addListener(testListener);
mCameraService.removeListener(testListener);
for (CameraStatus c : cameraStatuses) {
@@ -1400,6 +1402,7 @@
}
for (String id : deviceIdsToRemove) {
onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, id);
+ mTorchStatus.remove(id);
}
} catch (ServiceSpecificException e) {
// Unexpected failure
@@ -1500,7 +1503,11 @@
*/
public boolean cameraIdHasConcurrentStreamsLocked(String cameraId) {
if (!mDeviceStatus.containsKey(cameraId)) {
- Log.e(TAG, "cameraIdHasConcurrentStreamsLocked called on non existing camera id");
+ // physical camera ids aren't advertised in concurrent camera id combinations.
+ if (DEBUG) {
+ Log.v(TAG, " physical camera id " + cameraId + " is hidden." +
+ " Available logical camera ids : " + mDeviceStatus.toString());
+ }
return false;
}
for (Set<String> comb : mConcurrentCameraIdCombinations) {
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionForwardProcessor.java b/core/java/android/hardware/camera2/impl/CameraExtensionForwardProcessor.java
index 8eb1dcc..bf45932 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionForwardProcessor.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionForwardProcessor.java
@@ -25,6 +25,7 @@
import android.media.ImageReader;
import android.media.ImageWriter;
import android.annotation.NonNull;
+import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
import android.util.Size;
@@ -39,6 +40,7 @@
private final IPreviewImageProcessorImpl mProcessor;
private final long mOutputSurfaceUsage;
private final int mOutputSurfaceFormat;
+ private final Handler mHandler;
private ImageReader mIntermediateReader = null;
private Surface mIntermediateSurface = null;
@@ -48,10 +50,11 @@
private boolean mOutputAbandoned = false;
public CameraExtensionForwardProcessor(@NonNull IPreviewImageProcessorImpl processor,
- int format, long surfaceUsage) {
+ int format, long surfaceUsage, @NonNull Handler handler) {
mProcessor = processor;
mOutputSurfaceUsage = surfaceUsage;
mOutputSurfaceFormat = format;
+ mHandler = handler;
}
public void close() {
@@ -98,7 +101,7 @@
mResolution.getHeight(), CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT,
FORWARD_QUEUE_SIZE, mOutputSurfaceUsage);
mIntermediateSurface = mIntermediateReader.getSurface();
- mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), null);
+ mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), mHandler);
mProcessor.onOutputSurface(mIntermediateSurface, mOutputSurfaceFormat);
// PreviewImageProcessorImpl always expect the extension processing format as input
@@ -124,11 +127,15 @@
@Override public void onImageAvailable(ImageReader reader) {
Image processedImage = null;
try {
- processedImage = mIntermediateReader.acquireNextImage();
+ processedImage = reader.acquireNextImage();
} catch (IllegalStateException e) {
Log.e(TAG, "Failed to acquire processed image!");
return;
}
+ if (processedImage == null) {
+ Log.e(TAG, "Invalid image");
+ return;
+ }
if (mOutputSurface != null && mOutputSurface.isValid() && !mOutputAbandoned) {
if (mOutputWriter == null) {
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
index 1f5098f..3d771c01 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
@@ -352,7 +352,7 @@
try {
mPreviewImageProcessor = new CameraExtensionForwardProcessor(
mPreviewExtender.getPreviewImageProcessor(), repeatingSurfaceInfo.mFormat,
- repeatingSurfaceInfo.mUsage);
+ repeatingSurfaceInfo.mUsage, mHandler);
} catch (ClassCastException e) {
throw new UnsupportedOperationException("Failed casting preview processor!");
}
diff --git a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
index 29bdee3..bd8df87 100644
--- a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
+++ b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
@@ -63,27 +63,32 @@
private final ArrayList<Size> mAvailableSizes = new ArrayList<Size> ();
private final boolean mIsInput;
private final boolean mIsUltraHighResolution;
+ private final boolean mIsMaximumSize;
/**
* Create a new {@link MandatoryStreamInformation}.
*
- @param availableSizes List of possible stream sizes.
+ * @param availableSizes List of possible stream sizes.
* @param format Image format.
+ * @param isMaximumSize Whether this is a maximum size stream.
*
* @throws IllegalArgumentException
* if sizes is empty or if the format was not user-defined in
* ImageFormat/PixelFormat.
* @hide
*/
- public MandatoryStreamInformation(@NonNull List<Size> availableSizes, @Format int format) {
- this(availableSizes, format, /*isInput*/false, /*maximumResolution*/false);
+ public MandatoryStreamInformation(@NonNull List<Size> availableSizes, @Format int format,
+ boolean isMaximumSize) {
+ this(availableSizes, format, isMaximumSize, /*isInput*/false,
+ /*isUltraHighResolution*/false);
}
/**
* Create a new {@link MandatoryStreamInformation}.
*
- @param availableSizes List of possible stream sizes.
+ * @param availableSizes List of possible stream sizes.
* @param format Image format.
+ * @param isMaximumSize Whether this is a maximum size stream.
* @param isInput Flag indicating whether this stream is input.
*
* @throws IllegalArgumentException
@@ -92,17 +97,20 @@
* @hide
*/
public MandatoryStreamInformation(@NonNull List<Size> availableSizes, @Format int format,
- boolean isInput) {
- this(availableSizes, format, isInput, /*maximumResolution*/ false);
+ boolean isMaximumSize, boolean isInput) {
+ this(availableSizes, format, isMaximumSize, isInput,
+ /*isUltraHighResolution*/ false);
}
/**
* Create a new {@link MandatoryStreamInformation}.
*
- @param availableSizes List of possible stream sizes.
+ * @param availableSizes List of possible stream sizes.
* @param format Image format.
+ * @param isMaximumSize Whether this is a maximum size stream.
* @param isInput Flag indicating whether this stream is input.
- * @param isMaxResolution Flag indicating whether this is a maximum resolution stream.
+ * @param isUltraHighResolution Flag indicating whether this is a ultra-high resolution
+ * stream.
*
* @throws IllegalArgumentException
* if sizes is empty or if the format was not user-defined in
@@ -110,12 +118,13 @@
* @hide
*/
public MandatoryStreamInformation(@NonNull List<Size> availableSizes, @Format int format,
- boolean isInput, boolean isUltraHighResolution) {
+ boolean isMaximumSize, boolean isInput, boolean isUltraHighResolution) {
if (availableSizes.isEmpty()) {
throw new IllegalArgumentException("No available sizes");
}
mAvailableSizes.addAll(availableSizes);
mFormat = checkArgumentFormat(format);
+ mIsMaximumSize = isMaximumSize;
mIsInput = isInput;
mIsUltraHighResolution = isUltraHighResolution;
}
@@ -130,10 +139,12 @@
/**
* Confirms whether or not this is an ultra high resolution stream.
- * An 'ultra high resolution' stream is one which has a configuration which appears in
+ *
+ * <p>An 'ultra high resolution' stream is one which has a configuration which appears in
* {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP_MAXIMUM_RESOLUTION},
* Streams which are ultra high resolution must not be included with streams which are not
- * ultra high resolution in the same {@link android.hardware.camera2.CaptureRequest}.
+ * ultra high resolution in the same {@link android.hardware.camera2.CaptureRequest}.</p>
+ *
* @return true in case the stream is ultra high resolution, false otherwise.
*/
public boolean isUltraHighResolution() {
@@ -141,6 +152,34 @@
}
/**
+ * Confirms whether or not this is a maximum size stream.
+ *
+ * <p>A stream with maximum size is one with the camera device's maximum resolution
+ * for the stream's format as appears in {@link
+ * android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}. This
+ * maximum size has the same meaning as the 'MAXIMUM' target size documented in the camera
+ * capture session {@link CameraDevice#createCaptureSession guideline}.</p>
+ *
+ * <p>The application can use a
+ * {@link android.hardware.camera2.MultiResolutionImageReader} for a maximum size
+ * output stream if the camera device supports multi-resolution outputs for the stream's
+ * format. See {@link
+ * android.hardware.camera2.CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP}
+ * for details.</p>
+ *
+ * <p>This is different from the ultra high resolution flag, which applies only to
+ * ultra high resolution sensor camera devices and refers to a stream in
+ * {@link
+ * android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP_MAXIMUM_RESOLUTION}
+ * instead.</p>
+ *
+ * @return true if the stream is a maximum size stream.
+ */
+ public boolean isMaximumSize() {
+ return mIsMaximumSize;
+ }
+
+ /**
* Return the list of available sizes for this mandatory stream.
*
* <p>Per documented {@link CameraDevice#createCaptureSession guideline} the largest
@@ -827,7 +866,8 @@
getMaxSize(mStreamConfigMap.getOutputSizes(template.mFormat)));
sizes.add(sizeChosen);
try {
- streamInfo = new MandatoryStreamInformation(sizes, template.mFormat);
+ streamInfo = new MandatoryStreamInformation(sizes, template.mFormat,
+ /*isMaximumSize*/false);
} catch (IllegalArgumentException e) {
String cause = "No available sizes found for format: " + template.mFormat
+ " size threshold: " + template.mSizeThreshold + " combination: "
@@ -890,9 +930,11 @@
inputSize.add(maxRawInputSize);
streamsInfo.add(new MandatoryStreamInformation(inputSize,
- ImageFormat.RAW_SENSOR, /*isInput*/true, /*ultraHighResolution*/true));
+ ImageFormat.RAW_SENSOR, /*isMaximumSize*/true, /*isInput*/true,
+ /*ultraHighResolution*/true));
streamsInfo.add(new MandatoryStreamInformation(inputSize,
- ImageFormat.RAW_SENSOR, /*isInput*/ false, /*ultraHighResolution*/true));
+ ImageFormat.RAW_SENSOR, /*isMaximumSize*/true, /*isInput*/ false,
+ /*ultraHighResolution*/true));
MandatoryStreamCombination streamCombination;
streamCombination = new MandatoryStreamCombination(streamsInfo,
"Remosaic reprocessing", /*isReprocess*/true);
@@ -917,10 +959,11 @@
Size sizeChosen =
getMaxSize(streamConfigMap.getOutputSizes(
template.mFormat));
+ boolean isMaximumSize = (template.mSizeThreshold == SizeThreshold.MAXIMUM);
sizes.add(sizeChosen);
try {
streamInfo = new MandatoryStreamInformation(sizes, template.mFormat,
- /*isInput*/ false, /*ultraHighResolution*/ true);
+ isMaximumSize, /*isInput*/ false, /*ultraHighResolution*/ true);
} catch (IllegalArgumentException e) {
String cause = "No available sizes found for format: " + template.mFormat
+ " size threshold: " + template.mSizeThreshold + " combination: "
@@ -1096,8 +1139,9 @@
format = ImageFormat.YUV_420_888;
}
streamsInfo.add(new MandatoryStreamInformation(inputSize, format,
- /*isInput*/true));
- streamsInfo.add(new MandatoryStreamInformation(inputSize, format));
+ /*isMaximumSize*/true, /*isInput*/true));
+ streamsInfo.add(new MandatoryStreamInformation(inputSize, format,
+ /*isMaximumSize*/true));
}
for (StreamTemplate template : combTemplate.mStreamTemplates) {
@@ -1112,8 +1156,11 @@
}
MandatoryStreamInformation streamInfo;
+ boolean isMaximumSize =
+ (template.mSizeThreshold == SizeThreshold.MAXIMUM);
try {
- streamInfo = new MandatoryStreamInformation(sizes, template.mFormat);
+ streamInfo = new MandatoryStreamInformation(sizes, template.mFormat,
+ isMaximumSize);
} catch (IllegalArgumentException e) {
Log.e(TAG, "No available sizes found for format: " + template.mFormat +
" size threshold: " + template.mSizeThreshold + " combination: " +
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 171c6a2..f50aa99 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -78,5 +78,4 @@
boolean isUidNetworkingBlocked(int uid, boolean meteredNetwork);
boolean isUidRestrictedOnMeteredNetworks(int uid);
- boolean checkUidNetworkingBlocked(int uid, int uidRules, boolean isNetworkMetered, boolean isBackgroundRestricted);
}
diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java
index b037261..1eef7d9 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -198,15 +198,11 @@
final int oemManaged = getOemBitfield(snapshot.networkCapabilities);
if (legacyType == TYPE_WIFI) {
- if (snapshot.networkCapabilities.getSsid() != null) {
- networkId = snapshot.networkCapabilities.getSsid();
- if (networkId == null) {
- // TODO: Figure out if this code path never runs. If so, remove them.
- final WifiManager wifi = (WifiManager) context.getSystemService(
- Context.WIFI_SERVICE);
- final WifiInfo info = wifi.getConnectionInfo();
- networkId = info != null ? info.getSSID() : null;
- }
+ networkId = snapshot.networkCapabilities.getSsid();
+ if (networkId == null) {
+ final WifiManager wifi = context.getSystemService(WifiManager.class);
+ final WifiInfo info = wifi.getConnectionInfo();
+ networkId = info != null ? info.getSSID() : null;
}
}
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 68606ec..da3febd 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -564,31 +564,6 @@
}
/**
- * Figure out if networking is blocked for a given set of conditions.
- *
- * This is used by ConnectivityService via passing stale copies of conditions, so it must not
- * take any locks.
- *
- * @param uid The target uid.
- * @param uidRules The uid rules which are obtained from NetworkPolicyManagerService.
- * @param isNetworkMetered True if the network is metered.
- * @param isBackgroundRestricted True if data saver is enabled.
- *
- * @return true if networking is blocked for the UID under the specified conditions.
- *
- * @hide
- */
- public boolean checkUidNetworkingBlocked(int uid, int uidRules,
- boolean isNetworkMetered, boolean isBackgroundRestricted) {
- try {
- return mService.checkUidNetworkingBlocked(uid, uidRules, isNetworkMetered,
- isBackgroundRestricted);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Check that the given uid is restricted from doing networking on metered networks.
*
* @param uid The target uid.
diff --git a/core/java/android/net/vcn/IVcnStatusCallback.aidl b/core/java/android/net/vcn/IVcnStatusCallback.aidl
index 236ae8b..11bc443 100644
--- a/core/java/android/net/vcn/IVcnStatusCallback.aidl
+++ b/core/java/android/net/vcn/IVcnStatusCallback.aidl
@@ -20,7 +20,7 @@
oneway interface IVcnStatusCallback {
void onVcnStatusChanged(int statusCode);
void onGatewayConnectionError(
- in int[] gatewayNetworkCapabilities,
+ in String gatewayConnectionName,
int errorCode,
in String exceptionClass,
in String exceptionMessage);
diff --git a/core/java/android/net/vcn/VcnConfig.java b/core/java/android/net/vcn/VcnConfig.java
index 52cc218..d41c0b4 100644
--- a/core/java/android/net/vcn/VcnConfig.java
+++ b/core/java/android/net/vcn/VcnConfig.java
@@ -183,12 +183,25 @@
*
* @param gatewayConnectionConfig the configuration for an individual gateway connection
* @return this {@link Builder} instance, for chaining
+ * @throws IllegalArgumentException if a VcnGatewayConnectionConfig has already been set for
+ * this {@link VcnConfig} with the same GatewayConnection name (as returned via {@link
+ * VcnGatewayConnectionConfig#getGatewayConnectionName()}).
*/
@NonNull
public Builder addGatewayConnectionConfig(
@NonNull VcnGatewayConnectionConfig gatewayConnectionConfig) {
Objects.requireNonNull(gatewayConnectionConfig, "gatewayConnectionConfig was null");
+ for (final VcnGatewayConnectionConfig vcnGatewayConnectionConfig :
+ mGatewayConnectionConfigs) {
+ if (vcnGatewayConnectionConfig
+ .getGatewayConnectionName()
+ .equals(gatewayConnectionConfig.getGatewayConnectionName())) {
+ throw new IllegalArgumentException(
+ "GatewayConnection for specified name already exists");
+ }
+ }
+
mGatewayConnectionConfigs.add(gatewayConnectionConfig);
return this;
}
diff --git a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
index d4e8e2d..75db3820 100644
--- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
+++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
@@ -148,6 +148,8 @@
TimeUnit.MINUTES.toMillis(5),
TimeUnit.MINUTES.toMillis(15)
};
+ private static final String GATEWAY_CONNECTION_NAME_KEY = "mGatewayConnectionName";
+ @NonNull private final String mGatewayConnectionName;
private static final String CTRL_PLANE_CONFIG_KEY = "mCtrlPlaneConfig";
@NonNull private VcnControlPlaneConfig mCtrlPlaneConfig;
@@ -166,11 +168,13 @@
/** Builds a VcnGatewayConnectionConfig with the specified parameters. */
private VcnGatewayConnectionConfig(
+ @NonNull String gatewayConnectionName,
@NonNull VcnControlPlaneConfig ctrlPlaneConfig,
@NonNull Set<Integer> exposedCapabilities,
@NonNull Set<Integer> underlyingCapabilities,
@NonNull long[] retryIntervalsMs,
@IntRange(from = MIN_MTU_V6) int maxMtu) {
+ mGatewayConnectionName = gatewayConnectionName;
mCtrlPlaneConfig = ctrlPlaneConfig;
mExposedCapabilities = new TreeSet(exposedCapabilities);
mUnderlyingCapabilities = new TreeSet(underlyingCapabilities);
@@ -192,6 +196,7 @@
final PersistableBundle underlyingCapsBundle =
in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);
+ mGatewayConnectionName = in.getString(GATEWAY_CONNECTION_NAME_KEY);
mCtrlPlaneConfig = VcnControlPlaneConfig.fromPersistableBundle(ctrlPlaneConfigBundle);
mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
@@ -204,6 +209,7 @@
}
private void validate() {
+ Objects.requireNonNull(mGatewayConnectionName, "gatewayConnectionName was null");
Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null");
Preconditions.checkArgument(
@@ -242,6 +248,20 @@
}
/**
+ * Returns the configured Gateway Connection name.
+ *
+ * <p>This name is used by the configuring apps to distinguish between
+ * VcnGatewayConnectionConfigs configured on a single {@link VcnConfig}. This will be used as
+ * the identifier in VcnStatusCallback invocations.
+ *
+ * @see VcnManager.VcnStatusCallback#onGatewayConnectionError
+ */
+ @NonNull
+ public String getGatewayConnectionName() {
+ return mGatewayConnectionName;
+ }
+
+ /**
* Returns control plane configuration.
*
* @hide
@@ -364,6 +384,7 @@
new ArrayList<>(mUnderlyingCapabilities),
PersistableBundleUtils.INTEGER_SERIALIZER);
+ result.putString(GATEWAY_CONNECTION_NAME_KEY, mGatewayConnectionName);
result.putPersistableBundle(CTRL_PLANE_CONFIG_KEY, ctrlPlaneConfigBundle);
result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
@@ -376,6 +397,7 @@
@Override
public int hashCode() {
return Objects.hash(
+ mGatewayConnectionName,
mExposedCapabilities,
mUnderlyingCapabilities,
Arrays.hashCode(mRetryIntervalsMs),
@@ -389,7 +411,8 @@
}
final VcnGatewayConnectionConfig rhs = (VcnGatewayConnectionConfig) other;
- return mExposedCapabilities.equals(rhs.mExposedCapabilities)
+ return mGatewayConnectionName.equals(rhs.mGatewayConnectionName)
+ && mExposedCapabilities.equals(rhs.mExposedCapabilities)
&& mUnderlyingCapabilities.equals(rhs.mUnderlyingCapabilities)
&& Arrays.equals(mRetryIntervalsMs, rhs.mRetryIntervalsMs)
&& mMaxMtu == rhs.mMaxMtu;
@@ -399,6 +422,7 @@
* This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects.
*/
public static final class Builder {
+ @NonNull private final String mGatewayConnectionName;
@NonNull private final VcnControlPlaneConfig mCtrlPlaneConfig;
@NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
@NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
@@ -412,12 +436,22 @@
/**
* Construct a Builder object.
*
+ * @param gatewayConnectionName the String GatewayConnection name for this
+ * VcnGatewayConnectionConfig. Each VcnGatewayConnectionConfig within a {@link
+ * VcnConfig} must be given a unique name. This name is used by the caller to
+ * distinguish between VcnGatewayConnectionConfigs configured on a single {@link
+ * VcnConfig}. This will be used as the identifier in VcnStatusCallback invocations.
* @param ctrlPlaneConfig the control plane configuration
* @see VcnControlPlaneConfig
+ * @see VcnManager.VcnStatusCallback#onGatewayConnectionError
*/
- public Builder(@NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
+ public Builder(
+ @NonNull String gatewayConnectionName,
+ @NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
+ Objects.requireNonNull(gatewayConnectionName, "gatewayConnectionName was null");
Objects.requireNonNull(ctrlPlaneConfig, "ctrlPlaneConfig was null");
+ mGatewayConnectionName = gatewayConnectionName;
mCtrlPlaneConfig = ctrlPlaneConfig;
}
@@ -562,6 +596,7 @@
@NonNull
public VcnGatewayConnectionConfig build() {
return new VcnGatewayConnectionConfig(
+ mGatewayConnectionName,
mCtrlPlaneConfig,
mExposedCapabilities,
mUnderlyingCapabilities,
diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java
index abd41da..344b20c 100644
--- a/core/java/android/net/vcn/VcnManager.java
+++ b/core/java/android/net/vcn/VcnManager.java
@@ -437,7 +437,7 @@
* Invoked when status of the VCN for this callback's subscription group changes.
*
* @param statusCode the code for the status change encountered by this {@link
- * VcnStatusCallback}'s subscription group.
+ * VcnStatusCallback}'s subscription group. This value will be one of VCN_STATUS_CODE_*.
*/
public abstract void onStatusChanged(@VcnStatusCode int statusCode);
@@ -445,18 +445,17 @@
* Invoked when a VCN Gateway Connection corresponding to this callback's subscription group
* encounters an error.
*
- * @param networkCapabilities an array of NetworkCapabilities.NET_CAPABILITY_* capabilities
- * for the Gateway Connection that encountered the error, for identification purposes.
- * These will be a sorted list with no duplicates and will match {@link
- * VcnGatewayConnectionConfig#getExposedCapabilities()} for one of the {@link
- * VcnGatewayConnectionConfig}s set in the {@link VcnConfig} for this subscription
- * group.
- * @param errorCode the code to indicate the error that occurred
+ * @param gatewayConnectionName the String GatewayConnection name for the GatewayConnection
+ * encountering an error. This will match the name for exactly one {@link
+ * VcnGatewayConnectionConfig} for the {@link VcnConfig} configured for this callback's
+ * subscription group
+ * @param errorCode the code to indicate the error that occurred. This value will be one of
+ * VCN_ERROR_CODE_*.
* @param detail Throwable to provide additional information about the error, or {@code
* null} if none
*/
public abstract void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable Throwable detail);
}
@@ -586,7 +585,7 @@
// TODO(b/180521637): use ServiceSpecificException for safer Exception 'parceling'
@Override
public void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable String exceptionClass,
@Nullable String exceptionMessage) {
@@ -597,7 +596,7 @@
mExecutor.execute(
() ->
mCallback.onGatewayConnectionError(
- networkCapabilities, errorCode, cause)));
+ gatewayConnectionName, errorCode, cause)));
}
private static Throwable createThrowableByClassName(
diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java
index 2b6f336..0331483 100644
--- a/core/java/android/os/BatteryConsumer.java
+++ b/core/java/android/os/BatteryConsumer.java
@@ -124,6 +124,30 @@
public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000;
public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999;
+ /**
+ * Identifiers of models used for power estimation.
+ *
+ * @hide
+ */
+ @IntDef(prefix = {"POWER_MODEL_"}, value = {
+ POWER_MODEL_POWER_PROFILE,
+ POWER_MODEL_MEASURED_ENERGY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PowerModel {
+ }
+
+ /**
+ * Power model that is based on average consumption rates that hardware components
+ * consume in various states.
+ */
+ public static final int POWER_MODEL_POWER_PROFILE = 0;
+
+ /**
+ * Power model that is based on energy consumption measured by on-device power monitors.
+ */
+ public static final int POWER_MODEL_MEASURED_ENERGY = 1;
+
private final PowerComponents mPowerComponents;
protected BatteryConsumer(@NonNull PowerComponents powerComponents) {
@@ -149,6 +173,16 @@
}
/**
+ * Returns the ID of the model that was used for power estimation.
+ *
+ * @param componentId The ID of the power component, e.g.
+ * {@link BatteryConsumer#POWER_COMPONENT_CPU}.
+ */
+ public @PowerModel int getPowerModel(@BatteryConsumer.PowerComponent int componentId) {
+ return mPowerComponents.getPowerModel(componentId);
+ }
+
+ /**
* Returns the amount of drain attributed to the specified custom drain type.
*
* @param componentId The ID of the custom power component.
@@ -188,9 +222,22 @@
protected abstract static class BaseBuilder<T extends BaseBuilder<?>> {
final PowerComponents.Builder mPowerComponentsBuilder;
- public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount) {
+ public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount,
+ boolean includePowerModels) {
mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount,
- customTimeComponentCount);
+ customTimeComponentCount, includePowerModels);
+ }
+
+ /**
+ * Sets the amount of drain attributed to the specified drain type, e.g. CPU, WiFi etc.
+ *
+ * @param componentId The ID of the power component, e.g.
+ * {@link BatteryConsumer#POWER_COMPONENT_CPU}.
+ * @param componentPower Amount of consumed power in mAh.
+ */
+ @NonNull
+ public T setConsumedPower(@PowerComponent int componentId, double componentPower) {
+ return setConsumedPower(componentId, componentPower, POWER_MODEL_POWER_PROFILE);
}
/**
@@ -202,8 +249,9 @@
*/
@SuppressWarnings("unchecked")
@NonNull
- public T setConsumedPower(@PowerComponent int componentId, double componentPower) {
- mPowerComponentsBuilder.setConsumedPower(componentId, componentPower);
+ public T setConsumedPower(@PowerComponent int componentId, double componentPower,
+ @PowerModel int powerModel) {
+ mPowerComponentsBuilder.setConsumedPower(componentId, componentPower, powerModel);
return (T) this;
}
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index a0721c3..f288774 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -74,7 +74,7 @@
for (int i = 0; i < systemBatteryConsumerCount; i++) {
final SystemBatteryConsumer consumer =
builder.mSystemBatteryConsumerBuilders.valueAt(i).build();
- totalPower += consumer.getConsumedPower();
+ totalPower += consumer.getConsumedPower() - consumer.getPowerConsumedByApps();
mSystemBatteryConsumers.add(consumer);
}
@@ -261,6 +261,7 @@
public static final class Builder {
private final int mCustomPowerComponentCount;
private final int mCustomTimeComponentCount;
+ private final boolean mIncludePowerModels;
private long mStatsStartTimestampMs;
private int mDischargePercentage;
private double mDischargedPowerLowerBoundMah;
@@ -277,8 +278,14 @@
private List<BatteryStats.HistoryTag> mHistoryTagPool;
public Builder(int customPowerComponentCount, int customTimeComponentCount) {
+ this(customPowerComponentCount, customTimeComponentCount, false);
+ }
+
+ public Builder(int customPowerComponentCount, int customTimeComponentCount,
+ boolean includePowerModels) {
mCustomPowerComponentCount = customPowerComponentCount;
mCustomTimeComponentCount = customTimeComponentCount;
+ mIncludePowerModels = includePowerModels;
}
/**
@@ -360,7 +367,7 @@
UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
if (builder == null) {
builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount,
- mCustomTimeComponentCount, batteryStatsUid);
+ mCustomTimeComponentCount, mIncludePowerModels, batteryStatsUid);
mUidBatteryConsumerBuilders.put(uid, builder);
}
return builder;
@@ -376,7 +383,7 @@
SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
if (builder == null) {
builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount,
- mCustomTimeComponentCount, drainType);
+ mCustomTimeComponentCount, mIncludePowerModels, drainType);
mSystemBatteryConsumerBuilders.put(drainType, builder);
}
return builder;
@@ -391,7 +398,7 @@
UserBatteryConsumer.Builder builder = mUserBatteryConsumerBuilders.get(userId);
if (builder == null) {
builder = new UserBatteryConsumer.Builder(mCustomPowerComponentCount,
- mCustomTimeComponentCount, userId);
+ mCustomTimeComponentCount, mIncludePowerModels, userId);
mUserBatteryConsumerBuilders.put(userId, builder);
}
return builder;
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java
index 85861bc..5080442 100644
--- a/core/java/android/os/BatteryUsageStatsQuery.java
+++ b/core/java/android/os/BatteryUsageStatsQuery.java
@@ -60,6 +60,12 @@
*/
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY = 2;
+ /**
+ * Indicates that identifiers of power models used for computations of power
+ * consumption should be included in the BatteryUsageStats.
+ */
+ public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS = 4;
+
private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000;
private final int mFlags;
@@ -187,6 +193,17 @@
}
/**
+ * Requests to return identifiers of models that were used for estimation
+ * of power consumption.
+ *
+ * Should only be used for testing and debugging.
+ */
+ public Builder includePowerModels() {
+ mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS;
+ return this;
+ }
+
+ /**
* Set the client's tolerance for stale battery stats. The data may be up to
* this many milliseconds out-of-date.
*/
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index b12dad0..40c658f 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -46,8 +46,6 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
-import android.content.res.AssetFileDescriptor;
-import android.net.Uri;
import android.provider.DocumentsContract.Document;
import android.provider.MediaStore;
import android.system.ErrnoException;
@@ -83,7 +81,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
-import java.util.Locale;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
@@ -1446,46 +1443,22 @@
}
}
- // TODO(b/170488060): Consider better approach
/** {@hide} */
@VisibleForTesting
- public static FileDescriptor convertToModernFd(FileDescriptor fd) {
+ public static ParcelFileDescriptor convertToModernFd(FileDescriptor fd) {
try {
Context context = AppGlobals.getInitialApplication();
- // /mnt/user paths are not accessible directly so convert to a /storage path
- String filePath = Os.readlink("/proc/self/fd/" + fd.getInt$()).replace(
- "/mnt/user/" + UserHandle.myUserId(), "/storage");
- File realFile = new File(filePath);
- String fileName = realFile.getName();
- boolean isCameraVideo = !fileName.startsWith(".") && fileName.endsWith(".mp4")
- && contains(CAMERA_DIR_LOWER_CASE, filePath.toLowerCase(Locale.ROOT));
-
- if (!SystemProperties.getBoolean("sys.fuse.transcode_enabled", false)
- || UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)
- || !isCameraVideo) {
- // 1. If transcode is enabled we optimize by default, unless explicitly disabled.
- // 2. Never convert modern fd for MediaProvider, because this requires
+ if (UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)) {
+ // Never convert modern fd for MediaProvider, because this requires
// MediaStore#scanFile and can cause infinite loops when MediaProvider scans
- // 3. Only convert published mp4 videos in the DCIM/Camera dir
return null;
}
- Log.i(TAG, "Changing to modern format dataSource for: " + realFile);
- ContentResolver resolver = context.getContentResolver();
-
- Uri uri = MediaStore.scanFile(resolver, realFile);
- if (uri != null) {
- Bundle opts = new Bundle();
- opts.putBoolean(MediaStore.EXTRA_ACCEPT_ORIGINAL_MEDIA_FORMAT, true);
- AssetFileDescriptor afd = resolver.openTypedAssetFileDescriptor(uri, "*/*", opts);
- Log.i(TAG, "Changed to modern format dataSource for: " + realFile);
- return afd.getFileDescriptor();
- } else {
- Log.i(TAG, "Failed to change to modern format dataSource for: " + realFile);
- }
+ return MediaStore.getOriginalMediaFormatFileDescriptor(context,
+ ParcelFileDescriptor.dup(fd));
} catch (Exception e) {
- Log.w(TAG, "Failed to change to modern format dataSource", e);
+ Log.w(TAG, "Failed to convert to modern format file descriptor", e);
+ return null;
}
- return null;
}
private static int getMediaProviderAppId(Context context) {
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index d239b23..238f451 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -33,12 +33,14 @@
private final double[] mPowerComponentsMah;
private final long[] mTimeComponentsMs;
private final int mCustomPowerComponentCount;
+ private final byte[] mPowerModels;
PowerComponents(@NonNull Builder builder) {
mCustomPowerComponentCount = builder.mCustomPowerComponentCount;
mPowerComponentsMah = builder.mPowerComponentsMah;
mTimeComponentsMs = builder.mTimeComponentsMs;
mTotalConsumedPowerMah = builder.getTotalPower();
+ mPowerModels = builder.mPowerModels;
}
PowerComponents(@NonNull Parcel source) {
@@ -46,6 +48,12 @@
mCustomPowerComponentCount = source.readInt();
mPowerComponentsMah = source.createDoubleArray();
mTimeComponentsMs = source.createLongArray();
+ if (source.readBoolean()) {
+ mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT];
+ source.readByteArray(mPowerModels);
+ } else {
+ mPowerModels = null;
+ }
}
/** Writes contents to Parcel */
@@ -54,6 +62,12 @@
dest.writeInt(mCustomPowerComponentCount);
dest.writeDoubleArray(mPowerComponentsMah);
dest.writeLongArray(mTimeComponentsMs);
+ if (mPowerModels != null) {
+ dest.writeBoolean(true);
+ dest.writeByteArray(mPowerModels);
+ } else {
+ dest.writeBoolean(false);
+ }
}
/**
@@ -103,6 +117,15 @@
}
}
+ @BatteryConsumer.PowerModel
+ int getPowerModel(@BatteryConsumer.PowerComponent int component) {
+ if (mPowerModels == null) {
+ throw new IllegalStateException(
+ "Power model IDs were not requested in the BatteryUsageStatsQuery");
+ }
+ return mPowerModels[component];
+ }
+
/**
* Returns the amount of time used by the specified component, e.g. CPU, WiFi etc.
*
@@ -148,14 +171,21 @@
private final double[] mPowerComponentsMah;
private final int mCustomPowerComponentCount;
private final long[] mTimeComponentsMs;
+ private final byte[] mPowerModels;
- Builder(int customPowerComponentCount, int customTimeComponentCount) {
+ Builder(int customPowerComponentCount, int customTimeComponentCount,
+ boolean includePowerModels) {
mCustomPowerComponentCount = customPowerComponentCount;
int powerComponentCount =
BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount;
mPowerComponentsMah = new double[powerComponentCount];
mTimeComponentsMs =
new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
+ if (includePowerModels) {
+ mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT];
+ } else {
+ mPowerModels = null;
+ }
}
/**
@@ -167,7 +197,7 @@
*/
@NonNull
public Builder setConsumedPower(@BatteryConsumer.PowerComponent int componentId,
- double componentPower) {
+ double componentPower, @BatteryConsumer.PowerModel int powerModel) {
if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) {
throw new IllegalArgumentException(
"Unsupported power component ID: " + componentId);
@@ -178,6 +208,9 @@
throw new IllegalArgumentException(
"Unsupported power component ID: " + componentId);
}
+ if (mPowerModels != null) {
+ mPowerModels[componentId] = (byte) powerModel;
+ }
return this;
}
diff --git a/core/java/android/os/SystemBatteryConsumer.java b/core/java/android/os/SystemBatteryConsumer.java
index 5f35332..e973e4c 100644
--- a/core/java/android/os/SystemBatteryConsumer.java
+++ b/core/java/android/os/SystemBatteryConsumer.java
@@ -141,8 +141,8 @@
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
Builder(int customPowerComponentCount, int customTimeComponentCount,
- @DrainType int drainType) {
- super(customPowerComponentCount, customTimeComponentCount);
+ boolean includePowerModels, @DrainType int drainType) {
+ super(customPowerComponentCount, customTimeComponentCount, includePowerModels);
mDrainType = drainType;
}
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index dfa0c39..87c263b 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -140,8 +140,8 @@
private boolean mExcludeFromBatteryUsageStats;
public Builder(int customPowerComponentCount, int customTimeComponentCount,
- @NonNull BatteryStats.Uid batteryStatsUid) {
- super(customPowerComponentCount, customTimeComponentCount);
+ boolean includePowerModels, @NonNull BatteryStats.Uid batteryStatsUid) {
+ super(customPowerComponentCount, customTimeComponentCount, includePowerModels);
mBatteryStatsUid = batteryStatsUid;
mUid = batteryStatsUid.getUid();
}
diff --git a/core/java/android/os/UserBatteryConsumer.java b/core/java/android/os/UserBatteryConsumer.java
index 94e567f..7832208 100644
--- a/core/java/android/os/UserBatteryConsumer.java
+++ b/core/java/android/os/UserBatteryConsumer.java
@@ -77,8 +77,9 @@
private final int mUserId;
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
- Builder(int customPowerComponentCount, int customTimeComponentCount, int userId) {
- super(customPowerComponentCount, customTimeComponentCount);
+ Builder(int customPowerComponentCount, int customTimeComponentCount,
+ boolean includePowerModels, int userId) {
+ super(customPowerComponentCount, customTimeComponentCount, includePowerModels);
mUserId = userId;
}
diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java
index 047c05a..7fb9ae0 100644
--- a/core/java/android/os/incremental/IncrementalManager.java
+++ b/core/java/android/os/incremental/IncrementalManager.java
@@ -25,6 +25,7 @@
import android.content.pm.IPackageLoadingProgressCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -285,7 +286,7 @@
* Unbinds the target dir and deletes the corresponding storage instance.
* Deletes the package name and associated storage id from maps.
*/
- public void onPackageRemoved(@NonNull File codeFile) {
+ public void rmPackageDir(@NonNull File codeFile) {
try {
final String codePath = codeFile.getAbsolutePath();
final IncrementalStorage storage = openStorage(codePath);
@@ -294,11 +295,9 @@
}
mLoadingProgressCallbacks.cleanUpCallbacks(storage);
unregisterHealthListener(codePath);
-
- // Parent since we bind-mount a folder one level above.
- mService.deleteBindMount(storage.getId(), codeFile.getParent());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ storage.unBind(codePath);
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed to remove code path", e);
}
}
diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl
index 6d677f3..66e1c5a 100644
--- a/core/java/android/permission/IPermissionController.aidl
+++ b/core/java/android/permission/IPermissionController.aidl
@@ -48,4 +48,10 @@
void getPrivilegesDescriptionStringForProfile(
in String deviceProfileName,
in AndroidFuture<String> callback);
+ void getPlatformPermissionsForGroup(
+ in String permissionGroupName,
+ in AndroidFuture<List<String>> callback);
+ void getGroupOfPlatformPermission(
+ in String permissionName,
+ in AndroidFuture<String> callback);
}
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index 913b827..05eb23a 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -45,6 +45,7 @@
import android.os.Process;
import android.os.UserHandle;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
@@ -66,6 +67,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -720,4 +722,46 @@
mRemoteService.run(
service -> service.notifyOneTimePermissionSessionTimeout(packageName));
}
+
+ /**
+ * Get the platform permissions which belong to a particular permission group
+ *
+ * @param permissionGroupName The permission group whose permissions are desired
+ * @return A list of the platform permissions in the group, or empty if the group is not a valid
+ * platform group.
+ */
+ public @NonNull Set<String> getPlatformPermissionsForGroup(
+ @NonNull String permissionGroupName) {
+ try {
+ return new ArraySet<>(mRemoteService.postAsync(service -> {
+ AndroidFuture<List<String>> future = new AndroidFuture<>();
+ service.getPlatformPermissionsForGroup(permissionGroupName, future);
+ return future;
+ }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to get permissions of " + permissionGroupName, e);
+ return null;
+ }
+ }
+
+ /**
+ * Get the platform group of a particular permission, if the permission is a platform permission
+ *
+ * @param permissionName The permission name whose group is desired
+ * @return The name of the permission group this permission belongs to, or null if it has no
+ * group, or is not a platform permission
+ */
+ public @Nullable String getGroupOfPlatformPermission(
+ @NonNull String permissionName) {
+ try {
+ return mRemoteService.postAsync(service -> {
+ AndroidFuture<String> future = new AndroidFuture<>();
+ service.getGroupOfPlatformPermission(permissionName, future);
+ return future;
+ }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to get group of " + permissionName, e);
+ return null;
+ }
+ }
}
diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java
index ad9e8b3..0b99b85 100644
--- a/core/java/android/permission/PermissionControllerService.java
+++ b/core/java/android/permission/PermissionControllerService.java
@@ -301,6 +301,29 @@
}
/**
+ * Get the platform permissions which belong to a particular permission group
+ *
+ * @param permissionGroupName The permission group whose permissions are desired
+ * @param callback A callback the permission names will be passed to
+ */
+ @BinderThread
+ public void onGetPlatformPermissionsForGroup(@NonNull String permissionGroupName,
+ @NonNull Consumer<List<String>> callback) {
+ throw new AbstractMethodError("Must be overridden in implementing class");
+ }
+
+ /**
+ * Get the platform group of a particular permission, if the permission is a platform permission
+ *
+ * @param permissionName The permission name whose group is desired
+ * @param callback A callback the group name will be passed to
+ */
+ @BinderThread
+ public void onGetGroupOfPlatformPermission(@NonNull String permissionName,
+ @NonNull Consumer<String> callback) {
+ throw new AbstractMethodError("Must be overridden in implementing class");
+ }
+ /**
* Get a user-readable sentence, describing the set of privileges that are to be granted to a
* companion app managing a device of the given profile.
*
@@ -563,6 +586,36 @@
callback.completeExceptionally(t);
}
}
+
+ @Override
+ public void getPlatformPermissionsForGroup(
+ @NonNull String permissionName,
+ @NonNull AndroidFuture<List<String>> callback) {
+ try {
+ Objects.requireNonNull(permissionName);
+ Objects.requireNonNull(callback);
+ PermissionControllerService.this.onGetPlatformPermissionsForGroup(
+ permissionName, callback::complete);
+ } catch (Throwable t) {
+ callback.completeExceptionally(t);
+ }
+ }
+
+ @Override
+ public void getGroupOfPlatformPermission(
+ @NonNull String permissionGroupName,
+ @NonNull AndroidFuture<String> callback) {
+ try {
+ Objects.requireNonNull(permissionGroupName);
+ Objects.requireNonNull(callback);
+ PermissionControllerService
+ .this
+ .onGetGroupOfPlatformPermission(
+ permissionGroupName, callback::complete);
+ } catch (Throwable t) {
+ callback.completeExceptionally(t);
+ }
+ }
};
}
}
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 936cbfc..751e9aa 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -1114,6 +1114,7 @@
*
* @hide
*/
+ @TestApi
public @NonNull AttributionSource registerAttributionSource(@NonNull AttributionSource source) {
try {
return mPermissionManager.registerAttributionSource(source);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 22d74ca..ecb1700 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6745,9 +6745,8 @@
/**
* The current location time zone detection enabled state for the user.
*
- * See {@link
- * android.app.timezonedetector.TimeZoneDetector#getCapabilities} for access. See {@link
- * android.app.timezonedetector.TimeZoneDetector#updateConfiguration} to update.
+ * See {@link android.app.time.TimeManager#getTimeZoneCapabilitiesAndConfig} for access.
+ * See {@link android.app.time.TimeManager#updateTimeZoneConfiguration} to update.
* @hide
*/
public static final String LOCATION_TIME_ZONE_DETECTION_ENABLED =
diff --git a/core/java/android/security/ConfirmationPrompt.java b/core/java/android/security/ConfirmationPrompt.java
index 2329037..d8c44ad 100644
--- a/core/java/android/security/ConfirmationPrompt.java
+++ b/core/java/android/security/ConfirmationPrompt.java
@@ -21,7 +21,6 @@
import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
-import android.security.keystore.AndroidKeyStoreProvider;
import android.text.TextUtils;
import android.util.Log;
@@ -106,32 +105,6 @@
private void doCallback(int responseCode, byte[] dataThatWasConfirmed,
ConfirmationCallback callback) {
switch (responseCode) {
- case KeyStore.CONFIRMATIONUI_OK:
- callback.onConfirmed(dataThatWasConfirmed);
- break;
-
- case KeyStore.CONFIRMATIONUI_CANCELED:
- callback.onDismissed();
- break;
-
- case KeyStore.CONFIRMATIONUI_ABORTED:
- callback.onCanceled();
- break;
-
- case KeyStore.CONFIRMATIONUI_SYSTEM_ERROR:
- callback.onError(new Exception("System error returned by ConfirmationUI."));
- break;
-
- default:
- callback.onError(new Exception("Unexpected responseCode=" + responseCode
- + " from onConfirmtionPromptCompleted() callback."));
- break;
- }
- }
-
- private void doCallback2(int responseCode, byte[] dataThatWasConfirmed,
- ConfirmationCallback callback) {
- switch (responseCode) {
case AndroidProtectedConfirmation.ERROR_OK:
callback.onConfirmed(dataThatWasConfirmed);
break;
@@ -155,31 +128,6 @@
}
}
- private final android.os.IBinder mCallbackBinder =
- new android.security.IConfirmationPromptCallback.Stub() {
- @Override
- public void onConfirmationPromptCompleted(
- int responseCode, final byte[] dataThatWasConfirmed)
- throws android.os.RemoteException {
- if (mCallback != null) {
- ConfirmationCallback callback = mCallback;
- Executor executor = mExecutor;
- mCallback = null;
- mExecutor = null;
- if (executor == null) {
- doCallback(responseCode, dataThatWasConfirmed, callback);
- } else {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- doCallback(responseCode, dataThatWasConfirmed, callback);
- }
- });
- }
- }
- }
- };
-
private final android.security.apc.IConfirmationCallback mConfirmationCallback =
new android.security.apc.IConfirmationCallback.Stub() {
@Override
@@ -191,11 +139,11 @@
mCallback = null;
mExecutor = null;
if (executor == null) {
- doCallback2(result, dataThatWasConfirmed, callback);
+ doCallback(result, dataThatWasConfirmed, callback);
} else {
executor.execute(new Runnable() {
@Override public void run() {
- doCallback2(result, dataThatWasConfirmed, callback);
+ doCallback(result, dataThatWasConfirmed, callback);
}
});
}
@@ -266,29 +214,7 @@
mExtraData = extraData;
}
- private static final int UI_OPTION_ACCESSIBILITY_INVERTED_FLAG = 1 << 0;
- private static final int UI_OPTION_ACCESSIBILITY_MAGNIFIED_FLAG = 1 << 1;
-
private int getUiOptionsAsFlags() {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- return getUiOptionsAsFlags2();
- }
- int uiOptionsAsFlags = 0;
- ContentResolver contentResolver = mContext.getContentResolver();
- int inversionEnabled = Settings.Secure.getInt(contentResolver,
- Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0);
- if (inversionEnabled == 1) {
- uiOptionsAsFlags |= UI_OPTION_ACCESSIBILITY_INVERTED_FLAG;
- }
- float fontScale = Settings.System.getFloat(contentResolver,
- Settings.System.FONT_SCALE, (float) 1.0);
- if (fontScale > 1.0) {
- uiOptionsAsFlags |= UI_OPTION_ACCESSIBILITY_MAGNIFIED_FLAG;
- }
- return uiOptionsAsFlags;
- }
-
- private int getUiOptionsAsFlags2() {
int uiOptionsAsFlags = 0;
ContentResolver contentResolver = mContext.getContentResolver();
int inversionEnabled = Settings.Secure.getInt(contentResolver,
@@ -349,52 +275,26 @@
mExecutor = executor;
String locale = Locale.getDefault().toLanguageTag();
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- int uiOptionsAsFlags = getUiOptionsAsFlags2();
- int responseCode = getService().presentConfirmationPrompt(
- mConfirmationCallback, mPromptText.toString(), mExtraData, locale,
- uiOptionsAsFlags);
- switch (responseCode) {
- case AndroidProtectedConfirmation.ERROR_OK:
- return;
+ int uiOptionsAsFlags = getUiOptionsAsFlags();
+ int responseCode = getService().presentConfirmationPrompt(
+ mConfirmationCallback, mPromptText.toString(), mExtraData, locale,
+ uiOptionsAsFlags);
+ switch (responseCode) {
+ case AndroidProtectedConfirmation.ERROR_OK:
+ return;
- case AndroidProtectedConfirmation.ERROR_OPERATION_PENDING:
- throw new ConfirmationAlreadyPresentingException();
+ case AndroidProtectedConfirmation.ERROR_OPERATION_PENDING:
+ throw new ConfirmationAlreadyPresentingException();
- case AndroidProtectedConfirmation.ERROR_UNIMPLEMENTED:
- throw new ConfirmationNotAvailableException();
+ case AndroidProtectedConfirmation.ERROR_UNIMPLEMENTED:
+ throw new ConfirmationNotAvailableException();
- default:
- // Unexpected error code.
- Log.w(TAG,
- "Unexpected responseCode=" + responseCode
- + " from presentConfirmationPrompt() call.");
- throw new IllegalArgumentException();
- }
- } else {
- int uiOptionsAsFlags = getUiOptionsAsFlags();
- int responseCode = mKeyStore.presentConfirmationPrompt(
- mCallbackBinder, mPromptText.toString(), mExtraData, locale, uiOptionsAsFlags);
- switch (responseCode) {
- case KeyStore.CONFIRMATIONUI_OK:
- return;
-
- case KeyStore.CONFIRMATIONUI_OPERATION_PENDING:
- throw new ConfirmationAlreadyPresentingException();
-
- case KeyStore.CONFIRMATIONUI_UNIMPLEMENTED:
- throw new ConfirmationNotAvailableException();
-
- case KeyStore.CONFIRMATIONUI_UIERROR:
- throw new IllegalArgumentException();
-
- default:
- // Unexpected error code.
- Log.w(TAG,
- "Unexpected responseCode=" + responseCode
- + " from presentConfirmationPrompt() call.");
- throw new IllegalArgumentException();
- }
+ default:
+ // Unexpected error code.
+ Log.w(TAG,
+ "Unexpected responseCode=" + responseCode
+ + " from presentConfirmationPrompt() call.");
+ throw new IllegalArgumentException();
}
}
@@ -408,33 +308,18 @@
* @throws IllegalStateException if no prompt is currently being presented.
*/
public void cancelPrompt() {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- int responseCode =
- getService().cancelConfirmationPrompt(mConfirmationCallback);
- if (responseCode == AndroidProtectedConfirmation.ERROR_OK) {
- return;
- } else if (responseCode == AndroidProtectedConfirmation.ERROR_OPERATION_PENDING) {
- throw new IllegalStateException();
- } else {
- // Unexpected error code.
- Log.w(TAG,
- "Unexpected responseCode=" + responseCode
- + " from cancelConfirmationPrompt() call.");
- throw new IllegalStateException();
- }
+ int responseCode =
+ getService().cancelConfirmationPrompt(mConfirmationCallback);
+ if (responseCode == AndroidProtectedConfirmation.ERROR_OK) {
+ return;
+ } else if (responseCode == AndroidProtectedConfirmation.ERROR_OPERATION_PENDING) {
+ throw new IllegalStateException();
} else {
- int responseCode = mKeyStore.cancelConfirmationPrompt(mCallbackBinder);
- if (responseCode == KeyStore.CONFIRMATIONUI_OK) {
- return;
- } else if (responseCode == KeyStore.CONFIRMATIONUI_OPERATION_PENDING) {
- throw new IllegalStateException();
- } else {
- // Unexpected error code.
- Log.w(TAG,
- "Unexpected responseCode=" + responseCode
- + " from cancelConfirmationPrompt() call.");
- throw new IllegalStateException();
- }
+ // Unexpected error code.
+ Log.w(TAG,
+ "Unexpected responseCode=" + responseCode
+ + " from cancelConfirmationPrompt() call.");
+ throw new IllegalStateException();
}
}
@@ -448,9 +333,6 @@
if (isAccessibilityServiceRunning(context)) {
return false;
}
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- return new AndroidProtectedConfirmation().isConfirmationPromptSupported();
- }
- return KeyStore.getInstance().isConfirmationPromptSupported();
+ return new AndroidProtectedConfirmation().isConfirmationPromptSupported();
}
}
diff --git a/core/java/android/security/keymaster/KeymasterCertificateChain.aidl b/core/java/android/security/keymaster/KeymasterCertificateChain.aidl
new file mode 100644
index 0000000..e01db7a
--- /dev/null
+++ b/core/java/android/security/keymaster/KeymasterCertificateChain.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2021 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.security.keymaster;
+
+parcelable KeymasterCertificateChain;
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 6788353..ad9b796 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -712,18 +712,10 @@
*/
@NonNull Key getKeyFromGrant(@NonNull String grantAlias)
throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- if (grantAlias.startsWith(APPLICATION_KEY_GRANT_PREFIX)) {
- return AndroidKeyStoreProvider
- .loadAndroidKeyStoreSecretKeyFromKeystore(
- KeyStore2.getInstance(),
- getGrantDescriptor(grantAlias));
- }
- // TODO(b/171305545): remove KeyStore1 logic.
- return android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
- mKeyStore,
- grantAlias,
- KeyStore.UID_SELF);
-
+ return AndroidKeyStoreProvider
+ .loadAndroidKeyStoreSecretKeyFromKeystore(
+ KeyStore2.getInstance(),
+ getGrantDescriptor(grantAlias));
}
private static final String APPLICATION_KEY_GRANT_PREFIX = "recoverable_key:";
diff --git a/core/java/android/service/notification/NotificationListenerFilter.java b/core/java/android/service/notification/NotificationListenerFilter.java
index 9de75ca..a69d33c 100644
--- a/core/java/android/service/notification/NotificationListenerFilter.java
+++ b/core/java/android/service/notification/NotificationListenerFilter.java
@@ -31,15 +31,17 @@
* @hide
*/
public class NotificationListenerFilter implements Parcelable {
+
+ private static final int DEFAULT_TYPES = FLAG_FILTER_TYPE_CONVERSATIONS
+ | FLAG_FILTER_TYPE_ALERTING
+ | FLAG_FILTER_TYPE_SILENT
+ | FLAG_FILTER_TYPE_ONGOING;
private int mAllowedNotificationTypes;
// VersionedPackage is holding the pkg name and pkg uid
private ArraySet<VersionedPackage> mDisallowedPackages;
public NotificationListenerFilter() {
- mAllowedNotificationTypes = FLAG_FILTER_TYPE_CONVERSATIONS
- | FLAG_FILTER_TYPE_ALERTING
- | FLAG_FILTER_TYPE_SILENT
- | FLAG_FILTER_TYPE_ONGOING;
+ mAllowedNotificationTypes = DEFAULT_TYPES;
mDisallowedPackages = new ArraySet<>();
}
@@ -80,6 +82,10 @@
return (mAllowedNotificationTypes & type) != 0;
}
+ public boolean areAllTypesAllowed() {
+ return DEFAULT_TYPES == mAllowedNotificationTypes;
+ }
+
public boolean isPackageAllowed(VersionedPackage pkg) {
return !mDisallowedPackages.contains(pkg);
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 09c3b2e..6c77585 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -792,6 +792,29 @@
}
}
+ /**
+ * Lets an app migrate notification filters from its app into the OS.
+ *
+ * <p>This call will be ignored if the app has already migrated these settings or the user
+ * has set filters in the UI. This method is intended for user specific settings; if an app has
+ * already specified defaults types in its manifest with
+ * {@link #META_DATA_DEFAULT_FILTER_TYPES}, the defaultTypes option will be ignored.</p>
+ * @param defaultTypes A value representing the types of notifications that this listener should
+ * receive by default
+ * @param disallowedPkgs A list of package names whose notifications should not be seen by this
+ * listener, by default, because the listener does not process or display them, or because a
+ * user had previously disallowed these packages in the listener app's UI
+ */
+ public final void migrateNotificationFilter(@NotificationFilterTypes int defaultTypes,
+ @Nullable List<String> disallowedPkgs) {
+ if (!isBound()) return;
+ try {
+ getNotificationInterface().migrateNotificationFilter(
+ mWrapper, defaultTypes, disallowedPkgs);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ }
/**
* Inform the notification manager that these notifications have been viewed by the
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index 7aa5ee5..9a855f3 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -214,6 +214,17 @@
* command to the created {@code SpeechRecognizer}, otherwise no notifications will be
* received.
*
+ * <p>For apps targeting Android 11 (API level 30) interaction with a speech recognition
+ * service requires <queries> element to be added to the manifest file:
+ * <pre>{@code
+ * <queries>
+ * <intent>
+ * <action
+ * android:name="android.speech.RecognitionService" />
+ * </intent>
+ * </queries>
+ * }</pre>
+ *
* @param context in which to create {@code SpeechRecognizer}
* @return a new {@code SpeechRecognizer}
*/
@@ -231,7 +242,18 @@
* {@link SpeechRecognizer} to. Normally you would not use this; use
* {@link #createSpeechRecognizer(Context)} instead to use the system default recognition
* service.
- *
+ *
+ * <p>For apps targeting Android 11 (API level 30) interaction with a speech recognition
+ * service requires <queries> element to be added to the manifest file:
+ * <pre>{@code
+ * <queries>
+ * <intent>
+ * <action
+ * android:name="android.speech.RecognitionService" />
+ * </intent>
+ * </queries>
+ * }</pre>
+ *
* @param context in which to create {@code SpeechRecognizer}
* @param serviceComponent the {@link ComponentName} of a specific service to direct this
* {@code SpeechRecognizer} to
diff --git a/core/java/android/text/method/TranslationTransformationMethod.java b/core/java/android/text/method/TranslationTransformationMethod.java
index 54c0ffc..7db999a8 100644
--- a/core/java/android/text/method/TranslationTransformationMethod.java
+++ b/core/java/android/text/method/TranslationTransformationMethod.java
@@ -78,11 +78,24 @@
if (TextUtils.isEmpty(translatedText) || isWhitespace(translatedText.toString())) {
return source;
} else {
+ // TODO(b/179693024): Remove this once we have the fix to pad the view text instead.
+ translatedText = ellipsize(translatedText, ((TextView) view).getText().length());
// TODO(b/174283799): apply the spans to the text
return translatedText;
}
}
+ private static CharSequence ellipsize(CharSequence text, int newLength) {
+ if (text.length() <= newLength) {
+ return text;
+ }
+ String ellipsis = String.valueOf('\u2026');
+ if (newLength == 1) {
+ return ellipsis;
+ }
+ return TextUtils.concat(TextUtils.trimToSize(text, newLength - 1), ellipsis);
+ }
+
@Override
public void onFocusChanged(View view, CharSequence sourceText,
boolean focused, int direction,
diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java
index 2a43222..78c4739 100644
--- a/core/java/android/util/Slog.java
+++ b/core/java/android/util/Slog.java
@@ -61,7 +61,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void v(String tag, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.VERBOSE)) return;
@@ -87,7 +90,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void d(String tag, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.DEBUG)) return;
@@ -112,7 +118,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void i(String tag, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.INFO)) return;
@@ -142,7 +151,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void w(String tag, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.WARN)) return;
@@ -157,7 +169,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void w(String tag, Exception exception, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.WARN)) return;
@@ -183,7 +198,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void e(String tag, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.ERROR)) return;
@@ -198,7 +216,10 @@
* of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
* calling this method in a critical path, make sure to explicitly do the check before calling
* it.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void e(String tag, Exception exception, String format, @Nullable Object... args) {
if (!Log.isLoggable(tag, Log.ERROR)) return;
@@ -217,14 +238,20 @@
/**
* Logs a {@code wtf} message.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void wtf(String tag, String format, @Nullable Object... args) {
wtf(tag, getMessage(format, args));
}
/**
* Logs a {@code wtf} message with an exception.
+ *
+ * @deprecated use {@code com.android.server.utils.SLogF} instead.
*/
+ @Deprecated
public static void wtf(String tag, Exception exception, String format,
@Nullable Object... args) {
wtf(tag, getMessage(format, args), exception);
diff --git a/core/java/android/uwb/RangingManager.java b/core/java/android/uwb/RangingManager.java
index 85f2c1c..5c7f0f5 100644
--- a/core/java/android/uwb/RangingManager.java
+++ b/core/java/android/uwb/RangingManager.java
@@ -17,6 +17,7 @@
package android.uwb;
import android.annotation.NonNull;
+import android.content.AttributionSource;
import android.os.CancellationSignal;
import android.os.PersistableBundle;
import android.os.RemoteException;
@@ -42,6 +43,9 @@
/**
* Open a new ranging session
*
+ * @param attributionSource Attribution source to use for the enforcement of
+ * {@link android.Manifest.permission#ULTRAWIDEBAND_RANGING} runtime
+ * permission.
* @param params the parameters that define the ranging session
* @param executor {@link Executor} to run callbacks
* @param callbacks {@link RangingSession.Callback} to associate with the {@link RangingSession}
@@ -49,7 +53,8 @@
* @return a {@link CancellationSignal} that may be used to cancel the opening of the
* {@link RangingSession}.
*/
- public CancellationSignal openSession(@NonNull PersistableBundle params,
+ public CancellationSignal openSession(@NonNull AttributionSource attributionSource,
+ @NonNull PersistableBundle params,
@NonNull Executor executor,
@NonNull RangingSession.Callback callbacks) {
synchronized (this) {
@@ -58,6 +63,7 @@
new RangingSession(executor, callbacks, mAdapter, sessionHandle);
mRangingSessionTable.put(sessionHandle, session);
try {
+ // TODO: Pass in the attributionSource to the service.
mAdapter.openRanging(sessionHandle, this, params);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
index 844bbbe..bed77e6 100644
--- a/core/java/android/uwb/UwbManager.java
+++ b/core/java/android/uwb/UwbManager.java
@@ -16,7 +16,7 @@
package android.uwb;
-import android.Manifest;
+import android.Manifest.permission;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -24,7 +24,9 @@
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.content.AttributionSource;
import android.content.Context;
+import android.content.ContextParams;
import android.os.CancellationSignal;
import android.os.IBinder;
import android.os.PersistableBundle;
@@ -47,9 +49,10 @@
@SystemApi
@SystemService(Context.UWB_SERVICE)
public final class UwbManager {
- private IUwbAdapter mUwbAdapter;
private static final String SERVICE_NAME = "uwb";
+ private final Context mContext;
+ private final IUwbAdapter mUwbAdapter;
private final AdapterStateListener mAdapterStateListener;
private final RangingManager mRangingManager;
@@ -116,9 +119,11 @@
/**
* Use <code>Context.getSystemService(UwbManager.class)</code> to get an instance.
*
+ * @param ctx Context of the client.
* @param adapter an instance of an {@link android.uwb.IUwbAdapter}
*/
- private UwbManager(IUwbAdapter adapter) {
+ private UwbManager(@NonNull Context ctx, @NonNull IUwbAdapter adapter) {
+ mContext = ctx;
mUwbAdapter = adapter;
mAdapterStateListener = new AdapterStateListener(adapter);
mRangingManager = new RangingManager(adapter);
@@ -127,7 +132,7 @@
/**
* @hide
*/
- public static UwbManager getInstance() {
+ public static UwbManager getInstance(@NonNull Context ctx) {
IBinder b = ServiceManager.getService(SERVICE_NAME);
if (b == null) {
return null;
@@ -138,7 +143,7 @@
return null;
}
- return new UwbManager(adapter);
+ return new UwbManager(ctx, adapter);
}
/**
@@ -153,7 +158,7 @@
* @param executor an {@link Executor} to execute given callback
* @param callback user implementation of the {@link AdapterStateCallback}
*/
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
+ @RequiresPermission(permission.UWB_PRIVILEGED)
public void registerAdapterStateCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull AdapterStateCallback callback) {
mAdapterStateListener.register(executor, callback);
@@ -168,7 +173,7 @@
*
* @param callback user implementation of the {@link AdapterStateCallback}
*/
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
+ @RequiresPermission(permission.UWB_PRIVILEGED)
public void unregisterAdapterStateCallback(@NonNull AdapterStateCallback callback) {
mAdapterStateListener.unregister(callback);
}
@@ -182,7 +187,7 @@
* @return {@link PersistableBundle} of the device's supported UWB protocols and parameters
*/
@NonNull
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
+ @RequiresPermission(permission.UWB_PRIVILEGED)
public PersistableBundle getSpecificationInfo() {
try {
return mUwbAdapter.getSpecificationInfo();
@@ -199,7 +204,7 @@
* @return the timestamp resolution in nanoseconds
*/
@SuppressLint("MethodNameUnits")
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
+ @RequiresPermission(permission.UWB_PRIVILEGED)
public long elapsedRealtimeResolutionNanos() {
try {
return mUwbAdapter.getTimestampResolutionNanos();
@@ -235,10 +240,14 @@
* {@link RangingSession.Callback#onOpened(RangingSession)}.
*/
@NonNull
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
+ @RequiresPermission(allOf = {
+ permission.UWB_PRIVILEGED,
+ permission.UWB_RANGING
+ })
public CancellationSignal openRangingSession(@NonNull PersistableBundle parameters,
@NonNull @CallbackExecutor Executor executor,
@NonNull RangingSession.Callback callbacks) {
- return mRangingManager.openSession(parameters, executor, callbacks);
+ return mRangingManager.openSession(
+ mContext.getAttributionSource(), parameters, executor, callbacks);
}
}
diff --git a/core/java/android/view/HapticFeedbackConstants.java b/core/java/android/view/HapticFeedbackConstants.java
index c62e9346..9f63500 100644
--- a/core/java/android/view/HapticFeedbackConstants.java
+++ b/core/java/android/view/HapticFeedbackConstants.java
@@ -129,6 +129,12 @@
public static final int SAFE_MODE_ENABLED = 10001;
/**
+ * Invocation of the voice assistant via hardware button.
+ * @hide
+ */
+ public static final int ASSISTANT_BUTTON = 10002;
+
+ /**
* Flag for {@link View#performHapticFeedback(int, int)
* View.performHapticFeedback(int, int)}: Ignore the setting in the
* view for whether to perform haptic feedback, do it always.
diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java
index 3d1c8ff..f487c6c 100644
--- a/core/java/android/view/InsetsState.java
+++ b/core/java/android/view/InsetsState.java
@@ -34,6 +34,7 @@
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.WindowConfiguration;
import android.graphics.Insets;
@@ -808,7 +809,7 @@
dest.writeTypedObject(mRoundedCorners, flags);
}
- public static final @android.annotation.NonNull Creator<InsetsState> CREATOR = new Creator<InsetsState>() {
+ public static final @NonNull Creator<InsetsState> CREATOR = new Creator<InsetsState>() {
public InsetsState createFromParcel(Parcel in) {
return new InsetsState(in);
@@ -842,5 +843,16 @@
+ ", mSources= { " + joiner
+ " }";
}
+
+ public @NonNull String toSourceVisibilityString() {
+ StringJoiner joiner = new StringJoiner(", ");
+ for (int i = 0; i < SIZE; i++) {
+ InsetsSource source = mSources[i];
+ if (source != null) {
+ joiner.add(typeToString(i) + ": " + (source.isVisible() ? "visible" : "invisible"));
+ }
+ }
+ return joiner.toString();
+ }
}
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 4a1d685..cdf1e46 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -59,6 +59,10 @@
per-file ViewRootImpl.java = file:/services/core/java/com/android/server/wm/OWNERS
per-file ViewRootImpl.java = file:/core/java/android/view/inputmethod/OWNERS
per-file AccessibilityInteractionController.java = file:/services/accessibility/OWNERS
+per-file OnReceiveContentListener.java = file:/core/java/android/service/autofill/OWNERS
+per-file OnReceiveContentListener.java = file:/core/java/android/widget/OWNERS
+per-file ContentInfo.java = file:/core/java/android/service/autofill/OWNERS
+per-file ContentInfo.java = file:/core/java/android/widget/OWNERS
# WindowManager
per-file DisplayCutout.aidl = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/core/java/android/view/SurfaceControlHdrLayerInfoListener.java b/core/java/android/view/SurfaceControlHdrLayerInfoListener.java
new file mode 100644
index 0000000..13d68d0
--- /dev/null
+++ b/core/java/android/view/SurfaceControlHdrLayerInfoListener.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2021 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.view;
+
+import android.annotation.RequiresPermission;
+import android.os.IBinder;
+import android.util.ArrayMap;
+
+import libcore.util.NativeAllocationRegistry;
+
+import java.util.Objects;
+
+/**
+ * Allows for the monitoring of layers with HDR content
+ *
+ * @hide */
+public abstract class SurfaceControlHdrLayerInfoListener {
+ private static final NativeAllocationRegistry sRegistry =
+ NativeAllocationRegistry.createMalloced(
+ SurfaceControlHdrLayerInfoListener.class.getClassLoader(), nGetDestructor());
+
+ /**
+ * Callback when the HDR information about the given display has changed
+ *
+ * @param displayToken The display this callback is about
+ * @param numberOfHdrLayers How many HDR layers are visible on the display
+ * @param maxW The width of the HDR layer with the largest area
+ * @param maxH The height of the HDR layer with the largest area
+ * @param flags Additional metadata flags, currently always 0
+ * TODO(b/182312559): Add some flags
+ *
+ * @hide */
+ public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
+ int maxW, int maxH, int flags);
+
+ /**
+ * Registers this as an HDR info listener on the provided display
+ * @param displayToken
+ */
+ @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS)
+ public void register(IBinder displayToken) {
+ Objects.requireNonNull(displayToken);
+ synchronized (this) {
+ if (mRegisteredListeners.containsKey(displayToken)) {
+ return;
+ }
+ long nativePtr = nRegister(displayToken);
+ Runnable destructor = sRegistry.registerNativeAllocation(this, nativePtr);
+ mRegisteredListeners.put(displayToken, destructor);
+ }
+ }
+
+ /**
+ * Unregisters this as an HDR info listener on the provided display
+ * @param displayToken
+ */
+ @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS)
+ public void unregister(IBinder displayToken) {
+ Objects.requireNonNull(displayToken);
+ final Runnable destructor;
+ synchronized (this) {
+ destructor = mRegisteredListeners.remove(displayToken);
+ }
+ if (destructor != null) {
+ destructor.run();
+ }
+ }
+
+ /**
+ * Unregisters this on all previously registered displays
+ */
+ @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS)
+ public void unregisterAll() {
+ final ArrayMap<IBinder, Runnable> toDestroy;
+ synchronized (this) {
+ toDestroy = mRegisteredListeners;
+ mRegisteredListeners = new ArrayMap<>();
+ }
+ for (Runnable destructor : toDestroy.values()) {
+ destructor.run();
+ }
+ }
+
+ private ArrayMap<IBinder, Runnable> mRegisteredListeners = new ArrayMap<>();
+
+ private static native long nGetDestructor();
+ private native long nRegister(IBinder displayToken);
+}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e2cf962..0df26b2 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1193,8 +1193,7 @@
Looper.myLooper());
if (mAttachInfo.mThreadedRenderer != null) {
- InputMetricsListener listener =
- new InputMetricsListener(mInputEventReceiver);
+ InputMetricsListener listener = new InputMetricsListener();
mHardwareRendererObserver = new HardwareRendererObserver(
listener, listener.data, mHandler, true /*waitForPresentTime*/);
mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver);
@@ -1390,6 +1389,9 @@
if (mAttachInfo.mThreadedRenderer != null) {
mAttachInfo.mHardwareAccelerated =
mAttachInfo.mHardwareAccelerationRequested = true;
+ if (mHardwareRendererObserver != null) {
+ mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver);
+ }
}
}
}
@@ -8075,6 +8077,9 @@
ThreadedRenderer hardwareRenderer = mAttachInfo.mThreadedRenderer;
if (hardwareRenderer != null) {
+ if (mHardwareRendererObserver != null) {
+ hardwareRenderer.removeObserver(mHardwareRendererObserver);
+ }
if (mView != null) {
hardwareRenderer.destroyHardwareResources(mView);
}
@@ -8576,18 +8581,12 @@
super.dispose();
}
}
- WindowInputEventReceiver mInputEventReceiver;
+ private WindowInputEventReceiver mInputEventReceiver;
final class InputMetricsListener
implements HardwareRendererObserver.OnFrameMetricsAvailableListener {
public long[] data = new long[FrameMetrics.Index.FRAME_STATS_COUNT];
- private InputEventReceiver mReceiver;
-
- InputMetricsListener(InputEventReceiver receiver) {
- mReceiver = receiver;
- }
-
@Override
public void onFrameMetricsAvailable(int dropCountSinceLastInvocation) {
final int inputEventId = (int) data[FrameMetrics.Index.INPUT_EVENT_ID];
@@ -8601,7 +8600,10 @@
return;
}
final long gpuCompletedTime = data[FrameMetrics.Index.GPU_COMPLETED];
- mReceiver.reportTimeline(inputEventId, gpuCompletedTime, presentTime);
+ if (mInputEventReceiver == null) {
+ return;
+ }
+ mInputEventReceiver.reportTimeline(inputEventId, gpuCompletedTime, presentTime);
}
}
HardwareRendererObserver mHardwareRendererObserver;
@@ -10204,9 +10206,6 @@
if (useBLAST() && mBlastBufferQueue != null) {
mBlastBufferQueue.mergeWithNextTransaction(transaction, frameNumber);
- } else {
- transaction.deferTransactionUntil(surfaceControl, surfaceControl, frameNumber);
- transaction.apply();
}
}
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index f63749b..e641577 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
+import android.content.Context;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -39,6 +40,7 @@
import com.android.internal.util.ArrayUtils;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
@@ -83,6 +85,8 @@
public static final int NO_ID = -1;
+ public static final String CALL_STACK = "call_stack";
+
private static final String LOG_TAG = "AccessibilityInteractionClient";
private static final boolean DEBUG = false;
@@ -113,7 +117,10 @@
private final Object mInstanceLock = new Object();
+ private final AccessibilityManager mAccessibilityManager;
+
private volatile int mInteractionId = -1;
+ private volatile int mCallingUid = Process.INVALID_UID;
private AccessibilityNodeInfo mFindAccessibilityNodeInfoResult;
@@ -152,6 +159,37 @@
}
/**
+ * @return The client for the current thread.
+ */
+ public static AccessibilityInteractionClient getInstance(Context context) {
+ final long threadId = Thread.currentThread().getId();
+ if (context != null) {
+ return getInstanceForThread(threadId, context);
+ }
+ return getInstanceForThread(threadId);
+ }
+
+ /**
+ * <strong>Note:</strong> We keep one instance per interrogating thread since
+ * the instance contains state which can lead to undesired thread interleavings.
+ * We do not have a thread local variable since other threads should be able to
+ * look up the correct client knowing a thread id. See ViewRootImpl for details.
+ *
+ * @return The client for a given <code>threadId</code>.
+ */
+ public static AccessibilityInteractionClient getInstanceForThread(
+ long threadId, Context context) {
+ synchronized (sStaticLock) {
+ AccessibilityInteractionClient client = sClients.get(threadId);
+ if (client == null) {
+ client = new AccessibilityInteractionClient(context);
+ sClients.put(threadId, client);
+ }
+ return client;
+ }
+ }
+
+ /**
* Gets a cached accessibility service connection.
*
* @param connectionId The connection id.
@@ -197,6 +235,11 @@
private AccessibilityInteractionClient() {
/* reducing constructor visibility */
+ mAccessibilityManager = null;
+ }
+
+ private AccessibilityInteractionClient(Context context) {
+ mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
}
/**
@@ -453,6 +496,15 @@
if (packageNames != null) {
List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
interactionId);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "findAccessibilityNodeInfoByAccessibilityId",
+ "InteractionId:" + interactionId + ";Result: " + infos
+ + ";connectionId=" + connectionId + ";accessibilityWindowId="
+ + accessibilityWindowId + ";accessibilityNodeId="
+ + accessibilityNodeId + ";bypassCache=" + bypassCache
+ + ";prefetchFlags=" + prefetchFlags + ";arguments=" + arguments);
+ }
finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
bypassCache, packageNames);
if (infos != null && !infos.isEmpty()) {
@@ -514,6 +566,14 @@
if (packageNames != null) {
List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
interactionId);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "findAccessibilityNodeInfosByViewId", "InteractionId="
+ + interactionId + ":Result: " + infos + ";connectionId="
+ + connectionId + ";accessibilityWindowId=" + accessibilityWindowId
+ + ";accessibilityNodeId=" + accessibilityNodeId + ";viewId="
+ + viewId);
+ }
if (infos != null) {
finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
false, packageNames);
@@ -568,6 +628,13 @@
if (packageNames != null) {
List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
interactionId);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "findAccessibilityNodeInfosByText", "InteractionId="
+ + interactionId + ":Result: " + infos + ";connectionId="
+ + connectionId + ";accessibilityWindowId=" + accessibilityWindowId
+ + ";accessibilityNodeId=" + accessibilityNodeId + ";text=" + text);
+ }
if (infos != null) {
finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
false, packageNames);
@@ -621,6 +688,14 @@
if (packageNames != null) {
AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear(
interactionId);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "findFocus", "InteractionId=" + interactionId
+ + ":Result: " + info + ";connectionId=" + connectionId
+ + ";accessibilityWindowId=" + accessibilityWindowId
+ + ";accessibilityNodeId=" + accessibilityNodeId + ";focusType="
+ + focusType);
+ }
finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames);
return info;
}
@@ -671,6 +746,14 @@
AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear(
interactionId);
finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "focusSearch", "InteractionId=" + interactionId
+ + ":Result: " + info + ";connectionId=" + connectionId
+ + ";accessibilityWindowId=" + accessibilityWindowId
+ + ";accessibilityNodeId=" + accessibilityNodeId + ";direction="
+ + direction);
+ }
return info;
}
} else {
@@ -716,7 +799,17 @@
}
if (success) {
- return getPerformAccessibilityActionResultAndClear(interactionId);
+ final boolean result =
+ getPerformAccessibilityActionResultAndClear(interactionId);
+ if (mAccessibilityManager != null
+ && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+ logTrace(connection, "performAccessibilityAction", "InteractionId="
+ + interactionId + ":Result: " + result + ";connectionId="
+ + connectionId + ";accessibilityWindowId=" + accessibilityWindowId
+ + ";accessibilityNodeId=" + accessibilityNodeId + ";action="
+ + action + ";arguments=" + arguments);
+ }
+ return result;
}
} else {
if (DEBUG) {
@@ -774,6 +867,7 @@
if (interactionId > mInteractionId) {
mFindAccessibilityNodeInfoResult = info;
mInteractionId = interactionId;
+ mCallingUid = Binder.getCallingUid();
}
mInstanceLock.notifyAll();
}
@@ -823,6 +917,7 @@
mFindAccessibilityNodeInfosResult = Collections.emptyList();
}
mInteractionId = interactionId;
+ mCallingUid = Binder.getCallingUid();
}
mInstanceLock.notifyAll();
}
@@ -851,6 +946,7 @@
if (interactionId > mInteractionId) {
mPerformAccessibilityActionResult = succeeded;
mInteractionId = interactionId;
+ mCallingUid = Binder.getCallingUid();
}
mInstanceLock.notifyAll();
}
@@ -1059,4 +1155,19 @@
}
return true;
}
+
+ private void logTrace(
+ IAccessibilityServiceConnection connection, String method, String params) {
+ try {
+ Bundle b = new Bundle();
+ ArrayList<StackTraceElement> callStack = new ArrayList<StackTraceElement>(
+ Arrays.asList(Thread.currentThread().getStackTrace()));
+ b.putSerializable(CALL_STACK, callStack);
+ connection.logTrace(SystemClock.elapsedRealtimeNanos(),
+ LOG_TAG + ".callback for " + method, params, Process.myPid(),
+ Thread.currentThread().getId(), mCallingUid, b);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Failed to log trace. " + e);
+ }
+ }
}
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 56dcd59..fc9e5e2 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -111,6 +111,9 @@
public static final int STATE_FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00000010;
/** @hide */
+ public static final int STATE_FLAG_ACCESSIBILITY_TRACING_ENABLED = 0x00000020;
+
+ /** @hide */
public static final int DALTONIZER_DISABLED = -1;
/** @hide */
@@ -232,6 +235,9 @@
@UnsupportedAppUsage(trackingBug = 123768939L)
boolean mIsHighTextContrastEnabled;
+ // Whether accessibility tracing is enabled or not
+ boolean mIsAccessibilityTracingEnabled = false;
+
AccessibilityPolicy mAccessibilityPolicy;
private int mPerformingAction = 0;
@@ -1004,6 +1010,17 @@
}
/**
+ * Gets accessibility tracing enabled state.
+ *
+ * @hide
+ */
+ public boolean isAccessibilityTracingEnabled() {
+ synchronized (mLock) {
+ return mIsAccessibilityTracingEnabled;
+ }
+ }
+
+ /**
* Get the preparers that are registered for an accessibility ID
*
* @param id The ID of interest
@@ -1197,6 +1214,8 @@
(stateFlags & STATE_FLAG_TOUCH_EXPLORATION_ENABLED) != 0;
final boolean highTextContrastEnabled =
(stateFlags & STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED) != 0;
+ final boolean accessibilityTracingEnabled =
+ (stateFlags & STATE_FLAG_ACCESSIBILITY_TRACING_ENABLED) != 0;
final boolean wasEnabled = isEnabled();
final boolean wasTouchExplorationEnabled = mIsTouchExplorationEnabled;
@@ -1218,6 +1237,8 @@
if (wasHighTextContrastEnabled != highTextContrastEnabled) {
notifyHighTextContrastStateChanged();
}
+
+ updateAccessibilityTracingState(accessibilityTracingEnabled);
}
/**
@@ -1675,6 +1696,15 @@
}
/**
+ * Update mIsAccessibilityTracingEnabled.
+ */
+ private void updateAccessibilityTracingState(boolean enabled) {
+ synchronized (mLock) {
+ mIsAccessibilityTracingEnabled = enabled;
+ }
+ }
+
+ /**
* Update interactive and non-interactive UI timeout.
*
* @param uiTimeout A pair of {@code int}s. First integer for interactive one, and second
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index 1951194..ae426d2 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -626,20 +626,31 @@
// assume rotations of increments of 90 degrees
float x = mTmpPoints[10] - mTmpPoints[8];
float width = right - left;
- float vecX = dampStretchVector(Math.max(-1f, Math.min(1f, x / width)));
+ float vecX = 0f;
+ if (width > 0) {
+ vecX = dampStretchVector(Math.max(-1f, Math.min(1f, x / width)));
+ }
+
float y = mTmpPoints[11] - mTmpPoints[9];
float height = bottom - top;
- float vecY = dampStretchVector(Math.max(-1f, Math.min(1f, y / height)));
- renderNode.stretch(
- left,
- top,
- right,
- bottom,
- vecX,
- vecY,
- mWidth,
- mHeight
- );
+ float vecY = 0f;
+ if (height > 0) {
+ vecY = dampStretchVector(Math.max(-1f, Math.min(1f, y / height)));
+ }
+
+ boolean hasStretchVectors = Float.compare(vecX, 0) != 0 || Float.compare(vecY, 0) != 0;
+ if (right > left && bottom > top && mWidth > 0 && mHeight > 0 && hasStretchVectors) {
+ renderNode.stretch(
+ left,
+ top,
+ right,
+ bottom,
+ vecX,
+ vecY,
+ mWidth,
+ mHeight
+ );
+ }
} else {
// This is TYPE_STRETCH and drawing into a Canvas that isn't a Recording Canvas,
// so no effect can be shown. Just end the effect.
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 957e416..6bf4645 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -34,7 +34,7 @@
interface IBatteryStats {
// These first methods are also called by native code, so must
- // be kept in sync with frameworks/native/libs/binder/include/binder/IBatteryStats.h
+ // be kept in sync with frameworks/native/libs/binder/include_batterystats/batterystats/IBatteryStats.h
void noteStartSensor(int uid, int sensor);
void noteStopSensor(int uid, int sensor);
void noteStartVideo(int uid);
diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
index 586607e..2f49582 100644
--- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
+++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
@@ -44,14 +44,15 @@
@Override
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
+ final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(measuredEnergyUC, query);
final long durationMs = calculateDuration(batteryStats, rawRealtimeUs,
BatteryStats.STATS_SINCE_CHARGED);
- final double powerMah = getMeasuredOrEstimatedPower(
- batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(),
- mPowerEstimator, durationMs, query.shouldForceUsePowerProfileModel());
+ final double powerMah = getMeasuredOrEstimatedPower(powerModel,
+ measuredEnergyUC, mPowerEstimator, durationMs);
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah)
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah, powerModel)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs);
}
@@ -64,10 +65,12 @@
@Override
public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
+ final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC();
final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType);
- final double powerMah = getMeasuredOrEstimatedPower(
+ final int powerModel = getPowerModel(measuredEnergyUC);
+ final double powerMah = getMeasuredOrEstimatedPower(powerModel,
batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(),
- mPowerEstimator, durationMs, false);
+ mPowerEstimator, durationMs);
if (powerMah > 0) {
BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0);
bs.usagePowerMah = powerMah;
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index b0920b0..ac72d29 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -41,7 +41,6 @@
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
-import android.os.BatteryProperty;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Build;
@@ -58,7 +57,6 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.WorkSource;
import android.os.WorkSource.WorkChain;
@@ -150,14 +148,6 @@
public class BatteryStatsImpl extends BatteryStats {
private static final String TAG = "BatteryStatsImpl";
private static final boolean DEBUG = false;
-
- // TODO(b/169376495): STOPSHIP if true
- private static final boolean DEBUG_FOREGROUND_STATS = true;
-
- private static final boolean ENABLE_FOREGROUND_STATS_COLLECTION =
- DEBUG_FOREGROUND_STATS && SystemProperties.getBoolean(
- "debug.battery_foreground_stats_collection", false);
-
public static final boolean DEBUG_ENERGY = false;
private static final boolean DEBUG_ENERGY_CPU = DEBUG_ENERGY;
private static final boolean DEBUG_BINDER_STATS = false;
@@ -752,37 +742,6 @@
long mTrackRunningHistoryElapsedRealtimeMs = 0;
long mTrackRunningHistoryUptimeMs = 0;
- private static final int FOREGROUND_UID_INITIAL_CAPACITY = 10;
- private static final int INVALID_UID = -1;
-
- private final IntArray mForegroundUids = ENABLE_FOREGROUND_STATS_COLLECTION
- ? new IntArray(FOREGROUND_UID_INITIAL_CAPACITY) : null;
-
- // Last recorded battery energy capacity.
- // This is used for computing foregrund power per application.
- // See: PowerForUid below
- private long mLastBatteryEnergyCapacityNwh = 0;
-
- private static final class PowerForUid {
- public long energyNwh = 0;
- // Same as energyNwh, but not tracked for the first 2 minutes;
- public long filteredEnergyNwh = 0;
- public double totalHours = 0;
- public long baseTimeMs = 0;
-
- double computePower() {
- // units in nW
- return totalHours != 0 ? energyNwh / totalHours : -1.0;
- }
-
- double computeFilteredPower() {
- // units in nW
- return totalHours != 0 ? filteredEnergyNwh / totalHours : -1.0;
- }
- }
- private final HashMap<Integer, PowerForUid> mUidToPower = ENABLE_FOREGROUND_STATS_COLLECTION
- ? new HashMap<>() : null;
-
@NonNull
final BatteryStatsHistory mBatteryStatsHistory;
@@ -1094,7 +1053,6 @@
private int mNumConnectivityChange;
private int mBatteryVoltageMv = -1;
- private int mBatteryChargeUah = -1;
private int mEstimatedBatteryCapacityMah = -1;
private int mMinLearnedBatteryCapacityUah = -1;
@@ -4020,49 +3978,6 @@
// TODO(b/155216561): It is possible for isolated uids to be in a higher
// state than its parent uid. We should track the highest state within the union of host
// and isolated uids rather than only the parent uid.
-
-
- int uidState = mapToInternalProcessState(state);
-
- boolean isForeground = (uidState == Uid.PROCESS_STATE_TOP)
- || (uidState == Uid.PROCESS_STATE_FOREGROUND);
-
-
- if (ENABLE_FOREGROUND_STATS_COLLECTION) {
- boolean previouslyInForegrond = false;
- for (int i = 0; i < mForegroundUids.size(); i++) {
- if (mForegroundUids.get(i) == uid) {
- previouslyInForegrond = true;
- if (!isForeground) {
- // If we were previously in the foreground, remove the uid
- // from the foreground set and dirty the slot.
- mForegroundUids.set(i, INVALID_UID);
- final PowerForUid pfu =
- mUidToPower.computeIfAbsent(uid, unused -> new PowerForUid());
- pfu.baseTimeMs = 0;
- break;
- }
- }
- }
-
- if (!previouslyInForegrond && isForeground) {
- boolean addedToForeground = false;
- // Check if we have a free slot to clobber...
- for (int i = 0; i < mForegroundUids.size(); i++) {
- if (mForegroundUids.get(i) == INVALID_UID) {
- addedToForeground = true;
- mForegroundUids.set(i, uid);
- break;
- }
- }
-
- // ...if not, append to the end of the array.
- if (!addedToForeground) {
- mForegroundUids.add(uid);
- }
- }
- }
-
FrameworkStatsLog.write(FrameworkStatsLog.UID_PROCESS_STATE_CHANGED, uid,
ActivityManager.processStateAmToProto(state));
getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
@@ -13547,7 +13462,6 @@
doWrite = true;
resetAllStatsLocked(mSecUptime, mSecRealtime);
if (chargeUah > 0 && level > 0) {
- mBatteryChargeUah = chargeUah;
// Only use the reported coulomb charge value if it is supported and reported.
mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0));
}
@@ -13720,48 +13634,7 @@
startRecordingHistory(elapsedRealtimeMs, uptimeMs, true);
}
}
-
mBatteryVoltageMv = voltageMv;
-
- if (ENABLE_FOREGROUND_STATS_COLLECTION) {
- if (onBattery) {
- final long energyNwh = (voltageMv * (long) chargeUah);
- final long energyDelta = mLastBatteryEnergyCapacityNwh - energyNwh;
- for (int i = 0; i < mForegroundUids.size(); i++) {
- final int uid = mForegroundUids.get(i);
- if (uid == INVALID_UID) {
- continue;
- }
- final PowerForUid pfu = mUidToPower
- .computeIfAbsent(uid, unused -> new PowerForUid());
- if (pfu.baseTimeMs <= 0) {
- pfu.baseTimeMs = currentTimeMs;
- } else {
- // Check if mLastBatteryEnergyCapacityNwh > energyNwh,
- // to make sure we only count discharges
- if (energyDelta > 0) {
- pfu.energyNwh += energyDelta;
- // Convert from milliseconds to hours
- // 1000 ms per second * 3600 seconds per hour
- pfu.totalHours += ((double) (currentTimeMs - pfu.baseTimeMs)
- / (1.0 * 1000 * 60 * 60));
- // Now convert from 2 minutes to hours
- // 2 minutes = 1/30 of an hour
- if (pfu.totalHours > (2.0 / 60)) {
- pfu.filteredEnergyNwh += energyDelta;
- }
-
- }
- pfu.baseTimeMs = currentTimeMs;
- }
- }
- mLastBatteryEnergyCapacityNwh = energyNwh;
- } else if (onBattery != mOnBattery) {
- // Transition to onBattery = false
- mUidToPower.values().forEach(v -> v.baseTimeMs = 0);
- }
- }
-
mCurrentBatteryLevel = level;
if (mDischargePlugLevel < 0) {
mDischargePlugLevel = level;
@@ -16679,48 +16552,6 @@
}
public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) {
- if (ENABLE_FOREGROUND_STATS_COLLECTION) {
- long actualChargeUah = -1;
- long actualEnergyNwh = -1;
- try {
- IBatteryPropertiesRegistrar registrar =
- IBatteryPropertiesRegistrar.Stub.asInterface(
- ServiceManager.getService("batteryproperties"));
- if (registrar != null) {
- BatteryProperty prop = new BatteryProperty();
- if (registrar.getProperty(
- BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER, prop) == 0) {
- actualChargeUah = prop.getLong();
- }
- prop = new BatteryProperty();
- if (registrar.getProperty(
- BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER, prop) == 0) {
- actualEnergyNwh = prop.getLong();
- }
- }
- } catch (RemoteException e) {
- // Ignore.
- }
- pw.printf("ActualCharge (uAh): %d\n", (int) actualChargeUah);
- pw.printf("ActualEnergy (nWh): %d\n", actualEnergyNwh);
- pw.printf("mBatteryCharge (uAh): %d\n", mBatteryChargeUah);
- pw.printf("mBatteryVolts (mV): %d\n", mBatteryVoltageMv);
- pw.printf("est energy (nWh): %d\n", mBatteryVoltageMv * (long) mBatteryChargeUah);
- pw.printf("mEstimatedBatteryCapacity (mAh): %d\n", mEstimatedBatteryCapacityMah);
- pw.printf("mMinLearnedBatteryCapacity (uAh): %d\n", mMinLearnedBatteryCapacityUah);
- pw.printf("mMaxLearnedBatteryCapacity (uAh): %d\n", mMaxLearnedBatteryCapacityUah);
- pw.printf("est. capacity: %f\n",
- (float) actualChargeUah / (mEstimatedBatteryCapacityMah * 1000));
- pw.printf("mCurrentBatteryLevel: %d\n", mCurrentBatteryLevel);
- pw.println("Total Power per app:");
- mUidToPower.entrySet().forEach(e ->
- pw.printf("Uid: %d, Total watts (nW): %f\n",
- e.getKey(), e.getValue().computePower()));
- pw.println("Total Power per app after first 2 minutes initial launch:");
- mUidToPower.entrySet().forEach(e ->
- pw.printf("Uid: %d, Total watts (nW): %f\n",
- e.getKey(), e.getValue().computeFilteredPower()));
- }
if (DEBUG) {
pw.println("mOnBatteryTimeBase:");
mOnBatteryTimeBase.dump(pw, " ");
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index f8ae0c1..49c564b 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -132,9 +132,12 @@
// TODO(b/174186358): read extra time component number from configuration
final int customTimeComponentCount = 0;
- final BatteryUsageStats.Builder batteryUsageStatsBuilder =
- new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount)
- .setStatsStartTimestamp(mStats.getStartClockTime());
+ final boolean includePowerModels = (query.getFlags()
+ & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0;
+
+ final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
+ customPowerComponentCount, customTimeComponentCount, includePowerModels);
+ batteryUsageStatsBuilder.setStatsStartTimestamp(mStats.getStartClockTime());
SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
index 75a9813..a418dff 100644
--- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java
+++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
@@ -15,8 +15,6 @@
*/
package com.android.internal.os;
-import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;
-
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryStats.ControllerActivityCounter;
@@ -75,12 +73,13 @@
}
}
- final long measuredChargeUC = query.shouldForceUsePowerProfileModel() ?
- POWER_DATA_UNAVAILABLE : batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
+ final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(measuredChargeUC, query);
final ControllerActivityCounter activityCounter =
batteryStats.getBluetoothControllerActivity();
final long systemDurationMs = calculateDuration(activityCounter);
- final double systemPowerMah = calculatePowerMah(measuredChargeUC, activityCounter);
+ final double systemPowerMah =
+ calculatePowerMah(powerModel, measuredChargeUC, activityCounter);
// Subtract what the apps used, but clamp to 0.
final long systemComponentDurationMs = Math.max(0, systemDurationMs - total.durationMs);
@@ -92,23 +91,22 @@
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH,
systemComponentDurationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
- Math.max(systemPowerMah, total.powerMah))
+ Math.max(systemPowerMah, total.powerMah), powerModel)
.setPowerConsumedByApps(total.powerMah);
}
private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total,
BatteryUsageStatsQuery query) {
-
- final long measuredChargeUC = query.shouldForceUsePowerProfileModel() ?
- POWER_DATA_UNAVAILABLE :
+ final long measuredChargeUC =
app.getBatteryStatsUid().getBluetoothMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(measuredChargeUC, query);
final ControllerActivityCounter activityCounter =
app.getBatteryStatsUid().getBluetoothControllerActivity();
final long durationMs = calculateDuration(activityCounter);
- final double powerMah = calculatePowerMah(measuredChargeUC, activityCounter);
+ final double powerMah = calculatePowerMah(powerModel, measuredChargeUC, activityCounter);
app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, durationMs)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerMah);
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerMah, powerModel);
total.durationMs += durationMs;
total.powerMah += powerMah;
@@ -132,10 +130,12 @@
BatterySipper bs = new BatterySipper(BatterySipper.DrainType.BLUETOOTH, null, 0);
final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(measuredChargeUC);
final ControllerActivityCounter activityCounter =
batteryStats.getBluetoothControllerActivity();
final long systemDurationMs = calculateDuration(activityCounter);
- final double systemPowerMah = calculatePowerMah(measuredChargeUC, activityCounter);
+ final double systemPowerMah =
+ calculatePowerMah(powerModel, measuredChargeUC, activityCounter);
// Subtract what the apps used, but clamp to 0.
final double powerMah = Math.max(0, systemPowerMah - total.powerMah);
@@ -165,9 +165,10 @@
PowerAndDuration total) {
final long measuredChargeUC = u.getBluetoothMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(measuredChargeUC);
final ControllerActivityCounter activityCounter = u.getBluetoothControllerActivity();
final long durationMs = calculateDuration(activityCounter);
- final double powerMah = calculatePowerMah(measuredChargeUC, activityCounter);
+ final double powerMah = calculatePowerMah(powerModel, measuredChargeUC, activityCounter);
app.bluetoothRunningTimeMs = durationMs;
app.bluetoothPowerMah = powerMah;
@@ -189,10 +190,12 @@
}
/** Returns bluetooth power usage based on the best data available. */
- private double calculatePowerMah(long measuredChargeUC, ControllerActivityCounter counter) {
- if (measuredChargeUC != POWER_DATA_UNAVAILABLE) {
+ private double calculatePowerMah(@BatteryConsumer.PowerModel int powerModel,
+ long measuredChargeUC, ControllerActivityCounter counter) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
return uCtoMah(measuredChargeUC);
}
+
if (counter == null) {
return 0;
}
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index b15543a..4aafec5 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -91,10 +91,12 @@
private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
BatteryUsageStatsQuery query, Result result) {
- calculatePowerAndDuration(u, BatteryStats.STATS_SINCE_CHARGED,
- query.shouldForceUsePowerProfileModel(), result);
+ final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculatePowerAndDuration(u, powerModel, consumptionUC, BatteryStats.STATS_SINCE_CHARGED,
+ result);
- app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, result.powerMah)
+ app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, result.powerMah, powerModel)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, result.durationMs)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND,
result.durationFgMs)
@@ -114,7 +116,9 @@
}
private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, Result result) {
- calculatePowerAndDuration(u, statsType, false, result);
+ final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculatePowerAndDuration(u, powerModel, consumptionUC, statsType, result);
app.cpuPowerMah = result.powerMah;
app.cpuTimeMs = result.durationMs;
@@ -122,16 +126,20 @@
app.packageWithHighestDrain = result.packageWithHighestDrain;
}
- private void calculatePowerAndDuration(BatteryStats.Uid u, int statsType,
- boolean forceUsePowerProfileModel, Result result) {
+ private void calculatePowerAndDuration(BatteryStats.Uid u,
+ @BatteryConsumer.PowerModel int powerModel, long consumptionUC, int statsType,
+ Result result) {
long durationMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000;
final double powerMah;
- final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC();
- if (forceUsePowerProfileModel || consumptionUC == BatteryStats.POWER_DATA_UNAVAILABLE) {
- powerMah = calculateUidModeledPowerMah(u, statsType);
- } else {
- powerMah = uCtoMah(consumptionUC);
+ switch(powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ powerMah = uCtoMah(consumptionUC);
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ powerMah = calculateUidModeledPowerMah(u, statsType);
+ break;
}
if (DEBUG && (durationMs != 0 || powerMah != 0)) {
diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java
index 97c4fd8..0e0870d 100644
--- a/core/java/com/android/internal/os/GnssPowerCalculator.java
+++ b/core/java/com/android/internal/os/GnssPowerCalculator.java
@@ -52,28 +52,30 @@
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
- calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs, rawUptimeUs, query,
- averageGnssPowerMa);
+ final long consumptionUC =
+ app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculateApp(app, app.getBatteryStatsUid(), powerModel, rawRealtimeUs,
+ averageGnssPowerMa, consumptionUC);
}
}
private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
- long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query,
- double averageGnssPowerMa) {
+ @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs,
+ double averageGnssPowerMa, long measuredChargeUC) {
final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
-
- final long measuredChargeUC = u.getGnssMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable = !query.shouldForceUsePowerProfileModel()
- && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE;
-
final double powerMah;
- if (isMeasuredPowerAvailable) {
- powerMah = uCtoMah(measuredChargeUC);
- } else {
- powerMah = computePower(durationMs, averageGnssPowerMa);
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ powerMah = uCtoMah(measuredChargeUC);
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ powerMah = computePower(durationMs, averageGnssPowerMa);
}
+
app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS, durationMs)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah);
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah, powerModel);
}
@Override
@@ -83,24 +85,28 @@
for (int i = sippers.size() - 1; i >= 0; i--) {
final BatterySipper app = sippers.get(i);
if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(app, app.uidObj, rawRealtimeUs, statsType, averageGnssPowerMa, false);
+ final long consumptionUC =
+ app.uidObj.getGnssMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculateApp(app, app.uidObj, powerModel, rawRealtimeUs, averageGnssPowerMa,
+ consumptionUC);
}
}
}
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- int statsType, double averageGnssPowerMa, boolean shouldForceUsePowerProfileModel) {
+ private void calculateApp(BatterySipper app, BatteryStats.Uid u,
+ @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs,
+ double averageGnssPowerMa, long measuredChargeUC) {
final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
- final long measuredChargeUC = u.getGnssMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable = shouldForceUsePowerProfileModel
- && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE;
-
final double powerMah;
- if (isMeasuredPowerAvailable) {
- powerMah = uCtoMah(measuredChargeUC);
- } else {
- powerMah = computePower(durationMs, averageGnssPowerMa);
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ powerMah = uCtoMah(measuredChargeUC);
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ powerMah = computePower(durationMs, averageGnssPowerMa);
}
app.gpsTimeMs = durationMs;
diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
index f6ef30c..d441d45 100644
--- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
+++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
@@ -97,37 +97,41 @@
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
final BatteryStats.Uid uid = app.getBatteryStatsUid();
- calculateApp(app, uid, powerPerPacketMah, total,
- query.shouldForceUsePowerProfileModel());
+ calculateApp(app, uid, powerPerPacketMah, total, query);
}
- calculateRemaining(total, batteryStats, rawRealtimeUs,
- query.shouldForceUsePowerProfileModel());
+ final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC);
if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) {
builder.getOrCreateSystemBatteryConsumerBuilder(
- SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO)
+ SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO,
total.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
- total.remainingPowerMah + total.totalAppPowerMah)
+ total.remainingPowerMah + total.totalAppPowerMah,
+ powerModel)
.setPowerConsumedByApps(total.totalAppPowerMah);
}
}
private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
double powerPerPacketMah, PowerAndDuration total,
- boolean shouldForceUsePowerProfileModel) {
+ BatteryUsageStatsQuery query) {
final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED);
total.totalAppDurationMs += radioActiveDurationMs;
- final double powerMah = calculatePower(u, powerPerPacketMah, radioActiveDurationMs,
- shouldForceUsePowerProfileModel);
+ final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ final double powerMah = calculatePower(u, powerModel, powerPerPacketMah,
+ radioActiveDurationMs, consumptionUC);
total.totalAppPowerMah += powerMah;
app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO,
- radioActiveDurationMs)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah);
+ radioActiveDurationMs)
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah,
+ powerModel);
}
@Override
@@ -140,12 +144,14 @@
final BatterySipper app = sippers.get(i);
if (app.drainType == BatterySipper.DrainType.APP) {
final BatteryStats.Uid u = app.uidObj;
- calculateApp(app, u, statsType, mobilePowerPerPacket, total, false);
+ calculateApp(app, u, statsType, mobilePowerPerPacket, total);
}
}
BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0);
- calculateRemaining(total, batteryStats, rawRealtimeUs, false);
+ final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC);
if (total.remainingPowerMah != 0) {
if (total.signalDurationMs != 0) {
radio.noCoveragePercent =
@@ -162,12 +168,13 @@
}
private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType,
- double powerPerPacketMah, PowerAndDuration total,
- boolean shouldForceUsePowerProfileModel) {
+ double powerPerPacketMah, PowerAndDuration total) {
app.mobileActive = calculateDuration(u, statsType);
- app.mobileRadioPowerMah = calculatePower(u, powerPerPacketMah, app.mobileActive,
- shouldForceUsePowerProfileModel);
+ final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ app.mobileRadioPowerMah = calculatePower(u, powerModel, powerPerPacketMah, app.mobileActive,
+ consumptionUC);
total.totalAppDurationMs += app.mobileActive;
// Add cost of mobile traffic.
@@ -193,13 +200,9 @@
return u.getMobileRadioActiveTime(statsType) / 1000;
}
- private double calculatePower(BatteryStats.Uid u, double powerPerPacketMah,
- long radioActiveDurationMs, boolean shouldForceUsePowerProfileModel) {
-
- final long measuredChargeUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable = !shouldForceUsePowerProfileModel
- && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE;
- if (isMeasuredPowerAvailable) {
+ private double calculatePower(BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel,
+ double powerPerPacketMah, long radioActiveDurationMs, long measuredChargeUC) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
return uCtoMah(measuredChargeUC);
}
@@ -220,23 +223,20 @@
}
}
- private void calculateRemaining(MobileRadioPowerCalculator.PowerAndDuration total,
- BatteryStats batteryStats, long rawRealtimeUs,
- boolean shouldForceUsePowerProfileModel) {
+ private void calculateRemaining(PowerAndDuration total,
+ @BatteryConsumer.PowerModel int powerModel, BatteryStats batteryStats,
+ long rawRealtimeUs, long consumptionUC) {
long signalTimeMs = 0;
double powerMah = 0;
- final long measuredChargeUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable = !shouldForceUsePowerProfileModel
- && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE;
- if (isMeasuredPowerAvailable) {
- powerMah = uCtoMah(measuredChargeUC);
+ if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
+ powerMah = uCtoMah(consumptionUC);
}
for (int i = 0; i < NUM_SIGNAL_STRENGTH_LEVELS; i++) {
long strengthTimeMs = batteryStats.getPhoneSignalStrengthTime(i, rawRealtimeUs,
BatteryStats.STATS_SINCE_CHARGED) / 1000;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
final double p = calcIdlePowerAtSignalStrengthMah(strengthTimeMs, i);
if (DEBUG && p != 0) {
Log.d(TAG, "Cell strength #" + i + ": time=" + strengthTimeMs + " power="
@@ -256,7 +256,7 @@
BatteryStats.STATS_SINCE_CHARGED) / 1000;
long remainingActiveTimeMs = radioActiveTimeMs - total.totalAppDurationMs;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
final double p = calcScanTimePowerMah(scanningTimeMs);
if (DEBUG && p != 0) {
Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + formatCharge(
diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java
index 72385e2..d139b4f 100644
--- a/core/java/com/android/internal/os/PowerCalculator.java
+++ b/core/java/com/android/internal/os/PowerCalculator.java
@@ -15,6 +15,8 @@
*/
package com.android.internal.os;
+import android.annotation.NonNull;
+import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
@@ -114,20 +116,49 @@
public void reset() {
}
+ protected static @BatteryConsumer.PowerModel int getPowerModel(
+ long measuredEnergyUC, @NonNull BatteryUsageStatsQuery query) {
+ if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE
+ && !query.shouldForceUsePowerProfileModel()) {
+ return BatteryConsumer.POWER_MODEL_MEASURED_ENERGY;
+ }
+ return BatteryConsumer.POWER_MODEL_POWER_PROFILE;
+ }
+
+ protected static @BatteryConsumer.PowerModel int getPowerModel(long measuredEnergyUC) {
+ return measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE
+ ? BatteryConsumer.POWER_MODEL_MEASURED_ENERGY
+ : BatteryConsumer.POWER_MODEL_POWER_PROFILE;
+ }
+
/**
* Returns either the measured energy converted to mAh or a usage-based estimate.
*/
- protected static double getMeasuredOrEstimatedPower(long measuredEnergyUC,
- UsageBasedPowerEstimator powerEstimator, long durationMs,
- boolean forceUsePowerProfileModel) {
- if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE
- && !forceUsePowerProfileModel) {
- return uCtoMah(measuredEnergyUC);
+ protected static double getMeasuredOrEstimatedPower(@BatteryConsumer.PowerModel int powerModel,
+ long measuredEnergyUC, UsageBasedPowerEstimator powerEstimator, long durationMs) {
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ return uCtoMah(measuredEnergyUC);
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ return powerEstimator.calculatePower(durationMs);
}
- return powerEstimator.calculatePower(durationMs);
}
/**
+ * Returns either the measured energy converted to mAh or a usage-based estimate.
+ */
+ protected static double getMeasuredOrEstimatedPower(
+ long measuredEnergyUC, UsageBasedPowerEstimator powerEstimator, long durationMs) {
+ if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE) {
+ return uCtoMah(measuredEnergyUC);
+ } else {
+ return powerEstimator.calculatePower(durationMs);
+ }
+ }
+
+
+ /**
* Converts charge in mAh to string.
*/
public static String formatCharge(double power) {
diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java
index ad57444..0267def 100644
--- a/core/java/com/android/internal/os/ScreenPowerCalculator.java
+++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java
@@ -62,9 +62,10 @@
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
final PowerAndDuration totalPowerAndDuration = new PowerAndDuration();
- final boolean useEnergyData = calculateTotalDurationAndPower(totalPowerAndDuration,
- batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED,
- query.shouldForceUsePowerProfileModel());
+ final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats,
+ rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, consumptionUC);
double totalAppPower = 0;
@@ -73,29 +74,32 @@
// but the method depends on the data source.
final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders =
builder.getUidBatteryConsumerBuilders();
- if (useEnergyData) {
- final PowerAndDuration appPowerAndDuration = new PowerAndDuration();
- for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
- final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
- calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.getBatteryStatsUid(),
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ final PowerAndDuration appPowerAndDuration = new PowerAndDuration();
+ for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
+ final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
+ calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.getBatteryStatsUid(),
+ rawRealtimeUs);
+ app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN,
+ appPowerAndDuration.durationMs)
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
+ appPowerAndDuration.powerMah, powerModel);
+ totalAppPower += appPowerAndDuration.powerMah;
+ }
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration,
rawRealtimeUs);
- app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN,
- appPowerAndDuration.durationMs)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
- appPowerAndDuration.powerMah);
- totalAppPower += appPowerAndDuration.powerMah;
- }
- } else {
- smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration,
- rawRealtimeUs);
- totalAppPower = totalPowerAndDuration.powerMah;
+ totalAppPower = totalPowerAndDuration.powerMah;
}
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE,
totalPowerAndDuration.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE,
- Math.max(totalPowerAndDuration.powerMah, totalAppPower))
+ Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel)
.setPowerConsumedByApps(totalAppPower);
}
@@ -106,8 +110,10 @@
public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
final PowerAndDuration totalPowerAndDuration = new PowerAndDuration();
- final boolean useEnergyData = calculateTotalDurationAndPower(totalPowerAndDuration,
- batteryStats, rawRealtimeUs, statsType, false);
+ final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats,
+ rawRealtimeUs, statsType, consumptionUC);
if (totalPowerAndDuration.powerMah == 0) {
return;
}
@@ -121,41 +127,42 @@
// Now deal with each app's BatterySipper. The results are stored in the screenPowerMah
// field, which is considered smeared, but the method depends on the data source.
- if (useEnergyData) {
- final PowerAndDuration appPowerAndDuration = new PowerAndDuration();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj, rawRealtimeUs);
- app.screenPowerMah = appPowerAndDuration.powerMah;
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ final PowerAndDuration appPowerAndDuration = new PowerAndDuration();
+ for (int i = sippers.size() - 1; i >= 0; i--) {
+ final BatterySipper app = sippers.get(i);
+ if (app.drainType == BatterySipper.DrainType.APP) {
+ calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj,
+ rawRealtimeUs);
+ app.screenPowerMah = appPowerAndDuration.powerMah;
+ }
}
- }
- } else {
- smearScreenBatterySipper(sippers, bs, rawRealtimeUs);
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ smearScreenBatterySipper(sippers, bs, rawRealtimeUs);
}
}
/**
- * Stores duration and power information in totalPowerAndDuration and returns true if measured
- * energy data is available and should be used by the model.
+ * Stores duration and power information in totalPowerAndDuration.
*/
- private boolean calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration,
- BatteryStats batteryStats, long rawRealtimeUs, int statsType,
- boolean forceUsePowerProfileModel) {
+ private void calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration,
+ @BatteryConsumer.PowerModel int powerModel, BatteryStats batteryStats,
+ long rawRealtimeUs, int statsType, long consumptionUC) {
totalPowerAndDuration.durationMs = calculateDuration(batteryStats, rawRealtimeUs,
statsType);
- if (!forceUsePowerProfileModel) {
- final long chargeUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC();
- if (chargeUC != BatteryStats.POWER_DATA_UNAVAILABLE) {
- totalPowerAndDuration.powerMah = uCtoMah(chargeUC);
- return true;
- }
+ switch (powerModel) {
+ case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
+ totalPowerAndDuration.powerMah = uCtoMah(consumptionUC);
+ break;
+ case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
+ default:
+ totalPowerAndDuration.powerMah = calculateTotalPowerFromBrightness(batteryStats,
+ rawRealtimeUs, statsType, totalPowerAndDuration.durationMs);
}
-
- totalPowerAndDuration.powerMah = calculateTotalPowerFromBrightness(batteryStats,
- rawRealtimeUs, statsType, totalPowerAndDuration.durationMs);
- return false;
}
private void calculateAppUsingMeasuredEnergy(PowerAndDuration appPowerAndDuration,
@@ -245,7 +252,8 @@
final long durationMs = activityTimeArray.get(app.getUid(), 0);
final double powerMah = totalScreenPowerMah * durationMs / totalActivityTimeMs;
app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, durationMs)
- .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah);
+ .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah,
+ BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
}
}
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index d95506b..11219ec 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -15,8 +15,6 @@
*/
package com.android.internal.os;
-import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;
-
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
@@ -92,10 +90,12 @@
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
- calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), rawRealtimeUs,
- BatteryStats.STATS_SINCE_CHARGED,
- batteryStats.hasWifiActivityReporting(),
- query.shouldForceUsePowerProfileModel());
+ final long consumptionUC =
+ app.getBatteryStatsUid().getWifiMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel,
+ rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED,
+ batteryStats.hasWifiActivityReporting(), consumptionUC);
totalAppDurationMs += powerDurationAndTraffic.durationMs;
totalAppPowerMah += powerDurationAndTraffic.powerMah;
@@ -103,7 +103,7 @@
app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI,
powerDurationAndTraffic.durationMs);
app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
- powerDurationAndTraffic.powerMah);
+ powerDurationAndTraffic.powerMah, powerModel);
if (app.getUid() == Process.WIFI_UID) {
systemBatteryConsumerBuilder.addUidBatteryConsumer(app);
@@ -111,17 +111,17 @@
}
}
- calculateRemaining(powerDurationAndTraffic, batteryStats, rawRealtimeUs,
- BatteryStats.STATS_SINCE_CHARGED,
- batteryStats.hasWifiActivityReporting(),
- query.shouldForceUsePowerProfileModel(),
- totalAppDurationMs, totalAppPowerMah);
+ final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC, query);
+ calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs,
+ BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(),
+ totalAppDurationMs, totalAppPowerMah, consumptionUC);
systemBatteryConsumerBuilder
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI,
powerDurationAndTraffic.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
- totalAppPowerMah + powerDurationAndTraffic.powerMah)
+ totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel)
.setPowerConsumedByApps(totalAppPowerMah);
}
@@ -144,8 +144,11 @@
for (int i = sippers.size() - 1; i >= 0; i--) {
final BatterySipper app = sippers.get(i);
if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(powerDurationAndTraffic, app.uidObj, rawRealtimeUs, statsType,
- batteryStats.hasWifiActivityReporting(), /* force use power model*/ false);
+ final long consumptionUC =
+ app.uidObj.getWifiMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculateApp(powerDurationAndTraffic, app.uidObj, powerModel, rawRealtimeUs,
+ statsType, batteryStats.hasWifiActivityReporting(), consumptionUC);
totalAppDurationMs += powerDurationAndTraffic.durationMs;
totalAppPowerMah += powerDurationAndTraffic.powerMah;
@@ -164,9 +167,11 @@
}
}
- calculateRemaining(powerDurationAndTraffic, batteryStats, rawRealtimeUs, statsType,
- batteryStats.hasWifiActivityReporting(), /* force use power model*/ false,
- totalAppDurationMs, totalAppPowerMah);
+ final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC();
+ final int powerModel = getPowerModel(consumptionUC);
+ calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs,
+ statsType, batteryStats.hasWifiActivityReporting(), totalAppDurationMs,
+ totalAppPowerMah, consumptionUC);
bs.wifiRunningTimeMs += powerDurationAndTraffic.durationMs;
bs.wifiPowerMah += powerDurationAndTraffic.powerMah;
@@ -176,9 +181,10 @@
}
}
- private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic, BatteryStats.Uid u,
- long rawRealtimeUs, int statsType,
- boolean hasWifiActivityReporting, boolean shouldForceUsePowerProfileModel) {
+ private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic,
+ BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel,
+ long rawRealtimeUs, int statsType, boolean hasWifiActivityReporting,
+ long consumptionUC) {
powerDurationAndTraffic.wifiRxPackets = u.getNetworkActivityPackets(
BatteryStats.NETWORK_WIFI_RX_DATA,
@@ -193,11 +199,8 @@
BatteryStats.NETWORK_WIFI_TX_DATA,
statsType);
- final long measuredChargeUC = u.getWifiMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable
- = !shouldForceUsePowerProfileModel && measuredChargeUC != POWER_DATA_UNAVAILABLE;
- if (isMeasuredPowerAvailable) {
- powerDurationAndTraffic.powerMah = uCtoMah(measuredChargeUC);
+ if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
+ powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC);
}
if (hasWifiActivityReporting && mHasWifiPowerController) {
@@ -208,7 +211,7 @@
final long rxTime = counter.getRxTimeCounter().getCountLocked(statsType);
powerDurationAndTraffic.durationMs = idleTime + rxTime + txTime;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
powerDurationAndTraffic.powerMah
= calcPowerFromControllerDataMah(rxTime, txTime, idleTime);
}
@@ -223,7 +226,7 @@
final long wifiRunningTime = u.getWifiRunningTime(rawRealtimeUs, statsType) / 1000;
powerDurationAndTraffic.durationMs = wifiRunningTime;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
final long wifiScanTimeMs = u.getWifiScanTime(rawRealtimeUs, statsType) / 1000;
long batchTimeMs = 0;
for (int bin = 0; bin < BatteryStats.Uid.NUM_WIFI_BATCHED_SCAN_BINS; bin++) {
@@ -243,19 +246,17 @@
}
private void calculateRemaining(PowerDurationAndTraffic powerDurationAndTraffic,
- BatteryStats stats, long rawRealtimeUs, int statsType,
- boolean hasWifiActivityReporting, boolean shouldForceUsePowerProfileModel,
- long totalAppDurationMs, double totalAppPowerMah) {
+ @BatteryConsumer.PowerModel int powerModel, BatteryStats stats, long rawRealtimeUs,
+ int statsType, boolean hasWifiActivityReporting, long totalAppDurationMs,
+ double totalAppPowerMah, long consumptionUC) {
long totalDurationMs;
double totalPowerMah = 0;
- final long measuredChargeUC = stats.getWifiMeasuredBatteryConsumptionUC();
- final boolean isMeasuredPowerAvailable
- = !shouldForceUsePowerProfileModel && measuredChargeUC != POWER_DATA_UNAVAILABLE;
- if (isMeasuredPowerAvailable) {
- totalPowerMah = uCtoMah(measuredChargeUC);
+ if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
+ totalPowerMah = uCtoMah(consumptionUC);
}
+
if (hasWifiActivityReporting && mHasWifiPowerController) {
final BatteryStats.ControllerActivityCounter counter =
stats.getWifiControllerActivity();
@@ -266,7 +267,7 @@
totalDurationMs = idleTimeMs + rxTimeMs + txTimeMs;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
totalPowerMah = counter.getPowerCounter().getCountLocked(statsType)
/ (double) (1000 * 60 * 60);
if (totalPowerMah == 0) {
@@ -276,7 +277,7 @@
}
} else {
totalDurationMs = stats.getGlobalWifiRunningTime(rawRealtimeUs, statsType) / 1000;
- if (!isMeasuredPowerAvailable) {
+ if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
totalPowerMah = calcGlobalPowerWithoutControllerDataMah(totalDurationMs);
}
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index f907e25..361b836 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -41,6 +41,7 @@
import android.os.ZygoteProcess;
import android.os.storage.StorageManager;
import android.provider.DeviceConfig;
+import android.security.keystore2.AndroidKeyStoreProvider;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -216,10 +217,8 @@
long startTime = SystemClock.uptimeMillis();
Trace.traceBegin(
Trace.TRACE_TAG_DALVIK, "Starting installation of AndroidKeyStoreProvider");
- // AndroidKeyStoreProvider.install() manipulates the list of JCA providers to insert
- // preferred providers. Note this is not done via security.properties as the JCA providers
- // are not on the classpath in the case of, for example, raw dalvikvm runtimes.
- android.security.keystore2.AndroidKeyStoreProvider.install();
+
+ AndroidKeyStoreProvider.install();
Log.i(TAG, "Installed AndroidKeyStoreProvider in "
+ (SystemClock.uptimeMillis() - startTime) + "ms.");
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index f71b314..4d2266b 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -547,7 +547,7 @@
try {
ZygoteConnection connection = peers.get(pollIndex);
boolean multipleForksOK = !isUsapPoolEnabled()
- && ZygoteHooks.indefiniteThreadSuspensionOK();
+ && ZygoteHooks.isIndefiniteThreadSuspensionSafe();
final Runnable command =
connection.processCommand(this, multipleForksOK);
diff --git a/core/java/com/android/internal/widget/RecyclerView.java b/core/java/com/android/internal/widget/RecyclerView.java
index 17ce75e..9ed5eb1 100644
--- a/core/java/com/android/internal/widget/RecyclerView.java
+++ b/core/java/com/android/internal/widget/RecyclerView.java
@@ -2049,17 +2049,19 @@
}
if (!dispatchNestedPreFling(velocityX, velocityY)) {
- final View firstChild = mLayout.getChildAt(0);
- final View lastChild = mLayout.getChildAt(mLayout.getChildCount() - 1);
boolean consumed = false;
- if (velocityY < 0) {
- consumed = getChildAdapterPosition(firstChild) > 0
- || firstChild.getTop() < getPaddingTop();
- }
+ if (mLayout.getChildCount() > 0) {
+ final View firstChild = mLayout.getChildAt(0);
+ final View lastChild = mLayout.getChildAt(mLayout.getChildCount() - 1);
+ if (velocityY < 0) {
+ consumed = getChildAdapterPosition(firstChild) > 0
+ || firstChild.getTop() < getPaddingTop();
+ }
- if (velocityY > 0) {
- consumed = getChildAdapterPosition(lastChild) < mAdapter.getItemCount() - 1
- || lastChild.getBottom() > getHeight() - getPaddingBottom();
+ if (velocityY > 0) {
+ consumed = getChildAdapterPosition(lastChild) < mAdapter.getItemCount() - 1
+ || lastChild.getBottom() > getHeight() - getPaddingBottom();
+ }
}
dispatchNestedFling(velocityX, velocityY, consumed);
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index de85ff9..1f805c9 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -70,7 +70,10 @@
"libz",
],
- static_libs: ["libnativehelper_lazy", "libziparchive_for_incfs", ],
+ static_libs: [
+ "libnativehelper_lazy",
+ "libziparchive_for_incfs",
+ ],
export_include_dirs: [
".",
@@ -121,6 +124,7 @@
"android_view_Surface.cpp",
"android_view_SurfaceControl.cpp",
"android_view_SurfaceControlFpsListener.cpp",
+ "android_view_SurfaceControlHdrLayerInfoListener.cpp",
"android_graphics_BLASTBufferQueue.cpp",
"android_view_SurfaceSession.cpp",
"android_view_TextureView.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 6636b1f..916ecd6 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -122,6 +122,7 @@
extern int register_android_view_Surface(JNIEnv* env);
extern int register_android_view_SurfaceControl(JNIEnv* env);
extern int register_android_view_SurfaceControlFpsListener(JNIEnv* env);
+extern int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env);
extern int register_android_view_SurfaceSession(JNIEnv* env);
extern int register_android_view_CompositionSamplingListener(JNIEnv* env);
extern int register_android_view_TextureView(JNIEnv* env);
@@ -1515,6 +1516,7 @@
REG_JNI(register_android_view_Surface),
REG_JNI(register_android_view_SurfaceControl),
REG_JNI(register_android_view_SurfaceControlFpsListener),
+ REG_JNI(register_android_view_SurfaceControlHdrLayerInfoListener),
REG_JNI(register_android_view_SurfaceSession),
REG_JNI(register_android_view_CompositionSamplingListener),
REG_JNI(register_android_view_TextureView),
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 6f9a381..7c4c970 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -26,6 +26,7 @@
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
+#include <android/media/AudioVibratorInfo.h>
#include <audiomanager/AudioManager.h>
#include <media/AudioPolicy.h>
#include <media/AudioSystem.h>
@@ -176,10 +177,15 @@
jmethodID postRoutingUpdatedFromNative;
} gAudioPolicyEventHandlerMethods;
-static struct { jmethodID add; } gListMethods;
+jclass gListClass;
+static struct {
+ jmethodID add;
+ jmethodID get;
+ jmethodID size;
+} gListMethods;
static jclass gAudioDescriptorClass;
-static jmethodID gAudiODescriptorCstor;
+static jmethodID gAudioDescriptorCstor;
//
// JNI Initialization for OpenSLES routing
@@ -195,6 +201,13 @@
jclass gAudioProfileClass;
jmethodID gAudioProfileCstor;
+jclass gVibratorClass;
+static struct {
+ jmethodID getId;
+ jmethodID getResonantFrequency;
+ jmethodID getQFactor;
+} gVibratorMethods;
+
static Mutex gLock;
enum AudioError {
@@ -1351,7 +1364,7 @@
reinterpret_cast<const jbyte *>(extraAudioDescriptor.descriptor));
jAudioDescriptor =
ScopedLocalRef<jobject>(env,
- env->NewObject(gAudioDescriptorClass, gAudiODescriptorCstor,
+ env->NewObject(gAudioDescriptorClass, gAudioDescriptorCstor,
standard, encapsulationType,
jDescriptor.get()));
env->CallBooleanMethod(jAudioDescriptors, gArrayListMethods.add, jAudioDescriptor.get());
@@ -2627,6 +2640,29 @@
return jStatus;
}
+static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz,
+ jobject jVibrators) {
+ if (!env->IsInstanceOf(jVibrators, gListClass)) {
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+ const jint size = env->CallIntMethod(jVibrators, gListMethods.size);
+ std::vector<media::AudioVibratorInfo> vibratorInfos;
+ for (jint i = 0; i < size; ++i) {
+ ScopedLocalRef<jobject> jVibrator(env,
+ env->CallObjectMethod(jVibrators, gListMethods.get, i));
+ if (!env->IsInstanceOf(jVibrator.get(), gVibratorClass)) {
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+ media::AudioVibratorInfo vibratorInfo;
+ vibratorInfo.id = env->CallIntMethod(jVibrator.get(), gVibratorMethods.getId);
+ vibratorInfo.resonantFrequency =
+ env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getResonantFrequency);
+ vibratorInfo.qFactor = env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getQFactor);
+ vibratorInfos.push_back(vibratorInfo);
+ }
+ return (jint)check_AudioSystem_Command(AudioSystem::setVibratorInfos(vibratorInfos));
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] =
@@ -2757,7 +2793,9 @@
(void *)android_media_AudioSystem_setUserIdDeviceAffinities},
{"removeUserIdDeviceAffinities", "(I)I",
(void *)android_media_AudioSystem_removeUserIdDeviceAffinities},
- {"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid}};
+ {"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid},
+ {"setVibratorInfos", "(Ljava/util/List;)I",
+ (void *)android_media_AudioSystem_setVibratorInfos}};
static const JNINativeMethod gEventHandlerMethods[] = {
{"native_setup",
@@ -2959,7 +2997,10 @@
android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V");
jclass listClass = FindClassOrDie(env, "java/util/List");
+ gListClass = MakeGlobalRefOrDie(env, listClass);
gListMethods.add = GetMethodIDOrDie(env, listClass, "add", "(Ljava/lang/Object;)Z");
+ gListMethods.get = GetMethodIDOrDie(env, listClass, "get", "(I)Ljava/lang/Object;");
+ gListMethods.size = GetMethodIDOrDie(env, listClass, "size", "()I");
jclass audioProfileClass = FindClassOrDie(env, "android/media/AudioProfile");
gAudioProfileClass = MakeGlobalRefOrDie(env, audioProfileClass);
@@ -2967,7 +3008,14 @@
jclass audioDescriptorClass = FindClassOrDie(env, "android/media/AudioDescriptor");
gAudioDescriptorClass = MakeGlobalRefOrDie(env, audioDescriptorClass);
- gAudiODescriptorCstor = GetMethodIDOrDie(env, audioDescriptorClass, "<init>", "(II[B)V");
+ gAudioDescriptorCstor = GetMethodIDOrDie(env, audioDescriptorClass, "<init>", "(II[B)V");
+
+ jclass vibratorClass = FindClassOrDie(env, "android/os/Vibrator");
+ gVibratorClass = MakeGlobalRefOrDie(env, vibratorClass);
+ gVibratorMethods.getId = GetMethodIDOrDie(env, vibratorClass, "getId", "()I");
+ gVibratorMethods.getResonantFrequency =
+ GetMethodIDOrDie(env, vibratorClass, "getResonantFrequency", "()F");
+ gVibratorMethods.getQFactor = GetMethodIDOrDie(env, vibratorClass, "getQFactor", "()F");
AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback);
diff --git a/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp
new file mode 100644
index 0000000..adbd791
--- /dev/null
+++ b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2021 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.
+ */
+
+#define LOG_TAG "SurfaceControlHdrLayerInfoListener"
+
+#include <android/gui/BnHdrLayerInfoListener.h>
+#include <android_runtime/Log.h>
+#include <gui/ISurfaceComposer.h>
+#include <gui/SurfaceComposerClient.h>
+#include <log/log.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/RefBase.h>
+
+#include "android_util_Binder.h"
+#include "core_jni_helpers.h"
+
+namespace android {
+
+namespace {
+
+struct {
+ jclass mClass;
+ jmethodID mOnHdrInfoChanged;
+} gListenerClassInfo;
+
+struct SurfaceControlHdrLayerInfoListener : public gui::BnHdrLayerInfoListener {
+ SurfaceControlHdrLayerInfoListener(JNIEnv* env, jobject listener, jobject displayToken)
+ : mListener(env->NewGlobalRef(listener)), mDisplayToken(env->NewGlobalRef(displayToken)) {
+ LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm");
+ }
+
+ binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH,
+ int flags) override {
+ JNIEnv* env = requireEnv();
+
+ env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken,
+ numberOfHdrLayers, maxW, maxH, flags);
+
+ if (env->ExceptionCheck()) {
+ ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed.");
+ LOGE_EX(env);
+ env->ExceptionClear();
+ }
+ return binder::Status::ok();
+ }
+
+ status_t startListening() {
+ auto token = ibinderForJavaObject(requireEnv(), mDisplayToken);
+ return SurfaceComposerClient::addHdrLayerInfoListener(token, this);
+ }
+
+ status_t stopListening() {
+ auto token = ibinderForJavaObject(requireEnv(), mDisplayToken);
+ return SurfaceComposerClient::removeHdrLayerInfoListener(token, this);
+ }
+
+protected:
+ virtual ~SurfaceControlHdrLayerInfoListener() {
+ JNIEnv* env = requireEnv();
+ env->DeleteGlobalRef(mListener);
+ env->DeleteGlobalRef(mDisplayToken);
+ }
+
+ JNIEnv* requireEnv() {
+ JNIEnv* env = nullptr;
+ if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+ if (mVm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) {
+ LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!");
+ }
+ }
+ return env;
+ }
+
+private:
+ jobject mListener;
+ jobject mDisplayToken;
+ JavaVM* mVm;
+};
+
+jlong nRegister(JNIEnv* env, jobject jthis, jobject jbinderToken) {
+ auto callback = sp<SurfaceControlHdrLayerInfoListener>::make(env, jthis, jbinderToken);
+ status_t err = callback->startListening();
+ if (err != OK) {
+ auto errStr = statusToString(err);
+ jniThrowExceptionFmt(env, "java/lang/IllegalStateException",
+ "Failed to register HdrLayerInfoListener, err = %d (%s)", err,
+ errStr.c_str());
+ return 0;
+ }
+ SurfaceControlHdrLayerInfoListener* ret = callback.get();
+ ret->incStrong(0);
+ return static_cast<jlong>(reinterpret_cast<intptr_t>(ret));
+}
+
+static void destroy(SurfaceControlHdrLayerInfoListener* listener) {
+ listener->stopListening();
+ listener->decStrong(0);
+}
+
+static jlong nGetDestructor(JNIEnv* env, jobject clazz) {
+ return static_cast<jlong>(reinterpret_cast<intptr_t>(&destroy));
+}
+
+const JNINativeMethod gMethods[] = {
+ /* name, signature, funcPtr */
+ {"nGetDestructor", "()J", (void*)nGetDestructor},
+ {"nRegister", "(Landroid/os/IBinder;)J", (void*)nRegister}};
+
+} // namespace
+
+int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env) {
+ int res = jniRegisterNativeMethods(env, "android/view/SurfaceControlHdrLayerInfoListener",
+ gMethods, NELEM(gMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
+
+ jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener");
+ gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
+ gListenerClassInfo.mOnHdrInfoChanged =
+ env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIII)V");
+ return 0;
+}
+
+} // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index fc264f3..c67bfed 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -660,7 +660,6 @@
<protected-broadcast android:name="android.app.action.PROFILE_OWNER_CHANGED" />
<protected-broadcast android:name="android.app.action.TRANSFER_OWNERSHIP_COMPLETE" />
<protected-broadcast android:name="android.app.action.AFFILIATED_PROFILE_TRANSFER_OWNERSHIP_COMPLETE" />
- <protected-broadcast android:name="android.app.action.DATA_SHARING_RESTRICTION_CHANGED" />
<protected-broadcast android:name="android.app.action.STATSD_STARTED" />
<protected-broadcast android:name="com.android.server.biometrics.fingerprint.ACTION_LOCKOUT_RESET" />
<protected-broadcast android:name="com.android.server.biometrics.face.ACTION_LOCKOUT_RESET" />
@@ -1955,6 +1954,14 @@
android:label="@string/permlab_bluetooth_connect"
android:protectionLevel="dangerous" />
+ <!-- Required to be able to range to devices using uwb.
+ <p>Protection level: dangerous -->
+ <permission android:name="android.permission.UWB_RANGING"
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:description="@string/permdesc_uwb_ranging"
+ android:label="@string/permlab_uwb_ranging"
+ android:protectionLevel="dangerous" />
+
<!-- @SystemApi @TestApi Allows an application to suspend other apps, which will prevent the
user from using them until they are unsuspended.
@hide
@@ -2759,8 +2766,12 @@
<permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"
android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier" />
- <!-- Allows an application to start foreground services from background, can only be granted to
- privileged apps or app that is SMS/EMERGENCY/SYSTEM GALLERY roles. -->
+ <!-- Allows an application to start foreground services from the background at any time.
+ <em>This permission is not for use by third-party applications</em>,
+ with the only exception being if the app is the default SMS app.
+ Otherwise, it's only usable by privileged apps, app verifier app, and apps with
+ any of the EMERGENCY or SYSTEM GALLERY roles.
+ -->
<permission android:name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"
android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier|role"/>
@@ -5581,7 +5592,6 @@
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG"
android:protectionLevel="signature|privileged" />
- <uses-permission android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG"/>
<!-- @SystemApi Allows an app to override compat change config on release builds.
Only ChangeIds that are annotated as @Overridable can be overridden on release builds.
@hide -->
diff --git a/core/res/res/drawable/perm_group_camera.xml b/core/res/res/drawable/perm_group_camera.xml
index e65501c..c47d854 100644
--- a/core/res/res/drawable/perm_group_camera.xml
+++ b/core/res/res/drawable/perm_group_camera.xml
@@ -20,11 +20,6 @@
android:tint="?android:attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
-
- <path
- android:fillColor="#000000"
- android:pathData="M20,5h-3.17L15,3H9L7.17,5H4C2.9,5 2,5.9 2,7v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V7C22,5.9 21.1,5 20,5zM20,19H4V7h16V19z"/>
- <path
- android:fillColor="#000000"
- android:pathData="M12,9c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4s4,-1.79 4,-4C16,10.79 14.21,9 12,9z"/>
+ <path android:fillColor="@android:color/white"
+ android:pathData="M18,10.48L18,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4.48l4,3.98v-11l-4,3.98zM16,9.69L16,18L4,18L4,6h12v3.69z"/>
</vector>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index eb17991..9d891d5 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Laat die program toe om Bluetooth-toestelle in die omtrek te ontdek en saam te bind"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"koppel aan saamgebinde Bluetooth-toestelle"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Laat die program toe om aan saamgebinde Bluetooth-toestelle te koppel"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Voorkeur-NFC-betalingdiensinligting"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Laat die program toe om voorkeur-NFC-betalingdiensinligting soos geregistreerde hulpmiddels en roetebestemming te kry."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"beheer kortveldkommunikasie"</string>
@@ -573,7 +577,7 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Geen PIN, patroon of wagwoord is gestel nie"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Kon nie staaf nie"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Gebruik skermslot"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Voer jou toesteleiebewys in om voort te gaan."</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Voer jou skermslot in om voort te gaan"</string>
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kon nie vingerafdruk verwerk nie. Probeer asseblief weer."</string>
@@ -620,14 +624,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Gesigslot"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Skryf jou gesig weer in"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Skryf asseblief jou gesig weer in om herkenning te verbeter"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Stel gesigslot op"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontsluit jou foon deur daarna te kyk"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer maniere op om te ontsluit"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om \'n vingerafdruk by te voeg"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Kon nie gesigdata akkuraat vasvang nie. Probeer weer."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Te helder. Probeer sagter beligting."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Te donker. Probeer helderder beligting."</string>
@@ -664,7 +664,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Gesig <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Gebruik gesigslot"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gebruik gesig- of skermslot"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Gebruik gesigslot om voort te gaan"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gebruik jou gesig om voort te gaan"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik jou gesig of skermslot om voort te gaan"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"Gekopieer"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> het uit <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> geplak"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> het uit knipbord geplak"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> het teks geplak wat jy gekopieer het"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> het \'n prent geplak wat jy gekopieer het"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> het inhoud geplak wat jy gekopieer het"</string>
<string name="more_item_label" msgid="7419249600215749115">"Meer"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Kieslys+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2138,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlike aansig"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Werkaansig"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Deur jou IT-admin geblokkeer"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Hierdie inhoud kan nie met werkprogramme gedeel word nie"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Hierdie inhoud kan nie met werkprogramme oopgemaak word nie"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hierdie inhoud kan nie met persoonlike programme gedeel word nie"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Hierdie inhoud kan nie met persoonlike programme oopgemaak word nie"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Werkprofiel is onderbreek"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te skakel"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werkprogramme nie"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlike programme nie"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Maak in persoonlike profiel in <xliff:g id="APP">%s</xliff:g> oop?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Maak in werkprofiel in <xliff:g id="APP">%s</xliff:g> oop?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gebruik persoonlike blaaier"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gebruik werkblaaier"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM se netwerkontsluiting-PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM se netwerksubstelontsluiting-PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM se korporatiewe ontsluiting-PIN"</string>
@@ -2278,10 +2263,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nuwe vergrotinginstellings"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Jy kan nou \'n deel van jou skerm vergroot"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Skakel aan in Instellings"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Maak toe"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Om voort te gaan, moet <b><xliff:g id="APP">%s</xliff:g></b> toegang tot jou toestel se mikrofoon hê."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 9dd9814..75b4f7c 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"መተግበሪያው በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎችን እንዲያገኝ እና እንዲጣመር ይፈቅድለታል"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ከተጣመሩ የብሉቱዝ መሣሪያዎች ጋር ያገናኙ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"መተግበሪያው ከተጣመሩ የብሉቱዝ መሣሪያዎች ጋር እንዲገናኝ ይፈቅድለታል"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ተመራጭ NFC የክፍያ አገልግሎት መረጃ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"እንደ የተመዘገቡ እርዳታዎች እና የጉዞ መሥመር መዳረሻ የመሳሰለ ተመራጭ nfc የክፍያ አገልግሎት መረጃን ለማግኘት ለመተግበሪያው ያፈቅድለታል።"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ቅርብ የግኑኙነትመስክ (NFC) ተቆጣጠር"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ምንም ፒን፣ ሥርዓተ ጥለት ወይም የይለፍ ቃል አልተቀናበረም"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ማረጋገጥ ላይ ስህተት"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"የማያ ገጽ መቆለፊን ይጠቀሙ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ለመቀጠል የመሣሪያዎን የመግቢያ ማስረጃ ያስገቡ"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ጣት አሻራን መስራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"በመልክ መክፈት"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"የእርስዎን ፊት ዳግመኛ ያስመዝግቡ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"በመልክ መክፈቻን ያቀናብሩ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ስልክዎን በመመልከት ያስከፍቱት"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"የሚከፍቱባቸው ተጨማሪ መንገዶችን ያቀናብሩ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"የጣት አሻራን ለማከል መታ ያድርጉ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ከልክ በላይ ፈካ ያለ። ይበልጥ ረጋ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ከልክ በላይ ጨለማ ነው። ከዚህ ፈካ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ፊት <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"በመልክ መክፈትን ይጠቀሙ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"የመልክ ወይም የማያ ገጽ መቆለፊያን ይጠቀሙ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ለመቀጠል በመልክ መክፈትን ይጠቀሙ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ለመቀጠል መልክዎን ወይም የማያ ገጽዎን መቆለፊያ ይጠቀሙ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"ተቀድቷል"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ከ <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ተለጥፏል"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ከቅንጣብ ሰሌዳ ተለጥፏል"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> እርስዎ የቀዱትን ጽሑፍ ለጥፏል"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> እርስዎ የቀዱትን ምስል ለጥፏል"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> እርስዎ የቀዱትን ይዘት ለጥፏል"</string>
<string name="more_item_label" msgid="7419249600215749115">"ተጨማሪ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ምናሌ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ሥራ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"የግል እይታ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"የስራ እይታ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"በእርስዎ የአይቲ አስተዳዳሪ ታግዷል"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ይህ ይዘት በሥራ መተግበሪያዎች መጋራት አይችልም"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ይህ ይዘት በሥራ መተግበሪያዎች መከፈት አይችልም"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ይህ ይዘት በግል መተግበሪያዎች መጋራት አይችልም"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ይህ ይዘት በግል መተግበሪያዎች መከፈት አይችልም"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"የሥራ መገለጫ ባለበት ቆሟል"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ለማብራት መታ ያድርጉ"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ምንም የሥራ መተግበሪያዎች የሉም"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ምንም የግል መተግበሪያዎች የሉም"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> በግል መገለጫ ውስጥ ይከፈት?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> በስራ መገለጫ ውስጥ ይከፈት?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"የግል አሳሽ ተጠቀም"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"የስራ አሳሽ ተጠቀም"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"የሲም አውታረ መረብ መክፈቻ ፒን"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"የሲም አውታረ መረብ ንኡስ ስብስብ መክፈቻ ፒን"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"የሲም ኮርፖሬት መክፈቻ ፒን"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"አዲስ የማጉላት ቅንብሮች"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"አሁን የማያ ገጽዎን ክፍል ማጉላት ይችላሉ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"በቅንብሮች ውስጥ ያብሩ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"አሰናብት"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ለመቀጠል፣ <b><xliff:g id="APP">%s</xliff:g></b> ወደ መሳሪያዎ ማይክሮፎን መድረስ ይፈልጋል።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index b2f83b7..f5d3872 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -551,6 +551,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"يسمح هذا الإذن للتطبيق باكتشاف الأجهزة القريبة التي تتضمّن بلوتوث والاقتران بها."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"تسمح بالربط الأجهزة المقترنة التي تتضمّن بلوتوث."</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"يسمح هذا الإذن للتطبيق بالارتباط بالأجهزة المقترنة التي تتضمّن بلوتوث."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"معلومات الخدمات المدفوعة باستخدام الاتصال قصير المدى NFC المفضّل"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"يسمح هذا الإذن للتطبيق بالحصول على معلومات الخدمات المدفوعة باستخدام الاتصال قصير المدى NFC المفضّل، مثلاً المساعدات المسجّلة ووجهة المسار."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"التحكم في اتصال الحقل القريب"</string>
@@ -585,7 +589,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"لم يتم ضبط رقم تعريف شخصي أو نقش أو كلمة مرور."</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"خطأ في المصادقة"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"استخدام قفل الشاشة"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"إدخال بيانات اعتماد الجهاز للمتابعة"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"تعذرت معالجة بصمة الإصبع. يُرجى إعادة المحاولة."</string>
@@ -632,14 +637,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"فتح القفل بالوجه"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"إعادة تسجيل وجهك"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه."</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"إعداد ميزة \"فتح القفل بالوجه\""</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"يمكنك فتح قفل هاتفك بمجرّد النظر إلى الشاشة."</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"إعداد المزيد من الطرق لفتح قفل الجهاز"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"انقر لإضافة بصمة إصبع."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ساطع للغاية. تجربة مستوى سطوع أقلّ."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"الصورة معتمة للغاية. يُرجى زيادة السطوع."</string>
@@ -676,7 +677,8 @@
<string name="face_name_template" msgid="3877037340223318119">"الوجه <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"استخدام \"فتح القفل بالوجه\""</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"استخدام ميزة \"فتح القفل بالوجه\" أو ميزة \"قفل الشاشة\""</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"استخدام ميزة \"فتح القفل بالوجه\" للمتابعة"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"استخدام ميزة \"فتح القفل بالوجه\" أو ميزة \"قفل الشاشة\" للمتابعة"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1043,12 +1045,9 @@
<string name="copied" msgid="4675902854553014676">"تم النسخ."</string>
<string name="pasted_from_app" msgid="5627698450808256545">"تم لصق محتوى في <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> من <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>."</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"تم لصق محتوى في <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> من الحافظة."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"لصق تطبيق <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> النص الذي نسخته."</string>
+ <string name="pasted_image" msgid="4729097394781491022">"لصق تطبيق <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> الصورة التي نسختها."</string>
+ <string name="pasted_content" msgid="646276353060777131">"لصق تطبيق <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> المحتوى الذي نسخته."</string>
<string name="more_item_label" msgid="7419249600215749115">"المزيد"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"القائمة+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2277,31 +2276,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"للعمل"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"عرض المحتوى الشخصي"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"عرض محتوى العمل"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"حظر مشرف تكنولوجيا المعلومات مشاركة المحتوى"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"لا يمكن مشاركة هذا المحتوى مع تطبيقات العمل."</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"لا يمكن فتح هذا المحتوى باستخدام تطبيقات العمل."</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"لا يمكن مشاركة هذا المحتوى مع التطبيقات الشخصية."</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"لا يمكن فتح هذا المحتوى باستخدام التطبيقات الشخصية."</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"الملف الشخصي للعمل متوقف مؤقتًا."</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"انقر لتفعيل الميزة"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ما مِن تطبيقات عمل."</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ما مِن تطبيقات شخصية."</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"هل تريد فتح المحتوى في <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي؟"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"هل تريد فتح المحتوى في <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي للعمل؟"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استخدام المتصفّح الشخصي"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"استخدام متصفّح العمل"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"رقم التعريف الشخصي لإلغاء قفل شبكة شريحة SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"رقم التعريف الشخصي لإلغاء قفل المجموعة الفرعية لشبكة شريحة SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"رقم التعريف الشخصي لإلغاء قفل شريحة SIM للشركات"</string>
@@ -2414,10 +2401,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"إعدادات التكبير الجديدة"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"يمكنك الآن تكبير جزء من الشاشة."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"التفعيل من خلال \"الإعدادات\""</string>
<string name="dismiss_action" msgid="1728820550388704784">"إغلاق"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"للمتابعة، يحتاج <b><xliff:g id="APP">%s</xliff:g></b> إلى الوصول إلى ميكروفون الجهاز."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 3c7e372..927441a 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"এপ্টোক নিকটৱৰ্তী ব্লুটুথ ডিভাইচ বিচাৰি উলিয়াবলৈ আৰু সেইসমূহৰ সৈতে পেয়াৰ কৰিবলৈ অনুমতি দিয়ে"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"পেয়াৰ কৰা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰক"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"এপ্টোক পেয়াৰ কৰা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰিবলৈ অনুমতি দিয়ে"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"অগ্ৰাধিকাৰ দিয়া NFC পৰিশোধ সেৱাৰ তথ্য"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"এপ্টোক অগ্ৰাধিকাৰ দিয়া nfc পৰিশোধ সেৱাৰ পঞ্জীকৃত সহায়কসমূহ আৰু পৰিশোধ কৰিব লগা লক্ষ্যস্থান দৰে তথ্য পাবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"নিয়েৰ ফিল্ড কমিউনিকেশ্বন নিয়ন্ত্ৰণ কৰক"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"কোনো পিন, আৰ্হি বা পাছৱৰ্ড ছেট কৰা নাই"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"আসোঁৱাহৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰি থকা হৈছে"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"স্ক্ৰীন ল\'ক ব্যৱহাৰ কৰক"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"অব্যাহত ৰাখিবলৈ আপোনাৰ ডিভাইচৰ ক্ৰেডেনশ্বিয়েল দিয়ক"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ফিগাৰপ্ৰিণ্টৰ প্ৰক্ৰিয়া সম্পাদন কৰিবপৰা নগ\'ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধা"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধাটো ছেট আপ কৰক"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"আপোনাৰ ফ’নটোলৈ চাই সেইটো আনলক কৰক"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক কৰাৰ অধিক উপায় ছেট আপ কৰক"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"এটা ফিংগাৰপ্ৰিণ্ট যোগ দিবলৈ টিপক"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"অতি উজ্জ্বল। ইয়াতকৈ কম পোহৰৰ উৎস ব্যৱহাৰ কৰক।"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"অতি আন্ধাৰ। উজ্জ্বল লাইট ব্যৱহাৰ কৰক।"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"মুখাৱয়বৰে আনলক কৰা ব্যৱহাৰ কৰক"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"মুখাৱয়বৰে আনলক কৰা অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"অব্যাহত ৰাখিবলৈ মুখাৱয়বৰে আনলক কৰা ব্যৱহাৰ কৰক"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"অব্যাহত ৰাখিবলৈ আপোনাৰ মুখাৱয়ব অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"প্ৰতিলিপি কৰা হ’ল"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> পে’ষ্ট কৰা হৈছে"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ক্লিপব’ৰ্ডৰ পৰা <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> পে’ষ্ট কৰা হৈছে"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>এ আপুনি প্ৰতিলিপি কৰা সমল পে’ষ্ট কৰিছে"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>এ আপুনি প্ৰতিলিপি কৰা এটা প্ৰতিচ্ছবি পে’ষ্ট কৰিছে"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>এ আপুনি প্ৰতিলিপি কৰা সমল পে’ষ্ট কৰিছে"</string>
<string name="more_item_label" msgid="7419249600215749115">"অধিক"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"মেনু+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"মেটা+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"কৰ্মস্থান"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"কৰ্মস্থানৰ ভিউ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"এই সমল কৰ্মস্থানৰ এপৰ সৈতে শ্বেয়াৰ কৰিব নোৱাৰি"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"এই সমল কৰ্মস্থানৰ এপৰ জৰিয়তে খুলিব নোৱাৰি"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"এই সমল ব্যক্তিগত এপৰ সৈতে শ্বেয়াৰ কৰিব নোৱাৰি"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"এই সমল ব্যক্তিগত এপৰ জৰিয়তে খুলিব নোৱাৰি"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"কৰ্মস্থানৰ প্ৰ\'ফাইলটো পজ কৰা আছে"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"অন কৰিবলৈ টিপক"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"কোনো কৰ্মস্থানৰ এপ্ নাই"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"কোনো ব্যক্তিগত এপ্ নাই"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g>ত ব্যক্তিগত প্ৰ’ফাইলত খুলিবনে?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g>ত কৰ্মস্থানৰ প্ৰ’ফাইলত খুলিবনে?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"কৰ্মস্থানৰ ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ছিম নেটৱৰ্ক আনলক কৰা পিন"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"ছিম নেটৱৰ্ক আনলক কৰা পিন"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"ছিম কৰ্পৰে\'ট আনলক কৰা পিন"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"বিবৰ্ধনৰ নতুন ছেটিং"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"আপুনি এতিয়া আপোনাৰ স্ক্ৰীনখনৰ কিছু অংশ বিবৰ্ধন কৰিব পাৰে"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ছেটিঙত অন কৰক"</string>
<string name="dismiss_action" msgid="1728820550388704784">"অগ্ৰাহ্য কৰক"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"অব্যাহত ৰাখিবলৈ <b><xliff:g id="APP">%s</xliff:g></b>এ আপোনাৰ ডিভাইচৰ মাইক্ৰ’ফ’ন এক্সেছ কৰাৰ আৱশ্যক।"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 48e83b2..53c8738 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tətbiqə yaxınlıqdakı Bluetooth cihazlarını aşkarlamaq və birləşdirməyə icazə verir"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"birləşdirilmiş Bluetooth cihazlarına qoşulmaq"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tətbiqə birləşdirilmiş Bluetooth cihazlarına qoşulmağa icazə verir"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Tərcih edilən NFC ödəniş xidməti məlumatı"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tətbiqə qeydiyyatdan keçmiş yardım və marşrut təyinatı kimi tərcih edilən nfc ödəniş xidməti məlumatını əldə etmək icazəsi verir."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication\'ı kontrol et"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Pin, nümunə və ya parol ayarlanmayıb"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Doğrulama zamanı xəta baş verdi"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ekran kilidindən istifadə edin"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Davam etmək üçün cihazın giriş məlumatlarını daxil edin"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Barmaq izi tanınmadı. Lütfən, yenidən cəhd edin."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Üz kilidi"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Üzünüzü yenidən qeydiyyatdan keçirin"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Üz ilə kiliddən çıxarmanı ayarlayın"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefona baxaraq onu kiliddən çıxarın"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kiliddən çıxarmağın daha çox yolunu ayarlayın"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmaq izi əlavə etmək üçün toxunun"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Çox işıqlıdır. Daha az işıqlı şəkli sınayın."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Çox qaranlıqdır. Parlaq işıqdan istifadə edin."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Üz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Üz ilə kiliddən çıxarmadan istifadə edin"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Üz və ya ekran kilidindən istifadə edin"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Davam etmək üçün üz ilə kiliddən çıxarmadan istifadə edin"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davam etmək üçün üz və ya ekran kilidinizdən istifadə edin"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopyalandı"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> tətbiqindən əlavə edilib"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> mübadilə buferindən əlavə edilib"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kopyaladığınız mətni əlavə etdi"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kopyaladığınız şəkli əlavə etdi"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kopyaladığınız kontenti əlavə etdi"</string>
<string name="more_item_label" msgid="7419249600215749115">"Digər"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menyu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Şəxsi məzmuna baxış"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"İş məzmununa baxış"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT admininiz tərəfindən bloklanıb"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Bu kontenti iş tətbiqləri ilə paylaşmaq mümkün deyil"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Bu kontenti iş tətbiqləri ilə açmaq mümkün deyil"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Bu kontenti şəxsi tətbiqlər ilə paylaşmaq mümkün deyil"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Bu kontenti şəxsi tətbiqlər ilə açmaq mümkün deyil"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"İş profilinə fasilə verilib"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Aktiv etmək üçün toxunun"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş tətbiqi yoxdur"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Şəxsi tətbiq yoxdur"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Şəxsi profildə <xliff:g id="APP">%s</xliff:g> tətbiqində açılsın?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"İş profilində <xliff:g id="APP">%s</xliff:g> tətbiqində açılsın?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Şəxsi brauzerdən istifadə edin"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş brauzerindən istifadə edin"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM şəbəkəsi kilidaçma PİN\'i"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM Şəbəkəsi Alt Dəstinin kilidaçma PIN\'i"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM korporativ kilidaçma PIN\'i"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Yeni böyütmə ayarları"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"İndi ekranınızın bir hissəsini böyüdə bilərsiniz"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ayarlarda aktiv edin"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Qapadın"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Davam etmək üçün <b><xliff:g id="APP">%s</xliff:g></b> tətbiqi cihazın mikrofonuna giriş tələb edir."</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 78fce43..a8f8226 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Dozvoljava aplikaciji da otkriva Bluetooth uređaje u blizini i uparuje se sa njima"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezivanje sa uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Dozvoljava aplikaciji da se povezuje sa uparenim Bluetooth uređajima"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o željenoj NFC usluzi za plaćanje"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da preuzima informacije o željenoj NFC usluzi za plaćanje, poput registrovanih identifikatora aplikacija i odredišta preusmeravanja."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrola komunikacije u užem polju (Near Field Communication)"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Niste podesili ni PIN, ni šablon, ni lozinku"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Greška pri potvrdi identiteta"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristite zaključavanje ekrana"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Unesite akreditiv za uređaj da biste nastavili"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nije uspela obrada otiska prsta. Probajte ponovo."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrujte lice"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Da biste poboljšali prepoznavanje, ponovo registrujte lice"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Podesite otključavanje licem"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon tako što ćete ga pogledati"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Podesite još načina za otključavanje"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Snimanje lica nije uspelo. Probajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše je svetlo. Probajte sa slabijim osvetljenjem."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Pretamno je. Probajte sa jačim osvetljenjem."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Koristite otključavanje licem"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili zaključavanje ekrana"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Koristite otključavanje licem da biste nastavili"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Kopirano je"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikacija<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je nalepila podatke iz aplikacije <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikacija<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> nalepila podatke iz privremene memorije"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikacija<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je nalepila tekst koji ste kopirali"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikacija<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je nalepila sliku koju ste kopirali"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikacija<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je nalepila sadržaj koji ste kopirali"</string>
<string name="more_item_label" msgid="7419249600215749115">"Još"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Meni+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1498,7 +1497,7 @@
<string name="ime_action_previous" msgid="6548799326860401611">"Prethodno"</string>
<string name="ime_action_default" msgid="8265027027659800121">"Izvrši"</string>
<string name="dial_number_using" msgid="6060769078933953531">"Biraj broj\nkoristeći <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="create_contact_using" msgid="6200708808003692594">"Kreirajte kontakt\nkoristeći <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="6200708808003692594">"Napravite kontakt\nkoristeći <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Sledeće aplikacije zahtevaju dozvolu za pristup nalogu, kako sada, tako i ubuduće."</string>
<string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Želite da odobrite ovaj zahtev?"</string>
<string name="grant_permissions_header_text" msgid="3420736827804657201">"Zahtev za pristup"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Poslovno"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Lični prikaz"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Prikaz za posao"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokira IT administrator"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ovaj sadržaj ne može da se deli pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ovaj sadržaj ne može da se otvara pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj ne može da se deli pomoću ličnih aplikacija"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ovaj sadržaj ne može da se otvara pomoću ličnih aplikacija"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Poslovni profil je pauziran"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Želite da otvorite na ličnom profilu u: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Želite da otvorite na poslovnom profilu u: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični pregledač"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni pregledač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN za otključavanje podskupa SIM mreže"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN za otključavanje poslovne SIM kartice"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nova podešavanja uvećanja"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sada možete da uvećate deo ekrana"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Podešavanjima"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> zahteva pristup mikrofonu uređaja radi nastavljanja."</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 12a9b42..93adffd 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -326,10 +326,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"доступ да даных фізічнай актыўнасці"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"рабіць фатаздымкі і запісваць відэа"</string>
- <!-- no translation found for permgrouplab_nearby_devices (14428105203684587) -->
- <skip />
- <!-- no translation found for permgroupdesc_nearby_devices (1146639974734121820) -->
- <skip />
+ <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"Прылады з Bluetooth паблізу"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"выяўляць прылады з Bluetooth, якія знаходзяцца паблізу, і падключацца да іх"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Журналы выклікаў"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"Чытанне і запіс журнала тэлефонных выклікаў"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Тэлефон"</string>
@@ -543,13 +541,13 @@
<string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Дазваляе прыкладанню праглядаць канфігурацыю Bluetooth на планшэце , а таксама здзяйсняць і прымаць злучэнні са спалучанымі прыладамі."</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Дазваляе праграме праглядаць канфігурацыю Bluetooth на прыладзе Android TV, а таксама выконваць і дазваляць злучэнні са спалучанымі прыладамі."</string>
<string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Дазваляе прыкладанню праглядаць канфігурацыю Bluetooth на тэлефоне , а таксама здзяйсняць і прымаць злучэнні са спалучанымі прыладамі."</string>
- <!-- no translation found for permlab_bluetooth_scan (5402587142833124594) -->
+ <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"выяўляць прылады з Bluetooth і спалучацца з імі"</string>
+ <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дазваляе праграме выяўляць прылады з Bluetooth і спалучацца з імі"</string>
+ <string name="permlab_bluetooth_connect" msgid="6657463246355003528">"падключацца да спалучаных прылад з Bluetooth"</string>
+ <string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дазваляе праграме падключацца да спалучаных прылад з Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
<skip />
- <!-- no translation found for permdesc_bluetooth_scan (6540723536925289276) -->
- <skip />
- <!-- no translation found for permlab_bluetooth_connect (6657463246355003528) -->
- <skip />
- <!-- no translation found for permdesc_bluetooth_connect (4546016548795544617) -->
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
<skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Інфармацыя пра прыярытэтны сэрвіс аплаты NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дазваляе праграме атрымаць доступ да інфармацыі пра прыярытэтны сэрвіс аплаты NFC, напрыклад зарэгістраваныя ідэнтыфікатары праграм і маршруты адпраўкі даных."</string>
@@ -585,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Не заданы PIN-код, узор разблакіроўкі або пароль"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Памылка аўтэнтыфікацыі"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ужываць блакіроўку экрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Каб працягнуць, увядзіце ўліковыя даныя вашай прылады"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не атрымалася апрацаваць адбітак пальца. Паспрабуйце яшчэ раз."</string>
@@ -632,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Распазнаванне твару"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Паўтарыце рэгістрацыю твару"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Наладзьце распазнаванне твару"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Разблакіруйце свой тэлефон, паглядзеўшы на яго"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Наладзьце дадатковыя спосабы разблакіроўкі"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Націсніце, каб дадаць адбітак пальца"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Не атрымалася распазнаць твар. Паўтарыце спробу."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадта светла. Прыглушыце асвятленне."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Занадта цёмна. Павялічце асвятленне."</string>
@@ -676,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Твар <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Ужываць распазнаванне твару"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Выкарыстоўваць распазнаванне твару ці блакіроўку экрана"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Каб працягнуць, скарыстайце распазнаванне твару"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Каб працягнуць, скарыстайце распазнаванне твару ці сродак разблакіроўкі экрана"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1043,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Скапіравана"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Праграма \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\" была ўстаўлена з праграмы \"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>\""</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Праграма \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\" была ўстаўлена з буфера абмену"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Скапіраваны вамі тэкст устаўлены праграмай \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\""</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Скапіраваны вамі відарыс устаўлены праграмай \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\""</string>
+ <string name="pasted_content" msgid="646276353060777131">"Скапіраванае вамі змесціва ўстаўлена праграмай \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\""</string>
<string name="more_item_label" msgid="7419249600215749115">"Больш"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Меню+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -1788,7 +1781,7 @@
<string name="error_message_title" msgid="4082495589294631966">"Памылка"</string>
<string name="error_message_change_not_allowed" msgid="843159705042381454">"Ваш адміністратар не дазваляе гэту змену"</string>
<string name="app_not_found" msgid="3429506115332341800">"Прыкладанне для гэтага дзеяння не знойдзенае"</string>
- <string name="revoke" msgid="5526857743819590458">"Ануляваць"</string>
+ <string name="revoke" msgid="5526857743819590458">"Адклікаць"</string>
<string name="mediasize_iso_a0" msgid="7039061159929977973">"ISO A0"</string>
<string name="mediasize_iso_a1" msgid="4063589931031977223">"ISO A1"</string>
<string name="mediasize_iso_a2" msgid="2779860175680233980">"ISO A2"</string>
@@ -2215,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Працоўныя"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Прагляд асабістага змесціва"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Прагляд працоўнага змесціва"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Заблакіравана вашым ІТ-адміністратарам"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Не ўдалося абагуліць гэта змесціва з працоўнымі праграмамі"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Не ўдалося адкрыць гэта змесціва з дапамогай працоўных праграм"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Не ўдалося абагуліць гэта змесціва з асабістымі праграмамі"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Не ўдалося адкрыць гэта змесціва з дапамогай асабістых праграм"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Працоўны профіль прыпынены"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Націсніце, каб уключыць"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма працоўных праграм"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма асабістых праграм"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Адкрыць у праграме \"<xliff:g id="APP">%s</xliff:g>\" з асабістага профілю?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Адкрыць у праграме \"<xliff:g id="APP">%s</xliff:g>\" з працоўнага профілю?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Скарыстаць асабісты браўзер"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Скарыстаць працоўны браўзер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код разблакіроўкі сеткі для SIM-карты"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-код разблакіроўкі падмноства сеткі для SIM-карты"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-код разблакіроўкі карпаратыўнай SIM-карты"</string>
@@ -2352,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Новыя налады павелічэння"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Цяпер можна павялічваць частку экрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Уключыць у Наладах"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Адхіліць"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Каб працягнуць, дайце праграме <b><xliff:g id="APP">%s</xliff:g></b> доступ да мікрафона прылады."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 258dad5..2cdc8d1 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дава възможност на приложението да открива устройства с Bluetooth в близост и да се сдвоява с тях"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"свързване със сдвоените устройства с Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дава възможност на приложението да се свързва със сдвоените устройства с Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информация за предпочитаната услуга за плащане чрез NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дава възможност на приложението да получава информация за предпочитаната услуга за плащане чрез NFC, като например регистрирани помощни средства и местоназначение."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контролиране на комуникацията в близкото поле"</string>
@@ -573,7 +577,7 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Няма зададен ПИН код, фигура или парола"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Грешка при удостоверяването"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ползване на заключв. на екрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Въведете идентификационните данни на устройството, за да продължите"</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Въведете опцията си за заключване на екрана, за да продължите"</string>
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатъкът не бе обработен. Моля, опитайте отново."</string>
@@ -620,14 +624,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Отключване с лице"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Регистрирайте отново лицето си"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"С цел подобряване на разпознаването регистрирайте отново лицето си"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Настройване на отключването с лице"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Отключвайте телефона си, като го погледнете"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройване на още начини за отключване на телефона"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Докоснете, за да добавите отпечатък"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Лицето не бе заснето точно. Опитайте отново."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Твърде светло е. Опитайте при по-слабо осветление."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Твърде тъмно е. Опитайте при по-силно осветление."</string>
@@ -664,7 +664,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Използване на отключв. с лице"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Използване на отключването с лице или опцията за заключване на екрана"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Използвайте функцията за отключване с лице, за да продължите"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Използвайте лицето си, за да продължите"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Използвайте лицето си или опцията за заключване на екрана, за да продължите"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"Копирано"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> постави данни от <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> постави данни от буферната памет"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> постави копиран от вас текст"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> постави копирано от вас изображение"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> постави копирано от вас съдържание"</string>
<string name="more_item_label" msgid="7419249600215749115">"Още"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Меню+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2138,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Служебни"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен изглед"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Служебен изглед"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Блокирано от системния ви администратор"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Това съдържание не може да се споделя със служебни приложения"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Това съдържание не може да се отваря със служебни приложения"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Това съдържание не може да се споделя с лични приложения"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Това съдържание не може да се отваря с лични приложения"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Служебният потребителски профил е поставен на пауза"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Докоснете за включване"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма подходящи служебни приложения"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма подходящи лични приложения"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Да се отвори ли в личния потребителски профил чрез <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Да се отвори ли в служебния потребителски профил чрез <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Използване на личния браузър"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Използване на служебния браузър"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ПИН за отключване на мрежата за SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"ПИН за отключване на подмножеството от мрежи за SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"ПИН за отключване на корпоративната SIM карта"</string>
@@ -2278,10 +2263,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Нови настройки за увеличението"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Вече можете да увеличите част от екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Включете от настройките"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Отхвърляне"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"За да продължите, <b><xliff:g id="APP">%s</xliff:g></b> се нуждае от достъп до микрофона на устройството ви."</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 5582330..75a33af 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -320,10 +320,8 @@
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"শারীরিক অ্যাক্টিভিটি অ্যাক্সেস করা"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ক্যামেরা"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"ছবি তোলা এবং ভিডিও রেকর্ড"</string>
- <!-- no translation found for permgrouplab_nearby_devices (14428105203684587) -->
- <skip />
- <!-- no translation found for permgroupdesc_nearby_devices (1146639974734121820) -->
- <skip />
+ <string name="permgrouplab_nearby_devices" msgid="14428105203684587">"কাছাকাছি ব্লুটুথ ডিভাইস"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="1146639974734121820">"কাছাকাছি ব্লুটুথ ডিভাইস খুঁজে দেখুন এবং তার সাথে কানেক্ট করুন"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"কল লগ"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"ফোন কল লগ পড়ে এবং দেখে"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"ফোন"</string>
@@ -537,13 +535,13 @@
<string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ট্যাবলেটের ব্লুটুথ কনফিগারেশন দেখতে, এবং যুক্ত ডিভাইসগুলির সাথে সংযোগ স্থাপন এবং সংযোগের অনুরোধ স্বীকার করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷"</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"আপনার Android TV ডিভাইসের ব্লুটুথের কনফিগারেশন দেখার এবং পেয়ার করা ডিভাইসের সাথে কানেক্ট করার বা কানেকশন গ্রহণ করার অনুমতি দেয়।"</string>
<string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"ফোনের ব্লুটুথ কনফিগারেশন দেখতে, এবং যুক্ত ডিভাইসগুলির সাথে সংযোগ স্থাপন এবং সংযোগের অনুরোধ স্বীকার করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷"</string>
- <!-- no translation found for permlab_bluetooth_scan (5402587142833124594) -->
+ <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"কাছাকাছি ব্লুটুথ ডিভাইস খুঁজে দেখুন এবং তার সাথে পেয়ার করুন"</string>
+ <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"অ্যাপটিকে কাছাকাছি ব্লুটুথ ডিভাইস খুঁজে দেখতে এবং তার সাথে পেয়ার করার অনুমতি দেয়"</string>
+ <string name="permlab_bluetooth_connect" msgid="6657463246355003528">"পেয়ার করা ব্লুটুথ ডিভাইসের সাথে কানেক্ট করুন"</string>
+ <string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"অ্যাপটিকে পেয়ার করা ব্লুটুথ ডিভাইসের সাথে কানেক্ট করতে অনুমতি দেয়"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
<skip />
- <!-- no translation found for permdesc_bluetooth_scan (6540723536925289276) -->
- <skip />
- <!-- no translation found for permlab_bluetooth_connect (6657463246355003528) -->
- <skip />
- <!-- no translation found for permdesc_bluetooth_connect (4546016548795544617) -->
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
<skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"পছন্দের NFC পেমেন্ট পরিষেবার তথ্য"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"অ্যাপের মাধ্যমে পছন্দসই এনএফসি পেমেন্ট পরিষেবার তথ্য, যেমন রেজিস্ট্রার করার সহায়তা এবং রুট ডেস্টিনেশন সম্পর্কিত তথ্য অ্যাক্সেস করার অনুমতি দেয়।"</string>
@@ -579,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"পিন, প্যাটার্ন অথবা পাসওয়ার্ড সেট করা নেই"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"যাচাইকরণে সমস্যা হয়েছে"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"স্ক্রিন লক ব্যবহার করুন"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"চালিয়ে যেতে আপনার ডিভাইসের ক্রেডেনশিয়াল ব্যবহার করুন"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"আঙ্গুলের ছাপ প্রক্রিয়া করা যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
@@ -626,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"মুখের সাহায্যে আনলক"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"আপনার ফেস আবার এনরোল করুন"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"মুখের সাহায্যে আনলক করার ফিচার সেট-আপ করুন"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"আপনার ফোনের দিকে তাকিয়ে এটিকে আনলক করুন"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক করার জন্য বিভিন্ন উপায়ে সেট আপ করুন"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"একটি আঙ্গুলের ছাপ যোগ করতে ট্যাপ করুন"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"খুব উজ্জ্বল। আলো কমিয়ে চেষ্টা করে দেখুন।"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"খুব অন্ধকার। আরও উজ্জ্বল আলো ব্যবহার করে দেখুন।"</string>
@@ -670,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> ফেস"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"মুখের সাহায্যে আনলক ব্যবহার করুন"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"মুখ অথবা স্ক্রিন লক ব্যবহার করুন"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"চালিয়ে যেতে মুখের সাহায্যে আনলক ব্যবহার করুন"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"চালিয়ে যেতে আপনার ফেস বা স্ক্রিন লক ব্যবহার করুন"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"কপি করা হয়েছে"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> থেকে কপি করা ডেটা <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-এ পেস্ট করা হয়েছে"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ক্লিপবোর্ডের ডেটা <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-এ পেস্ট করা হয়েছে"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"আপনার কপি করা টেক্সট <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> অ্যাপ পেস্ট করেছে"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"আপনার কপি করা ছবি <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> অ্যাপ পেস্ট করেছে"</string>
+ <string name="pasted_content" msgid="646276353060777131">"আপনার কপি করা কন্টেন্ট <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> অ্যাপ পেস্ট করেছে"</string>
<string name="more_item_label" msgid="7419249600215749115">"আরও"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"মেনু+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2147,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"অফিস"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"অফিসের ভিউ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"আপনার আইটি অ্যাডমিন ব্লক করেছেন"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"অফিসের অ্যাপে এই কন্টেন্ট শেয়ার করা যাবে না"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"অফিসের অ্যাপে এই খোলা যাবে না"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ব্যক্তিগত অ্যাপে এই কন্টেন্ট শেয়ার করা যাবে না"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ব্যক্তিগত অ্যাপে এই কন্টেন্ট খোলা যাবে না"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"অফিস প্রোফাইল বন্ধ করা আছে"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"চালু করতে ট্যাপ করুন"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"অফিসের অ্যাপ ব্যবহার করা যাবে না"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ব্যক্তিগত অ্যাপে দেখা যাবে না"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ব্যক্তিগত প্রোফাইলে <xliff:g id="APP">%s</xliff:g> অ্যাপ খুলতে চান?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"অফিস প্রোফাইলে <xliff:g id="APP">%s</xliff:g> অ্যাপ খুলতে চান?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্রাউজার ব্যবহার করুন"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"অফিস ব্রাউজার ব্যবহার করুন"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"সিম নেটওয়ার্ক আনলক পিন"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"সিম নেটওয়ার্ক সাবসেট আনলক পিন"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"কর্পোরেট সিম আনলক পিন"</string>
@@ -2284,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"বড় করে দেখার নতুন সেটিংস"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"আপনার স্ক্রিনের অংশ এখন আপনি বড় করে দেখতে পারবেন"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"সেটিংস থেকে চালু করুন"</string>
<string name="dismiss_action" msgid="1728820550388704784">"বাতিল করুন"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"চালিয়ে যেতে, <b><xliff:g id="APP">%s</xliff:g></b> আপনার ডিভাইসের মাইক্রোফোন অ্যাক্সেস করতে চায়।"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index b6d478f..c891a53 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Dozvoljava aplikaciji da otkrije Bluetooth uređaje u blizini i upari se s njima"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezivanje s uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Dozvoljava aplikaciji da se poveže s uparenim Bluetooth uređajima"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o preferiranoj usluzi plaćanja putem NFC-a"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da dobije informacije o preferiranoj usluzi plaćanja putem NFC-a kao što su registrirana pomagala i odredište rute."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"upravljanje NFC-om"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nije postavljen PIN, uzorak niti lozinka"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Greška pri autentifikaciji"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristi zaključavanje ekrana"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Unesite akreditiv uređaja da nastavite"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrirajte lice"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ponovo registrirajte lice da poboljšate prepoznavanje"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Postavite otključavanje licem"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da dodate otisak prsta"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Lice nije snimljeno precizno. Pokušajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše svijetlo. Probajte s blažim osvjetljenjem."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Previše je tamno. Pokušajte s jačim osvjetljenjem."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Koristi otključavanje licem"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristi otključavanje licem ili zaključavanje ekrana"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Koristite otključavanje licem da nastavite"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da nastavite"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Kopirano"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je zalijepljena iz aplikacije <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je zalijepljena iz međumemorije"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je zalijepila kopirani tekst"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je zalijepila kopiranu sliku"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je zalijepila kopirani sadržaj"</string>
<string name="more_item_label" msgid="7419249600215749115">"Više"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Meni+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Prikaz ličnog sadržaja"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Prikaz poslovnog sadržaja"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokirao je vaš IT administrator"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ovaj sadržaj nije moguće dijeliti pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ovaj sadržaj nije moguće otvoriti pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj nije moguće dijeliti pomoću ličnih aplikacija"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ovaj sadržaj nije moguće otvoriti pomoću ličnih aplikacija"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Radni profil je pauziran"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da uključite"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> u ličnom profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> u radnom profilu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični preglednik"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje mreže na SIM-u"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN za otključavanje mrežne podgrupe na SIM-u"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN za otključavanje korporativnog SIM-a"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nove postavke uvećavanja"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sada možete uvećati dio ekrana"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Da nastavite, aplikaciji <b><xliff:g id="APP">%s</xliff:g></b> je potreban pristup mikrofonu vašeg uređaja."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 023ec09..0d97a70 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permet que l\'aplicació detecti i vinculi dispositius Bluetooth propers"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connectar-se a dispositius Bluetooth vinculats"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permet que l\'aplicació es connecti a dispositius Bluetooth vinculats"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informació preferent sobre el servei de pagament per NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet que l\'aplicació obtingui informació preferent sobre el servei de pagament per NFC, com ara complements registrats i destinacions de rutes."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicació de camp proper (NFC)"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No s\'ha definit cap PIN, patró o contrasenya"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error en l\'autenticació"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Utilitza el bloqueig de pantalla"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Utilitza les credencials del teu dispositiu per continuar"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No s\'ha pogut processar l\'empremta digital. Torna-ho a provar."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueig facial"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Torna a registrar la cara"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Per millorar el reconeixement, torna a registrar la cara"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configura el desbloqueig facial"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira el telèfon per desbloquejar-lo"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura més maneres de desbloquejar el dispositiu"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca per afegir una empremta digital"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"No es reconeix la teva cara. Torna-ho a provar."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Massa brillant Prova una il·luminació més suau."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Massa fosc. Prova una il·luminació més brillant."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Utilitza el desbloqueig facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilitza el desbloqueig facial o de pantalla"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Utilitza el desbloqueig facial per continuar"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilitza la cara o el bloqueig de pantalla per continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"S\'ha copiat"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha enganxat dades de: <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha enganxat dades del porta-retalls"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha enganxat text que has copiat"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha enganxat una imatge que has copiat"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha enganxat contingut que has copiat"</string>
<string name="more_item_label" msgid="7419249600215749115">"Més"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menú+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1327,7 +1326,7 @@
<item msgid="1616528372438698248">"Ethernet"</item>
<item msgid="9177085807664964627">"VPN"</item>
</string-array>
- <string name="network_switch_type_name_unknown" msgid="3665696841646851068">"una tipus de xarxa desconegut"</string>
+ <string name="network_switch_type_name_unknown" msgid="3665696841646851068">"un tipus de xarxa desconegut"</string>
<string name="accept" msgid="5447154347815825107">"Accepta"</string>
<string name="decline" msgid="6490507610282145874">"Rebutja"</string>
<string name="select_character" msgid="3352797107930786979">"Insereix un caràcter"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Feina"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualització personal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualització de treball"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloquejat per l\'administrador de TI"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"No es pot compartir aquest contingut amb aplicacions de treball"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"No es pot obrir aquest contingut amb aplicacions de treball"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"No es pot compartir aquest contingut amb aplicacions personals"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"No es pot obrir aquest contingut amb aplicacions personals"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"El perfil de treball està en pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Toca per activar"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Cap aplicació de treball"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Cap aplicació personal"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vols obrir-ho a <xliff:g id="APP">%s</xliff:g> amb el perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vols obrir-ho a <xliff:g id="APP">%s</xliff:g> amb el perfil de treball?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilitza el navegador personal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilitza el navegador de treball"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueig de la xarxa SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueig de subconjunt de la xarxa SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueig de la SIM corporativa"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nova configuració d\'ampliació"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ara pots ampliar una part de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activa a Configuració"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignora"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Per continuar, <b><xliff:g id="APP">%s</xliff:g></b> necessita accedir al micròfon del dispositiu."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 34846ec..7e163e1 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -545,6 +545,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Umožňuje aplikaci vyhledávat zařízení Bluetooth v okolí a spárovávat se s nimi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"připojovat se ke spárovaným zařízením Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Umožňuje aplikaci připojovat se ke spárovaným zařízením Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informace o preferované platební službě NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikaci získat informace o preferované platební službě NFC, například o registrovaných pomůckách a cíli směrování."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ovládání technologie NFC"</string>
@@ -579,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Není nastaven žádný PIN, gesto ani heslo"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Při ověřování došlo k chybě"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Použít zámek obrazovky"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Pokračujte zadáním identifikačních úřadů svého zařízení"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Zpracování otisku prstu se nezdařilo. Zkuste to znovu."</string>
@@ -626,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odemknutí obličejem"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Zaznamenejte obličej znovu"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavte odemknutí obličejem"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefon odemknete pohledem"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte si více způsobů odemykání"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím přidáte otisk prstu"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Je příliš světlo. Zmírněte osvětlení."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Je moc velká tma. Přejděte na světlo."</string>
@@ -670,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Obličej <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Použít odemknutí obličejem"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Použít odemknutí obličejem nebo zámek obrazovky"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Pokračujte odemknutím obličejem"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte ověřením pomocí obličeje nebo zámku obrazovky"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Zkopírováno"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikace <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> vložila data z aplikace <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikace <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> vložila data ze schránky"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikace <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> vložila zkopírovaný text"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikace <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> vložila zkopírovaný obrázek"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikace <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> vložila zkopírovaný obsah"</string>
<string name="more_item_label" msgid="7419249600215749115">"Více"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Pracovní"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobní zobrazení"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pracovní zobrazení"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokováno administrátorem IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Tento obsah nelze sdílet pomocí pracovních aplikací"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Tento obsah nelze otevřít pomocí pracovních aplikací"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Tento obsah nelze sdílet pomocí osobních aplikací"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Tento obsah nelze otevřít pomocí osobních aplikací"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Pracovní profil je pozastaven"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Klepnutím zapnete"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žádné pracovní aplikace"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žádné osobní aplikace"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otevřít v aplikaci <xliff:g id="APP">%s</xliff:g> v osobním profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otevřít v aplikaci <xliff:g id="APP">%s</xliff:g> v pracovním profilu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použít osobní prohlížeč"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použít pracovní prohlížeč"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kód PIN odblokování sítě pro SIM kartu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN pro odblokování podskupiny sítí pro SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Kód PIN odblokování podnikové sítě pro SIM kartu"</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nové nastavení zvětšování"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nově můžete zvětšit část obrazovky"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Zapnout v Nastavení"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Zavřít"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Než budete pokračovat, udělte aplikaci <b><xliff:g id="APP">%s</xliff:g></b> přístup k mikrofonu na zařízení."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 475b274..e79be91 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Appen kører"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps, der bruger batteri"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Forstørrelse"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Brug af hjælpefunktioner"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> bruger batteri"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps bruger batteri"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tryk for at se info om batteri- og dataforbrug"</string>
@@ -541,6 +540,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tillader, at appen registrerer og parrer Bluetooth-enheder i nærheden"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"opret forbindelse til parrede Bluetooth-enheder"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tillader, at appen opretter forbindelse til parrede Bluetooth-enheder"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Foretrukne oplysninger vedrørende NFC-betalingstjeneste"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillader, at appen får foretrukne oplysninger vedrørende NFC-betalingstjeneste, f.eks. registrerede hjælpemidler og rutedestinationer."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"administrere Near Field Communication"</string>
@@ -575,29 +578,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Der er ikke angivet pinkode, mønster eller adgangskode"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Der opstod fejl i forbindelse med godkendelse"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Brug skærmlås"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Angiv dine loginoplysninger for enheden for at fortsætte"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Angiv din skærmlås for at fortsætte"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Et delvist fingeraftryk blev registreret"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Fingeraftrykket kunne ikke behandles. Prøv igen."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Rengør sensoren"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Fingeren blev flyttet for hurtigt"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Du bevægede fingeren for langsomt. Prøv igen."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prøv med et andet fingeraftryk"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Der er for lyst"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Prøv at justere den"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingeraftrykket blev godkendt"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Ansigtet er godkendt"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ansigtet er godkendt. Tryk på Bekræft."</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardwaren til fingeraftryk er ikke tilgængelig."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Fingeraftrykket kan ikke gemmes"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Registrering af fingeraftryk fik timeout. Prøv igen."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingeraftrykshandlingen blev annulleret."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingeraftrykshandlingen blev annulleret af brugeren."</string>
@@ -622,14 +618,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansigtslås"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrer dit ansigt igen"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Registrer dit ansigt igen for at forbedre genkendelsen af det"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurer ansigtslås"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Der blev ikke registreret ansigtsdata. Prøv igen."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Der er for lyst. Prøv en mere dæmpet belysning."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv med mere belysning."</string>
@@ -666,7 +658,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Brug ansigtslås"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Brug ansigts- eller skærmlås"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Brug ansigtslås for at fortsætte"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Brug dit ansigt for at fortsætte"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Brug din ansigts- eller skærmlås for at fortsætte"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1033,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Kopieret"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> indsatte indhold fra <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> indsatte indhold fra udklipsholderen"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> indsatte tekst, som du har kopieret"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> indsatte et billede, som du har kopieret"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> indsatte indhold, som du har kopieret"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mere"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2143,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Arbejde"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visningen Personligt"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visningen Arbejde"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokeret af din it-administrator"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Dette indhold kan ikke deles med arbejdsapps"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Dette indhold kan ikke åbnes med arbejdsapps"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Dette indhold kan ikke deles med personlige apps"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Dette indhold kan ikke åbnes med personlige apps"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Arbejdsprofilen er sat på pause"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tryk for at aktivere"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Der er ingen arbejdsapps"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Der er ingen personlige apps"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Skal det åbnes i <xliff:g id="APP">%s</xliff:g> på den personlige profil?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Skal det åbnes i <xliff:g id="APP">%s</xliff:g> på arbejdsprofilen?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Brug personlig browser"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Brug arbejdsbrowser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkode til oplåsning af SIM-netværket"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Pinkode til oplåsning af delmængde for SIM-netværket"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Pinkode til oplåsning af virksomhedens SIM"</string>
@@ -2280,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nye indstillinger for forstørrelse"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Du kan nu forstørre noget af skærmen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivér i Indstillinger"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Luk"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> skal have adgang til din enheds mikrofon, før den kan fortsætte."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f8cb560..1c4da39 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Erlaubt der App, Bluetooth-Geräte in der Nähe zu finden und zu koppeln"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"Mit gekoppelten Bluetooth-Geräten verbinden"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Erlaubt der App, sich mit gekoppelten Bluetooth-Geräten zu verbinden"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informationen zum bevorzugten NFC-Zahlungsdienst"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ermöglicht der App, Informationen zum bevorzugten NFC-Zahlungsdienst abzurufen, etwa registrierte Hilfsmittel oder das Routenziel."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Nahfeldkommunikation steuern"</string>
@@ -573,7 +577,7 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Keine PIN, kein Muster und kein Passwort festgelegt"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Fehler bei der Authentifizierung"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Displaysperre verwenden"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Zum Fortfahren Anmeldedaten des Geräts eingeben"</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Displaysperre eingeben, um fortzufahren"</string>
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Fingerabdruck konnte nicht verarbeitet werden. Bitte versuche es noch einmal."</string>
@@ -620,14 +624,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Gesicht neu scannen lassen"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Für bessere Erkennung Gesicht neu scannen lassen"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Face Unlock einrichten"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Entsperre dein Smartphone, indem du es ansiehst"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weitere Möglichkeiten zum Entsperren einrichten"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tippe, um einen Fingerabdruck hinzuzufügen"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Gesichtsdaten nicht gut erfasst. Erneut versuchen."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Zu hell. Schwächere Beleuchtung ausprobieren."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Zu dunkel. Probier eine hellere Beleuchtung aus."</string>
@@ -664,7 +664,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Gesicht <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Face Unlock verwenden"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Face Unlock oder Displaysperre verwenden"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Zum Fortfahren Face Unlock verwenden"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Per Gesichtserkennung fortfahren"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Verwende die Gesichtserkennung oder deine Display-Entsperrmethode, um fortzufahren"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"Kopiert"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> hat etwas von <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> eingefügt"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> hat etwas aus der Zwischenablage eingefügt"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> hat einen von dir kopierten Text eingefügt"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> hat ein von dir kopiertes Bild eingefügt"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> hat den von dir kopierten Inhalt eingefügt"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mehr"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menü+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta-Taste +"</string>
@@ -2141,31 +2138,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Geschäftlich"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Private Ansicht"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Geschäftliche Ansicht"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Von deinem IT-Administrator blockiert"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Diese Art von Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Diese Art von Inhalt kann nicht mit geschäftlichen Apps geöffnet werden"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Diese Art von Inhalt kann nicht über private Apps geteilt werden"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Diese Art von Inhalt kann nicht mit privaten Apps geöffnet werden"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Arbeitsprofil pausiert"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Zum Aktivieren tippen"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Keine geschäftlichen Apps"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Keine privaten Apps"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"In <xliff:g id="APP">%s</xliff:g> im privaten Profil öffnen?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"In <xliff:g id="APP">%s</xliff:g> im Arbeitsprofil öffnen?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Privaten Browser verwenden"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Arbeitsbrowser verwenden"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Entsperr-PIN für netzgebundenes Gerät"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Entsperr-PIN für subnetzgebundenes Gerät"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Entsperr-PIN für unternehmensgebundenes Gerät"</string>
@@ -2278,10 +2263,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Neue Vergrößerungseinstellungen"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Du kannst das Display teilweise vergrößern"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"In den Einstellungen aktivieren"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Schließen"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Zum Fortfahren benötigt, <b><xliff:g id="APP">%s</xliff:g></b> Zugriff auf das Mikrofon deines Geräts."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 7279634..4204b9ce 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Η εφαρμογή εκτελείται"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Εφαρμογές που καταναλώνουν μπαταρία"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Μεγιστοποίηση"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Χρήση προσβασιμότητας"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> χρησιμοποιεί μπαταρία"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> εφαρμογές χρησιμοποιούν μπαταρία"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Πατήστε για λεπτομέρειες σχετικά με τη χρήση μπαταρίας και δεδομένων"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Επιτρέπει στην εφαρμογή την ανακάλυψη και τη σύζευξη κοντινών συσκευών Bluetooth"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"σύνδεση σε συζευγμένες συσκευές Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Επιτρέπει στην εφαρμογή τη σύνδεση σε συζευγμένες συσκευές Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Πληροφορίες προτιμώμενης υπηρεσίας πληρωμών NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Επιτρέπει στην εφαρμογή να λαμβάνει πληροφορίες προτιμώμενης υπηρεσίας πληρωμής NFC, όπως καταχωρημένα βοηθήματα και προορισμό διαδρομής."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ελέγχει την Επικοινωνία κοντινού πεδίου (FNC)"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Δεν έχει οριστεί PIN, μοτίβο ή κωδικός πρόσβασης"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Σφάλμα κατά τον έλεγχο ταυτότητας"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Χρήση κλειδώματος οθόνης"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Εισαγάγετε το διαπιστευτήριο της συσκευής σας για να συνεχίσετε"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Εντοπίστηκε μέρους του δακτυλικού αποτυπώματος"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Δεν ήταν δυνατή η επεξεργασία του δακτυλικού αποτυπώματος. Δοκιμάστε ξανά."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Καθαρίστε τον αισθητήρα"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Το δάχτυλο μετακινήθηκε πολύ γρήγορα"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Πολύ αργή κίνηση δαχτύλου. Δοκιμάστε ξανά."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Δοκιμάστε άλλο δακτυλικό αποτύπωμα"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Υπερβολικά έντονος φωτισμός"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Δοκιμάστε να το προσαρμόσετε"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Η ταυτότητα του δακτυλικού αποτυπώματος ελέγχθηκε"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Έγινε έλεγχος ταυτότητας προσώπου"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Έγινε έλεγχος ταυτότητας προσώπου, πατήστε \"Επιβεβαίωση\""</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Ο εξοπλισμός δακτυλικού αποτυπώματος δεν είναι διαθέσιμος."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Δεν είναι δυνατή η ρύθμιση του δακτυλικού αποτυπώματος"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Λήξη χρονικού ορίου δακτυλικού αποτυπώματος. Δοκιμάστε ξανά."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Η λειτουργία δακτυλικού αποτυπώματος ακυρώθηκε."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Η λειτουργία δακτυλικού αποτυπώματος ακυρώθηκε από τον χρήστη."</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Εγγράψτε ξανά το πρόσωπό σας"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Ρυθμίστε το Face Unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Ξεκλειδώστε το τηλέφωνό σας απλώς κοιτώντας το"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ρυθμίστε περισσότερους τρόπους ξεκλειδώματος"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Πατήστε για να προσθέσετε δακτυλικό αποτύπωμα"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Υπερβολικά έντονος φωτισμός. Δοκιμάστε πιο ήπιο."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Πολύ σκοτεινό περιβάλλον. Φροντίστε τον φωτισμό."</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Πρόσωπο <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Χρήση Face Unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Χρήση προσώπου ή κλειδώματος οθόνης"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Χρησιμοποιήστε το Face Unlock για να συνεχίσετε"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Χρησιμοποιήστε το πρόσωπό σας ή το κλείδωμα οθόνης για συνέχεια"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Αντιγράφηκε"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Η εφαρμογή <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> έκανε επικόλληση από την εφαρμογή <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Η εφαρμογή <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> έκανε επικόλληση από το πρόχειρο"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Η εφαρμογή <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> επικόλλησε το κείμενο που αντιγράψατε"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Η εφαρμογή <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> επικόλλησε την εικόνα που αντιγράψατε"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Η εφαρμογή <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> επικόλλησε περιεχόμενο που αντιγράψατε"</string>
<string name="more_item_label" msgid="7419249600215749115">"Περισσότερα"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Πλήκτρο Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Εργασία"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Προσωπική προβολή"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Προβολή εργασίας"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Αποκλείστηκε από τον διαχειριστή IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Το προφίλ εργασίας σας έχει τεθεί σε παύση."</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Πατήστε για ενεργοποίηση"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Δεν υπάρχουν εφαρμογές εργασιών"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Δεν υπάρχουν προσωπικές εφαρμογές"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Άνοιγμα εφαρμογής <xliff:g id="APP">%s</xliff:g> στο προσωπικό προφίλ;"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Άνοιγμα εφαρμογής <xliff:g id="APP">%s</xliff:g> στο προφίλ εργασίας;"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Χρήση προσωπικού προγράμματος περιήγησης"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Χρήση προγράμματος περιήγησης εργασίας"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ξεκλειδώματος δικτύου κάρτας SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN ξεκλειδώματος υποσυνόλου δικτύου κάρτας SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN ξεκλειδώματος εταιρικής SIM"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Νέες ρυθμίσεις μεγιστοποίησης"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Μπορείτε πλέον να μεγεθύνετε μέρος της οθόνης σας"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ενεργοποίηση στις Ρυθμίσεις"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Παράβλεψη"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Για να συνεχίσετε, η εφαρμογή <b><xliff:g id="APP">%s</xliff:g></b> χρειάζεται πρόσβαση στο μικρόφωνο της συσκευής σας."</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 9fdd65b..70ae1b7 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App running"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps consuming battery"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Magnification"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Accessibility usage"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using battery"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps are using battery"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tap for details on battery and data usage"</string>
@@ -539,6 +538,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="1386872477514626447">"range to devices using ultra-wideband"</string>
+ <string name="permdesc_uwb_ranging" product="default" msgid="1583519616137382182">"Allows the app to range to devices using ultra-wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -573,29 +574,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No pin, pattern or password set"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error while authenticating"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Use screen lock"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Enter your device credential to continue"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Finger moved too fast"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Try adjusting"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingerprint hardware not available."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Can’t set up fingerprint"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingerprint operation cancelled by user."</string>
@@ -660,7 +654,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use face unlock to continue"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 2f0a4d2..91732c0 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App running"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps consuming battery"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Magnification"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Accessibility usage"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using battery"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps are using battery"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tap for details on battery and data usage"</string>
@@ -539,6 +538,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="1386872477514626447">"range to devices using ultra-wideband"</string>
+ <string name="permdesc_uwb_ranging" product="default" msgid="1583519616137382182">"Allows the app to range to devices using ultra-wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -573,29 +574,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No pin, pattern or password set"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error while authenticating"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Use screen lock"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Enter your device credential to continue"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Finger moved too fast"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Try adjusting"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingerprint hardware not available."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Can’t set up fingerprint"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingerprint operation cancelled by user."</string>
@@ -660,7 +654,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use face unlock to continue"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index e52ff7d..79476d5 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App running"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps consuming battery"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Magnification"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Accessibility usage"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using battery"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps are using battery"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tap for details on battery and data usage"</string>
@@ -539,6 +538,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="1386872477514626447">"range to devices using ultra-wideband"</string>
+ <string name="permdesc_uwb_ranging" product="default" msgid="1583519616137382182">"Allows the app to range to devices using ultra-wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -573,29 +574,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No pin, pattern or password set"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error while authenticating"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Use screen lock"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Enter your device credential to continue"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Finger moved too fast"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Try adjusting"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingerprint hardware not available."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Can’t set up fingerprint"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingerprint operation cancelled by user."</string>
@@ -660,7 +654,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use face unlock to continue"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index a73db00..34fd93b 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App running"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps consuming battery"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Magnification"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Accessibility usage"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using battery"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps are using battery"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tap for details on battery and data usage"</string>
@@ -539,6 +538,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="1386872477514626447">"range to devices using ultra-wideband"</string>
+ <string name="permdesc_uwb_ranging" product="default" msgid="1583519616137382182">"Allows the app to range to devices using ultra-wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC payment service information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string>
@@ -573,29 +574,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No pin, pattern or password set"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error while authenticating"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Use screen lock"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Enter your device credential to continue"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Finger moved too fast"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Try adjusting"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingerprint hardware not available."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Can’t set up fingerprint"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingerprint operation cancelled by user."</string>
@@ -660,7 +654,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use face unlock to continue"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 12bc978..6530693 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App running"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps consuming battery"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Magnification"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Accessibility usage"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using battery"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps are using battery"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tap for details on battery and data usage"</string>
@@ -539,6 +538,8 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Allows the app to discover and pair nearby Bluetooth devices"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"connect to paired Bluetooth devices"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Allows the app to connect to paired Bluetooth devices"</string>
+ <string name="permlab_uwb_ranging" msgid="1386872477514626447">"range to devices using ultra-wideband"</string>
+ <string name="permdesc_uwb_ranging" product="default" msgid="1583519616137382182">"Allows the app to range to devices using ultra-wideband"</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferred NFC Payment Service Information"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred nfc payment service information like registered aids and route destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"control Near Field Communication"</string>
@@ -573,29 +574,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No pin, pattern, or password set"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error authenticating"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Use screen lock"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Enter your device credential to continue"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Finger moved too fast"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Try adjusting"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated, please press confirm"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingerprint hardware not available."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Can’t set up fingerprint"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Fingerprint time out reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerprint operation canceled."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingerprint operation canceled by user."</string>
@@ -660,7 +654,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use face unlock to continue"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 475fe5f..c5660cf 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App en ejecución"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps que consumen batería"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Ampliación"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uso de accesibilidad"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> está consumiendo batería"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps están consumiendo batería"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Presiona para obtener información sobre el uso de datos y de la batería"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que la app descubra dispositivos Bluetooth cercanos y se conecte a ellos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que la app se conecte a dispositivos Bluetooth vinculados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información sobre servicio de pago NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar la Transmisión de datos en proximidad"</string>
@@ -573,29 +576,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No se estableció ningún PIN, patrón ni contraseña"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error de autenticación"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar bloqueo de pantalla"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Ingresa las credenciales de tu dispositivo para continuar"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Ingresa tu bloqueo de pantalla para continuar"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Detección parcial de una huella dactilar"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se pudo procesar la huella dactilar. Vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpia el sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Se movió el dedo demasiado rápido"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Moviste el dedo muy lento. Vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prueba con otra huella dactilar"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Demasiada luz"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Prueba ajustarla"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Se autenticó la huella dactilar"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Se autenticó el rostro"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Se autenticó el rostro; presiona Confirmar"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"El hardware para detectar huellas dactilares no está disponible."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"No se puede configurar la huella dactilar"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Finalizó el tiempo de espera para la huella dactilar. Vuelve a intentarlo."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Se canceló la operación de huella dactilar."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"El usuario canceló la operación de huella dactilar."</string>
@@ -620,14 +616,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Vuelve a registrar tu rostro"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mejorar el reconocimiento, vuelve a registrar tu rostro"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configurar Desbloqueo facial"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloquear el dispositivo"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Presiona para agregar una huella dactilar"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Datos faciales imprecisos. Vuelve a intentarlo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado brillante. Prueba con menos iluminación."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado oscuro. Prueba con más iluminación."</string>
@@ -664,7 +656,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Rostro <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueo facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar bloqueo facial o de pantalla"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Usa el desbloqueo facial para continuar"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa el rostro para continuar"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu rostro o bloqueo de pantalla para continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1023,9 @@
<string name="copied" msgid="4675902854553014676">"Copiado"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegó contenido de <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegó contenido del portapapeles"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegó texto que copiaste"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegó una imagen que copiaste"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegó el contenido que copiaste"</string>
<string name="more_item_label" msgid="7419249600215749115">"Más"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menú+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2130,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista personal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de trabajo"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Tu administrador de IT impide compartir este contenido"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"No se puede compartir este contenido con apps de trabajo"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"No se puede abrir este contenido con apps de trabajo"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"No se puede compartir este contenido con apps personales"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"No se puede abrir este contenido con apps personales"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"El perfil de trabajo está en pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Presionar para activar"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"El contenido no es compatible con apps de trabajo"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"El contenido no es compatible con apps personales"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> con tu perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> con tu perfil de trabajo?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar un navegador personal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar un navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo del dispositivo para la red de tarjeta SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueo del dispositivo para el subconjunto de redes de tarjeta SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueo corporativo del dispositivo para tarjeta SIM"</string>
@@ -2278,10 +2255,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nueva configuración de ampliación"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ahora puedes ampliar parte de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Configuración"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Descartar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b&gt necesita acceso al micrófono del dispositivo."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 3aefd2b..32121a5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que la aplicación detecte y vincule dispositivos Bluetooth cercanos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que la aplicación se conecte a dispositivos Bluetooth vinculados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información sobre el servicio de pago por NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la aplicación obtenga información sobre el servicio de pago por NFC preferido, como identificadores de aplicación registrados y destinos de rutas."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicación de campo cercano (NFC)"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No se ha definido el PIN, el patrón o la contraseña"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"No se ha podido autenticar"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar bloqueo de pantalla"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Introduce las credenciales del dispositivo para continuar"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se ha podido procesar la huella digital. Vuelve a intentarlo."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volver a registrar la cara"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mejorar el reconocimiento, vuelve a registrar tu cara"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configura el desbloqueo facial"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloqueo"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para añadir una huella digital"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Datos faciales no reconocidos. Vuelve a intentarlo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Hay demasiada luz. Busca un sitio menos iluminado."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado oscuro. Prueba en un lugar con más luz."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueo facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar desbloqueo facial o bloqueo de pantalla"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Usa el desbloqueo facial para continuar"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu cara o tu bloqueo de pantalla para continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Copiado"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha pegado contenido de <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha pegado contenido del portapapeles"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha pegado texto que has copiado"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha pegado una imagen que has copiado"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha pegado contenido que has copiado"</string>
<string name="more_item_label" msgid="7419249600215749115">"Más"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"MENU+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ver contenido personal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ver contenido de trabajo"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloqueado por tu administrador de TI"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Este contenido no se puede compartir con aplicaciones de trabajo"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Este contenido no se puede abrir con aplicaciones de trabajo"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Este contenido no se puede compartir con aplicaciones personales"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Este contenido no se puede abrir con aplicaciones personales"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"El perfil de trabajo está en pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Toca para activar"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ninguna aplicación de trabajo"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ninguna aplicación personal"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"¿Abrir en <xliff:g id="APP">%s</xliff:g> en el perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"¿Abrir en <xliff:g id="APP">%s</xliff:g> en el perfil de trabajo?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar navegador personal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo de red de tarjeta SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueo de subconjunto de red SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueo corporativo de SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nuevos ajustes de ampliación"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ahora puedes ampliar una parte de la pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Ajustes"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Cerrar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> necesita tener acceso al micrófono del dispositivo."</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index d45e917..d0a0463 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lubab rakendusel avastada lähedalasuvaid Bluetooth-seadmeid ja nendega siduda"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"seotud Bluetooth-seadmetega ühenduse loomine"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lubab rakendusel luua ühenduse seotud Bluetooth-seadmetega"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Eelistatud NFC-makseteenuse teave"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Võimaldab rakendusel hankida eelistatud NFC-makseteenuse teavet (nt registreeritud abi ja marsruudi sihtkoht)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"lähiväljaside juhtimine"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN-koodi, mustrit ega parooli pole määratud"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Viga autentimisel"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ekraaniluku kasutamine"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Jätkamiseks sisestage seadme mandaat"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Sõrmejälge ei õnnestunud töödelda. Proovige uuesti."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registreerige oma nägu uuesti"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Tuvastamise parandamiseks registreerige oma nägu uuesti"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Seadistage Face Unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Avage telefon seda vaadates"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Seadistage rohkem viise avamiseks"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Puudutage sõrmejälje lisamiseks"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Näoandmeid ei saanud jäädvustada. Proovige uuesti."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Liiga ere. Proovige hämaramat valgust."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Liiga pime. Proovige parema valgustusega kohas."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Nägu <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Face Unlocki kasutamine"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Face Unlocki või ekraaniluku kasutamine"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Jätkamiseks kasutage Face Unlocki"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jätkamiseks kasutage oma nägu või ekraanilukku"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopeeritud"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kleepis rakendusest <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kleepis lõikelaualt"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kleepis teie kopeeritud teksti"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kleepis teie kopeeritud pildi"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> kleepis teie kopeeritud sisu"</string>
<string name="more_item_label" msgid="7419249600215749115">"Rohkem"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menüü+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Töö"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Isiklik vaade"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Töövaade"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokeeris teie IT-administraator"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Seda sisu ei saa töörakendustega jagada"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Seda sisu ei saa töörakendustega avada"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Seda sisu ei saa isiklike rakendustega jagada"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Seda sisu ei saa isiklike rakendustega avada"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Tööprofiil on peatatud"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Puudutage sisselülitamiseks"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Töörakendusi pole"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Isiklikke rakendusi pole"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Kas avada rakendus <xliff:g id="APP">%s</xliff:g> isiklikul profiilil?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Kas avada rakendus <xliff:g id="APP">%s</xliff:g> tööprofiilil?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kasuta isiklikku brauserit"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Kasuta tööbrauserit"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kaardi võrgu avamise PIN-kood"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM-kaardi võrgu alamhulga avamise PIN-kood"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM-kaardi ettevõtte avamise PIN-kood"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Uued suurendamise seaded"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Saate nüüd suurendada osa oma ekraanikuvast"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Lülitage sisse menüüs Seaded"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Loobu"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Jätkamiseks vajab rakendus <b><xliff:g id="APP">%s</xliff:g></b> juurdepääsu teie seadme mikrofonile."</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index a4dad80..1fd31a1 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Inguruko Bluetooth bidezko gailuak hautemateko eta haiekin parekatzeko baimena ematen die aplikazioei"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"parekatutako Bluetooth bidezko gailuetara konektatu"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Parekatutako Bluetooth bidezko gailuetara konektatzeko baimena ematen die aplikazioei"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC bidezko ordainketa-zerbitzu lehenetsiari buruzko informazioa"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Aplikazioari baimena ematen dio NFC bidezko ordainketa-zerbitzu lehenetsiari buruzko informazioa jasotzeko, hala nola erregistratutako laguntzaileak eta ibilbidearen helmuga."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolatu Near Field Communication komunikazioa"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Ez da ezarri PIN koderik, eredurik edo pasahitzik"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Errorea autentifikatzean"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Erabili pantailaren blokeoa"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Aurrera egiteko, idatzi gailuaren kredentzialak"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ezin izan da prozesatu hatz-marka. Saiatu berriro."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Aurpegiaren bidez desblokeatzeko eginbidea"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Erregistratu aurpegia berriro"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ezagutzea hobetzeko, erregistratu aurpegia berriro"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Konfiguratu aurpegiaren bidez desblokeatzeko eginbidea"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonoa desblokeatzeko, begira iezaiozu"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguratu telefonoa desblokeatzeko modu gehiago"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Sakatu hau hatz-marka bat gehitzeko"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Argi gehiegi dago. Joan toki ilunago batera."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Ilunegi dago. Erabili argi gehiago."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> aurpegia"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Erabili aurpegiaren bidez desblokeatzeko eginbidea"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Erabili aurpegia edo pantailaren blokeoa"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Aurrera egiteko, erabili aurpegiaren bidez desblokeatzeko eginbidea"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopiatu da"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> aplikaziotik itsatsi da <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Arbeletik itsatsi da <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> aplikazioak kopiatu duzun testua itsatsi du"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> aplikazioak kopiatu duzun irudia itsatsi du"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> aplikazioak kopiatu duzun edukia itsatsi du"</string>
<string name="more_item_label" msgid="7419249600215749115">"Gehiago"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menua+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Lanekoa"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ikuspegi pertsonala"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Laneko ikuspegia"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IKT saileko administratzaileak blokeatu egin du"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Eduki hau ezin da laneko aplikazioekin partekatu"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Eduki hau ezin da laneko aplikazioekin ireki"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Eduki hau ezin da aplikazio pertsonalekin partekatu"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Eduki hau ezin da aplikazio pertsonalekin ireki"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Laneko profila pausatuta dago"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Sakatu aktibatzeko"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ez dago laneko aplikaziorik"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ez dago aplikazio pertsonalik"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Profil pertsonaleko <xliff:g id="APP">%s</xliff:g> aplikazioan ireki nahi duzu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Laneko profileko <xliff:g id="APP">%s</xliff:g> aplikazioan ireki nahi duzu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Erabili arakatzaile pertsonala"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Erabili laneko arakatzailea"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIMaren sarearen bidez desblokeatzeko PIN kodea"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIMaren sareko azpimultzoaren bidez desblokeatzeko PIN kodea"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Enpresaren SIMaren bidez desblokeatzeko PIN kodea"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Luparen ezarpen berriak"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Orain, pantailaren zati bat handi dezakezu"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktibatu ezarpenetan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Baztertu"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Aurrera egiteko, gailuaren mikrofonoa atzitzeko baimena behar du <b><xliff:g id="APP">%s</xliff:g></b> aplikazioak."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 7ce6cf0..e0ffd46 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"به برنامه اجازه میدهد دستگاههای بلوتوث اطراف را پیدا کند و با آنها مرتبط شود"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"اتصال به دستگاههای بلوتوث مرتبطشده"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"به برنامه اجازه میدهد به دستگاههای بلوتوث مرتبطشده متصل شود"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"به برنامه اجازه میدهد اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)، مانند کمکهای ثبتشده و مقصد مسیر را دریافت کند."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"کنترل ارتباط راه نزدیک"</string>
@@ -573,7 +577,7 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"پین، الگو یا گذرواژهای تنظیم نشده است"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"خطا هنگام اصالتسنجی"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"از قفل صفحه استفاده کنید"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"برای ادامه، اطلاعات کاربری دستگاهتان را وارد کنید"</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"برای ادامه، قفل صفحهتان را وارد کنید"</string>
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"اثرانگشت پردازش نشد. لطفاً دوباره امتحان کنید."</string>
@@ -620,14 +624,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"بازگشایی با چهره"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ثبت مجدد چهره"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"برای بهبود تشخیص، لطفاً چهرهتان را دوباره ثبت کنید"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"راهاندازی «بازگشایی با چهره»"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"برای باز کردن قفل تلفن خود به آن نگاه کنید"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"راهاندازی روشهای بیشتر برای باز کردن قفل"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"برای افزودن اثر انگشت، ضربه بزنید"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"دادههای دقیق چهره ضبط نشد. دوباره امتحان کنید."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"خیلی روشن است. روشناییاش را ملایمتر کنید."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"خیلی تاریک است. تصویر را روشنتر کنید."</string>
@@ -664,7 +664,7 @@
<string name="face_name_template" msgid="3877037340223318119">"چهره <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"استفاده از «بازگشایی با چهره»"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"استفاده از قفل صفحه یا چهره"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"برای ادامه، از «بازگشایی با چهره» استفاده کنید"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"برای ادامه، از چهرهتان استفاده کنید"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"برای ادامه، از تشخیص چهره یا قفل صفحه استفاده کنید"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"کپی شد"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> از <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> جایگذاری کرد"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> از بریدهدان جایگذاری کرد"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> نوشتاری را که کپی کردید جایگذاری کرد"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> تصویری را که کپی کردید جایگذاری کرد"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> محتوایی را که کپی کردید جایگذاری کرد"</string>
<string name="more_item_label" msgid="7419249600215749115">"بیشتر"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"منو+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2138,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"کاری"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"نمای شخصی"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"نمای کاری"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"سرپرست سیستم آن را مسدود کرده است"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"نمیتوان این محتوا را با برنامههای کاری همرسانی کرد"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"نمیتوان این محتوا را با برنامههای کاری باز کرد"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"نمیتوان این محتوا را با برنامههای شخصی همرسانی کرد"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"نمیتوان این محتوا را با برنامههای شخصی باز کرد"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"نمایه کاری موقتاً متوقف شده است"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"برای روشن کردن، ضربه بزنید"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"برنامه کاریای وجود ندارد"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"برنامه شخصیای وجود ندارد"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"در <xliff:g id="APP">%s</xliff:g> در نمایه شخصی باز شود؟"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"در <xliff:g id="APP">%s</xliff:g> در نمایه کاری باز شود؟"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استفاده از مرورگر شخصی"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"استفاده از مرورگر کاری"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"پین باز کردن قفل شبکه سیمکارت"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"پین باز کردن قفل زیرمجموعه شبکه سیمکارت"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"پین باز کردن قفل شرکت سیمکارت"</string>
@@ -2278,10 +2263,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"تنظیمات درشتنمایی جدید"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"اکنون میتوانید بخشی از صفحه را درشتنمایی کنید"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"روشن کردن در «تنظیمات»"</string>
<string name="dismiss_action" msgid="1728820550388704784">"رد شدن"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"برای ادامه دادن، <b><xliff:g id="APP">%s</xliff:g></b> باید به میکروفون دستگاه دسترسی داشته باشد."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7320df7..b7c81d7 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Sallii sovelluksen löytää lähellä olevia Bluetooth-laitteita ja muodostaa niistä laitepareja"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"yhdistää pariliitettyihin Bluetooth-laitteisiin"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Sallii sovelluksen muodostaa yhteyden pariliitettyihin Bluetooth-laitteisiin"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Ensisijaiset NFC-maksupalvelutiedot"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Sallii sovelluksen noutaa tietoja rekisteröidyistä sovellustunnuksista, maksureitin kohteesta ja muita ensisijaisia NFC-maksupalvelutietoja."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"hallitse Near Field Communication -tunnistusta"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN-koodia, kuviota tai salasanaa ei ole asetettu"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Virhe todennuksessa"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Käytä näytön lukitusta"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Jatka lisäämällä laitteesi kirjautumistiedot"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Sormenjäljen prosessointi epäonnistui. Yritä uudelleen."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Lisää kasvot uudelleen"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Lisää kasvosi uudelleen tunnistamisen parantamiseksi"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Ota Face Unlock käyttöön"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Avaa puhelimesi lukitus katsomalla laitetta"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ota käyttöön lisää tapoja avata lukitus"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Napauta lisätäksesi sormenjälki"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Liian kirkasta. Kokeile pehmeämpää valaistusta."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Liian pimeää. Kokeile kirkkaampaa valaistusta."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Kasvot <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Käytä Face Unlockia"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Käytä Face Unlockia tai näytön lukitusta"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Jatka käyttämällä Face Unlockia"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jatka kasvojentunnistuksen tai näytön lukituksen avulla"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopioitu"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> liitetty täältä: <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> liitetty leikepöydältä"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> on liittänyt kopioimasi tekstin"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> on liittänyt kopioimasi kuvan"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> on liittänyt kopioimasi sisällön"</string>
<string name="more_item_label" msgid="7419249600215749115">"Lisää"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Valikko+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Työ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Henkilökohtainen näkymä"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Työnäkymä"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT-järjestelmänvalvojasi estämä"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Tätä sisältöä ei voi jakaa työsovelluksilla"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Tätä sisältöä ei voi avata työsovelluksilla"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Tätä sisältöä ei voi jakaa henkilökohtaisilla sovelluksilla"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Tätä sisältöä ei voi avata henkilökohtaisilla sovelluksilla"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Työprofiilin käyttö on keskeytetty"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Laita päälle napauttamalla"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ei työsovelluksia"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ei henkilökohtaisia sovelluksia"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Avataanko <xliff:g id="APP">%s</xliff:g> henkilökohtaisessa profiilissa?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Avataanko <xliff:g id="APP">%s</xliff:g> työprofiilissa?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Käytä henkilökohtaista selainta"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Käytä työselainta"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kortin verkkoversion lukituksen avaamisen PIN-koodi"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM-kortin verkkoversion alijoukon lukituksen avaamisen PIN-koodi"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM-kortin yritysversion lukituksen avaamisen PIN-koodi"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Uudet suurennusasetukset"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Voit nyt suurentaa näytön osan"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Laita päälle asetuksista"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hylkää"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Jotta voit jatkaa, <b><xliff:g id="APP">%s</xliff:g></b> tarvitsee pääsyn laitteesi mikrofoniin."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index a6c8195..e757fbb 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permet à l\'application de découvrir les appareils Bluetooth à proximité et de s\'y connecter"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"se connecter aux appareils Bluetooth associés"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permet à l\'application de se connecter aux appareils Bluetooth associés"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Information sur le service préféré de paiement NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement NFC comme les aides enregistrées et la route de destination."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"gérer la communication en champ proche"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Aucun NIP, schéma ou mot de passe défini"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Erreur d\'authentification"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Utiliser le verrouillage de l\'écran"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Entrez votre authentifiant d\'appareil pour continuer"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossible de reconnaître l\'empreinte digitale. Veuillez réessayer."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Déverrouillage par reconnaissance faciale"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Inscrivez votre visage à nouveau"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configurer le déverrouillage par reconnaissance faciale"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Touchez pour ajouter une empreinte digitale"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Imposs. capt. données visage précises. Réessayez."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez un éclairage plus faible."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez avec un éclairage plus fort."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Utiliser le déverrouillage par reconnaissance faciale"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utiliser la reconnaissance faciale ou le verrouillage de l\'écran"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Utilisez le déverrouillage par reconnaissance faciale pour continuer"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez votre visage ou le verrouillage de l\'écran pour continuer"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Copié"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> collé à partir de <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> collé à partir du presse-papiers"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé du texte que vous avez copié"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé une image que vous avez copiée"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé le contenu que vous avez copié"</string>
<string name="more_item_label" msgid="7419249600215749115">"Plus"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Méta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Professionnel"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Affichage personnel"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Affichage professionnel"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloqué par votre administrateur informatique"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Impossible de partager ce contenu avec des applications professionnelles"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Impossible d\'ouvrir ce contenu avec des applications professionnelles"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Impossible de partager ce contenu avec des applications personnelles"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Impossible d\'ouvrir ce contenu avec des applications personnelles"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Le profil professionnel est interrompu"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Touchez pour activer"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune application professionnelle"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune application personnelle"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur du profil personnel"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur du profil professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"NIP de déverrouillage du réseau associé au module SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"NIP de déverrouillage du sous-ensemble du réseau associé au module SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"NIP de déverrouillage du module SIM professionnel"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nouveaux paramètres d\'agrandissement"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez agrandir une partie votre écran."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Fermer"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pour continuer, vous devez accorder l\'accès au microphone de votre appareil à l\'application <b><xliff:g id="APP">%s</xliff:g></b>."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 48b3f26..bbf896a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Autorise l\'appli à détecter et à associer les appareils Bluetooth à proximité"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"se connecter aux appareils Bluetooth associés"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Autorise l\'appli à se connecter à des appareils Bluetooth associés"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informations sur le service de paiement NFC préféré"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir des informations sur le service de paiement NFC préféré, y compris les ID d\'applications et les destinations de routage enregistrés."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"contrôler la communication en champ proche"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Aucun code, schéma ni mot de passe n\'est défini"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Erreur d\'authentification"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Utiliser verrouillage écran"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Saisissez l\'identifiant de l\'appareil pour continuer"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossible de reconnaître l\'empreinte digitale. Veuillez réessayer."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Enregistrer à nouveau votre visage"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configurer Face Unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Appuyez pour ajouter une empreinte digitale"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Capture du visage impossible. Réessayez."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez de baisser la lumière."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez une éclairage plus lumineux."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Utiliser Face Unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utiliser Face Lock ou le verrouillage de l\'écran"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Utilisez Face Unlock pour continuer"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez la reconnaissance faciale ou le verrouillage de l\'écran pour continuer"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Copie effectuée"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> collé depuis <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> collé depuis le presse-papiers"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé du texte que vous avez copié"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé une image que vous avez copiée"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a collé le contenu que vous avez copié"</string>
<string name="more_item_label" msgid="7419249600215749115">"Plus"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Méta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Professionnel"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vue personnelle"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vue professionnelle"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloqué par votre administrateur informatique"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Impossible de partager ce contenu avec des applis professionnelles"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Impossible d\'ouvrir ce contenu avec des applis professionnelles"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Impossible de partager ce contenu avec des applis personnelles"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Impossible d\'ouvrir ce contenu avec des applis personnelles"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profil professionnel en pause"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Appuyer pour activer"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune appli professionnelle"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune appli personnelle"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ouvrir dans <xliff:g id="APP">%s</xliff:g> avec le profil personnel ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ouvrir dans <xliff:g id="APP">%s</xliff:g> avec le profil professionnel ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur personnel"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Code PIN de déblocage du réseau SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Code PIN de déblocage du sous-ensemble du réseau SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Code PIN de déblocage de la carte SIM d\'entreprise"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nouveaux paramètres d\'agrandissement"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez désormais agrandir une partie de l\'écran"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Fermer"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pour continuer, <b><xliff:g id="APP">%s</xliff:g></b> a besoin d\'accéder au micro de votre appareil."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 69ab060..0e78105 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que a aplicación detecte dispositivos Bluetooth próximos e se vincule a eles"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conectarse a dispositivos Bluetooth vinculados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que a aplicación se conecte aos dispositivos Bluetooth vinculados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información do servizo de pago de NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a aplicación obteña información do servizo de pago de NFC preferido, como as axudas rexistradas e o destino da ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar Near Field Communication"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Non se estableceu ningún PIN, padrón ou contrasinal"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Produciuse un erro ao realizar a autenticación"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar credencial do dispositivo"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Para continuar, mete a credencial do dispositivo"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Non se puido procesar a impresión dixital. Téntao de novo."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volve inscribir a túa cara"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mellorar o recoñecemento, inscribe de novo a túa cara"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configura o desbloqueo facial"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira o teléfono para desbloquealo"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Sen datos faciais exactos. Téntao de novo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Hai demasiada iluminación. Proba cunha máis suave."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Hai demasiada escuridade. Proba con máis luz."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Utilizar desbloqueo facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilizar desbloqueo facial ou credencial do dispositivo"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Para continuar, utiliza o desbloqueo facial"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Para continuar, utiliza o desbloqueo facial ou a credencial do dispositivo"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Copiuse"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegou contido procedente de <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegou contido procedente do portapapeis"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegou texto que copiaches"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegou unha imaxe que copiaches"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> pegou contido que copiaches"</string>
<string name="more_item_label" msgid="7419249600215749115">"Máis"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menú+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Traballo"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista persoal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de traballo"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"O teu administrador de TI bloqueou a instalación"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Este contido non pode compartirse con aplicacións do traballo"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Este contido non pode abrirse con aplicacións do traballo"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Este contido non pode compartirse con aplicacións persoais"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Este contido non pode abrirse con aplicacións persoais"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"O perfil de traballo está en pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para activar o perfil"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Non hai ningunha aplicación do traballo compatible"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Non hai ningunha aplicación persoal compatible"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Queres abrir o contido en <xliff:g id="APP">%s</xliff:g> co perfil persoal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Queres abrir o contido en <xliff:g id="APP">%s</xliff:g> co perfil de traballo?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador persoal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de traballo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo da rede SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN de desbloqueo do subconxunto da rede SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN de desbloqueo corporativo da SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Novas opcións de configuración de ampliación"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Xa podes ampliar parte da pantalla"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activar en Configuración"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignorar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, <b><xliff:g id="APP">%s</xliff:g></b> precisa acceder ao micrófono do dispositivo."</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 60d95a3..5ee5c98 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ઍપને આસપાસના બ્લૂટૂથ ડિવાઇસ શોધવાની અને તેની સાથે જોડી કરવાની મંજૂરી આપે છે"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"જોડી કરેલા બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટ કરો"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ઍપને જોડી કરેલા બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટ કરવાની મંજૂરી આપે છે"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"પસંદગીની NFC ચુકવણીની સેવા વિશે માહિતી"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"આ મંજૂરીને આપવાથી, ઍપ તમારી પસંદગીની NFC ચુકવણીની સેવા વિશે માહિતી મેળવી શકે છે, જેમ કે રજિસ્ટર થયેલી સહાય અને નિર્ધારિત સ્થાન."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"નિઅર ફીલ્ડ કમ્યુનિકેશન નિયંત્રિત કરો"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"કોઈ પિન, પૅટર્ન અથવા પાસવર્ડ સેટ કરેલો નથી"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"પ્રમાણિત કરવામાં ભૂલ આવી"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ચાલુ રાખવા માટે તમારા ડિવાઇસની લૉગ ઇન વિગત દાખલ કરો"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ફિંગરપ્રિન્ટ પ્રક્રિયા કરી શકાઈ નથી. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ફેસ અનલૉક"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"તમારા ચહેરાની ફરી નોંધણી કરાવો"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ફેસ અનલૉક સુવિધાનું સેટઅપ કરો"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"તમારા ફોનની તરફ જોઈને તેને અનલૉક કરો"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"અનલૉક કરવાની બીજી રીતોનું સેટઅપ કરો"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ફિંગરપ્રિન્ટ ઉમેરવા માટે ટૅપ કરો"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"અતિશય પ્રકાશિત. થોડો હળવો પ્રકાશ અજમાવી જુઓ."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"અતિશય ઘેરી. વધુ ઝળહળતો પ્રકાશ અજમાવો"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ચહેરાનું <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ફેસ અનલૉકનો ઉપયોગ કરો"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"આગળ વધવા માટે ફેસ અનલૉકનો ઉપયોગ કરો"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ચાલુ રાખવા માટે તમારા ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -751,7 +753,7 @@
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"ચેતવણી વિના આ Android TV ડિવાઇસ પર રહેલો આ વપરાશકર્તાનો ડેટા કાઢી નાખો."</string>
<string name="policydesc_wipeData_secondaryUser" product="default" msgid="2788325512167208654">"ચેતવણી વિના આ ફોન પરનો આ વપરાશકર્તાનો ડેટા કાઢી નાખો."</string>
<string name="policylab_setGlobalProxy" msgid="215332221188670221">"ઉપકરણ વૈશ્વિક પ્રોક્સી સેટ કરો"</string>
- <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"પૉલિસી સક્ષમ હોય તે વખતે ઉપયોગ કરવા માટેના ડિવાઇસ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ડિવાઇસના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે."</string>
+ <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"પૉલિસી ચાલુ હોય તે વખતે ઉપયોગ કરવા માટેના ડિવાઇસ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ડિવાઇસના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે."</string>
<string name="policylab_expirePassword" msgid="6015404400532459169">"સ્ક્રીન લૉક પાસવર્ડ સમાપ્તિ સેટ કરો"</string>
<string name="policydesc_expirePassword" msgid="9136524319325960675">"કેટલા સમયાંતરે સ્ક્રીન લૉક પાસવર્ડ, પિન અથવા પૅટર્ન બદલવો આવશ્યક છે, તેને બદલો."</string>
<string name="policylab_encryptedStorage" msgid="9012936958126670110">"સંગ્રહ એન્ક્રિપ્શન સેટ કરો"</string>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"કૉપિ કરેલ"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>માંથી કૉપિ કરાયેલો ડેટા <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>માં પેસ્ટ કરવામાં આવ્યો"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ક્લિપબોર્ડ ડેટાને <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>માં પેસ્ટ કર્યો"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> દ્વારા તમે કૉપિ કરેલી ટેક્સ્ટ પેસ્ટ કરાઈ"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> દ્વારા તમે કૉપિ કરેલી છબી પેસ્ટ કરાઈ"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> દ્વારા તમે કૉપિ કરેલું કન્ટેન્ટ પેસ્ટ કરાયું"</string>
<string name="more_item_label" msgid="7419249600215749115">"વધુ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"મેનૂ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ઑફિસ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"વ્યક્તિગત વ્યૂ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ઑફિસ વ્યૂ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"તમારા IT વ્યવસ્થાપકે બ્લૉક કર્યું છે"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"આ કન્ટેન્ટ ઑફિસ માટેની ઍપ સાથે શેર કરી શકાતું નથી"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"આ કન્ટેન્ટ ઑફિસ માટેની ઍપ વડે ખોલી શકાતું નથી"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"આ કન્ટેન્ટ વ્યક્તિગત ઍપ સાથે શેર કરી શકાતું નથી"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"આ કન્ટેન્ટ વ્યક્તિગત ઍપ વડે ખોલી શકાતું નથી"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ઑફિસની પ્રોફાઇલ થોભાવી છે"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ચાલુ કરવા માટે ટૅપ કરો"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"કોઈ ઑફિસ માટેની ઍપ સપોર્ટ કરતી નથી"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"કોઈ વ્યક્તિગત ઍપ સપોર્ટ કરતી નથી"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"વ્યક્તિગત પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g>માં ખોલીએ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"ઑફિસની પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g>માં ખોલીએ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"વ્યક્તિગત બ્રાઉઝરનો ઉપયોગ કરો"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ઑફિસના બ્રાઉઝરના ઉપયોગ કરો"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"સિમ નેટવર્કને અનલૉક કરવાનો પિન"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"સિમ નેટવર્ક સબસેટને અનલૉક કરવાનો પિન"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"સિમ કૉર્પોરેટ કાર્ડના લૉકને અનલૉક કરવાનો પિન"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"મોટું કરવા માટેના નવા સેટિંગ"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"હવે તમે તમારી સ્ક્રીનનો અમુક ભાગ મોટો કરી શકો છો"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"સેટિંગમાં ચાલુ કરો"</string>
<string name="dismiss_action" msgid="1728820550388704784">"છોડી દો"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ચાલુ રાખવા માટે, <b><xliff:g id="APP">%s</xliff:g></b>ને તમારા ડિવાઇસના માઇક્રોફોનના ઍક્સેસની જરૂર છે."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index ba237ce..1cd7c3c 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"अनुमति देने पर, ऐप्लिकेशन, आस-पास मौजूद ब्लूटूथ डिवाइसों को खोज पाएगा और उनसे जुड़ पाएगा"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"जोड़े गए ब्लूटूथ डिवाइसों से कनेक्ट करें"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"अनुमति देने पर, ऐप्लिकेशन, जोड़े गए ब्लूटूथ डिवाइसों से कनेक्ट कर पाएगा"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC का इस्तेमाल करने वाली पैसे चुकाने की पसंदीदा सेवा की जानकारी"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"अगर ऐप्लिकेशन को अनुमति दी जाती है, तो वह पैसे चुकाने की आपकी उस पसंदीदा सेवा के बारे में जानकारी पा सकता है जो NFC का इस्तेमाल करती है. इसमें रजिस्टर किए गए डिवाइस और उनके आउटपुट के रूट जैसी जानकारी शामिल होती है."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"नियर फ़ील्ड कम्यूनिकेशन नियंत्रित करें"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"पिन, पैटर्न या पासवर्ड सेट नहीं है"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"गड़बड़ी की पुष्टि की जा रही है"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"स्क्रीन लॉक का क्रेडेंशियल इस्तेमाल करें"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"जारी रखने के लिए, अपने डिवाइस का क्रेडेंशियल डालें"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फ़िंगरप्रिंट प्रोसेस नहीं हो सका. कृपया दोबारा कोशिश करें."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"मालिक का चेहरा पहचानकर अनलॉक"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"अपना चेहरा फिर से दर्ज करें"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"फ़ेस अनलॉक की सुविधा सेट अप करें"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"अपने फ़ोन की तरफ़ देखकर उसे अनलॉक करें"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"फ़ोन को अनलॉक करने के दूसरे तरीके सेट अप करें"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फ़िंगरप्रिंट जोड़ने के लिए टैप करें"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"बहुत रोशनी है. हल्की रोशनी आज़माएं."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"बहुत अंधेरा है. बेहतर रोशनी में आज़माएं."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"\'फ़ेस अनलॉक\' इस्तेमाल करें"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"\'फ़ेस अनलॉक\' या स्क्रीन लॉक का क्रेडेंशियल इस्तेमाल करें"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"जारी रखने के लिए, \'फ़ेस अनलॉक\' इस्तेमाल करें"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी रखने के लिए, अपना चेहरा दिखाकर या स्क्रीन लॉक क्रेडेंशियल डालकर पुष्टि करें"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"कॉपी किया गया"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> से कॉपी किए गए डेटा को <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> में चिपकाया गया है"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"क्लिपबोर्ड के डेटा को <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> में चिपकाया गया है"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने आपका कॉपी किया हुआ टेक्स्ट चिपका दिया है"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने आपकी कॉपी की हुई इमेज चिपका दी है"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने आपका कॉपी किया हुआ कॉन्टेंट चिपका दिया है"</string>
<string name="more_item_label" msgid="7419249600215749115">"और"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"मेन्यू+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"वर्क प्रोफ़ाइल"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"निजी व्यू"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"वर्क व्यू"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"आपके आईटी एडमिन ने इस कॉन्टेंट को शेयर करने की सुविधा ब्लॉक कर रखी है"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"इस कॉन्टेंट को ऑफ़िस के काम से जुड़े ऐप्लिकेशन का इस्तेमाल करके, शेयर नहीं किया जा सकता"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"इस कॉन्टेंट को ऑफ़िस के काम से जुड़े ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"इस कॉन्टेंट को निजी ऐप्लिकेशन का इस्तेमाल करके, शेयर नहीं किया जा सकता"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"इस कॉन्टेंट को निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"वर्क प्रोफ़ाइल रोक दी गई है"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"वर्क प्रोफ़ाइल चालू करने के लिए टैप करें"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यह कॉन्टेंट, ऑफ़िस के काम से जुड़े आपके किसी भी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यह कॉन्टेंट आपके किसी भी निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"क्या आप <xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन को निजी प्रोफ़ाइल में खोलना चाहते हैं?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"क्या आप <xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन को वर्क प्रोफ़ाइल में खोलना चाहते हैं?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"निजी ब्राउज़र का इस्तेमाल करें"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ऑफ़िस के काम से जुड़े ब्राउज़र का इस्तेमाल करें"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क को अनलॉक करने का पिन"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"सिम नेटवर्क के सबसेट को अनलॉक करने का पिन"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"कारोबार के लिए इस्तेमाल होने वाले सिम को अनलॉक करने का पिन"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ज़ूम करके देखने की नई सुविधा उपलब्ध है"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"अब आप अपनी स्क्रीन के किसी हिस्से को ज़ूम करके देख सकते हैं"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिंग में जाकर, इस सुविधा को चालू करें"</string>
<string name="dismiss_action" msgid="1728820550388704784">"खारिज करें"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"जारी रखने के लिए, <b><xliff:g id="APP">%s</xliff:g></b> को आपके डिवाइस का माइक्रोफ़ोन ऐक्सेस करने की ज़रूरत है."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index b7db308..d85123f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aplikaciji omogućuje otkrivanje i uparivanje Bluetooth uređaja u blizini"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezati se s uparenim Bluetooth uređajima"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Aplikaciji omogućuje povezivanje s uparenim Bluetooth uređajima"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacije o preferiranoj usluzi plaćanja NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Omogućuje aplikaciji primanje informacija o preferiranoj usluzi plaćanja NFC kao što su registrirana pomagala i odredište."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"upravljanje beskontaktnom komunikacijom (NFC)"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nisu postavljeni PIN, uzorak ni zaporka"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Pogreška prilikom autentifikacije"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Upotreba zaključavanja zaslona"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Unesite vjerodajnicu uređaja da biste nastavili"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrirajte svoje lice"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Za poboljšanje prepoznavanja ponovo registrirajte svoje lice"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Postavite otključavanje licem"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Podaci o licu nisu točni. Pokušajte ponovo."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvijetlo je. Pokušajte sa slabijim svjetlom."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Pretamno je. Pokušajte s jačim osvjetljenjem."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Upotreba otključavanja licem"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Upotreba lica ili zaključavanja zaslona"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Upotrijebite otključavanje licem da biste nastavili"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nastavak se identificirajte licem ili vjerodajnicom zaključavanja zaslona"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Kopirano"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"U aplikaciji <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> zalijepljen je sadržaj aplikacije <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"U aplikaciji <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> zalijepljen je sadržaj međuspremnika"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> zalijepila je tekst koji ste kopirali"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> zalijepila je sliku koju ste kopirali"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> zalijepila je ono što ste kopirali"</string>
<string name="more_item_label" msgid="7419249600215749115">"Više"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Izbornik+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobni prikaz"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Poslovni prikaz"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokirao vaš IT administrator"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Taj se sadržaj ne može dijeliti pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Taj se sadržaj ne može otvoriti pomoću poslovnih aplikacija"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Taj se sadržaj ne može dijeliti pomoću osobnih aplikacija"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Taj se sadržaj ne može otvoriti pomoću osobnih aplikacija"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Poslovni je profil pauziran"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Poslovne aplikacije nisu dostupne"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Osobne aplikacije nisu dostupne"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otvoriti u aplikaciji <xliff:g id="APP">%s</xliff:g> na osobnom profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otvoriti u aplikaciji <xliff:g id="APP">%s</xliff:g> na poslovnom profilu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi osobni preglednik"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže."</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN za otključavanje podskupa SIM mreže"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN za otključavanje poslovnog SIM-a"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nove postavke povećavanja"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sad možete povećati dio zaslona"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Da bi nastavila s radom, aplikacija <b><xliff:g id="APP">%s</xliff:g></b> treba pristupiti mikrofonu vašeg uređaja."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ceefe4f..38fc529 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lehetővé teszi az alkalmazás számára a közeli Bluetooth-eszközök felfedezését és a velük való párosítást."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"csatlakozás párosított Bluetooth-eszközökhöz"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lehetővé teszi az alkalmazás számára a párosított Bluetooth-eszközökhöz való csatlakozást."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferált NFC fizetési szolgáltatási információk"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Lehetővé teszi az alkalmazás számára preferált NFC fizetési szolgáltatási információk (pl. regisztrált alkalmazásazonosítók és útvonali cél) lekérését."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC technológia vezérlése"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nem állított be PIN-kódot, mintát vagy jelszót."</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Hiba történt a hitelesítés közben"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Képernyőzár használata"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"A folytatáshoz adja meg az eszköz hitelesítési adatait"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nem sikerült feldolgozni az ujjlenyomatot. Próbálkozzon újra."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Arcalapú feloldás"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Rögzítsen újra képet az arcáról"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"A felismerés javítása érdekében rögzítsen újra az arcáról készített képet"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Az arcalapú feloldás beállítása"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Feloldhatja a zárolást úgy, hogy ránéz a telefonra"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"További feloldási módszerek beállítása"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Koppintson ide ujjlenyomat hozzáadásához"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Túl világos. Próbálja kevésbé erős világítással."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Túl sötét. Próbálja jobb megvilágítás mellett."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> arc"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Arcalapú feloldás használata"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"A folytatás arcalapú feloldással vagy képernyőzárral lehetséges"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"A folytatás arcalapú feloldással lehetséges"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"A folytatás arcalapú feloldással vagy a képernyőzár feloldásával lehetséges"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Átmásolva"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"A(z) <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> tartalmat másolt vágólapra a(z) <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> appból"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"A(z) <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> beillesztette a vágólapon lévő tartalmat"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"A(z) <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> beillesztette a másolt szöveget"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"A(z) <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> beillesztette a másolt képet"</string>
+ <string name="pasted_content" msgid="646276353060777131">"A(z) <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> beillesztette a másolt tartalmat"</string>
<string name="more_item_label" msgid="7419249600215749115">"Egyebek"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menü+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Munka"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Személyes nézet"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Munkanézet"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Rendszergazda által letiltva"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ez a tartalom nem osztható meg munkahelyi alkalmazásokkal"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ez a tartalom nem nyitható meg munkahelyi alkalmazásokkal"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ez a tartalom nem osztható meg személyes alkalmazásokkal"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ez a tartalom nem nyitható meg személyes alkalmazásokkal"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"A munkaprofil használata szünetel"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Koppintson a bekapcsoláshoz"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nincs munkahelyi alkalmazás"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nincs személyes alkalmazás"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazásban a személyes profilja használatával?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazásban a munkaprofilja használatával?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Személyes böngésző használata"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Munkahelyi böngésző használata"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Hálózati SIM feloldó PIN-kódja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Hálózati SIM alkészletének feloldó PIN-kódja"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Vállalati SIM feloldó PIN-kódja"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Új nagyítási beállítások"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Mostantól kinagyíthatja a képernyő egy részét"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bekapcsolás a Beállításokban"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Elvetés"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"A folytatáshoz a(z) <b><xliff:g id="APP">%s</xliff:g></b> alkalmazásnak hozzáférésre van szüksége az eszköze mikrofonjához."</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 0ac8e92..04de38e 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Թույլ է տալիս հավելվածին հայտնաբերել և զուգակցել մոտակա Bluetooth սարքերը"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"միանալ զուգակցված Bluetooth սարքերի"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Թույլ է տալիս հավելվածին միանալ զուգակցված Bluetooth սարքերի"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Տեղեկություններ NFC վճարային ծառայության մասին"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Թույլ է տալիս հավելվածին ստանալ նախընտրելի NFC վճարային ծառայության մասին տեղեկություններ (օր․՝ գրանցված լրացուցիչ սարքերի և երթուղու նպատակակետի մասին տվյալներ)։"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"վերահսկել Մոտ Տարածությամբ Հաղորդակցումը"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Ավելացրեք PIN կոդ, նախշ կամ գաղտնաբառ։"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Չհաջողվեց նույնականացնել"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Էկրանի կողպում"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Շարունակելու համար մուտքագրեք սարքի նույնականացման տվյալները"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Չհաջողվեց մշակել մատնահետքը: Նորից փորձեք:"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Դեմքով ապակողպում"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Նորից գրանցեք ձեր դեմքը"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Կարգավորեք դեմքով ապակողպումը"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Ապակողպելու համար պարզապես նայեք հեռախոսին"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Կարգավորեք ապակողպելու այլ եղանակներ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Հպեք՝ մատնահետք ավելացնելու համար"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Շատ լուսավոր է։ Փորձեք ավելի թեթև լուսավորություն։"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Շատ մութ է։ Փորձեք ավելի պայծառ լուսավորություն։"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Դեմք <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Օգտագործել դեմքով ապակողպում"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Օգտագործել դեմքով ապակողպում կամ էկրանի կողպում"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Շարունակելու համար օգտագործեք դեմքով ապակողպում"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Շարունակելու համար օգտագործեք ձեր դեմքը կամ էկրանի կողպումը"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Պատճենվեց"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> հավելվածը տվյալներ տեղադրեց <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> հավելվածից"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> հավելվածը տվյալներ տեղադրեց սեղմատախտակից"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> հավելվածը տեղադրեց ձեր պատճենած տեքստը"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> հավելվածը տեղադրեց ձեր պատճենած պատկերը"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> հավելվածը տեղադրեց ձեր պատճենած բովանդակությունը"</string>
<string name="more_item_label" msgid="7419249600215749115">"Ավելին"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Ցանկ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Աշխատանքային"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Անձնական"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Աշխատանքային"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Արգելափակվել է ձեր ՏՏ ադմինիստրատորի կողմից"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Այս բովանդակությունը հնարավոր չէ ուղարկել աշխատանքային հավելվածներով"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Այս բովանդակությունը հնարավոր չէ բացել աշխատանքային հավելվածներով"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Այս բովանդակությունը հնարավոր չէ ուղարկել անձնական հավելվածներով"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Այս բովանդակությունը հնարավոր չէ բացել անձնական հավելվածներով"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Աշխատանքային պրոֆիլի ծառայությունը դադարեցված է"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Հպեք՝ միացնելու համար"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Աշխատանքային հավելվածներ չկան"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Անձնական հավելվածներ չկան"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածում անձնական պրոֆիլով"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածում աշխատանքային պրոֆիլով"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Օգտագործել անձնական դիտարկիչը"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Օգտագործել աշխատանքային դիտարկիչը"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM Network քարտի ապակողպման PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM Network Subset քարտի ապակողպման PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM Corporate քարտի ապակողպման PIN"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Խոշորացման նոր կարգավորումներ"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Դուք կարող եք խոշորացնել ձեր էկրանի մի մասը"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Միացնել կարգավորումներում"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Փակել"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Շարունակելու համար <b><xliff:g id="APP">%s</xliff:g></b> հավելվածին անհրաժեշտ է սարքի խոսափողի օգտագործման թույլտվություն։"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 0b8bae6..62b7adb 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Mengizinkan aplikasi menemukan dan menyambungkan perangkat Bluetooth di sekitar"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"hubungkan ke perangkat Bluetooth yang disambungkan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Mengizinkan aplikasi terhubung ke perangkat Bluetooth yang disambungkan"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informasi Layanan Pembayaran NFC Pilihan"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Mengizinkan aplikasi untuk mendapatkan informasi layanan pembayaran NFC pilihan seperti bantuan terdaftar dan tujuan rute."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrol NFC"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Tidak ada PIN, pola, atau sandi yang disetel"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Error saat mengautentikasi"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Gunakan kunci layar"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Masukkan kredensial perangkat untuk melanjutkan"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Tidak dapat memproses sidik jari. Coba lagi."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Daftarkan kembali wajah Anda"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Siapkan face unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci ponsel dengan melihat ke ponsel"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Siapkan lebih banyak cara untuk membuka kunci"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketuk untuk menambahkan sidik jari"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Coba cahaya yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Coba pencahayaan yang lebih cerah."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> wajah"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Gunakan face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gunakan face lock atau kunci layar"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Gunakan face unlock untuk melanjutkan"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan face lock atau kunci layar untuk melanjutkan"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Disalin"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ditempelkan dari <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ditempelkan dari papan klip"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> menempelkan teks yang Anda salin"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> menempelkan gambar yang Anda salin"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> menempelkan konten yang Anda salin"</string>
<string name="more_item_label" msgid="7419249600215749115">"Lainnya"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1270,7 +1269,7 @@
<string name="android_preparing_apk" msgid="589736917792300956">"Menyiapkan <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Memulai aplikasi."</string>
<string name="android_upgrading_complete" msgid="409800058018374746">"Menyelesaikan boot."</string>
- <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
+ <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan"</string>
<string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Ketuk untuk kembali ke game"</string>
<string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Pilih game"</string>
<string name="heavy_weight_switcher_text" msgid="6814316627367160126">"Agar performa tetap maksimal, hanya 1 game yang dapat dibuka sekaligus."</string>
@@ -1365,7 +1364,7 @@
<string name="no_permissions" msgid="5729199278862516390">"Tidak perlu izin"</string>
<string name="perm_costs_money" msgid="749054595022779685">"ini mungkin tidak gratis"</string>
<string name="dlg_ok" msgid="5103447663504839312">"Oke"</string>
- <string name="usb_charging_notification_title" msgid="1674124518282666955">"Mengisi daya perangkat ini via USB"</string>
+ <string name="usb_charging_notification_title" msgid="1674124518282666955">"Daya perangkat sedang diisi via USB"</string>
<string name="usb_supplying_notification_title" msgid="5378546632408101811">"Mengisi daya perangkat yang terhubung via USB"</string>
<string name="usb_mtp_notification_title" msgid="1065989144124499810">"Transfer file USB diaktifkan"</string>
<string name="usb_ptp_notification_title" msgid="5043437571863443281">"PTP via USB diaktifkan"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Tampilan pribadi"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Tampilan kerja"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Diblokir oleh admin IT Anda"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Konten ini tidak dapat dibagikan dengan aplikasi kerja"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Konten ini tidak dapat dibuka dengan aplikasi kerja"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Konten ini tidak dapat dibagikan dengan aplikasi pribadi"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Konten ini tidak dapat dibuka dengan aplikasi pribadi"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profil kerja dijeda"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Ketuk untuk mengaktifkan"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tidak ada aplikasi kerja"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tidak ada aplikasi pribadi"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buka di <xliff:g id="APP">%s</xliff:g> dengan profil pribadi?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buka di <xliff:g id="APP">%s</xliff:g> dengan profil kerja?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan browser pribadi"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan browser kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN pembuka kunci SIM network"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN pembuka kunci SIM network subset"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN pembuka kunci SIM corporate"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Setelan pembesaran baru"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sekarang Anda dapat memperbesar sebagian layar"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktifkan di Setelan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Tutup"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Untuk melanjutkan, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses ke mikrofon perangkat."</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c37c52c..63c2e4f 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Forrit er í gangi"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Forrit sem nota rafhlöðuorku"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Stækkun"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Aðgengisnotkun"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> notar rafhlöðuorku"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> forrit nota rafhlöðuorku"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Ýttu til að fá upplýsingar um rafhlöðu- og gagnanotkun"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Leyfir forritinu að finna nálæg Bluetooth-tæki og parast við þau"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"tengjast pöruðum Bluetooth-tækjum"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Leyfir forritinu að tengjast pöruðum Bluetooth-tækjum"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Upplýsingar um valda NFC-greiðsluþjónustu"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gerir forritinu kleift að fá valda NFC-greiðsluþjónustu, svo sem skráða aðstoð og áfangastað leiðar."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"stjórna nándarsamskiptum (NFC)"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Ekkert PIN-númer, mynstur eða aðgangsorð stillt"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Villa við auðkenningu"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Nota skjálás"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Færðu inn skilríki tækisins til að halda áfram"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Hluti fingrafars greindist"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ekki var hægt að vinna úr fingrafarinu. Reyndu aftur."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Hreinsaðu lesarann"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Fingur hreyfður of hratt"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Fingurinn hreyfðist of hægt. Reyndu aftur."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prófaðu annað fingrafar"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Of bjart"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Prófaðu að breyta stöðu fingursins"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingrafar staðfest"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Andlit staðfest"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Andlit staðfest, ýttu til að staðfesta"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Fingrafarsvélbúnaður ekki til staðar."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Ekki er hægt að setja upp fingrafar"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Hætt við fingrafarsaðgerð."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Notandi hætti við að nota fingrafar."</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Andlitsopnun"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Skráðu andlitið þitt aftur"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Skráðu andlitið þitt til að bæta kennsl"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Setja upp andlitsopnun"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Taktu símann úr lás með því að horfa á hann"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Settu upp fleiri leiðir til að taka úr lás"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ýttu til að bæta við fingrafari"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Nákvæm andlitsgögn fengust ekki. Reyndu aftur."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Of bjart. Prófaðu mýkri lýsingu."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Of dimmt. Prófaðu sterkari lýsingu."</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Andlit <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Nota andlitsopnun"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Nota andlit eða skjálás"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Notaðu andlitsopnun til að halda áfram"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Notaðu andlitið eða skjálás til að halda áfram"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Afritað"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> límt úr <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> límt af klippiborði."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> límdi texta sem þú afritaðir"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> límdi mynd sem þú afritaðir"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> límdi efni sem þú afritaðir"</string>
<string name="more_item_label" msgid="7419249600215749115">"Meira"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Valmynd+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Vinna"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persónulegt yfirlit"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vinnuyfirlit"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Útilokað af kerfisstjóra"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ekki er hægt að deila þessu efni með vinnuforritum"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ekki er hægt að opna þetta efni með vinnuforritum"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ekki er hægt að deila þessu efni með forritum til einkanota"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ekki er hægt að opna þetta efni með forritum til einkanota"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Hlé gert á vinnusniði"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Ýttu til að kveikja"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Engin vinnuforrit"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Engin forrit til einkanota"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Opna <xliff:g id="APP">%s</xliff:g> á eigin sniði?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Opna <xliff:g id="APP">%s</xliff:g> á vinnusniði?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Nota einkavafra"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Nota vinnuvafra"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-númer fyrir opnun á SIM-korti netkerfis"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-númer fyrir opnun á SIM-korti netkerfishlutmengis"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-númer fyrir opnun á SIM-korti fyrirtækis"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nýjar stækkunarstillingar"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nú geturðu stækkað hluta skjásins"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Kveikja á í stillingum"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hunsa"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Til að halda áfram þarf <b><xliff:g id="APP">%s</xliff:g></b> aðgang að hljóðnema tækisins."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 27ee7ce..f7922cc 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App in esecuzione"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"App che consumano la batteria"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Ingrandimento"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Utilizzo dell\'accessibilità"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> sta consumando la batteria"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> app stanno consumando la batteria"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tocca per conoscere i dettagli sull\'utilizzo dei dati e della batteria"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Consente all\'app di rilevare e accoppiare dispositivi Bluetooth nelle vicinanze"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"Connessione a dispositivi Bluetooth accoppiati"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Consente all\'app di connettersi ai dispositivi Bluetooth accoppiati"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informazioni del servizio di pagamento NFC preferito"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Consente all\'app di recuperare informazioni del servizio di pagamento NFC preferito, quali destinazione della route e identificatori applicazione registrati."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controllo Near Field Communication"</string>
@@ -573,29 +576,22 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Non hai impostato PIN, sequenza o password"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Errore durante l\'autenticazione"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usa il blocco schermo"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Inserisci la credenziale del dispositivo per continuare"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
- <skip />
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Inserisci il blocco schermo per continuare"</string>
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impronta parziale rilevata"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossibile elaborare l\'impronta. Riprova."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Pulisci il sensore"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Hai tolto il dito troppo presto"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Movimento del dito troppo lento. Riprova."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prova con un\'altra impronta"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Troppa luce"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Prova a regolare"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impronta autenticata"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Volto autenticato"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Volto autenticato, premi Conferma"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware per l\'impronta non disponibile."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Impossibile configurare l\'impronta"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Timeout impronta. Riprova."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Operazione associata all\'impronta annullata."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operazione di autenticazione dell\'impronta annullata dall\'utente."</string>
@@ -620,14 +616,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Sblocco con il volto"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registra di nuovo il volto"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Per migliorare il riconoscimento, registra di nuovo il tuo volto"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configura Sblocco con il volto"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Sblocca il telefono guardandolo"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura altri modi per sbloccare"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tocca per aggiungere un\'impronta"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Impossibile acquisire dati viso accurati. Riprova."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Troppa luce. Prova con una luce più soft."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Troppo buio. Prova con più luce."</string>
@@ -664,7 +656,7 @@
<string name="face_name_template" msgid="3877037340223318119">"Volto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Usa Sblocco con il volto"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usa Sblocco con il volto o il blocco schermo"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Usa Sblocco con il volto per continuare"</string>
+ <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa il tuo volto per continuare"</string>
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Per continuare devi usare il tuo volto o il tuo blocco schermo"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1023,9 @@
<string name="copied" msgid="4675902854553014676">"Copia eseguita"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Dati dell\'app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> incollati dall\'app <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Dati dell\'app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> incollati dagli appunti"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha incollato il testo che hai copiato"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha incollato un\'immagine che hai copiato"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ha incollato i contenuti che hai copiato"</string>
<string name="more_item_label" msgid="7419249600215749115">"Altro"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"META +"</string>
@@ -2141,31 +2130,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Lavoro"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualizzazione personale"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualizzazione di lavoro"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloccati dall\'amministratore IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Questi contenuti non possono essere condivisi con app di lavoro"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Questi contenuti non possono essere aperti con app di lavoro"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Questi contenuti non possono essere condivisi con app personali"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Questi contenuti non possono essere aperti con app personali"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profilo di lavoro in pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tocca per attivare"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nessuna app di lavoro"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nessuna app personale"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Aprire <xliff:g id="APP">%s</xliff:g> nel profilo personale?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Aprire <xliff:g id="APP">%s</xliff:g> nel profilo di lavoro?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usa il browser personale"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usa il browser di lavoro"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN di sblocco rete SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN di sblocco sottoinsieme rete SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN sblocco aziendale SIM"</string>
@@ -2278,10 +2255,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nuove impostazioni per l\'ingrandimento"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ora puoi ingrandire parte dello schermo"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Attiva nelle Impostazioni"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignora"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Per continuare, l\'app <b><xliff:g id="APP">%s</xliff:g></b> deve accedere al microfono del dispositivo."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 7e4b8ad..ca66487 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -42,23 +42,23 @@
<string name="serviceErased" msgid="997354043770513494">"המחיקה בוצעה בהצלחה."</string>
<string name="passwordIncorrect" msgid="917087532676155877">"סיסמה שגויה."</string>
<string name="mmiComplete" msgid="6341884570892520140">"MMI הושלם."</string>
- <string name="badPin" msgid="888372071306274355">"קוד הגישה הישן שהקלדת שגוי."</string>
+ <string name="badPin" msgid="888372071306274355">"קוד האימות הישן שהקלדת שגוי."</string>
<string name="badPuk" msgid="4232069163733147376">"ה-PUK שהקלדת שגוי."</string>
<string name="mismatchPin" msgid="2929611853228707473">"קודי הגישה שהקלדת לא תואמים."</string>
<string name="invalidPin" msgid="7542498253319440408">"יש להקליד קוד אימות שאורכו 4 עד 8 ספרות."</string>
- <string name="invalidPuk" msgid="8831151490931907083">"הקלד PUK באורך 8 מספרים או יותר."</string>
+ <string name="invalidPuk" msgid="8831151490931907083">"יש להקליד PUK באורך 8 ספרות לפחות."</string>
<string name="needPuk" msgid="7321876090152422918">"כרטיס ה-SIM נעול באמצעות PUK. יש להקליד את קוד ה-PUK כדי לבטל את הנעילה."</string>
<string name="needPuk2" msgid="7032612093451537186">"יש להקליד PUK2 כדי לבטל את חסימת כרטיס ה-SIM."</string>
<string name="enablePin" msgid="2543771964137091212">"לא הצלחת. יש להפעיל נעילת SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
- <item quantity="two">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני נעילת כרטיס ה-SIM.</item>
- <item quantity="many">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני נעילת כרטיס ה-SIM.</item>
- <item quantity="other">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני נעילת כרטיס ה-SIM.</item>
- <item quantity="one">נותר לך ניסיון <xliff:g id="NUMBER_0">%d</xliff:g> לפני נעילת כרטיס ה-SIM.</item>
+ <item quantity="two">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל.</item>
+ <item quantity="many">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל.</item>
+ <item quantity="other">נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל.</item>
+ <item quantity="one">נותר לך ניסיון אחד (<xliff:g id="NUMBER_0">%d</xliff:g>) לפני שכרטיס ה-SIM יינעל.</item>
</plurals>
<string name="imei" msgid="2157082351232630390">"IMEI"</string>
<string name="meid" msgid="3291227361605924674">"MEID"</string>
- <string name="ClipMmi" msgid="4110549342447630629">"זיהוי מתקשר של שיחה נכנסת"</string>
+ <string name="ClipMmi" msgid="4110549342447630629">"זיהוי מתקשר בשיחה נכנסת"</string>
<string name="ClirMmi" msgid="6752346475055446417">"הסתרת זיהוי מתקשר בשיחה יוצאת"</string>
<string name="ColpMmi" msgid="4736462893284419302">"מזהה של קו מחובר"</string>
<string name="ColrMmi" msgid="5889782479745764278">"הגבלה של מזהה קו מחובר"</string>
@@ -66,15 +66,15 @@
<string name="CwMmi" msgid="3164609577675404761">"שיחה ממתינה"</string>
<string name="BaMmi" msgid="7205614070543372167">"חסימת שיחות"</string>
<string name="PwdMmi" msgid="3360991257288638281">"שינוי סיסמה"</string>
- <string name="PinMmi" msgid="7133542099618330959">"שנה את קוד הגישה"</string>
+ <string name="PinMmi" msgid="7133542099618330959">"שינוי קוד האימות"</string>
<string name="CnipMmi" msgid="4897531155968151160">"מספר מתקשר נמצא"</string>
- <string name="CnirMmi" msgid="885292039284503036">"מספר מתקשר חסוי"</string>
+ <string name="CnirMmi" msgid="885292039284503036">"מספר חסוי"</string>
<string name="ThreeWCMmi" msgid="2436550866139999411">"שיחה עם שלושה משתתפים"</string>
<string name="RuacMmi" msgid="1876047385848991110">"דחיית שיחות מטרידות ולא רצויות"</string>
<string name="CndMmi" msgid="185136449405618437">"שליחת מספר מתקשר"</string>
<string name="DndMmi" msgid="8797375819689129800">"נא לא להפריע"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"השירות \'שיחה מזוהה\' עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"זיהוי מתקשר עובר כברירת מחדל למצב מוגבל. השיחה הבאה: לא מוגבלת"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"שירות השיחה המזוהה עובר כברירת מחדל למצב מוגבל. השיחה הבאה: לא מוגבלת"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"שירות \'שיחה מזוהה\' עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: לא מוגבלת"</string>
<string name="serviceNotProvisioned" msgid="8289333510236766193">"השירות לא הוקצה."</string>
@@ -107,7 +107,7 @@
<string name="serviceClassFAX" msgid="2561653371698904118">"פקס"</string>
<string name="serviceClassSMS" msgid="1547664561704509004">"SMS"</string>
<string name="serviceClassDataAsync" msgid="2029856900898545984">"אסינכרוני"</string>
- <string name="serviceClassDataSync" msgid="7895071363569133704">"סינכרוני"</string>
+ <string name="serviceClassDataSync" msgid="7895071363569133704">"סנכרון"</string>
<string name="serviceClassPacket" msgid="1430642951399303804">"מנה"</string>
<string name="serviceClassPAD" msgid="6850244583416306321">"PAD"</string>
<string name="roamingText0" msgid="7793257871609854208">"נורית מצב נדידה מופעלת"</string>
@@ -163,7 +163,7 @@
<string name="httpErrorLookup" msgid="3099834738227549349">"לא ניתן למצוא את כתובת ה-URL."</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="3976195595501606787">"סכימת אימות האתר אינה נתמכת."</string>
<string name="httpErrorAuth" msgid="469553140922938968">"האימות נכשל."</string>
- <string name="httpErrorProxyAuth" msgid="7229662162030113406">"האימות דרך שרת ה-Proxy נכשל."</string>
+ <string name="httpErrorProxyAuth" msgid="7229662162030113406">"לא ניתן לבצע את האימות דרך שרת ה-Proxy."</string>
<string name="httpErrorConnect" msgid="3295081579893205617">"לא ניתן להתחבר לשרת."</string>
<string name="httpErrorIO" msgid="3860318696166314490">"לא ניתן לתקשר עם השרת. אפשר לנסות שוב מאוחר יותר."</string>
<string name="httpErrorTimeout" msgid="7446272815190334204">"חלף הזמן הקצוב של החיבור לשרת."</string>
@@ -192,7 +192,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>
@@ -221,16 +221,16 @@
<string name="power_dialog" product="tv" msgid="7792839006640933763">"אפשרויות Android TV"</string>
<string name="power_dialog" product="default" msgid="1107775420270203046">"אפשרויות טלפון"</string>
<string name="silent_mode" msgid="8796112363642579333">"מצב שקט"</string>
- <string name="turn_on_radio" msgid="2961717788170634233">"הפעל חיבור אלחוטי"</string>
+ <string name="turn_on_radio" msgid="2961717788170634233">"הפעלת חיבור אלחוטי"</string>
<string name="turn_off_radio" msgid="7222573978109933360">"כיבוי אלחוטי"</string>
<string name="screen_lock" msgid="2072642720826409809">"נעילת מסך"</string>
<string name="power_off" msgid="4111692782492232778">"כיבוי"</string>
<string name="silent_mode_silent" msgid="5079789070221150912">"צלצול כבוי"</string>
<string name="silent_mode_vibrate" msgid="8821830448369552678">"צלצול ורטט"</string>
- <string name="silent_mode_ring" msgid="6039011004781526678">"צלצול מופעל"</string>
+ <string name="silent_mode_ring" msgid="6039011004781526678">"הצלצול מופעל"</string>
<string name="reboot_to_update_title" msgid="2125818841916373708">"עדכון מערכת Android"</string>
- <string name="reboot_to_update_prepare" msgid="6978842143587422365">"מתכונן לעדכון…"</string>
- <string name="reboot_to_update_package" msgid="4644104795527534811">"מעבד את חבילת העדכון…"</string>
+ <string name="reboot_to_update_prepare" msgid="6978842143587422365">"בהכנה לתהליך עדכון…"</string>
+ <string name="reboot_to_update_package" msgid="4644104795527534811">"מתבצע עיבוד של חבילת העדכון…"</string>
<string name="reboot_to_update_reboot" msgid="4474726009984452312">"מתבצע אתחול…"</string>
<string name="reboot_to_reset_title" msgid="2226229680017882787">"איפוס לנתוני היצרן"</string>
<string name="reboot_to_reset_message" msgid="3347690497972074356">"מתבצע אתחול…"</string>
@@ -238,16 +238,16 @@
<string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"הטאבלט שלך ייכבה."</string>
<string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"מכשיר ה-Android TV יכבה."</string>
<string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"השעון יכבה."</string>
- <string name="shutdown_confirm" product="default" msgid="136816458966692315">"הטלפון שלך יכובה."</string>
- <string name="shutdown_confirm_question" msgid="796151167261608447">"האם ברצונך לבצע כיבוי?"</string>
+ <string name="shutdown_confirm" product="default" msgid="136816458966692315">"הטלפון שלך ייכבה."</string>
+ <string name="shutdown_confirm_question" msgid="796151167261608447">"לכבות את הטלפון?"</string>
<string name="reboot_safemode_title" msgid="5853949122655346734">"אתחול למצב בטוח"</string>
<string name="reboot_safemode_confirm" msgid="1658357874737219624">"האם לבצע אתחול ולעבור למצב בטוח? הפעולה הזו תשבית את כל האפליקציות של צד שלישי שהתקנת. הן ישוחזרו לאחר הפעלה מחדש של המכשיר."</string>
<string name="recent_tasks_title" msgid="8183172372995396653">"נוצרו לאחרונה"</string>
- <string name="no_recent_tasks" msgid="9063946524312275906">"אין אפליקציות אחרונות"</string>
+ <string name="no_recent_tasks" msgid="9063946524312275906">"אין אפליקציות שהיו בשימוש לאחרונה"</string>
<string name="global_actions" product="tablet" msgid="4412132498517933867">"אפשרויות טאבלט"</string>
<string name="global_actions" product="tv" msgid="3871763739487450369">"אפשרויות Android TV"</string>
<string name="global_actions" product="default" msgid="6410072189971495460">"אפשרויות טלפון"</string>
- <string name="global_action_lock" msgid="6949357274257655383">"נעילת מסך"</string>
+ <string name="global_action_lock" msgid="6949357274257655383">"נעילת המסך"</string>
<string name="global_action_power_off" msgid="4404936470711393203">"כיבוי"</string>
<string name="global_action_power_options" msgid="1185286119330160073">"הפעלה"</string>
<string name="global_action_restart" msgid="4678451019561687074">"הפעלה מחדש"</string>
@@ -260,12 +260,12 @@
<string name="bugreport_option_interactive_title" msgid="7968287837902871289">"דוח אינטראקטיבי"</string>
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"כדאי להשתמש באפשרות הזו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה ולצלם את המסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ושיצירת הדיווח עליהם נמשכת זמן רב."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"דוח מלא"</string>
- <string name="bugreport_option_full_summary" msgid="1975130009258435885">"השתמש באפשרות זו כדי שההפרעה למערכת תהיה מזערית, כשהמכשיר אינו מגיב או איטי מדי, או כשאתה זקוק לכל קטעי הדוח. לא ניתן להזין פרטים נוספים או ליצור צילומי מסך נוספים."</string>
+ <string name="bugreport_option_full_summary" msgid="1975130009258435885">"כדאי להשתמש באפשרות הזו כדי שההפרעה למערכת תהיה מזערית כשהמכשיר אינו מגיב או איטי מדי, או כשצריך את כל קטעי הדוח. לא ניתן להזין פרטים נוספים או ליצור צילומי מסך נוספים."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="two">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="many">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="other">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="one">יוצר צילום מסך לדוח על באג בעוד שנייה <xliff:g id="NUMBER_0">%d</xliff:g>.</item>
+ <item quantity="two">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="many">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="other">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="one">המערכת יוצרת צילום מסך לדוח על באג בעוד שנייה (<xliff:g id="NUMBER_0">%d</xliff:g>).</item>
</plurals>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"בוצע צילום מסך של דוח על באג"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"הניסיון לצילום המסך של דוח על באג נכשל"</string>
@@ -274,7 +274,7 @@
<string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"קול מופעל"</string>
<string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"מצב טיסה"</string>
<string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"מצב טיסה מופעל"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"מצב טיסה כבוי"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"מצב הטיסה כבוי"</string>
<string name="global_action_settings" msgid="4671878836947494217">"הגדרות"</string>
<string name="global_action_assist" msgid="2517047220311505805">"סיוע"</string>
<string name="global_action_voice_assist" msgid="6655788068555086695">"האסיסטנט"</string>
@@ -302,9 +302,9 @@
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"הגדלה"</string>
<!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
<skip />
- <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> משתמשת בסוללה"</string>
+ <string name="foreground_service_app_in_background" msgid="1439289699671273555">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> משתמשת בסוללה"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> אפליקציות משתמשות בסוללה"</string>
- <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"הקש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
+ <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"אפשר להקיש כדי לקבל פרטים על צריכה של נתונים וסוללה"</string>
<string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>, <xliff:g id="LEFT_SIDE">%1$s</xliff:g>"</string>
<string name="safeMode" msgid="8974401416068943888">"מצב בטוח"</string>
<string name="android_system_label" msgid="5974767339591067210">"מערכת Android"</string>
@@ -331,17 +331,17 @@
<string name="permgrouplab_calllog" msgid="7926834372073550288">"יומני שיחות"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"קריאה וכתיבה של יומן השיחות של הטלפון"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"טלפון"</string>
- <string name="permgroupdesc_phone" msgid="270048070781478204">"התקשרות וניהול של שיחות טלפון"</string>
+ <string name="permgroupdesc_phone" msgid="270048070781478204">"ביצוע וניהול של שיחות טלפון"</string>
<string name="permgrouplab_sensors" msgid="9134046949784064495">"חיישנים לבישים"</string>
<string name="permgroupdesc_sensors" msgid="2610631290633747752">"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"אחזור תוכן של חלון"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"בדיקת התוכן של חלון שאיתו מתבצעת אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"הפעלה של \'גילוי באמצעות מגע\'"</string>
- <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"פריטים שעליהם תקיש יוקראו בקול, ותוכל לנווט במסך באמצעות תנועות."</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"פריטים שמקישים עליהם יוקראו בקול, וניתן לנווט במסך באמצעות תנועות."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"הצגת טקסט בזמן הקלדה"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"כולל נתונים אישיים כמו מספרי כרטיס אשראי וסיסמאות."</string>
<string name="capability_title_canControlMagnification" msgid="7701572187333415795">"שליטה בהגדלת התצוגה"</string>
- <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"קבע את המרחק מהתצוגה ואת מיקום התצוגה."</string>
+ <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"קביעת המרחק מהתצוגה ומיקום התצוגה."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"ביצוע תנועות"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"יכול להקיש, להחליק, לעשות תנועת צביטה ולבצע תנועות אחרות."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"תנועות של טביעות אצבעות"</string>
@@ -353,10 +353,10 @@
<string name="permlab_statusBarService" msgid="2523421018081437981">"להיות שורת הסטטוס"</string>
<string name="permdesc_statusBarService" msgid="6652917399085712557">"מאפשרת לאפליקציה להופיע בשורת הסטטוס."</string>
<string name="permlab_expandStatusBar" msgid="1184232794782141698">"הרחב/כווץ את שורת המצב"</string>
- <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"מאפשר לאפליקציה להרחיב או לכווץ את שורת המצב."</string>
+ <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"מאפשרת לאפליקציה להרחיב או לכווץ את שורת הסטטוס."</string>
<string name="permlab_fullScreenIntent" msgid="4310888199502509104">"הצגת התראות כפעילויות במסך מלא במכשיר נעול"</string>
<string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"מאפשרת לאפליקציה להציג התראות כפעילויות במסך מלא במכשיר נעול"</string>
- <string name="permlab_install_shortcut" msgid="7451554307502256221">"התקן קיצורי דרך"</string>
+ <string name="permlab_install_shortcut" msgid="7451554307502256221">"התקנה של קיצורי דרך"</string>
<string name="permdesc_install_shortcut" msgid="4476328467240212503">"מאפשרת לאפליקציה להוסיף קיצורי דרך במסך דף הבית ללא התערבות המשתמש."</string>
<string name="permlab_uninstall_shortcut" msgid="295263654781900390">"הסרת התקנה של קיצורי דרך"</string>
<string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"מאפשרת לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש."</string>
@@ -365,7 +365,7 @@
<string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"מענה לשיחות טלפון"</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="permlab_bindCellBroadcastService" msgid="586746677002040651">"העברת הודעות של שידור סלולרי"</string>
@@ -373,61 +373,61 @@
<string name="permlab_manageOngoingCalls" msgid="281244770664231782">"ניהול שיחות שנערכות"</string>
<string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"לאפליקציה תהיה אפשרות לראות פרטים על שיחות שנערכות במכשיר ולשלוט בשיחות האלה."</string>
<string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"קריאת הודעות שידור סלולרי"</string>
- <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"מאפשר לאפליקציה לקרוא הודעות שידור סלולרי שהתקבלו במכשיר שלך. התראות שידור סלולרי נשלחות במקומות מסוימים על מנת להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר שלך כאשר מתקבל שידור חירום סלולרי."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"מאפשרת לאפליקציה לקרוא הודעות שידור סלולרי שהתקבלו במכשיר שלך. התראות שידור סלולרי נשלחות במקומות מסוימים כדי להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר שלך כאשר מתקבל שידור חירום סלולרי."</string>
<string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"קריאת עדכוני מינויים"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"מאפשר לאפליקציה לקבל פרטים על ההזנות הנוכחיות שמסונכרנות."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"מאפשרת לאפליקציה לקבל פרטים על הפידים שמסונכרנים כרגע."</string>
<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">"אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטאבלט."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"האפליקציה הזו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטאבלט."</string>
<string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"האפליקציה הזו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות במכשיר ה-Android TV."</string>
- <string name="permdesc_readSms" product="default" msgid="774753371111699782">"אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטלפון."</string>
+ <string name="permdesc_readSms" product="default" msgid="774753371111699782">"האפליקציה הזו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטלפון."</string>
<string name="permlab_receiveWapPush" msgid="4223747702856929056">"קבלת הודעות טקסט (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="1638677888301778457">"מאפשרת לאפליקציה לקבל ולעבד הודעות WAP. ההרשאה הזו כוללת את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן."</string>
<string name="permlab_getTasks" msgid="7460048811831750262">"אחזור אפליקציות פעילות"</string>
<string name="permdesc_getTasks" msgid="7388138607018233726">"מאפשרת לאפליקציה לאחזר מידע לגבי משימות הפועלות כרגע וכאלו שפעלו לאחרונה. ייתכן שההרשאה הזו תתיר לאפליקציה לגלות מידע לגבי האפליקציות שבהן נעשה שימוש במכשיר."</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"ניהול בעלים של פרופיל ומכשיר"</string>
- <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"מאפשרת לאפליקציות להגדיר את הבעלים של הפרופיל ואת בעל המכשיר."</string>
+ <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"מאפשרת לאפליקציות להגדיר את הבעלים של הפרופיל ושל המכשיר."</string>
<string name="permlab_reorderTasks" msgid="7598562301992923804">"סידור מחדש של אפליקציות פעילות"</string>
- <string name="permdesc_reorderTasks" msgid="8796089937352344183">"מאפשר לאפליקציה להעביר משימות לחזית ולרקע. האפליקציה עשוי לעשות זאת ללא התערבותך."</string>
- <string name="permlab_enableCarMode" msgid="893019409519325311">"הפוך מצב מכונית לפעיל"</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_killBackgroundProcesses" msgid="2357013583055434685">"מאפשרת לאפליקציה להפסיק תהליכים ברקע שמבצעות אפליקציות אחרות. הדבר עשוי לגרום להפסקת הפעולה של אפליקציות אחרות."</string>
+ <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"האפליקציה הזו יכולה להופיע מעל אפליקציות אחרות."</string>
<string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"האפליקציה הזו יכולה להופיע מעל אפליקציות אחרות או בחלקים אחרים של המסך. ייתכן שהדבר יפריע לך להשתמש באפליקציות וישנה את האופן שבו הן מופיעות."</string>
<string name="permlab_runInBackground" msgid="541863968571682785">"פעולה ברקע"</string>
<string name="permdesc_runInBackground" msgid="4344539472115495141">"האפליקציה הזו יכולה לפעול ברקע. ייתכן שהסוללה תתרוקן מהר יותר במצב הזה."</string>
<string name="permlab_useDataInBackground" msgid="783415807623038947">"שימוש בנתונים ברקע"</string>
<string name="permdesc_useDataInBackground" msgid="1230753883865891987">"האפליקציה הזו יכולה להשתמש בנתונים ברקע. ייתכן שצריכת הנתונים תגדל במצב הזה."</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>
+ <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>
<string name="permlab_foregroundService" msgid="1768855976818467491">"הרצת שירות קדמה"</string>
<string name="permdesc_foregroundService" msgid="8720071450020922795">"ההרשאה הזו מאפשרת לאפליקציה להשתמש בשירותים שפועלים בחזית."</string>
<string name="permlab_getPackageSize" msgid="375391550792886641">"מדידת נפח האחסון של אפליקציות"</string>
- <string name="permdesc_getPackageSize" msgid="742743530909966782">"מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי קובצי המטמון שלו"</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="permlab_receiveBootCompleted" msgid="6643339400247325379">"הפעלה בזמן האתחול"</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">"מאפשרת לאפליקציה לשלוח שידורים \"דביקים\" (sticky), שנותרים לאחר שהשידור מסתיים. בעקבות שימוש מופרז באפשרות זו, שיעור ניצול הזיכרון יהיה גבוה מדי ומכשיר ה-Android TV עלול לפעול בצורה איטית או בלתי יציבה."</string>
+ <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, שנותרים לאחר שהשידור מסתיים. בעקבות שימוש מופרז באפשרות הזו, שיעור ניצול הזיכרון יהיה גבוה מדי ומכשיר ה-Android TV עלול לפעול בצורה איטית או בלתי יציבה."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון."</string>
<string name="permlab_readContacts" msgid="8776395111787429099">"קריאת אנשי הקשר שלך"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטאבלט שלך. לאפליקציות תהיה גם גישה לחשבונות בטאבלט שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."</string>
- <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים במכשיר ה-Android TV שלך. לאפליקציות תהיה גם גישה לחשבונות במכשיר ה-Android TV שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטאבלט שלך. לאפליקציות תהיה גם גישה לחשבונות בטאבלט שיצרו אנשי קשר, כולל חשבונות שנוצרו על ידי אפליקציות שהתקנת. ההרשאה הזו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."</string>
+ <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"מאפשרת לאפליקציה לקרוא נתונים לגבי אנשי הקשר השמורים במכשיר ה-Android TV שלך. לאפליקציות תהיה גם גישה לחשבונות שיצרו אנשי קשר במכשיר ה-Android TV. הפעולה הזו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. ההרשאה מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."</string>
<string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטלפון שלך. לאפליקציות תהיה גם גישה לחשבונות בטלפון שדרכם נוצרו אנשי קשר. הפעולה הזו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. ההרשאה הזו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך."</string>
<string name="permlab_writeContacts" msgid="8919430536404830430">"שינוי אנשי הקשר שלך"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטאבלט שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטאבלט שלך. ההרשאה הזו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."</string>
<string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים במכשיר ה-Android TV שלך. ההרשאה הזו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."</string>
- <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטלפון שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר."</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>
@@ -436,23 +436,23 @@
<string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"מאפשרת לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב."</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="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="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="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"מאפשרת לאפליקציה לגשת לפקודות נוספות של ספק המיקום. ההרשאה הזו עשויה לאפשר לאפליקציה לשבש את פעולת ה-GPS או מקורות מיקום אחרים."</string>
<string name="permlab_accessFineLocation" msgid="6426318438195622966">"קבלת גישה למיקום מדויק בחזית בלבד"</string>
<string name="permdesc_accessFineLocation" msgid="6732174080240016335">"האפליקציה הזו יכולה לקבל את המיקום המדויק שלך משירותי המיקום כאשר היא בשימוש. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר. פעולה זו עלולה להגביר את השימוש בסוללה."</string>
<string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"קבלת גישה למיקום משוער לאפליקציות בחזית בלבד"</string>
<string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"כאשר האפליקציה בשימוש היא יכולה לקבל משירותי המיקום את המיקום המשוער שלך. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר."</string>
<string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"גישה למיקום ברקע"</string>
<string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"לאפליקציה תמיד יש גישה למיקום, גם כשאינה בשימוש."</string>
- <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"שנה את הגדרות האודיו שלך"</string>
- <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"מאפשר לאפליקציה לשנות הגדרות אודיו גלובליות כמו עוצמת קול ובחירת הרמקול המשמש לפלט."</string>
- <string name="permlab_recordAudio" msgid="1208457423054219147">"הקלט אודיו"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"שינוי הגדרות האודיו שלך"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"מאפשרת לאפליקציה לשנות הגדרות אודיו גלובליות כמו עוצמת קול ובחירת הרמקול המשמש לפלט."</string>
+ <string name="permlab_recordAudio" msgid="1208457423054219147">"הקלטה של אודיו"</string>
<string name="permdesc_recordAudio" msgid="5857246765327514062">"האפליקציה הזו יכולה להשתמש במיקרופון כדי להקליט אודיו כאשר היא בשימוש."</string>
<string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"הקלטת אודיו ברקע"</string>
<string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"האפליקציה הזו יכולה להשתמש במיקרופון כדי להקליט אודיו בכל זמן."</string>
@@ -461,20 +461,20 @@
<string name="permlab_activityRecognition" msgid="1782303296053990884">"זיהוי הפעילות הגופנית"</string>
<string name="permdesc_activityRecognition" msgid="8667484762991357519">"האפליקציה מזהה את הפעילות הגופנית שלך."</string>
<string name="permlab_camera" msgid="6320282492904119413">"צילום תמונות וסרטונים"</string>
- <string name="permdesc_camera" msgid="5240801376168647151">"האפליקציה הזו יכולה להשתמש במצלמה כדי לצלם תמונות ולהקליט סרטונים כאשר היא בשימוש."</string>
+ <string name="permdesc_camera" msgid="5240801376168647151">"האפליקציה הזו יכולה להשתמש במצלמה כדי לצלם תמונות וסרטונים כאשר היא בשימוש."</string>
<string name="permlab_backgroundCamera" msgid="7549917926079731681">"צילום תמונות וסרטונים ברקע"</string>
- <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"האפליקציה הזו יכולה להשתמש במצלמה כדי לצלם תמונות ולהקליט סרטונים בכל זמן."</string>
- <string name="permlab_systemCamera" msgid="3642917457796210580">"הרשאת גישה לאפליקציה או לשירות למצלמות המערכת כדי לצלם תמונות וסרטונים"</string>
+ <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"האפליקציה הזו יכולה להשתמש במצלמה כדי לצלם תמונות וסרטונים בכל זמן."</string>
+ <string name="permlab_systemCamera" msgid="3642917457796210580">"הרשאת גישה למצלמות המערכת עבור אפליקציה או שירות כדי לצלם תמונות וסרטונים"</string>
<string name="permdesc_systemCamera" msgid="5938360914419175986">"האפליקציה הזו בעלת ההרשאות, או אפליקציית המערכת הזו, יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"אפליקציה או שירות יוכלו לקבל קריאות חוזרות (callback) כשמכשירי מצלמה ייפתחו או ייסגרו."</string>
<string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"האפליקציה הזו יכולה לקבל קריאות חוזרות (callback) כשמכשיר מצלמה כלשהו נפתח (באמצעות אפליקציה) או נסגר."</string>
<string name="permlab_vibrate" msgid="8596800035791962017">"שליטה ברטט"</string>
- <string name="permdesc_vibrate" msgid="8733343234582083721">"מאפשר לאפליקציה לשלוט ברטט."</string>
+ <string name="permdesc_vibrate" msgid="8733343234582083721">"מאפשרת לאפליקציה לשלוט ברטט."</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"מאפשרת לאפליקציה לקבל גישה למצב רטט."</string>
<string name="permlab_callPhone" msgid="1798582257194643320">"חיוג ישירות למספרי טלפון"</string>
- <string name="permdesc_callPhone" msgid="5439809516131609109">"מאפשר לאפליקציה להתקשר למספרי טלפון ללא התערבותך. פעולה זו עשויה לגרום לשיחות או לחיובים לא צפויים. שים לב שהדבר לא מאפשר לאפליקציה להתקשר למספרי חירום. אפליקציות זדוניות עשויות לגרום לעלויות על ידי ביצוע שיחות ללא התערבותך."</string>
+ <string name="permdesc_callPhone" msgid="5439809516131609109">"מאפשרת לאפליקציה להתקשר למספרי טלפון ללא התערבות המשתמש. הפעולה הזו עשויה לגרום לשיחות או לחיובים לא צפויים. ההרשאה הזו לא מאפשרת לאפליקציה להתקשר למספרי חירום. אפליקציות זדוניות עשויות לגרום לחיובים על ידי ביצוע שיחות ללא האישור שלך."</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">"מאפשרת לאפליקציה לגשת לתכונות הטלפון של המכשיר. ההרשאה הזו מתירה לאפליקציה לגלות את מספר הטלפון ואת מזהי המכשיר, אם השיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה."</string>
<string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ניתוב שיחות דרך המערכת"</string>
@@ -484,17 +484,17 @@
<string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"פטור מהגבלות של הקלטת אודיו"</string>
<string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"פוטרת את האפליקציה מהגבלות של הקלטת אודיו."</string>
<string name="permlab_acceptHandover" msgid="2925523073573116523">"המשך שיחה מאפליקציה אחרת"</string>
- <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"הרשאה זו מתירה לאפליקציה להמשיך שיחה שהחלה באפליקציה אחרת."</string>
+ <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"ההרשאה הזו מאפשרת לאפליקציה להמשיך שיחה שהתחילה באפליקציה אחרת."</string>
<string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"גישה למספרי הטלפון"</string>
<string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"מתירה לאפליקציה גישה למספרי הטלפון במכשיר."</string>
<string name="permlab_wakeLock" product="automotive" msgid="1904736682319375676">"מסך המכונית יישאר דלוק"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1527660973931694000">"מניעה מהטאבלט לעבור למצב שינה"</string>
<string name="permlab_wakeLock" product="tv" msgid="2856941418123343518">"מונעת ממכשיר ה-Android TV להיכנס למצב שינה"</string>
- <string name="permlab_wakeLock" product="default" msgid="569409726861695115">"מניעת מעבר הטלפון למצב שינה"</string>
+ <string name="permlab_wakeLock" product="default" msgid="569409726861695115">"מניעה מהטלפון לעבור למצב שינה"</string>
<string name="permdesc_wakeLock" product="automotive" msgid="5995045369683254571">"מסך המכונית יישאר דלוק כשהאפליקציה פועלת."</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="2441742939101526277">"מאפשר לאפליקציה למנוע מהטאבלט לעבור למצב שינה."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="2441742939101526277">"מאפשרת לאפליקציה למנוע מהטאבלט לעבור למצב שינה."</string>
<string name="permdesc_wakeLock" product="tv" msgid="2329298966735118796">"מאפשרת לאפליקציה למנוע ממכשיר ה-Android TV לעבור למצב שינה."</string>
- <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"מאפשר לאפליקציה למנוע מהטלפון לעבור למצב שינה."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"מאפשרת לאפליקציה למנוע מהטלפון לעבור למצב שינה."</string>
<string name="permlab_transmitIr" msgid="8077196086358004010">"שידור באינפרה-אדום"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5884738958581810253">"מאפשרת לאפליקציה להשתמש במשדר האינפרה-אדום של הטאבלט."</string>
<string name="permdesc_transmitIr" product="tv" msgid="3278506969529173281">"מאפשרת לאפליקציה להשתמש במשדר האינפרה-אדום של מכשיר ה-Android TV."</string>
@@ -502,7 +502,7 @@
<string name="permlab_setWallpaper" msgid="6959514622698794511">"הגדרת טפט"</string>
<string name="permdesc_setWallpaper" msgid="2973996714129021397">"מאפשרת לאפליקציה להגדיר את טפט המערכת."</string>
<string name="permlab_setWallpaperHints" msgid="1153485176642032714">"התאמת גודל הטפט שלך"</string>
- <string name="permdesc_setWallpaperHints" msgid="6257053376990044668">"מאפשר לאפליקציה להגדיר את סמני הגודל של טפט המערכת."</string>
+ <string name="permdesc_setWallpaperHints" msgid="6257053376990044668">"מאפשרת לאפליקציה להגדיר את סמני הגודל של טפט המערכת."</string>
<string name="permlab_setTimeZone" msgid="7922618798611542432">"הגדרת אזור זמן"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="1788868809638682503">"מאפשרת לאפליקציה לשנות את אזור הזמן של הטאבלט."</string>
<string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"מאפשרת לאפליקציה לשנות את אזור הזמן של מכשיר ה-Android TV."</string>
@@ -510,33 +510,33 @@
<string name="permlab_getAccounts" msgid="5304317160463582791">"חיפוש חשבונות במכשיר"</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">"מאפשרת לאפליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מותאמים אישית. הדפדפן, כמו אפליקציות אחרות, מספק אמצעים לשליחת נתונים לאינטרנט, כך שאישור זה אינו נחוץ לשליחת נתונים לאינטרנט."</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">"הצג חיבורי Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="6913641669259483363">"מאפשר לאפליקציה להציג מידע על רשתות Wi-Fi, למשל, האם Wi-Fi מופעל, כמו גם שם מכשירי ה-Wi-Fi המחוברים."</string>
+ <string name="permdesc_changeTetherState" msgid="3025129606422533085">"מאפשרת לאפליקציה לשנות את מצב הקישוריות של רשת משותפת."</string>
+ <string name="permlab_accessWifiState" msgid="5552488500317911052">"הצגת חיבורי Wi-Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="6913641669259483363">"מאפשרת לאפליקציה להציג מידע על רשתות Wi-Fi. למשל, אם ה-Wi-Fi מופעל ומה השמות של מכשירי ה-Wi-Fi המחוברים."</string>
<string name="permlab_changeWifiState" msgid="7947824109713181554">"התחברות והתנתקות מ-Wi-Fi"</string>
<string name="permdesc_changeWifiState" msgid="7170350070554505384">"מאפשר לאפליקציה להתחבר לנקודות גישת Wi-Fi ולהתנתק מהן, וכן לבצע שינויים בתצורת המכשיר עבור רשתות Wi-Fi."</string>
<string name="permlab_changeWifiMulticastState" msgid="285626875870754696">"מאפשרת לקבל שידורים מרובים ב-Wi-Fi"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטאבלט שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטאבלט שלך. צריכת הסוללה גבוהה יותר מאשר במצב שאינו שידור לקבוצה."</string>
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות מולטיקאסט, ולא רק למכשיר ה-Android TV. צריכת החשמל תהיה גבוהה יותר מאשר במצב שאינו מולטיקאסט."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה."</string>
<string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"גישה להגדרות Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"מאפשר לאפליקציה להגדיר את תצורתו של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"מאפשרת לאפליקציה להגדיר את התצורה של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"מאפשרת לאפליקציה להגדיר Bluetooth במכשיר ה-Android TV, ולגלות מכשירים מרוחקים ולבצע איתם התאמה."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"מאפשר לאפליקציה להגדיר את תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"מאפשרת לאפליקציה להגדיר את התצורה של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
<string name="permlab_accessWimaxState" msgid="7029563339012437434">"התחברות והתנתקות מ-WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="5372734776802067708">"מאפשרת לאפליקציה לדעת האם WiNMAX מופעל, ולקבל מידע לגבי רשתות WiNMAX מחוברות."</string>
- <string name="permlab_changeWimaxState" msgid="6223305780806267462">"שנה את מצב 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="tv" msgid="5373274458799425276">"מאפשרת לאפליקציה לחבר את מכשיר ה-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">"התאמה למכשירי Bluetooth"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטאבלט, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים."</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"מאפשרת לאפליקציה להציג את הגדרת ה-Bluetooth במכשיר ה-Android TV, וליצור ולקבל חיבורים עם מכשירים מותאמים."</string>
@@ -545,25 +545,29 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"מאפשרת לאפליקציה לגלות מכשירי Bluetooth בקרבת מקום ולבצע התאמה איתם"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"התחברות למכשירי Bluetooth מתאימים"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"מאפשרת לאפליקציה להתחבר למכשירי Bluetooth מותאמים"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"פרטים על שירות תשלום מועדף ב-NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"מאפשרת לאפליקציה לקבל פרטים על שירות תשלום מועדף ב-NFC, כמו עזרים רשומים ויעד של נתיב."</string>
- <string name="permlab_nfc" msgid="1904455246837674977">"שלוט ב-Near Field Communication"</string>
+ <string name="permlab_nfc" msgid="1904455246837674977">"שליטה בתקשורת מטווח קצר"</string>
<string name="permdesc_nfc" msgid="8352737680695296741">"מאפשרת לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\' (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3605253559020928505">"ביטול נעילת המסך שלך"</string>
- <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"מאפשר לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית את נעילת המקשים בעת קבלה של שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
+ <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"מאפשרת לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון ישבית את נעילת המקשים במהלך שיחת טלפון נכנסת, ויפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
<string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"בקשת מידע לגבי מידת המורכבות של נעילת המסך"</string>
- <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"מאפשרת לאפליקציה ללמוד את רמת המורכבות של נעילת המסך (גבוהה, בינונית, נמוכה או לא מורכבת). רמה זו מציינת את הטווח האפשרי של אורך וסוג נעילת המסך. האפליקציה יכולה גם להציע למשתמשים לעדכן את נעילת המסך לרמה מסוימת, אבל המשתמשים יכולים להתעלם מההצעה ולנווט לפריט אחר. לתשומת ליבך, נעילת המסך לא מאוחסנת כטקסט פשוט, ולכן האפליקציה לא יודעת מה הסיסמה המדויקת."</string>
+ <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"מאפשרת לאפליקציה ללמוד את רמת המורכבות של נעילת המסך (גבוהה, בינונית, נמוכה או לא מורכבת). הרמה הזו מציינת את הטווח האפשרי של אורך וסוג נעילת המסך. האפליקציה יכולה גם להציע למשתמשים לעדכן את נעילת המסך לרמה מסוימת, אבל המשתמשים יכולים להתעלם מההצעה ולנווט לפריט אחר. לתשומת ליבך, נעילת המסך לא מאוחסנת כטקסט פשוט, ולכן האפליקציה לא יודעת מה הסיסמה המדויקת."</string>
<string name="permlab_useBiometric" msgid="6314741124749633786">"שימוש בחומרה ביומטרית"</string>
<string name="permdesc_useBiometric" msgid="7502858732677143410">"מאפשרת לאפליקציה להשתמש בחומרה ביומטרית לצורך אימות"</string>
<string name="permlab_manageFingerprint" msgid="7432667156322821178">"ניהול חומרה של טביעות אצבעות"</string>
- <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"מאפשר לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות טביעות אצבעות שבהן ייעשה שימוש."</string>
+ <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות טביעות אצבעות שבהן ייעשה שימוש."</string>
<string name="permlab_useFingerprint" msgid="1001421069766751922">"שימוש בחומרה של טביעות אצבעות"</string>
<string name="permdesc_useFingerprint" msgid="412463055059323742">"מאפשרת לאפליקציה להשתמש בחומרה של טביעות אצבעות לצורך אימות"</string>
<string name="permlab_audioWrite" msgid="8501705294265669405">"לשנות את אוסף המוזיקה שלך"</string>
<string name="permdesc_audioWrite" msgid="8057399517013412431">"מאפשרת לאפליקציה לשנות את אוסף המוזיקה שלך."</string>
<string name="permlab_videoWrite" msgid="5940738769586451318">"לשנות את אוסף הסרטונים שלך"</string>
<string name="permdesc_videoWrite" msgid="6124731210613317051">"מאפשרת לאפליקציה לשנות את אוסף הסרטונים שלך."</string>
- <string name="permlab_imagesWrite" msgid="1774555086984985578">"לשנות את אוסף התמונות שלך"</string>
+ <string name="permlab_imagesWrite" msgid="1774555086984985578">"שינוי אוסף התמונות שלך"</string>
<string name="permdesc_imagesWrite" msgid="5195054463269193317">"מאפשרת לאפליקציה לשנות את אוסף התמונות שלך."</string>
<string name="permlab_mediaLocation" msgid="7368098373378598066">"לקרוא מיקומים מאוסף המדיה שלך"</string>
<string name="permdesc_mediaLocation" msgid="597912899423578138">"מאפשרת לאפליקציה לקרוא מיקומים מאוסף המדיה שלך."</string>
@@ -579,15 +583,16 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"עוד לא הוגדרו קוד אימות, קו ביטול נעילה או סיסמה"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"שגיאה באימות"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"שימוש בנעילת מסך"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"יש להזין את פרטי הכניסה של המכשיר כדי להמשיך"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
- <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"לא ניתן היה לעבד את טביעת האצבע. נסה שוב."</string>
+ <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"לא ניתן היה לעבד את טביעת האצבע. אפשר לנסות שוב."</string>
<!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
<skip />
<!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
<skip />
- <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"הזזת את האצבע לאט מדי. נסה שוב."</string>
+ <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"הזזת את האצבע לאט מדי. יש לנסות שוב."</string>
<!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
<skip />
<!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
@@ -609,7 +614,7 @@
<string name="fingerprint_error_lockout_permanent" msgid="3895478283943513746">"יותר מדי ניסיונות. חיישן טביעות האצבע הושבת."</string>
<string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"כדאי לנסות שוב."</string>
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"לא נסרקו טביעות אצבע."</string>
- <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"במכשיר זה אין חיישן טביעות אצבע."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"במכשיר הזה אין חיישן טביעות אצבע."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"החיישן מושבת באופן זמני."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"שימוש בטביעת אצבע"</string>
@@ -626,16 +631,12 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"שחרור נעילה על ידי זיהוי פנים"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"יש לבצע סריקה חוזרת של הפנים שלך"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"הגדרת שחרור נעילה על ידי זיהוי פנים"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"יש להביט בטלפון כדי לבטל את נעילתו"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"אפשר להגדיר דרכים נוספות לביטול נעילה"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"יש להקיש כדי להוסיף טביעת אצבע"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."</string>
- <string name="face_acquired_too_bright" msgid="8070756048978079164">"בהיר מדי. צריך תאורה עדינה יותר."</string>
+ <string name="face_acquired_too_bright" msgid="8070756048978079164">"בהירה מדי. צריך תאורה עדינה יותר."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"התמונה חשוכה מדי. צריך תאורה חזקה יותר."</string>
<string name="face_acquired_too_close" msgid="1628767882971469833">"יש להרחיק את הטלפון."</string>
<string name="face_acquired_too_far" msgid="5098567726427173896">"צריך לקרב את הטלפון."</string>
@@ -651,9 +652,9 @@
<string name="face_acquired_too_similar" msgid="7684650785108399370">"דומה מדי, יש לשנות תנוחה."</string>
<string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"עליך ליישר קצת את הראש."</string>
<string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"יש ליישר קצת את הראש."</string>
- <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"עליך ליישר קצת את הראש."</string>
+ <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"צריך ליישר קצת את הראש."</string>
<string name="face_acquired_obscured" msgid="4917643294953326639">"יש להסיר כל דבר שמסתיר את הפנים."</string>
- <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"עליך לנקות את החלק העליון של המסך, כולל הסרגל השחור"</string>
+ <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"צריך לנקות את החלק העליון של המסך, כולל הסרגל השחור"</string>
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="5085202213036026288">"לא ניתן לאמת את הפנים. החומרה לא זמינה."</string>
@@ -670,43 +671,44 @@
<string name="face_name_template" msgid="3877037340223318119">"פנים <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"שחרור נעילה על ידי זיהוי פנים"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"שימוש בזיהוי פנים או בנעילת מסך"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"יש להשתמש בשחרור נעילה על ידי זיהוי פנים כדי להמשיך"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"יש להשתמש בזיהוי הפנים או בנעילת המסך כדי להמשיך"</string>
<string-array name="face_error_vendor">
</string-array>
<string name="face_icon_content_description" msgid="465030547475916280">"סמל הפנים"</string>
- <string name="permlab_readSyncSettings" msgid="6250532864893156277">"קרא את הגדרות הסינכרון"</string>
+ <string name="permlab_readSyncSettings" msgid="6250532864893156277">"קריאת הגדרות הסנכרון"</string>
<string name="permdesc_readSyncSettings" msgid="1325658466358779298">"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."</string>
- <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"הפעלת וכיבוי סנכרון"</string>
+ <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"הפעלה וכיבוי של הסנכרון"</string>
<string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"מאפשרת לאפליקציה לשנות את הגדרות הסנכרון של חשבונות. לדוגמה, אפשר להשתמש בהרשאה הזו כדי להפעיל סנכרון של האפליקציה \'אנשים\' עם חשבון כלשהו."</string>
<string name="permlab_readSyncStats" msgid="3747407238320105332">"קריאת הנתונים הסטטיסטיים של הסנכרון"</string>
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"מאפשרת לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"קריאת התוכן של האחסון המשותף שלך"</string>
- <string name="permdesc_sdcardRead" msgid="6872973242228240382">"מאפשר לאפליקציה לקרוא את התוכן של האחסון המשותף."</string>
+ <string name="permdesc_sdcardRead" msgid="6872973242228240382">"מאפשרת לאפליקציה לקרוא את התוכן של האחסון המשותף."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"שינוי או מחיקה של תוכן האחסון המשותף שלך"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"מאפשר לאפליקציה לכתוב את התוכן של האחסון המשותף."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"ביצוע/קבלה של שיחות SIP"</string>
- <string name="permdesc_use_sip" msgid="3590270893253204451">"אפשר לאפליקציה לבצע ולקבל שיחות SIP."</string>
+ <string name="permdesc_use_sip" msgid="3590270893253204451">"מאפשרת לאפליקציה לבצע ולקבל שיחות SIP."</string>
<string name="permlab_register_sim_subscription" msgid="1653054249287576161">"רישום חיבורי Telecom SIM חדשים"</string>
- <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"מאפשר לאפליקציה לרשום חיבורי Telecom SIM חדשים."</string>
+ <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"מאפשרת לאפליקציה לרשום חיבורי Telecom SIM חדשים."</string>
<string name="permlab_register_call_provider" msgid="6135073566140050702">"רשום חיבורי Telecom חדשים"</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="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_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="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"קריאת נתוני שימוש היסטוריים ברשת"</string>
<string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"מאפשר לאפליקציה לקרוא נתוני שימוש היסטוריים ברשת עבור רשתות ואפליקציות ספציפיות."</string>
- <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"נהל מדיניות רשת"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"ניהול מדיניות רשת"</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>
- <string name="permdesc_accessNotifications" msgid="761730149268789668">"מאפשר לאפליקציה לאחזר, לבדוק ולמחוק התראות, כולל כאלה שפורסמו על ידי אפליקציות אחרות."</string>
+ <string name="permdesc_accessNotifications" msgid="761730149268789668">"מאפשרת לאפליקציה לאחזר, לבדוק ולמחוק התראות, כולל כאלה שפורסמו על ידי אפליקציות אחרות."</string>
<string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"איגוד לשירות של מאזין להתראות"</string>
<string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות האזנה להתראות. ההרשאה הזו אינה נחוצה לאפליקציות רגילות."</string>
<string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"איגוד לשירות ספק תנאי"</string>
@@ -722,9 +724,9 @@
<string name="permlab_accessDrmCertificates" msgid="6473765454472436597">"גישה אל אישורי DRM"</string>
<string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"מאפשרת לאפליקציה לנהל תצורה של אישורי DRM ולהשתמש בהם. לעולם לא אמורה להיות נחוצה עבור אפליקציה רגילה."</string>
<string name="permlab_handoverStatus" msgid="7620438488137057281">"קבלת סטטוס העברה של Android Beam"</string>
- <string name="permdesc_handoverStatus" msgid="3842269451732571070">"מאפשר לאפליקציה הזו לקבל מידע על העברות Android Beam נוכחיות"</string>
+ <string name="permdesc_handoverStatus" msgid="3842269451732571070">"מאפשרת לאפליקציה הזו לקבל מידע על העברות Android Beam נוכחיות"</string>
<string name="permlab_removeDrmCertificates" msgid="710576248717404416">"הסרת אישורי DRM"</string>
- <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"הרשאה זו מאפשרת לאפליקציה להסיר אישורי DRM. באפליקציות רגילות אף פעם לא אמור להיות בה צורך."</string>
+ <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"ההרשאה הזו מאפשרת לאפליקציה להסיר אישורי DRM. אף פעם לא אמורה להיות נחוצה לאפליקציות רגילות."</string>
<string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"איגוד לשירות העברת הודעות של ספק"</string>
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות העברת הודעות של ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"איגוד לשירותי ספק"</string>
@@ -735,14 +737,14 @@
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"גישה לנתוני חיישנים בתדירות דגימה גבוהה"</string>
<string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"האפליקציה תוכל לדגום נתוני חיישנים בתדירות של מעל 200 הרץ"</string>
- <string name="policylab_limitPassword" msgid="4851829918814422199">"הגדר כללי סיסמה"</string>
+ <string name="policylab_limitPassword" msgid="4851829918814422199">"הגדרת כללי סיסמה"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי האימות של מסך הנעילה."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"מעקב אחר ניסיונות לביטול של נעילת המסך"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"ניהול מעקב אחר מספר הסיסמאות השגויות שמוקלדות בעת ביטול נעילת המסך, וביצוע נעילה של הטאבלט, או מחיקה של כל נתוני הטאבלט, אם מוקלדות יותר מדי סיסמאות שגויות."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילה של מכשיר ה-Android TV או מחיקה של כל נתוני מכשיר ה-Android TV אם הוזנו יותר מדי סיסמאות שגויות."</string>
- <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"ניהול מעקב אחר מספר הסיסמאות השגויות שהוקלדו בעת ביטול נעילה המסך, וביצוע נעילה של הטלפון או מחיקה של כל נתוני הטלפון אם הוקלדו יותר מדי סיסמאות שגויות."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"מעקב אחר מספר הסיסמאות השגויות שהוקלדו במהלך ביטול נעילת המסך, וביצוע נעילה של הטלפון או מחיקה של כל נתוני הטלפון אם הוקלדו יותר מדי סיסמאות שגויות."</string>
<string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילת הטאבלט או מחיקה של כל נתוני המשתמש הזה אם הוזנו יותר מדי סיסמאות שגויות."</string>
- <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילה של מכשיר ה-Android TV או מחיקה של כל נתוני המשתמש הזה אם הוזנו יותר מדי סיסמאות שגויות."</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"מעקב אחר מספר הסיסמאות השגויות שהוזנו במהלך ביטול נעילת המסך, כמו גם נעילה של מכשיר ה-Android TV או מחיקה של כל נתוני המשתמש הזה אם הוזנו יותר מדי סיסמאות שגויות."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילת הטלפון או מחיקה של כל נתוני המשתמש הזה אם הוזנו יותר מדי סיסמאות שגויות."</string>
<string name="policylab_resetPassword" msgid="214556238645096520">"שינוי נעילת המסך"</string>
<string name="policydesc_resetPassword" msgid="4626419138439341851">"שינוי של נעילת המסך."</string>
@@ -753,17 +755,17 @@
<string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"מחיקה ללא אזהרה של נתוני מכשיר ה-Android TV באמצעות איפוס לנתוני היצרן."</string>
<string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"מחיקה של נתוני הטלפון, ללא אזהרה, על ידי ביצוע איפוס לנתוני היצרן."</string>
<string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"מחיקת נתוני משתמש"</string>
- <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"מחיקה ללא אזהרה של נתוני המשתמש הזה בטאבלט הזה."</string>
+ <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"מחיקה של נתוני המשתמש הזה בטאבלט, ללא אזהרה."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"מחיקה של נתוני המשתמש הזה במכשיר ה-Android TV, ללא אזהרה."</string>
- <string name="policydesc_wipeData_secondaryUser" product="default" msgid="2788325512167208654">"מחיקה ללא אזהרה של נתוני המשתמש הזה בטלפון הזה."</string>
- <string name="policylab_setGlobalProxy" msgid="215332221188670221">"הגדר את שרת ה-Proxy הכללי של המכשיר"</string>
- <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק הבעלים של המכשיר יכול להגדיר את שרת ה-proxy הגלובלי."</string>
+ <string name="policydesc_wipeData_secondaryUser" product="default" msgid="2788325512167208654">"מחיקה של נתוני המשתמש הזה בטלפון, ללא אזהרה."</string>
+ <string name="policylab_setGlobalProxy" msgid="215332221188670221">"הגדרה של שרת ה-Proxy הכללי של המכשיר"</string>
+ <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק לבעלים של המכשיר יש אפשרות להגדיר את שרת ה-proxy הגלובלי."</string>
<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="policylab_disableCamera" msgid="5749486347810162018">"השבתת מצלמות"</string>
- <string name="policydesc_disableCamera" msgid="3204405908799676104">"מנע שימוש בכל המצלמות שבמכשיר."</string>
+ <string name="policydesc_disableCamera" msgid="3204405908799676104">"מניעת שימוש בכל המצלמות שבמכשיר."</string>
<string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"השבתת חלק מהתכונות של נעילת המסך"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"מניעת שימוש בחלק מהתכונות של נעילת המסך."</string>
<string-array name="phoneTypes">
@@ -860,8 +862,8 @@
<string name="orgTypeWork" msgid="8684458700669564172">"עבודה"</string>
<string name="orgTypeOther" msgid="5450675258408005553">"אחר"</string>
<string name="orgTypeCustom" msgid="1126322047677329218">"בהתאמה אישית"</string>
- <string name="relationTypeCustom" msgid="282938315217441351">"מותאם אישית"</string>
- <string name="relationTypeAssistant" msgid="4057605157116589315">"עוזר"</string>
+ <string name="relationTypeCustom" msgid="282938315217441351">"בהתאמה אישית"</string>
+ <string name="relationTypeAssistant" msgid="4057605157116589315">"אסיסטנט"</string>
<string name="relationTypeBrother" msgid="7141662427379247820">"אח"</string>
<string name="relationTypeChild" msgid="9076258911292693601">"ילד"</string>
<string name="relationTypeDomesticPartner" msgid="7825306887697559238">"שותף לחיים"</string>
@@ -885,7 +887,7 @@
<string name="keyguard_password_enter_puk_prompt" msgid="2825313071899938305">"קוד PUK"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="5505434724229581207">"קוד אימות חדש"</string>
<string name="keyguard_password_entry_touch_hint" msgid="4032288032993261520"><font size="17">"יש להקיש כדי להקליד את הסיסמה"</font></string>
- <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"הקלד סיסמה לביטול הנעילה"</string>
+ <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"יש להקליד סיסמה לביטול הנעילה"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"יש להקליד קוד אימות לביטול הנעילה"</string>
<string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"קוד אימות שגוי"</string>
<string name="keyguard_label_text" msgid="3841953694564168384">"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."</string>
@@ -900,7 +902,7 @@
<string name="lockscreen_pattern_correct" msgid="8050630103651508582">"נכון!"</string>
<string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"כדאי לנסות שוב"</string>
<string name="lockscreen_password_wrong" msgid="8605355913868947490">"כדאי לנסות שוב"</string>
- <string name="lockscreen_storage_locked" msgid="634993789186443380">"בטל את הנעילה לכל התכונות והנתונים"</string>
+ <string name="lockscreen_storage_locked" msgid="634993789186443380">"צריך לבטל את הנעילה כדי שכל התכונות והנתונים יהיו זמינים"</string>
<string name="faceunlock_multiple_failures" msgid="681991538434031708">"חרגת ממספר הניסיונות המרבי לשחרור נעילה על ידי זיהוי פנים"</string>
<string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"אין כרטיס SIM"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"אין כרטיס SIM בטאבלט."</string>
@@ -910,32 +912,32 @@
<string name="lockscreen_missing_sim_instructions_long" msgid="3664999892038416334">"כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. יש להכניס כרטיס SIM."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="3812893366715730539">"לא ניתן להשתמש בכרטיס ה-SIM הזה."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="4358929052509450807">"כרטיס ה-SIM שלך הושבת באופן סופי.\nיש לפנות לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."</string>
- <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"הרצועה הקודמת"</string>
+ <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"הטראק הקודם"</string>
<string name="lockscreen_transport_next_description" msgid="2931509904881099919">"הטראק הבא"</string>
<string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"השהה"</string>
<string name="lockscreen_transport_play_description" msgid="106868788691652733">"הפעלה"</string>
- <string name="lockscreen_transport_stop_description" msgid="1449552232598355348">"הפסק"</string>
- <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"הרץ אחורה"</string>
- <string name="lockscreen_transport_ffw_description" msgid="4763794746640196772">"הרץ קדימה"</string>
+ <string name="lockscreen_transport_stop_description" msgid="1449552232598355348">"הפסקה"</string>
+ <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"הרצה אחורה"</string>
+ <string name="lockscreen_transport_ffw_description" msgid="4763794746640196772">"הרצה קדימה"</string>
<string name="emergency_calls_only" msgid="3057351206678279851">"שיחות חירום בלבד"</string>
<string name="lockscreen_network_locked_message" msgid="2814046965899249635">"רשת נעולה"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="6618356415831082174">"כרטיס SIM נעול באמצעות PUK."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="5307979043730860995">"יש לעיין במדריך למשתמש או לפנות לשירות הלקוחות."</string>
<string name="lockscreen_sim_locked_message" msgid="3160196135801185938">"כרטיס ה-SIM נעול."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="2286497117428409709">"מבטל נעילה של כרטיס SIM…"</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="2286497117428409709">"מתבצע ביטול נעילה של כרטיס SIM…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6458790975898594240">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"הקלדת קוד גישה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את הנעילה של מכשיר ה-Android TV באמצעות כניסה לחשבון Google שלך.\n\n אפשר לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"ביצעת <xliff:g id="NUMBER_0">%1$d</xliff:g> ניסיונות שגויים לביטול נעילת הטאבלט. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"ביצעת <xliff:g id="NUMBER_0">%1$d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטאבלט. הטאבלט יעבור כעת איפוס לברירת המחדל של היצרן."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV <xliff:g id="NUMBER">%d</xliff:g> פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV <xliff:g id="NUMBER">%d</xliff:g> פעמים. מכשיר ה-Android TV יעבור עכשיו איפוס לברירת המחדל של היצרן."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן."</string>
- <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"נסה שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"אפשר לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"שכחת את קו ביטול הנעילה?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"ביטול נעילת החשבון"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"בוצעו ניסיונות רבים מדי לשרטוט קו ביטול נעילה."</string>
@@ -946,33 +948,33 @@
<string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"שם משתמש או סיסמה לא חוקיים."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"שכחת את שם המשתמש או הסיסמה?\nאפשר להיכנס לכתובת "<b>"google.com/accounts/recovery"</b></string>
<string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"בבדיקה..."</string>
- <string name="lockscreen_unlock_label" msgid="4648257878373307582">"בטל נעילה"</string>
+ <string name="lockscreen_unlock_label" msgid="4648257878373307582">"ביטול נעילה"</string>
<string name="lockscreen_sound_on_label" msgid="1660281470535492430">"קול פועל"</string>
<string name="lockscreen_sound_off_label" msgid="2331496559245450053">"ללא קול"</string>
- <string name="lockscreen_access_pattern_start" msgid="3778502525702613399">"יצירת הקו לביטול נעילה החלה"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3778502525702613399">"בתהליך שרטוט הקו לביטול נעילה"</string>
<string name="lockscreen_access_pattern_cleared" msgid="7493849102641167049">"הקו לביטול נעילה נמחק"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6746676335293144163">"התא נוסף"</string>
<string name="lockscreen_access_pattern_cell_added_verbose" msgid="2931364927622563465">"תא <xliff:g id="CELL_INDEX">%1$s</xliff:g> נוסף"</string>
<string name="lockscreen_access_pattern_detected" msgid="3931150554035194012">"הקו לביטול נעילה הושלם"</string>
<string name="lockscreen_access_pattern_area" msgid="1288780416685002841">"אזור לשרטוט של קו ביטול הנעילה"</string>
<string name="keyguard_accessibility_widget_changed" msgid="7298011259508200234">"%1$s. Widget %2$d מתוך %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8245795023551343672">"הוסף Widget."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8245795023551343672">"הוספת ווידג\'ט."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="544239307077644480">"ריק"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="7768634718706488951">"אזור ביטול הנעילה הורחב."</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="4729922043778400434">"אזור ביטול הנעילה כווץ."</string>
- <string name="keyguard_accessibility_widget" msgid="6776892679715699875">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_widget" msgid="6776892679715699875">"ווידג\'ט <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1466067610235696600">"בוחר משתמשים"</string>
<string name="keyguard_accessibility_status" msgid="6792745049712397237">"סטטוס"</string>
<string name="keyguard_accessibility_camera" msgid="7862557559464986528">"מצלמה"</string>
<string name="keygaurd_accessibility_media_controls" msgid="2267379779900620614">"פקדי מדיה"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"סידור מחדש של Widgets התחיל."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"סידור מחדש של Widgets הסתיים."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"הווידג\'ט <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"הרחבה של אזור ביטול הנעילה."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ביטול נעילה באמצעות הסטה."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ביטול נעילה על ידי שרטוט קו."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ביטול נעילה באמצעות זיהוי פנים."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ביטול נעילה באמצעות קוד גישה."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"שחרור נעילה על ידי זיהוי פנים."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ביטול נעילה באמצעות קוד אימות."</string>
<string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ביטול הנעילה של קוד האימות ל-SIM."</string>
<string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ביטול נעילה של PUK ל-SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="6130186108581153265">"ביטול נעילה באמצעות סיסמה."</string>
@@ -988,17 +990,17 @@
<string name="factorytest_failed" msgid="3190979160945298006">"בדיקת היצרן נכשלה"</string>
<string name="factorytest_not_system" msgid="5658160199925519869">"הפעולה FACTORY_TEST נתמכת רק עבור חבילות שהותקנו ב-/system/app."</string>
<string name="factorytest_no_action" msgid="339252838115675515">"לא נמצאה חבילה המספקת את הפעולה FACTORY_TEST."</string>
- <string name="factorytest_reboot" msgid="2050147445567257365">"אתחל מחדש"</string>
+ <string name="factorytest_reboot" msgid="2050147445567257365">"הפעלה מחדש"</string>
<string name="js_dialog_title" msgid="7464775045615023241">"בדף שבכתובת \'<xliff:g id="TITLE">%s</xliff:g>\' כתוב:"</string>
<string name="js_dialog_title_default" msgid="3769524569903332476">"JavaScript"</string>
<string name="js_dialog_before_unload_title" msgid="7012587995876771246">"אישור ניווט"</string>
- <string name="js_dialog_before_unload_positive_button" msgid="4274257182303565509">"צא מדף זה"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="4274257182303565509">"יציאה מהדף"</string>
<string name="js_dialog_before_unload_negative_button" msgid="3873765747622415310">"להישאר בדף הזה"</string>
<string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nבטוח שברצונך לנווט אל מחוץ לדף הזה?"</string>
<string name="save_password_label" msgid="9161712335355510035">"אישור"</string>
- <string name="double_tap_toast" msgid="7065519579174882778">"טיפ: הקש פעמיים כדי להגדיל ולהקטין."</string>
+ <string name="double_tap_toast" msgid="7065519579174882778">"טיפ: אפשר להקיש פעמיים כדי להגדיל או להקטין את התצוגה."</string>
<string name="autofill_this_form" msgid="3187132440451621492">"מילוי אוטומטי"</string>
- <string name="setup_autofill" msgid="5431369130866618567">"הגדר מילוי אוטומטי"</string>
+ <string name="setup_autofill" msgid="5431369130866618567">"הגדרת מילוי אוטומטי"</string>
<string name="autofill_window_title" msgid="4379134104008111961">"מילוי אוטומטי באמצעות <xliff:g id="SERVICENAME">%1$s</xliff:g>"</string>
<string name="autofill_address_name_separator" msgid="8190155636149596125">" "</string>
<string name="autofill_address_summary_name_format" msgid="3402882515222673691">"$1$2$3"</string>
@@ -1017,32 +1019,29 @@
<string name="autofill_area" msgid="8289022370678448983">"אזור"</string>
<string name="autofill_emirate" msgid="2544082046790551168">"אמירות"</string>
<string name="permlab_readHistoryBookmarks" msgid="9102293913842539697">"קריאת סימניות והיסטוריית האינטרנט שלך"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"מאפשר לאפליקציה לקרוא את ההיסטוריה של כל כתובות האתרים שבהן הדפדפן ביקר, ואת כל ה-Bookmarks של הדפדפן. שים לב: דפדפני צד שלישי או אפליקציות אחרות עם יכולות לדפדוף באינטרנט אינם יכולים לאכוף אישור זה."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"מאפשרת לאפליקציה לקרוא את ההיסטוריה של כל כתובות ה-URL שאליהן נכנסת באמצעות הדפדפן, ואת כל הסימניות בדפדפן. הערה: אפליקציות אחרות או דפדפני צד שלישי עם יכולות גלישה באינטרנט לא יכולים לאכוף את האישור הזה."</string>
<string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"כתיבת סימניות והיסטורייה של אתרים"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטאבלט. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"מאפשרת לאפליקציה לשנות את ההיסטוריה או את הסימניות של הדפדפן אשר מאוחסנות בטאבלט. ההרשאה עשויה לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. הערה: ההרשאה הזו לא ניתנת לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט."</string>
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"מאפשרת לאפליקציה לשנות את הסימניות או את היסטוריית הדפדפן השמורות במכשיר ה-Android TV. הרשאה זו עשויה לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. הערה: ייתכן שההרשאה לא תיושם על ידי דפדפנים של צד שלישי או על ידי אפליקציות אחרות עם יכולות גלישה באינטרנט."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטלפון. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"מאפשרת לאפליקציה לשנות את ההיסטוריה או את הסימניות של הדפדפן אשר מאוחסנות בטלפון. ההרשאה הזו עשויה לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. הערה: אפליקציות אחרות או דפדפני צד שלישי עם יכולות גלישה באינטרנט לא יכולים לאכוף את האישור הזה."</string>
<string name="permlab_setAlarm" msgid="1158001610254173567">"הגדרת התראה"</string>
<string name="permdesc_setAlarm" msgid="2185033720060109640">"מאפשרת לאפליקציה להגדיר התראה באפליקציה מותקנת של שעון מעורר. אפליקציות מסוימות של שעון מעורר אינן מיישמות את התכונה הזו."</string>
<string name="permlab_addVoicemail" msgid="4770245808840814471">"הוספה של דואר קולי"</string>
<string name="permdesc_addVoicemail" msgid="5470312139820074324">"מאפשרת לאפליקציה להוסיף הודעות לתיבת הדואר הקולי."</string>
<string name="permlab_writeGeolocationPermissions" msgid="8605631647492879449">"שינוי הרשאות המיקום הגיאוגרפי של הדפדפן"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"מאפשר לאפליקציה לשנות את הרשאות המיקום הגיאוגרפי של הדפדפן. אפליקציות זדוניות עלולות להשתמש בכך כדי לאפשר משלוח של פרטי מיקום לאתרים זדוניים אחרים."</string>
- <string name="save_password_message" msgid="2146409467245462965">"האם ברצונך שהדפדפן יזכור סיסמה זו?"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"מאפשרת לאפליקציה לשנות את הרשאות המיקום הגיאוגרפי של הדפדפן. אפליקציות זדוניות עלולות להשתמש בכך כדי לאפשר שליחה של פרטי מיקום לאתרים זדוניים אחרים."</string>
+ <string name="save_password_message" msgid="2146409467245462965">"רוצה שהדפדפן יזכור את הסיסמה?"</string>
<string name="save_password_notnow" msgid="2878327088951240061">"לא עכשיו"</string>
<string name="save_password_remember" msgid="6490888932657708341">"כן, לשמור"</string>
<string name="save_password_never" msgid="6776808375903410659">"אף פעם"</string>
- <string name="open_permission_deny" msgid="5136793905306987251">"אין לך הרשאה לפתוח דף זה."</string>
+ <string name="open_permission_deny" msgid="5136793905306987251">"אין לך הרשאה לפתוח את הדף הזה."</string>
<string name="text_copied" msgid="2531420577879738860">"הטקסט הועתק ללוח."</string>
<string name="copied" msgid="4675902854553014676">"ההעתקה בוצעה"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"האפליקציה <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> הודבקה מ-<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"האפליקציה <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> הודבקה מהלוח"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"טקסט שהעתקת הודבק על ידי <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"תמונה שהעתקת הודבקה על ידי <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
+ <string name="pasted_content" msgid="646276353060777131">"התוכן שהעתקת הודבק על ידי <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
<string name="more_item_label" msgid="7419249600215749115">"עוד"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"תפריט+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1063,8 +1062,8 @@
<string name="searchview_description_voice" msgid="42360159504884679">"חיפוש קולי"</string>
<string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"האם להפעיל את התכונה \'גילוי באמצעות מגע\'?"</string>
<string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'גילוי באמצעות מגע\'. כאשר התכונה הזו מופעלת, אפשר לשמוע או לראות תיאורים של הפריטים שעליהם הנחת את האצבע או לקיים אינטראקציה עם הטאבלט באמצעות תנועות."</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע."</string>
- <string name="oneMonthDurationPast" msgid="4538030857114635777">"לפני חודש אחד"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"השירות <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'גילוי באמצעות מגע\'. כשהתכונה \'גילוי באמצעות מגע\' מופעלת, אפשר לשמוע או לראות תיאורים של הפריטים שעליהם האצבע מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע."</string>
+ <string name="oneMonthDurationPast" msgid="4538030857114635777">"לפני חודש"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"לפני חודש אחד"</string>
<plurals name="last_num_days" formatted="false" msgid="687443109145393632">
<item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> הימים האחרונים</item>
@@ -1100,7 +1099,7 @@
<item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
<item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">שעה <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="one">שעה (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
<item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
@@ -1160,7 +1159,7 @@
<item quantity="two">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
<item quantity="many">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
<item quantity="other">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="one">לפני <xliff:g id="COUNT_0">%d</xliff:g> שנה</item>
+ <item quantity="one">לפני שנה אחת (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
<item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
@@ -1172,13 +1171,13 @@
<item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
<item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
<item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">בעוד <xliff:g id="COUNT_0">%d</xliff:g> שעה</item>
+ <item quantity="one">בעוד שעה אחת (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
<item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
<item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
<item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="one">בעוד <xliff:g id="COUNT_0">%d</xliff:g> יום</item>
+ <item quantity="one">בעוד יום אחד (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
<item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
@@ -1186,7 +1185,7 @@
<item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
<item quantity="one">בעוד שנה <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
- <string name="VideoView_error_title" msgid="5750686717225068016">"בעיה בווידאו"</string>
+ <string name="VideoView_error_title" msgid="5750686717225068016">"בעיה בסרטון"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"לא ניתן להעביר את הסרטון הזה בסטרימינג למכשיר."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"לא ניתן להפעיל את הסרטון הזה."</string>
<string name="VideoView_error_button" msgid="5138809446603764272">"אישור"</string>
@@ -1200,18 +1199,18 @@
<string name="selectAll" msgid="1532369154488982046">"בחירת הכול"</string>
<string name="cut" msgid="2561199725874745819">"חיתוך"</string>
<string name="copy" msgid="5472512047143665218">"העתקה"</string>
- <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"ההעתקה אל הלוח נכשלה"</string>
+ <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"לא ניתן להעתיק אל הלוח"</string>
<string name="paste" msgid="461843306215520225">"הדבק"</string>
<string name="paste_as_plain_text" msgid="7664800665823182587">"הדבקה כטקסט פשוט"</string>
<string name="replace" msgid="7842675434546657444">"החלפה..."</string>
<string name="delete" msgid="1514113991712129054">"מחיקה"</string>
<string name="copyUrl" msgid="6229645005987260230">"העתקת כתובת URL"</string>
- <string name="selectTextMode" msgid="3225108910999318778">"בחר טקסט"</string>
+ <string name="selectTextMode" msgid="3225108910999318778">"בחירת טקסט"</string>
<string name="undo" msgid="3175318090002654673">"ביטול"</string>
- <string name="redo" msgid="7231448494008532233">"בצע מחדש"</string>
+ <string name="redo" msgid="7231448494008532233">"ביצוע מחדש"</string>
<string name="autofill" msgid="511224882647795296">"מילוי אוטומטי"</string>
<string name="textSelectionCABTitle" msgid="5151441579532476940">"בחירת טקסט"</string>
- <string name="addToDictionary" msgid="8041821113480950096">"הוסף למילון"</string>
+ <string name="addToDictionary" msgid="8041821113480950096">"הוספה למילון"</string>
<string name="deleteText" msgid="4200807474529938112">"מחיקה"</string>
<string name="inputMethod" msgid="1784759500516314751">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"פעולות טקסט"</string>
@@ -1219,7 +1218,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>
@@ -1232,11 +1231,11 @@
<string name="not_checked" msgid="7972320087569023342">"לא מסומן"</string>
<string name="selected" msgid="6614607926197755875">"נבחר"</string>
<string name="not_selected" msgid="410652016565864475">"לא נבחר"</string>
- <string name="whichApplication" msgid="5432266899591255759">"השלמת פעולה באמצעות"</string>
- <string name="whichApplicationNamed" msgid="6969946041713975681">"להשלמת הפעולה באמצעות %1$s"</string>
- <string name="whichApplicationLabel" msgid="7852182961472531728">"השלם פעולה"</string>
+ <string name="whichApplication" msgid="5432266899591255759">"השלמת הפעולה באמצעות"</string>
+ <string name="whichApplicationNamed" msgid="6969946041713975681">"השלמת הפעולה באמצעות %1$s"</string>
+ <string name="whichApplicationLabel" msgid="7852182961472531728">"להשלמת הפעולה"</string>
<string name="whichViewApplication" msgid="5733194231473132945">"פתיחה באמצעות"</string>
- <string name="whichViewApplicationNamed" msgid="415164730629690105">"פתח באמצעות %1$s"</string>
+ <string name="whichViewApplicationNamed" msgid="415164730629690105">"פתיחה באמצעות %1$s"</string>
<string name="whichViewApplicationLabel" msgid="7367556735684742409">"פתיחה"</string>
<string name="whichOpenHostLinksWith" msgid="7645631470199397485">"פתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות"</string>
<string name="whichOpenLinksWith" msgid="1120936181362907258">"פתיחת קישורים באמצעות"</string>
@@ -1248,19 +1247,19 @@
<string name="whichEditApplicationLabel" msgid="1463288652070140285">"עריכה"</string>
<string name="whichSendApplication" msgid="4143847974460792029">"שיתוף"</string>
<string name="whichSendApplicationNamed" msgid="4470386782693183461">"שיתוף באמצעות %1$s"</string>
- <string name="whichSendApplicationLabel" msgid="7467813004769188515">"שתף"</string>
+ <string name="whichSendApplicationLabel" msgid="7467813004769188515">"שיתוף"</string>
<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="whichHomeApplicationLabel" msgid="8907334282202933959">"צילום תמונה"</string>
<string name="whichImageCaptureApplication" msgid="2737413019463215284">"צלם תמונה באמצעות"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8820702441847612202">"צילום תמונה באמצעות %1$s"</string>
- <string name="whichImageCaptureApplicationLabel" msgid="6505433734824988277">"צלם תמונה"</string>
+ <string name="whichImageCaptureApplicationLabel" msgid="6505433734824988277">"צילום תמונה"</string>
<string name="alwaysUse" msgid="3153558199076112903">"שימוש כברירת מחדל עבור הפעולה הזו."</string>
- <string name="use_a_different_app" msgid="4987790276170972776">"השתמש באפליקציה אחרת"</string>
- <string name="clearDefaultHintMsg" msgid="1325866337702524936">"נקה את הגדרת המחדל ב\'הגדרות מערכת\' < Google Apps < \'הורדות\'."</string>
+ <string name="use_a_different_app" msgid="4987790276170972776">"שימוש באפליקציה אחרת"</string>
+ <string name="clearDefaultHintMsg" msgid="1325866337702524936">"צריך לנקות את הגדרת המחדל ב\'הגדרות מערכת\' < \'אפליקציות של Google\' < \'הורדות\'."</string>
<string name="chooseActivity" msgid="8563390197659779956">"בחירת פעולה"</string>
<string name="chooseUsbActivity" msgid="2096269989990986612">"בחירת אפליקציה עבור התקן ה-USB"</string>
<string name="noApplications" msgid="1186909265235544019">"אין אפליקציות שיכולות לבצע את הפעולה הזו."</string>
@@ -1271,30 +1270,30 @@
<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_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_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>
- <string name="anr_application_process" msgid="4978772139461676184">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> אינה מגיבה"</string>
+ <string name="anr_application_process" msgid="4978772139461676184">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> לא מגיבה"</string>
<string name="anr_process" msgid="1664277165911816067">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> אינו מגיב."</string>
<string name="force_close" msgid="9035203496368973803">"אישור"</string>
- <string name="report" msgid="2149194372340349521">"שלח דוח"</string>
- <string name="wait" msgid="7765985809494033348">"המתן"</string>
- <string name="webpage_unresponsive" msgid="7850879412195273433">"הדף אינו מגיב.\n\nהאם אתה רוצה לסגור אותו?"</string>
+ <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_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>
<string name="screen_compat_mode_show" msgid="5080361367584709857">"להציג תמיד"</string>
<string name="screen_compat_mode_hint" msgid="4032272159093750908">"אפשר להפעיל מחדש את התכונה הזו ב\'הגדרות מערכת\' < Google Apps < \'הורדות\'."</string>
- <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g> אינו תומך בהגדרת הגודל הנוכחית של התצוגה, והתנהגותו עשויה להיות בלתי צפויה."</string>
- <string name="unsupported_display_size_show" msgid="980129850974919375">"הצג תמיד"</string>
+ <string name="unsupported_display_size_message" msgid="7265211375269394699">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בהגדרת הגודל הנוכחית של התצוגה, והיא עשויה לא לפעול כראוי."</string>
+ <string name="unsupported_display_size_show" msgid="980129850974919375">"להציג תמיד"</string>
<string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> נבנתה לגרסה לא תואמת של מערכת ההפעלה של Android ועלולה להתנהג באופן לא צפוי. ייתכן שקיימת גרסה מעודכנת של האפליקציה."</string>
- <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"הצג תמיד"</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>) הפר את מדיניות StrictMode באכיפה עצמית שלו."</string>
+ <string name="smv_application" msgid="3775183542777792638">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> (תהליך <xliff:g id="PROCESS">%2$s</xliff:g>) הפרה את מדיניות StrictMode באכיפה עצמית שלה."</string>
<string name="smv_process" msgid="1398801497130695446">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הפר את מדיניות StrictMode באכיפה עצמית."</string>
<string name="android_upgrading_title" product="default" msgid="7279077384220829683">"הטלפון מתעדכן…"</string>
<string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"הטאבלט מתעדכן…"</string>
@@ -1305,12 +1304,12 @@
<string name="android_start_title" product="device" msgid="6967413819673299309">"הפעלת המכשיר מתחילה…"</string>
<string name="android_upgrading_fstrim" msgid="3259087575528515329">"מתבצעת אופטימיזציה של האחסון."</string>
<string name="android_upgrading_notification_title" product="default" msgid="3509927005342279257">"עדכון המערכת לקראת סיום…"</string>
- <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> מבצעת שדרוג…"</string>
+ <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> בתהליך שדרוג…"</string>
<string name="android_upgrading_apk" msgid="1339564803894466737">"מתבצעת אופטימיזציה של אפליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="589736917792300956">"המערכת מכינה את <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
- <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"מפעיל אפליקציות."</string>
+ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"מתבצעת הפעלה של אפליקציות."</string>
<string name="android_upgrading_complete" msgid="409800058018374746">"תהליך האתחול בשלבי סיום."</string>
- <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string>
+ <string name="heavy_weight_notification" msgid="8382784283600329576">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת"</string>
<string name="heavy_weight_notification_detail" msgid="6802247239468404078">"יש להקיש כדי לחזור למשחק"</string>
<string name="heavy_weight_switcher_title" msgid="3861984210040100886">"בחירת משחק"</string>
<string name="heavy_weight_switcher_text" msgid="6814316627367160126">"לקבלת ביצועים טובים יותר, רק אחד מבין המשחקים האלה יכול להיות פתוח בכל פעם."</string>
@@ -1318,12 +1317,12 @@
<string name="new_app_action" msgid="547772182913269801">"פתיחת <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="1958903080400806644">"אפליקציית <xliff:g id="OLD_APP">%1$s</xliff:g> תיסגר ללא שמירה"</string>
<string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> חורג ממגבלת הזיכרון"</string>
- <string name="dump_heap_ready_notification" msgid="2302452262927390268">"Dump של ערימה בשביל <xliff:g id="PROC">%1$s</xliff:g> מוכן"</string>
+ <string name="dump_heap_ready_notification" msgid="2302452262927390268">"תמונת מצב של הזיכרון מוכנה עבור <xliff:g id="PROC">%1$s</xliff:g>"</string>
<string name="dump_heap_notification_detail" msgid="8431586843001054050">"Dump של ערימה נאסף. יש להקיש כדי לשתף."</string>
- <string name="dump_heap_title" msgid="4367128917229233901">"האם לשתף את נתוני ה-Dump של הערימה?"</string>
- <string name="dump_heap_text" msgid="1692649033835719336">"התהליך<xliff:g id="PROC">%1$s</xliff:g> חרג ממגבלת הזיכרון בגודל <xliff:g id="SIZE">%2$s</xliff:g>. Dump של ערימה זמין לשיתוף עם המפתח. חשוב לנקוט זהירות: ה-Dump של הערימה עשוי לכלול מידע אישי שאליו יש לאפליקציה גישה."</string>
+ <string name="dump_heap_title" msgid="4367128917229233901">"לשתף את תמונת המצב של הזיכרון?"</string>
+ <string name="dump_heap_text" msgid="1692649033835719336">"התהליך <xliff:g id="PROC">%1$s</xliff:g> חרג ממגבלת הזיכרון בגודל <xliff:g id="SIZE">%2$s</xliff:g>. תמונת מצב של הזיכרון זמינה לשיתוף עם המפתח. חשוב לנקוט זהירות: תמונת המצב של הזיכרון עשויה לכלול מידע אישי שאליו יש לאפליקציה גישה."</string>
<string name="dump_heap_system_text" msgid="6805155514925350849">"התהליך <xliff:g id="PROC">%1$s</xliff:g> חרג ממגבלת הזיכרון בגודל <xliff:g id="SIZE">%2$s</xliff:g>. יש Dump של ערימה זמין לשיתוף. חשוב לנקוט זהירות: ה-Dump של הערימה עשוי לכלול מידע אישי רגיש שאליו יש לתהליך גישה. ייתכן שמידע זה כולל נתונים שהקלדת."</string>
- <string name="dump_heap_ready_text" msgid="5849618132123045516">"Dump של ערימה עבור התהליך <xliff:g id="PROC">%1$s</xliff:g> זמין לשיתוף. חשוב לנקוט זהירות: ה-Dump של הערימה עשוי לכלול מידע אישי רגיש שאליו יש לתהליך גישה. ייתכן שמידע זה כולל נתונים שהקלדת."</string>
+ <string name="dump_heap_ready_text" msgid="5849618132123045516">"תמונת מצב של הזיכרון עבור התהליך <xliff:g id="PROC">%1$s</xliff:g> זמינה לשיתוף. זהירות: תמונת המצב של הזיכרון עשויה לכלול מידע אישי רגיש שאליו יש לתהליך גישה. ייתכן שהמידע הזה כולל נתונים שהקלדת."</string>
<string name="sendText" msgid="493003724401350724">"בחירת פעולה לביצוע עם טקסט"</string>
<string name="volume_ringtone" msgid="134784084629229029">"עוצמת קול של צלצול"</string>
<string name="volume_music" msgid="7727274216734955095">"עוצמת קול של מדיה"</string>
@@ -1369,29 +1368,29 @@
</string-array>
<string name="network_switch_type_name_unknown" msgid="3665696841646851068">"סוג רשת לא מזוהה"</string>
<string name="accept" msgid="5447154347815825107">"אישור"</string>
- <string name="decline" msgid="6490507610282145874">"דחה"</string>
- <string name="select_character" msgid="3352797107930786979">"הוסף תו"</string>
+ <string name="decline" msgid="6490507610282145874">"דחייה"</string>
+ <string name="select_character" msgid="3352797107930786979">"הוספת תו"</string>
<string name="sms_control_title" msgid="4748684259903148341">"מתבצעת שליחה של הודעות SMS"</string>
<string name="sms_control_message" msgid="6574313876316388239">"האפליקציה <b> <xliff:g id="APP_NAME">%1$s</xliff:g> </ b> שולחת מספר רב של הודעות SMS. האם לאפשר לאפליקציה הזו להמשיך לשלוח הודעות?"</string>
<string name="sms_control_yes" msgid="4858845109269524622">"כן, זה בסדר"</string>
<string name="sms_control_no" msgid="4845717880040355570">"עדיף שלא"</string>
<string name="sms_short_code_confirm_message" msgid="1385416688897538724">"אפליקציית <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> רוצה לשלוח הודעה אל <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string>
<string name="sms_short_code_details" msgid="2723725738333388351">"הדבר "<b>"עלול לגרום לחיובים"</b>" בחשבון המכשיר הנייד שלך."</string>
- <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"הדבר יגרום לחיובים בחשבון המכשיר הנייד שלך."</b></string>
+ <string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"הפעולה הזו תגרום לחיובים בחשבון המכשיר הנייד שלך."</b></string>
<string name="sms_short_code_confirm_allow" msgid="920477594325526691">"שלח"</string>
<string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"ביטול"</string>
- <string name="sms_short_code_remember_choice" msgid="1374526438647744862">"זכור את הבחירה שלי"</string>
+ <string name="sms_short_code_remember_choice" msgid="1374526438647744862">"תזכרו את הבחירה שלי"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"ניתן לשנות זאת מאוחר יותר ב\'הגדרות\' > \'אפליקציות\'"</string>
<string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"אפשר תמיד"</string>
- <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"לעולם אל תאפשר"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"לא לאפשר אף פעם"</string>
<string name="sim_removed_title" msgid="5387212933992546283">"כרטיס ה-SIM הוסר"</string>
<string name="sim_removed_message" msgid="9051174064474904617">"הרשת הסלולרית לא תהיה זמינה עד שתבוצע הפעלה מחדש לאחר הכנסת כרטיס SIM חוקי."</string>
<string name="sim_done_button" msgid="6464250841528410598">"סיום"</string>
<string name="sim_added_title" msgid="7930779986759414595">"כרטיס ה-SIM נוסף"</string>
- <string name="sim_added_message" msgid="6602906609509958680">"הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית."</string>
+ <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">"הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"</string>
+ <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"צריך להוריד את אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"</string>
<string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"ניתן להוריד את האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> כדי להפעיל את כרטיס ה-SIM החדש"</string>
<string name="install_carrier_app_notification_button" msgid="6257740533102594290">"להורדת האפליקציה"</string>
<string name="carrier_app_notification_title" msgid="5815477368072060250">"ה-SIM החדש הוכנס"</string>
@@ -1403,22 +1402,22 @@
<string name="perms_new_perm_prefix" msgid="6984556020395757087"><font size="12" fgcolor="#ff33b5e5">"חדש: "</font></string>
<string name="perms_description_app" msgid="2747752389870161996">"מאת <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="5729199278862516390">"לא נדרשות הרשאות"</string>
- <string name="perm_costs_money" msgid="749054595022779685">"פעולה זו עשויה לחייב אותך בכסף:"</string>
+ <string name="perm_costs_money" msgid="749054595022779685">"הפעולה הזו עשויה לגרום לחיוב כספי"</string>
<string name="dlg_ok" msgid="5103447663504839312">"אישור"</string>
- <string name="usb_charging_notification_title" msgid="1674124518282666955">"טעינת המכשיר הזה באמצעות USB"</string>
+ <string name="usb_charging_notification_title" msgid="1674124518282666955">"המכשיר בטעינה דרך USB"</string>
<string name="usb_supplying_notification_title" msgid="5378546632408101811">"טעינת המכשיר המחובר באמצעות USB"</string>
<string name="usb_mtp_notification_title" msgid="1065989144124499810">"האפשרות להעברת קבצים ב-USB מופעלת"</string>
<string name="usb_ptp_notification_title" msgid="5043437571863443281">"PTP באמצעות USB מופעל"</string>
<string name="usb_tether_notification_title" msgid="8828527870612663771">"שיתוף אינטרנט בין מכשירים באמצעות USB מופעל"</string>
<string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI באמצעות USB מופעל"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"אביזר USB מחובר"</string>
- <string name="usb_notification_message" msgid="4715163067192110676">"הקש לקבלת אפשרויות נוספות."</string>
+ <string name="usb_notification_message" msgid="4715163067192110676">"יש להקיש להצגת אפשרויות נוספות."</string>
<string name="usb_power_notification_message" msgid="7284765627437897702">"טעינת המכשיר המחובר. יש להקיש לאפשרויות נוספות."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"המכשיר זיהה התקן אודיו אנלוגי"</string>
- <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ההתקן שחיברת לא תואם לטלפון הזה. הקש למידע נוסף."</string>
+ <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ההתקן שחיברת לא תואם לטלפון הזה. יש להקיש לקבלת מידע נוסף."</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"ניפוי באגים של USB מחובר"</string>
<string name="adb_active_notification_message" msgid="5617264033476778211">"יש להקיש כדי לכבות את ניפוי הבאגים ב-USB"</string>
- <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"בחר להשבית ניפוי באגים ב-USB."</string>
+ <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"יש ללחוץ על ההתראה כדי להשבית ניפוי באגים ב-USB."</string>
<string name="adbwifi_active_notification_title" msgid="6147343659168302473">"ניפוי הבאגים האלחוטי מחובר"</string>
<string name="adbwifi_active_notification_message" msgid="930987922852867972">"יש להקיש כדי להשבית ניפוי באגים אלחוטי"</string>
<string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"יש לבחור כדי להשבית ניפוי באגים אלחוטי."</string>
@@ -1434,19 +1433,19 @@
<string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"האם לשתף דוח על באג?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"שיתוף דוח על באג…"</string>
<string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר הזה. ייתכן שאפליקציות ונתונים ישותפו."</string>
- <string name="share_remote_bugreport_action" msgid="7630880678785123682">"שתף"</string>
+ <string name="share_remote_bugreport_action" msgid="7630880678785123682">"שיתוף"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"עדיף שלא"</string>
<string name="select_input_method" msgid="3971267998568587025">"בחר שיטת הזנה"</string>
<string name="show_ime" msgid="6406112007347443383">"להשאיר במסך בזמן שהמקלדת הפיזית פעילה"</string>
<string name="hardware" msgid="1800597768237606953">"הצגת מקלדת וירטואלית"</string>
<string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"הגדרת מקלדת פיזית"</string>
- <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"הקש כדי לבחור שפה ופריסה"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"יש להקיש כדי לבחור שפה ופריסה"</string>
<string name="fast_scroll_alphabet" msgid="8854435958703888376">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="2529539945421557329">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"הצגה מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"תצוגה של <xliff:g id="NAME">%s</xliff:g> מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_title" msgid="6331662751095228536">"<xliff:g id="NAME">%s</xliff:g> מוצגת מעל אפליקציות אחרות"</string>
- <string name="alert_windows_notification_message" msgid="6538171456970725333">"אם אינך רוצה ש-<xliff:g id="NAME">%s</xliff:g> תשתמש בתכונה הזו, הקש כדי לפתוח את ההגדרות ולכבות אותה."</string>
+ <string name="alert_windows_notification_message" msgid="6538171456970725333">"אם אינך רוצה שהאפליקציה <xliff:g id="NAME">%s</xliff:g> תשתמש בתכונה הזו, אפשר להקיש כדי לפתוח את ההגדרות ולהשבית אותה."</string>
<string name="alert_windows_notification_turn_off_action" msgid="7805857234839123780">"כיבוי"</string>
<string name="ext_media_checking_notification_title" msgid="8299199995416510094">"בתהליך בדיקה של <xliff:g id="NAME">%s</xliff:g>…"</string>
<string name="ext_media_checking_notification_message" msgid="2231566971425375542">"מתבצעת בדיקה של התוכן הנוכחי"</string>
@@ -1460,8 +1459,8 @@
<string name="ext_media_ready_notification_message" product="tv" msgid="8847134811163165935">"עיון בקובצי המדיה"</string>
<string name="ext_media_unmountable_notification_title" msgid="4895444667278979910">"בעיה עם <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_title" product="automotive" msgid="3142723758949023280">"המדיה <xliff:g id="NAME">%s</xliff:g> לא פועלת"</string>
- <string name="ext_media_unmountable_notification_message" msgid="3256290114063126205">"יש להקיש כדי לתקן את הבעיה"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3003611129979934633">"<xliff:g id="NAME">%s</xliff:g> פגום. בחר כדי לטפל בבעיה."</string>
+ <string name="ext_media_unmountable_notification_message" msgid="3256290114063126205">"יש להקיש כדי לפתור את הבעיה"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3003611129979934633">"<xliff:g id="NAME">%s</xliff:g> פגום. יש ללחוץ כדי לפתור את הבעיה."</string>
<string name="ext_media_unmountable_notification_message" product="automotive" msgid="2274596120715020680">"ייתכן שיהיה צורך לפרמט מחדש את המכשיר. יש להקיש כדי להוציא את המדיה."</string>
<string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g> לא נתמך"</string>
<string name="ext_media_unsupported_notification_title" product="automotive" msgid="6004193172658722381">"המדיה <xliff:g id="NAME">%s</xliff:g> לא פועלת"</string>
@@ -1480,7 +1479,7 @@
<string name="ext_media_seamless_action" msgid="8837030226009268080">"החלפת פלט"</string>
<string name="ext_media_missing_title" msgid="3209472091220515046">"חסר: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4408988706227922909">"יש להכניס שוב את ההתקן"</string>
- <string name="ext_media_move_specific_title" msgid="8492118544775964250">"מעביר את <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_specific_title" msgid="8492118544775964250">"מתבצעת העברה של <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="2682741525619033637">"מתבצעת העברה של נתונים"</string>
<string name="ext_media_move_success_title" msgid="4901763082647316767">"העברת התוכן הסתיימה"</string>
<string name="ext_media_move_success_message" msgid="9159542002276982979">"התוכן הועבר אל <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1488,35 +1487,35 @@
<string name="ext_media_move_failure_message" msgid="4197306718121869335">"יש לנסות שוב להעביר את התוכן"</string>
<string name="ext_media_status_removed" msgid="241223931135751691">"הוסר"</string>
<string name="ext_media_status_unmounted" msgid="8145812017295835941">"בוצעה הוצאה"</string>
- <string name="ext_media_status_checking" msgid="159013362442090347">"בודק…"</string>
+ <string name="ext_media_status_checking" msgid="159013362442090347">"בבדיקה…"</string>
<string name="ext_media_status_mounted" msgid="3459448555811203459">"מוכן"</string>
<string name="ext_media_status_mounted_ro" msgid="1974809199760086956">"לקריאה בלבד"</string>
<string name="ext_media_status_bad_removal" msgid="508448566481406245">"הוסר בצורה לא בטוחה"</string>
<string name="ext_media_status_unmountable" msgid="7043574843541087748">"פגום"</string>
<string name="ext_media_status_unsupported" msgid="5460509911660539317">"לא נתמך"</string>
<string name="ext_media_status_ejecting" msgid="7532403368044013797">"מתבצעת הוצאה…"</string>
- <string name="ext_media_status_formatting" msgid="774148701503179906">"מפרמט…"</string>
+ <string name="ext_media_status_formatting" msgid="774148701503179906">"מתבצע פרמוט…"</string>
<string name="ext_media_status_missing" msgid="6520746443048867314">"לא הוכנס"</string>
<string name="activity_list_empty" msgid="4219430010716034252">"לא נמצאו פעילויות תואמות."</string>
<string name="permlab_route_media_output" msgid="8048124531439513118">"ניתוב פלט מדיה"</string>
- <string name="permdesc_route_media_output" msgid="1759683269387729675">"מאפשר לאפליקציה לנתב פלט מדיה למכשירים חיצוניים אחרים."</string>
- <string name="permlab_readInstallSessions" msgid="7279049337895583621">"קריאת פעילות התקנה"</string>
+ <string name="permdesc_route_media_output" msgid="1759683269387729675">"מאפשרת לאפליקציה לנתב פלט מדיה למכשירים חיצוניים אחרים."</string>
+ <string name="permlab_readInstallSessions" msgid="7279049337895583621">"קריאת סשנים של התקנה"</string>
<string name="permdesc_readInstallSessions" msgid="4012608316610763473">"מאפשרת לאפליקציה לקרוא פעילויות התקנה. ההרשאה הזו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות."</string>
<string name="permlab_requestInstallPackages" msgid="7600020863445351154">"בקשה להתקנת חבילות"</string>
- <string name="permdesc_requestInstallPackages" msgid="3969369278325313067">"מתיר לאפליקציה לבקש התקנה של חבילות."</string>
+ <string name="permdesc_requestInstallPackages" msgid="3969369278325313067">"מאפשרת לאפליקציה לבקש התקנה של חבילות."</string>
<string name="permlab_requestDeletePackages" msgid="2541172829260106795">"בקשה למחוק חבילות"</string>
- <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"מתיר לאפליקציה לבקש מחיקה של חבילות."</string>
+ <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"מאפשרת לאפליקציה לבקש מחיקה של חבילות."</string>
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"בקשה להתעלם מאופטימיזציות של הסוללה"</string>
<string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"מאפשרת לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו."</string>
- <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"הקש פעמיים לבקרת מרחק מתצוגה"</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"יש להקיש פעמיים לשינוי המרחק מהתצוגה"</string>
<string name="gadget_host_error_inflating" msgid="2449961590495198720">"לא ניתן להוסיף widget."</string>
- <string name="ime_action_go" msgid="5536744546326495436">"התחל"</string>
+ <string name="ime_action_go" msgid="5536744546326495436">"התחלה"</string>
<string name="ime_action_search" msgid="4501435960587287668">"חיפוש"</string>
<string name="ime_action_send" msgid="8456843745664334138">"שליחה"</string>
<string name="ime_action_next" msgid="4169702997635728543">"הבא"</string>
<string name="ime_action_done" msgid="6299921014822891569">"סיום"</string>
<string name="ime_action_previous" msgid="6548799326860401611">"הקודם"</string>
- <string name="ime_action_default" msgid="8265027027659800121">"בצע"</string>
+ <string name="ime_action_default" msgid="8265027027659800121">"ביצוע"</string>
<string name="dial_number_using" msgid="6060769078933953531">"חיוג למספר\nבאמצעות <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="6200708808003692594">"צור איש קשר\nבאמצעות <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"האפליקציות הבאות מבקשות אישור לגשת לחשבון שלך, עכשיו ובעתיד."</string>
@@ -1526,8 +1525,8 @@
<string name="deny" msgid="6632259981847676572">"עדיף שלא"</string>
<string name="permission_request_notification_title" msgid="1810025922441048273">"בקשת הרשאה"</string>
<string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"נדרשת הרשאה\nלחשבון <xliff:g id="ACCOUNT">%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>
@@ -1539,7 +1538,7 @@
<string name="notification_ranker_binding_label" msgid="432708245635563763">"שירות של דירוג התראות"</string>
<string name="vpn_title" msgid="5906991595291514182">"VPN מופעל"</string>
<string name="vpn_title_long" msgid="6834144390504619998">"VPN מופעל על ידי <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="vpn_text" msgid="2275388920267251078">"הקש כדי לנהל את הרשת."</string>
+ <string name="vpn_text" msgid="2275388920267251078">"יש להקיש כדי לנהל את הרשת."</string>
<string name="vpn_text_long" msgid="278540576806169831">"בוצע חיבור אל <xliff:g id="SESSION">%s</xliff:g>. יש להקיש כדי לנהל את הרשת."</string>
<string name="vpn_lockdown_connecting" msgid="6096725311950342607">"ה-VPN שמופעל תמיד, מתחבר..."</string>
<string name="vpn_lockdown_connected" msgid="2853127976590658469">"ה-VPN שפועל תמיד, מחובר"</string>
@@ -1549,7 +1548,7 @@
<string name="upload_file" msgid="8651942222301634271">"בחירת קובץ"</string>
<string name="no_file_chosen" msgid="4146295695162318057">"לא נבחר קובץ"</string>
<string name="reset" msgid="3865826612628171429">"איפוס"</string>
- <string name="submit" msgid="862795280643405865">"שלח"</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="back_button_label" msgid="4078224038025043387">"הקודם"</string>
@@ -1565,8 +1564,8 @@
</plurals>
<string name="action_mode_done" msgid="2536182504764803222">"סיום"</string>
<string name="progress_erasing" msgid="6891435992721028004">"בתהליך מחיקה של אחסון משותף…"</string>
- <string name="share" msgid="4157615043345227321">"שתף"</string>
- <string name="find" msgid="5015737188624767706">"מצא"</string>
+ <string name="share" msgid="4157615043345227321">"שיתוף"</string>
+ <string name="find" msgid="5015737188624767706">"חיפוש"</string>
<string name="websearch" msgid="5624340204512793290">"חיפוש באינטרנט"</string>
<string name="find_next" msgid="5341217051549648153">"מציאת ההתאמה הבאה"</string>
<string name="find_previous" msgid="4405898398141275532">"חיפוש של הקודם"</string>
@@ -1577,14 +1576,14 @@
<string name="gpsVerifNo" msgid="1671201856091564741">"לא"</string>
<string name="sync_too_many_deletes" msgid="6999440774578705300">"חרגת ממגבלת המחיקה"</string>
<string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"יש <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> פריטים שנמחקו עבור <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> , בחשבון <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. איזו פעולה ברצונך לבצע?"</string>
- <string name="sync_really_delete" msgid="5657871730315579051">"מחק את הפריטים"</string>
- <string name="sync_undo_deletes" msgid="5786033331266418896">"בטל את פעולות המחיקה"</string>
+ <string name="sync_really_delete" msgid="5657871730315579051">"מחיקת הפריטים"</string>
+ <string name="sync_undo_deletes" msgid="5786033331266418896">"ביטול פעולות המחיקה"</string>
<string name="sync_do_nothing" msgid="4528734662446469646">"לא לבצע שום פעולה כרגע"</string>
<string name="choose_account_label" msgid="5557833752759831548">"בחירת חשבון"</string>
<string name="add_account_label" msgid="4067610644298737417">"הוספת חשבון"</string>
<string name="add_account_button_label" msgid="322390749416414097">"הוספת חשבון"</string>
<string name="number_picker_increment_button" msgid="7621013714795186298">"הוסף"</string>
- <string name="number_picker_decrement_button" msgid="5116948444762708204">"הפחת"</string>
+ <string name="number_picker_decrement_button" msgid="5116948444762708204">"הפחתה"</string>
<string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> לחיצה ארוכה."</string>
<string name="number_picker_increment_scroll_action" msgid="8310191318914268271">"צריך להסיט למעלה כדי להוסיף ולמטה כדי להפחית."</string>
<string name="time_picker_increment_minute_button" msgid="7195870222945784300">"הוספת דקה"</string>
@@ -1593,10 +1592,10 @@
<string name="time_picker_decrement_hour_button" msgid="584101766855054412">"הפחתת שעה"</string>
<string name="time_picker_increment_set_pm_button" msgid="5889149366900376419">"הגדרת PM"</string>
<string name="time_picker_decrement_set_am_button" msgid="1422608001541064087">"הגדרת AM"</string>
- <string name="date_picker_increment_month_button" msgid="3447263316096060309">"הוסף חודש"</string>
+ <string name="date_picker_increment_month_button" msgid="3447263316096060309">"הוספת חודש"</string>
<string name="date_picker_decrement_month_button" msgid="6531888937036883014">"הפחתת חודש"</string>
- <string name="date_picker_increment_day_button" msgid="4349336637188534259">"הוסף יום"</string>
- <string name="date_picker_decrement_day_button" msgid="6840253837656637248">"הפחת יום"</string>
+ <string name="date_picker_increment_day_button" msgid="4349336637188534259">"הוספת יום"</string>
+ <string name="date_picker_decrement_day_button" msgid="6840253837656637248">"הפחתת יום"</string>
<string name="date_picker_increment_year_button" msgid="7608128783435372594">"הוסף שנה"</string>
<string name="date_picker_decrement_year_button" msgid="4102586521754172684">"הפחת שנה"</string>
<string name="date_picker_prev_month_button" msgid="3418694374017868369">"החודש הקודם"</string>
@@ -1608,13 +1607,13 @@
<string name="keyboardview_keycode_mode_change" msgid="2743735349997999020">"שינוי מצב"</string>
<string name="keyboardview_keycode_shift" msgid="3026509237043975573">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="168054869339091055">"Enter"</string>
- <string name="activitychooserview_choose_application" msgid="3500574466367891463">"בחר אפליקציה"</string>
+ <string name="activitychooserview_choose_application" msgid="3500574466367891463">"צריך לבחור אפליקציה"</string>
<string name="activitychooserview_choose_application_error" msgid="6937782107559241734">"לא ניתן היה להפעיל את <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
- <string name="shareactionprovider_share_with" msgid="2753089758467748982">"שתף עם"</string>
+ <string name="shareactionprovider_share_with" msgid="2753089758467748982">"שיתוף עם"</string>
<string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"שיתוף עם <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="982510275422590757">"נקודת אחיזה להחלקה. לחיצה ארוכה."</string>
- <string name="description_target_unlock_tablet" msgid="7431571180065859551">"החלק לביטול נעילה."</string>
- <string name="action_bar_home_description" msgid="1501655419158631974">"נווט לדף הבית"</string>
+ <string name="description_target_unlock_tablet" msgid="7431571180065859551">"יש להחליק לביטול הנעילה."</string>
+ <string name="action_bar_home_description" msgid="1501655419158631974">"ניווט לדף הבית"</string>
<string name="action_bar_up_description" msgid="6611579697195026932">"ניווט למעלה"</string>
<string name="action_menu_overflow_description" msgid="4579536843510088170">"אפשרויות נוספות"</string>
<string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s, %2$s"</string>
@@ -1627,7 +1626,7 @@
<string name="storage_usb" msgid="2391213347883616886">"אחסון USB"</string>
<string name="extract_edit_menu_button" msgid="63954536535863040">"עריכה"</string>
<string name="data_usage_warning_title" msgid="9034893717078325845">"אזהרה לגבי שימוש בנתונים"</string>
- <string name="data_usage_warning_body" msgid="1669325367188029454">"השתמשת ב-<xliff:g id="APP">%s</xliff:g> נתונים"</string>
+ <string name="data_usage_warning_body" msgid="1669325367188029454">"השתמשת ב-<xliff:g id="APP">%s</xliff:g> של נתונים"</string>
<string name="data_usage_mobile_limit_title" msgid="3911447354393775241">"הגעת למגבלה של חבילת הגלישה"</string>
<string name="data_usage_wifi_limit_title" msgid="2069698056520812232">"הגעת למגבלת נתוני Wi-Fi"</string>
<string name="data_usage_limit_body" msgid="3567699582000085710">"הנתונים הושהו להמשך המחזור"</string>
@@ -1635,12 +1634,12 @@
<string name="data_usage_wifi_limit_snoozed_title" msgid="1622359254521960508">"חריגה ממגבלת נתוני ה-Wi-Fi"</string>
<string name="data_usage_limit_snoozed_body" msgid="545146591766765678">"חרגת ב-<xliff:g id="SIZE">%s</xliff:g> מעבר למגבלה המוגדרת"</string>
<string name="data_usage_restricted_title" msgid="126711424380051268">"נתוני הרקע מוגבלים"</string>
- <string name="data_usage_restricted_body" msgid="5338694433686077733">"הקש כדי להסיר את ההגבלה."</string>
+ <string name="data_usage_restricted_body" msgid="5338694433686077733">"יש להקיש כדי להסיר את ההגבלה."</string>
<string name="data_usage_rapid_title" msgid="2950192123248740375">"שימוש מוגבר בחבילת הגלישה"</string>
<string name="data_usage_rapid_body" msgid="3886676853263693432">"האפליקציות שלך השתמשו בנתונים רבים יותר מהרגיל"</string>
<string name="data_usage_rapid_app_body" msgid="5425779218506513861">"האפליקציה <xliff:g id="APP">%s</xliff:g> השתמשה בנתונים רבים יותר מהרגיל"</string>
<string name="ssl_certificate" msgid="5690020361307261997">"אישור אבטחה"</string>
- <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"אישור זה תקף."</string>
+ <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"האישור הזה תקף."</string>
<string name="issued_to" msgid="5975877665505297662">"הוקצה ל:"</string>
<string name="common_name" msgid="1486334593631798443">"שם משותף:"</string>
<string name="org_name" msgid="7526331696464255245">"ארגון:"</string>
@@ -1653,12 +1652,12 @@
<string name="fingerprints" msgid="148690767172613723">"טביעות אצבע:"</string>
<string name="sha256_fingerprint" msgid="7103976380961964600">"טביעת אצבע SHA-256:"</string>
<string name="sha1_fingerprint" msgid="2339915142825390774">"טביעת אצבע SHA-1:"</string>
- <string name="activity_chooser_view_see_all" msgid="3917045206812726099">"הצג הכל"</string>
+ <string name="activity_chooser_view_see_all" msgid="3917045206812726099">"הצגת כל הפעילויות"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="8880731437191978314">"בחירת פעילות"</string>
- <string name="share_action_provider_share_with" msgid="1904096863622941880">"שתף עם"</string>
- <string name="sending" msgid="206925243621664438">"שולח…"</string>
+ <string name="share_action_provider_share_with" msgid="1904096863622941880">"שיתוף עם"</string>
+ <string name="sending" msgid="206925243621664438">"מתבצעת שליחה…"</string>
<string name="launchBrowserDefault" msgid="6328349989932924119">"להפעיל את הדפדפן?"</string>
- <string name="SetupCallDefault" msgid="5581740063237175247">"האם לקבל את השיחה?"</string>
+ <string name="SetupCallDefault" msgid="5581740063237175247">"לקבל את השיחה?"</string>
<string name="activity_resolver_use_always" msgid="5575222334666843269">"תמיד"</string>
<string name="activity_resolver_use_once" msgid="948462794469672658">"רק פעם אחת"</string>
<string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s אינו תומך בפרופיל עבודה"</string>
@@ -1677,8 +1676,8 @@
<string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"העברת מסך אל מכשיר"</string>
<string name="media_route_chooser_searching" msgid="6119673534251329535">"המערכת מחפשת מכשירים…"</string>
<string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"הגדרות"</string>
- <string name="media_route_controller_disconnect" msgid="7362617572732576959">"נתק"</string>
- <string name="media_route_status_scanning" msgid="8045156315309594482">"סורק..."</string>
+ <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ניתוק"</string>
+ <string name="media_route_status_scanning" msgid="8045156315309594482">"מתבצעת סריקה..."</string>
<string name="media_route_status_connecting" msgid="5845597961412010540">"מתבצע חיבור..."</string>
<string name="media_route_status_available" msgid="1477537663492007608">"זמין"</string>
<string name="media_route_status_not_available" msgid="480912417977515261">"לא זמין"</string>
@@ -1691,46 +1690,46 @@
<string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"שכחת את קו ביטול הנעילה?"</string>
<string name="kg_wrong_pattern" msgid="1342812634464179931">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"סיסמה שגויה"</string>
- <string name="kg_wrong_pin" msgid="3680925703673166482">"קוד גישה שגוי"</string>
+ <string name="kg_wrong_pin" msgid="3680925703673166482">"קוד אימות שגוי"</string>
<plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
<item quantity="two">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
<item quantity="many">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
<item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
<item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
</plurals>
- <string name="kg_pattern_instructions" msgid="8366024510502517748">"שרטט את קו ביטול הנעילה"</string>
- <string name="kg_sim_pin_instructions" msgid="6479401489471690359">"הזן קוד גישה ל-SIM"</string>
- <string name="kg_pin_instructions" msgid="7355933174673539021">"הזן קוד גישה"</string>
- <string name="kg_password_instructions" msgid="7179782578809398050">"הזן את הסיסמה"</string>
+ <string name="kg_pattern_instructions" msgid="8366024510502517748">"צריך לשרטט את קו ביטול הנעילה"</string>
+ <string name="kg_sim_pin_instructions" msgid="6479401489471690359">"יש להזין את קוד האימות של ה-SIM"</string>
+ <string name="kg_pin_instructions" msgid="7355933174673539021">"יש להזין קוד אימות"</string>
+ <string name="kg_password_instructions" msgid="7179782578809398050">"יש להזין את הסיסמה"</string>
<string name="kg_puk_enter_puk_hint" msgid="6696187482616360994">"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."</string>
- <string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"הזן את קוד הגישה הרצוי"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="6372557107414074580">"אשר את קוד הגישה הרצוי"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"צריך להזין את קוד האימות הרצוי"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="6372557107414074580">"יש לאשר את קוד האימות הרצוי"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8871937892678885545">"מתבצע ביטול נעילה של כרטיס SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="9013856346870572451">"קוד גישה שגוי."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="4821601451222564077">"הקלד קוד גישה שאורכו 4 עד 8 ספרות."</string>
+ <string name="kg_password_wrong_pin_code" msgid="9013856346870572451">"קוד אימות שגוי."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="4821601451222564077">"יש להקליד קוד אימות שאורכו 4 עד 8 ספרות."</string>
<string name="kg_invalid_sim_puk_hint" msgid="2539364558870734339">"קוד PUK צריך להיות בן 8 ספרות."</string>
<string name="kg_invalid_puk" msgid="4809502818518963344">"יש להזין שוב את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"קודי הגישה אינם תואמים"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"קודי האימות לא תואמים"</string>
<string name="kg_login_too_many_attempts" msgid="699292728290654121">"ניסיונות רבים מדי לשרטוט קו ביטול נעילה."</string>
<string name="kg_login_instructions" msgid="3619844310339066827">"כדי לבטל את הנעילה, עליך להיכנס באמצעות חשבון Google שלך."</string>
<string name="kg_login_username_hint" msgid="1765453775467133251">"שם משתמש (אימייל)"</string>
<string name="kg_login_password_hint" msgid="3330530727273164402">"סיסמה"</string>
<string name="kg_login_submit_button" msgid="893611277617096870">"כניסה"</string>
<string name="kg_login_invalid_input" msgid="8292367491901220210">"שם משתמש או סיסמה לא חוקיים."</string>
- <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת "<b>"google.com/accounts/recovery"</b></string>
+ <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"שכחת את שם המשתמש או הסיסמה?\nאפשר להיכנס לכתובת "<b>"google.com/accounts/recovery"</b></string>
<string name="kg_login_checking_password" msgid="4676010303243317253">"מתבצעת בדיקה של החשבון…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"הקלדת קוד גישה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="7357404233979139075">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"הקלדת קוד אימות שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nאפשר לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nאפשר לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="7357404233979139075">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"ביצעת <xliff:g id="NUMBER_0">%1$d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"ביצעת <xliff:g id="NUMBER_0">%1$d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטאבלט. הטאבלט יעבור כעת איפוס לברירת המחדל של היצרן."</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV <xliff:g id="NUMBER">%d</xliff:g> פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן."</string>
- <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור עכשיו איפוס לברירת המחדל של היצרן."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\nנסה שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\n אפשר לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"הסרה"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"האם להעלות את עוצמת הקול מעל לרמה המומלצת?\n\nהאזנה בעוצמת קול גבוהה למשכי זמן ממושכים עלולה לפגוע בשמיעה."</string>
@@ -1757,10 +1756,10 @@
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"יש להקיש על תכונה כדי להתחיל להשתמש בה:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"בחירת תכונה לשימוש עם לחצן הנגישות"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"בחירת תכונות לשימוש עם מקש הקיצור לעוצמת הקול"</string>
- <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> כובה"</string>
+ <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"שירות <xliff:g id="SERVICE_NAME">%s</xliff:g> כבוי"</string>
<string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"עריכת קיצורי הדרך"</string>
<string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"סיום"</string>
- <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"כבה את קיצור הדרך"</string>
+ <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"השבתת קיצור הדרך"</string>
<string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"שימוש בקיצור הדרך"</string>
<string name="color_inversion_feature_name" msgid="326050048927789012">"היפוך צבעים"</string>
<string name="color_correction_feature_name" msgid="3655077237805422597">"תיקון צבעים"</string>
@@ -1780,7 +1779,7 @@
<string name="user_logging_out_message" msgid="7216437629179710359">"מתבצע ניתוק של <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="owner_name" msgid="8713560351570795743">"בעלים"</string>
<string name="error_message_title" msgid="4082495589294631966">"שגיאה"</string>
- <string name="error_message_change_not_allowed" msgid="843159705042381454">"מנהל המערכת שלך אינו מתיר שינוי זה"</string>
+ <string name="error_message_change_not_allowed" msgid="843159705042381454">"מנהל המערכת שלך לא מאפשר את השינוי הזה"</string>
<string name="app_not_found" msgid="3429506115332341800">"לא נמצאה אפליקציה שתומכת בפעולה הזו"</string>
<string name="revoke" msgid="5526857743819590458">"ביטול"</string>
<string name="mediasize_iso_a0" msgid="7039061159929977973">"ISO A0"</string>
@@ -1873,12 +1872,12 @@
<string name="print_service_installed_title" msgid="6134880817336942482">"שירות <xliff:g id="NAME">%s</xliff:g> מותקן"</string>
<string name="print_service_installed_message" msgid="7005672469916968131">"יש להקיש כדי להפעיל את השירות"</string>
<string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"יש להזין את קוד האימות של מנהל המכשיר"</string>
- <string name="restr_pin_enter_pin" msgid="373139384161304555">"הזן קוד גישה"</string>
+ <string name="restr_pin_enter_pin" msgid="373139384161304555">"יש להזין קוד אימות"</string>
<string name="restr_pin_incorrect" msgid="3861383632940852496">"שגוי"</string>
- <string name="restr_pin_enter_old_pin" msgid="7537079094090650967">"קוד גישה נוכחי"</string>
+ <string name="restr_pin_enter_old_pin" msgid="7537079094090650967">"קוד אימות נוכחי"</string>
<string name="restr_pin_enter_new_pin" msgid="3267614461844565431">"קוד אימות חדש"</string>
- <string name="restr_pin_confirm_pin" msgid="7143161971614944989">"אשר את קוד הגישה החדש"</string>
- <string name="restr_pin_create_pin" msgid="917067613896366033">"צור קוד גישה לשינוי הגבלות"</string>
+ <string name="restr_pin_confirm_pin" msgid="7143161971614944989">"אישור קוד האימות החדש"</string>
+ <string name="restr_pin_create_pin" msgid="917067613896366033">"יש ליצור קוד אימות לשינוי הגבלות"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"קודי האימות לא תואמים. יש לנסות שוב."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
@@ -1894,22 +1893,22 @@
<string name="done_label" msgid="7283767013231718521">"סיום"</string>
<string name="hour_picker_description" msgid="5153757582093524635">"מחוון שעות מעגלי"</string>
<string name="minute_picker_description" msgid="9029797023621927294">"מחוון דקות מעגלי"</string>
- <string name="select_hours" msgid="5982889657313147347">"בחר שעות"</string>
+ <string name="select_hours" msgid="5982889657313147347">"בחירת שעות"</string>
<string name="select_minutes" msgid="9157401137441014032">"בחירת דקות"</string>
- <string name="select_day" msgid="2060371240117403147">"בחר חודש ויום"</string>
+ <string name="select_day" msgid="2060371240117403147">"בחירת חודש ויום"</string>
<string name="select_year" msgid="1868350712095595393">"בחירת שנה"</string>
<string name="deleted_key" msgid="9130083334943364001">"<xliff:g id="KEY">%1$s</xliff:g> נמחק"</string>
<string name="managed_profile_label_badge" msgid="6762559569999499495">"עבודה <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5673187309555352550">"<xliff:g id="LABEL">%1$s</xliff:g> שני בעבודה"</string>
<string name="managed_profile_label_badge_3" msgid="6882151970556391957">"<xliff:g id="LABEL">%1$s</xliff:g> שלישי בעבודה"</string>
- <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"בקש קוד גישה לפני ביטול הצמדה"</string>
+ <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"יש לבקש קוד אימות לפני ביטול הצמדה"</string>
<string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"צריך לבקש קו ביטול נעילה לפני ביטול הצמדה"</string>
- <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"בקש סיסמה לפני ביטול הצמדה"</string>
+ <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"יש לבקש סיסמה לפני ביטול הצמדה"</string>
<string name="package_installed_device_owner" msgid="7035926868974878525">"הותקנה על ידי מנהל המערכת"</string>
<string name="package_updated_device_owner" msgid="7560272363805506941">"עודכנה על ידי מנהל המערכת"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"נמחקה על ידי מנהל המערכת"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"אישור"</string>
- <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google\n\n"<annotation id="url">"למידע נוסף"</annotation></string>
+ <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google\n\n"<annotation id="url">"למידע נוסף"</annotation></string>
<string name="battery_saver_description" msgid="6794188153647295212">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• משביתה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google"</string>
<string name="data_saver_description" msgid="4995164271550590517">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"להפעיל את חוסך הנתונים?"</string>
@@ -1966,18 +1965,18 @@
<string name="zen_mode_until" msgid="2250286190237669079">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ההתראה הבאה)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"עד הכיבוי"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"עד שתכבה את \'נא לא להפריע\'"</string>
+ <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"עד להשבתת התכונה \'נא לא להפריע\'"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
- <string name="toolbar_collapse_description" msgid="8009920446193610996">"כווץ"</string>
+ <string name="toolbar_collapse_description" msgid="8009920446193610996">"כיווץ"</string>
<string name="zen_mode_feature_name" msgid="3785547207263754500">"נא לא להפריע"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"זמן השבתה"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ערב ביום חול"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"סוף השבוע"</string>
<string name="zen_mode_default_events_name" msgid="2280682960128512257">"אירוע"</string>
<string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"שינה"</string>
- <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> משתיק חלק מהצלילים"</string>
+ <string name="muted_by" msgid="91464083490094950">"חלק מהצלילים מושתקים על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"קיימת בעיה פנימית במכשיר שלך, וייתכן שהוא לא יתפקד כראוי עד שיבוצע איפוס לנתוני היצרן."</string>
- <string name="system_error_manufacturer" msgid="703545241070116315">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, צור קשר עם היצרן."</string>
+ <string name="system_error_manufacturer" msgid="703545241070116315">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, יש ליצור קשר עם היצרן."</string>
<string name="stk_cc_ussd_to_dial" msgid="3139884150741157610">"בקשת USSD שונתה לשיחה רגילה"</string>
<string name="stk_cc_ussd_to_ss" msgid="4826846653052609738">"בקשת USSD שונתה לבקשת SS"</string>
<string name="stk_cc_ussd_to_ussd" msgid="8343001461299302472">"היה שינוי לבקשת USSD חדשה"</string>
@@ -1990,8 +1989,8 @@
<string name="notification_work_profile_content_description" msgid="5296477955677725799">"פרופיל עבודה"</string>
<string name="notification_alerted_content_description" msgid="6139691253611265992">"נשלחה התראה"</string>
<string name="notification_verified_content_description" msgid="6401483602782359391">"מאומת"</string>
- <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"הרחב"</string>
- <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"כווץ"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"הרחבה"</string>
+ <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"כיווץ"</string>
<string name="expand_action_accessibility" msgid="1947657036871746627">"החלפת מצב הרחבה"</string>
<string name="usb_midi_peripheral_name" msgid="490523464968655741">"יציאת USB בציוד היקפי של Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7557148557088787741">"Android"</string>
@@ -2018,16 +2017,16 @@
<string name="importance_from_person" msgid="4235804979664465383">"ההודעה חשובה בשל האנשים המעורבים."</string>
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"התראות אפליקציה בהתאמה אישית"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"האם לאפשר לאפליקציה <xliff:g id="APP">%1$s</xliff:g> ליצור משתמש חדש באמצעות <xliff:g id="ACCOUNT">%2$s</xliff:g> (כבר קיים משתמש לחשבון הזה)?"</string>
- <string name="user_creation_adding" msgid="7305185499667958364">"האם לאפשר לאפליקציה <xliff:g id="APP">%1$s</xliff:g> ליצור משתמש חדש באמצעות <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
+ <string name="user_creation_adding" msgid="7305185499667958364">"לאפשר לאפליקציה <xliff:g id="APP">%1$s</xliff:g> ליצור משתמש חדש באמצעות <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
<string name="language_selection_title" msgid="52674936078683285">"הוספת שפה"</string>
<string name="country_selection_title" msgid="5221495687299014379">"העדפת אזור"</string>
- <string name="search_language_hint" msgid="7004225294308793583">"הקלד שם שפה"</string>
+ <string name="search_language_hint" msgid="7004225294308793583">"צריך להקליד את שם השפה"</string>
<string name="language_picker_section_suggested" msgid="6556199184638990447">"הצעות"</string>
<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_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="5503291976647976560">"להפעיל את פרופיל העבודה?"</string>
@@ -2036,7 +2035,7 @@
<string name="app_blocked_title" msgid="7353262160455028160">"האפליקציה לא זמינה"</string>
<string name="app_blocked_message" msgid="542972921087873023">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא זמינה בשלב זה."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח."</string>
- <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"האם יש עדכון חדש?"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"יש עדכון חדש?"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"יש לך הודעות חדשות"</string>
<string name="new_sms_notification_content" msgid="3197949934153460639">"יש לפתוח את אפליקציית ה-SMS כדי להציג"</string>
<string name="profile_encrypted_title" msgid="9001208667521266472">"ייתכן שחלק מהפונקציונליות תהיה מוגבלת"</string>
@@ -2046,12 +2045,12 @@
<string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"הקש כדי להציג קבצים"</string>
<string name="pin_target" msgid="8036028973110156895">"הצמדה"</string>
<string name="pin_specific_target" msgid="7824671240625957415">"הצמדה של <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="unpin_target" msgid="3963318576590204447">"בטל הצמדה"</string>
+ <string name="unpin_target" msgid="3963318576590204447">"ביטול הצמדה"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"ביטול ההצמדה של <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"פרטי אפליקציה"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="demo_starting_message" msgid="6577581216125805905">"מתחיל בהדגמה…"</string>
- <string name="demo_restarting_message" msgid="1160053183701746766">"מאפס את המכשיר…"</string>
+ <string name="demo_starting_message" msgid="6577581216125805905">"תהליך ההדגמה מתחיל…"</string>
+ <string name="demo_restarting_message" msgid="1160053183701746766">"מתבצע איפוס של המכשיר…"</string>
<string name="suspended_widget_accessibility" msgid="6331451091851326101">"<xliff:g id="LABEL">%1$s</xliff:g> הושבת"</string>
<string name="conference_call" msgid="5731633152336490471">"שיחת ועידה"</string>
<string name="tooltip_popup_title" msgid="7863719020269945722">"הסבר קצר"</string>
@@ -2071,7 +2070,7 @@
<string name="time_picker_header_text" msgid="9073802285051516688">"הגדרת שעה"</string>
<string name="time_picker_input_error" msgid="8386271930742451034">"יש להזין שעה חוקית"</string>
<string name="time_picker_prompt_label" msgid="303588544656363889">"מהי השעה הנכונה"</string>
- <string name="time_picker_text_input_mode_description" msgid="4761160667516611576">"העבר למצב קלט טקסט לצורך הזנת השעה"</string>
+ <string name="time_picker_text_input_mode_description" msgid="4761160667516611576">"מעבר לשיטת קלט טקסט כדי להזין את השעה"</string>
<string name="time_picker_radial_mode_description" msgid="1222342577115016953">"מעבר למצב שעון לצורך הזנת השעה"</string>
<string name="autofill_picker_accessibility_title" msgid="4425806874792196599">"אפשרויות מילוי אוטומטי"</string>
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"שמירה לצורך מילוי אוטומטי"</string>
@@ -2083,12 +2082,12 @@
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> הצעות של מילוי אוטומטי</item>
<item quantity="one">הצעה אחת של מילוי אוטומטי</item>
</plurals>
- <string name="autofill_save_title" msgid="7719802414283739775">"לשמור ב-"<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_save_title" msgid="7719802414283739775">"לשמור בשירות "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"האם לשמור את <xliff:g id="TYPE">%1$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"האם לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g> ואת <xliff:g id="TYPE_1">%2$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
- <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"האם לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ו-<xliff:g id="TYPE_2">%3$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title" msgid="3630695947047069136">"האם לעדכן ב-"<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title_with_type" msgid="5264152633488495704">"האם לעדכן את <xliff:g id="TYPE">%1$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ואת <xliff:g id="TYPE_2">%3$s</xliff:g> בשירות "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title" msgid="3630695947047069136">"לעדכן בשירות "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title_with_type" msgid="5264152633488495704">"לעדכן <xliff:g id="TYPE">%1$s</xliff:g> בשירות "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_update_title_with_2types" msgid="1797514386321086273">"האם לעדכן את <xliff:g id="TYPE_0">%1$s</xliff:g> ואת <xliff:g id="TYPE_1">%2$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
<string name="autofill_update_title_with_3types" msgid="1312232153076212291">"האם לעדכן פריטים אלה ב-"<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ו-<xliff:g id="TYPE_2">%3$s</xliff:g> ?"</string>
<string name="autofill_save_yes" msgid="8035743017382012850">"שמירה"</string>
@@ -2107,7 +2106,7 @@
<string name="autofill_save_type_email_address" msgid="1303262336895591924">"כתובת אימייל"</string>
<string name="etws_primary_default_message_earthquake" msgid="8401079517718280669">"חשוב להישאר רגועים ולחפש מחסה בקרבת מקום."</string>
<string name="etws_primary_default_message_tsunami" msgid="5828171463387976279">"יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר."</string>
- <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="4888224011071875068">"הישאר רגוע וחפש מחסה בקרבת מקום."</string>
+ <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="4888224011071875068">"חשוב להישאר רגועים ולחפש מחסה בקרבת מקום."</string>
<string name="etws_primary_default_message_test" msgid="4583367373909549421">"בדיקה של הודעות חירום"</string>
<string name="notification_reply_button_accessibility" msgid="5235776156579456126">"תשובה"</string>
<string name="etws_primary_default_message_others" msgid="7958161706019130739"></string>
@@ -2118,10 +2117,10 @@
<string name="mmcc_authentication_reject_msim_template" msgid="4480853038909922153">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
<string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="3688508325248599657">"אין ניהול תצורה עבור SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="mmcc_illegal_ms_msim_template" msgid="832644375774599327">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
- <string name="mmcc_illegal_me_msim_template" msgid="4802735138861422802">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="4802735138861422802">"SIM <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="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_restore_unknown_issue" msgid="2478146134395982154">"לא ניתן היה לשחזר את קיצור הדרך"</string>
@@ -2133,7 +2132,7 @@
<string name="screenshot_edit" msgid="7408934887203689207">"עריכה"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"שיחות והודעות ירטטו"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"שיחות והתראות יושתקו"</string>
- <string name="notification_channel_system_changes" msgid="2462010596920209678">"שינויי מערכת"</string>
+ <string name="notification_channel_system_changes" msgid="2462010596920209678">"שינויים במערכת"</string>
<string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"נא לא להפריע"</string>
<string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"חדש: מצב \'נא לא להפריע\' מסתיר התראות"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"אפשר להקיש כדי לקבל מידע נוסף ולבצע שינויים."</string>
@@ -2148,12 +2147,12 @@
<string name="notification_feedback_indicator_alerted" msgid="6552871804121942099">"ההתראה הזו שודרגה ל\'ברירת מחדל\'. יש להקיש כדי לשלוח משוב."</string>
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ההתראה הזו הורדה בדרגה ל\'שקטה\'. יש להקיש כדי לשלוח משוב."</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"דירוג ההתראה הזו הוגבה. יש להקיש כדי לשלוח משוב."</string>
- <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"דירוג ההתראה הזו הונמך. יש להקיש כדי לשלוח משוב."</string>
+ <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ההתראה הזו דורגה נמוך יותר. יש להקיש כדי לשלוח משוב."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"התראת מידע לגבי מצב שגרתי"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
<string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"חיסכון בסוללה"</string>
- <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"\'חיסכון בסוללה\' כבוי"</string>
+ <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"מצב \'חיסכון בסוללה\' כבוי"</string>
<string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"הטלפון טעון מספיק. התכונות כבר לא מוגבלות."</string>
<string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"הטאבלט טעון מספיק. התכונות כבר לא מוגבלות."</string>
<string name="battery_saver_charged_notification_summary" product="device" msgid="1031562417867646649">"המכשיר טעון מספיק. התכונות כבר לא מוגבלות."</string>
@@ -2178,10 +2177,10 @@
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth יישאר מופעל במהלך מצב טיסה"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"בטעינה"</string>
<plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + קובץ אחד (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
+ <item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
+ <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
+ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
+ <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> ועוד קובץ אחד (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
</plurals>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"אין אנשים שניתן לשתף איתם"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"רשימת האפליקציות"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"עבודה"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"תצוגה אישית"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"תצוגת עבודה"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"נחסם על ידי מנהל ה-IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"אי אפשר לשתף את התוכן הזה עם אפליקציות לעבודה"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"אי אפשר לפתוח את התוכן הזה באמצעות אפליקציות לעבודה"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"אי אפשר לשתף את התוכן הזה עם אפליקציות לשימוש אישי"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"אי אפשר לפתוח את התוכן הזה באמצעות אפליקציות לשימוש אישי"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"פרופיל העבודה מושהה"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"יש להקיש כדי להפעיל"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"אין אפליקציות לעבודה"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"אין אפליקציות לשימוש אישי"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"לפתוח באפליקציה <xliff:g id="APP">%s</xliff:g> בפרופיל האישי?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"לפתוח באפליקציה <xliff:g id="APP">%s</xliff:g> בפרופיל העבודה?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"בדפדפן האישי"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"בדפדפן של העבודה"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"קוד אימות לביטול הנעילה של רשת SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"קוד אימות לביטול הנעילה של תת-קבוצה ברשת SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"קוד אימות לביטול הנעילה של כרטיס SIM עסקי"</string>
@@ -2291,12 +2278,12 @@
<string name="PERSOSUBSTATE_SIM_NETWORK_ERROR" msgid="1924844017037151535">"לא ניתן היה לבטל את הנעילה של רשת SIM."</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR" msgid="3372797822292089708">"לא ניתן היה לבטל את הנעילה של תת-קבוצה ברשת SIM."</string>
<string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR" msgid="1878443146720411381">"נכשלה הבקשה לביטול הנעילה של ספק שירות SIM."</string>
- <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"נכשלה הבקשה לביטול הנעילה של כרטיס SIM עסקי."</string>
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR" msgid="7664778312218023192">"לא ניתן היה לבטל את הנעילה של כרטיס SIM עסקי."</string>
<string name="PERSOSUBSTATE_SIM_SIM_ERROR" msgid="2472944311643350302">"נכשלה הבקשה לביטול נעילת SIM."</string>
<string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR" msgid="828089694480999120">"נכשלה הבקשה לביטול הנעילה של RUIM network1."</string>
- <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"נכשלה הבקשה לביטול הנעילה של RUIM network2."</string>
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR" msgid="17619001007092511">"לא ניתן היה לבטל את הנעילה של RUIM network2."</string>
<string name="PERSOSUBSTATE_RUIM_HRPD_ERROR" msgid="807214229604353614">"נכשלה הבקשה לביטול נעילה של RUIM hrpd."</string>
- <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"נכשלה הבקשה לביטול הנעילה של כרטיס RUIM עסקי."</string>
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR" msgid="8644184447744175747">"לא ניתן היה לבטל את הנעילה של כרטיס RUIM עסקי."</string>
<string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR" msgid="3801002648649640407">"לא ניתן היה לבטל את הנעילה של ספק שירות RUIM."</string>
<string name="PERSOSUBSTATE_RUIM_RUIM_ERROR" msgid="707397021218680753">"לא ניתן היה לבטל את הנעילה של כרטיס RUIM."</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR" msgid="894358680773257820">"נכשל ביטול נעילה של PUK."</string>
@@ -2309,7 +2296,7 @@
<string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR" msgid="817542684437829139">"לא ניתן היה לבטל את הנעילה של PUK."</string>
<string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR" msgid="5178635064113393143">"לא ניתן היה לבטל את הנעילה של PUK."</string>
<string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR" msgid="5391587926974531008">"לא ניתן היה לבטל נעילה של PUK."</string>
- <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"נכשל ביטול נעילה של PUK."</string>
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR" msgid="4895494864493315868">"לא ניתן היה לבטל את הנעילה של PUK."</string>
<string name="PERSOSUBSTATE_SIM_SPN_ERROR" msgid="9017576601595353649">"לא ניתן היה לבטל את נעילת SPN."</string>
<string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR" msgid="1116993930995545742">"לא ניתן היה לבטל את הנעילה של PLMN לבית כשווה-ערך ל-SP."</string>
<string name="PERSOSUBSTATE_SIM_ICCID_ERROR" msgid="7559167306794441462">"נכשלה הבקשה לביטול נעילה של ICCID."</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"הגדרות חדשות להגדלה"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"עכשיו אפשר להגדיל חלק מהמסך"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"הפעלה בהגדרות"</string>
<string name="dismiss_action" msgid="1728820550388704784">"סגירה"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"כדי להמשיך, האפליקציה <b><xliff:g id="APP">%s</xliff:g></b> צריכה גישה למיקרופון של המכשיר שלך."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index aa98621..deaeaab 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"実行中のアプリ"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"電池を消費しているアプリ"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"拡大"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"ユーザー補助の使用"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」が電池を使用しています"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> 個のアプリが電池を使用しています"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"タップして電池やデータの使用量を確認"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"付近の Bluetooth デバイスの検出とペア設定をアプリに許可します"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ペア設定された Bluetooth デバイスへの接続"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ペア設定された Bluetooth デバイスへの接続をアプリに許可します"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"優先される NFC お支払いサービスの情報"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"登録されている支援やルートの目的地など、優先される NFC お支払いサービスの情報を取得することをアプリに許可します。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFCの管理"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN、パターン、パスワードが設定されていません"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"エラー認証"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"画面ロックの使用"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"続行するにはデバイスの認証情報を入力してください"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"指紋の一部しか検出できません"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"指紋を処理できませんでした。もう一度お試しください。"</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"センサーの汚れを取り除いてください"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"指を離すのが早すぎました"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"指の動きが遅すぎました。もう一度お試しください。"</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"別の指紋をお試しください"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"明るすぎます"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"調整してみてください"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"指紋認証を完了しました"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"顔を認証しました"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"顔を認証しました。[確認] を押してください"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"指紋認証ハードウェアは使用できません。"</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"指紋を設定できません"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"指紋の操作をキャンセルしました。"</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"指紋の操作がユーザーによりキャンセルされました。"</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"顔認証"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"顔の再登録"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"認識を改善するには、顔を再登録してください"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"顔認証の設定"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"スマートフォンに顔を向けるとロックが解除されます"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"その他のロック解除方法の設定"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"タップすると指紋が追加されます"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"顔を認識できませんでした。もう一度お試しください。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"明るすぎます。もっと暗い場所でお試しください。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"暗すぎます。もっと明るい場所でお試しください。"</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"顔認証の使用"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"顔認証または画面ロックの使用"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"続行するには顔認証を使用してください"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"続行するには、顔認証または画面ロックを使用してください"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"コピーしました"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> から <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> に貼り付けました"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"クリップボードから <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> に貼り付けました"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> がクリップボード内のテキストを貼り付けました"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> がクリップボード内の画像を貼り付けました"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> がクリップボード内のコンテンツを貼り付けました"</string>
<string name="more_item_label" msgid="7419249600215749115">"その他"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"MENU+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"仕事用"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人用ビュー"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"仕事用ビュー"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT 管理者によりブロックされました"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"このコンテンツを仕事用アプリと共有することはできません"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"このコンテンツを仕事用アプリで開くことはできません"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"このコンテンツを個人用アプリと共有することはできません"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"このコンテンツを個人用アプリで開くことはできません"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"仕事用プロファイルが一時停止しています"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"タップすると有効になります"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"仕事用アプリはありません"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"個人用アプリはありません"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"個人用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"仕事用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"個人用ブラウザを使用"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"仕事用ブラウザを使用"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM のネットワーク ロック解除 PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM のネットワーク サブネットのロック解除 PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM の企業ロック解除 PIN"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"新しい拡大機能の設定"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"画面の一部を拡大できるようになりました"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"[設定] で ON にする"</string>
<string name="dismiss_action" msgid="1728820550388704784">"閉じる"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"続行するには、<b><xliff:g id="APP">%s</xliff:g></b> にデバイスのマイクへのアクセスを許可する必要があります。"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 5d851e0..c767bcd 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"საშუალებას აძლევს აპს, აღმოაჩინოს ახლომახლო Bluetooth მოწყობილობები დასაწყვილებლად"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"დაწყვილებულ Bluetooth მოწყობილობებთან დაკავშირება"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"საშუალებას აძლევს აპს, დაუკავშირდეს დაწყვილებულ Bluetooth მოწყობილობებს"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"უპირატესი NFC გადახდის სერვისის ინფორმაცია"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"საშუალებას აძლევს აპს, მიიღოს უპირატესი NFC გადახდის სერვისის ინფორმაცია, მაგალითად, რეგისტრირებული დახმარება და დანიშნულება."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ახლო მოქმედების რადიოკავშირი (NFC) მართვა"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN-კოდი, ნიმუში ან პაროლი დაყენებული არ არის"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"შეცდომა ავთენტიკაციისას"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"გამოიყენეთ ეკრანის დაბლოკვა"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"გასაგრძელებლად შეიყვანეთ თქვენი მოწყობილობის ავტორიზაციის მონაცემი"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"თითის ანაბეჭდის დამუშავება ვერ მოხერხდა. გთხოვთ, ცადოთ ხელახლა."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"განბლოკვა სახით"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"დაარეგისტრირეთ თქვენი სახე ხელახლა"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"სახით განბლოკვის დაყენება"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"განბლოკეთ თქვენი ტელეფონი შეხედვით"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"დააყენეთ განბლოკვის სხვა ხერხები"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"შეეხეთ თითის ანაბეჭდის დასამატებლად"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"მეტისმეტად ნათელია. ცადეთ უფრო სუსტი განათება."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"მეტისმეტად ბნელია. ცადეთ უფრო ძლიერი განათება."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"სახე <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"გამოიყენეთ სახით განბლოკვა"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"გამოიყენეთ სახე ან ეკრანის დაბლოკვა"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"გასაგრძელებლად გამოიყენეთ სახით განბლოკვა"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"გასაგრძელებლად გამოიყენეთ თქვენი სახე ან ეკრანის განბლოკვის ნიმუში"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"დაკოპირდა"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-დან <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>-ში ჩასმული"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-მა ჩასვა გაცვლის ბუფერიდან"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-მ(ა) ჩასვა თქვენ მიერ დაკოპირებული ტექსტი"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-მ(ა) ჩასვა თქვენ მიერ დაკოპირებული სურათი"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>-მ(ა) ჩასვა თქვენ მიერ დაკოპირებული კონტენტი"</string>
<string name="more_item_label" msgid="7419249600215749115">"დამატებით"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"მენიუ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"სამსახური"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"პირადი ხედი"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"სამსახურის ხედი"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"დაბლოკილია თქვენი IT-ადმინისტრატორის მიერ"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ამ კონტენტის სამსახურის აპებისთვის გაზიარება შეუძლებელია"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ამ კონტენტის სამსახურის აპებით გახსნა შეუძლებელია"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ამ კონტენტის პირადი აპებისთვის გაზიარება შეუძლებელია"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ამ კონტენტის პირადი აპებით გახსნა შეუძლებელია"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"სამსახურის პროფილი დაპაუზებულია"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"შეეხეთ ჩასართავად"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"სამსახურის აპები არ არის"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"პირადი აპები არ არის"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"გაიხსნას <xliff:g id="APP">%s</xliff:g>-ის პირად პროფილში?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"გაიხსნას <xliff:g id="APP">%s</xliff:g>-ის სამსახურის პროფილში?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"პირადი ბრაუზერის გამოყენება"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"სამსახურის ბრაუზერის გამოყენება"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ქსელის განბლოკვის PIN-კოდი"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ქსელის ქვედანაყოფის განბლოკვის PIN-კოდი"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM-ის კორპორატიული განბლოკვის PIN-კოდი"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"გადიდების ახალი პარამეტრები"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ახლა უკვე შეგიძლიათ ეკრანის ნაწილის გადიდება"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ჩართვა პარამეტრებში"</string>
<string name="dismiss_action" msgid="1728820550388704784">"უარყოფა"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"გასაგრძელებლად <b><xliff:g id="APP">%s</xliff:g></b>-ს თქვენი მოწყობილობის მიკროფონზე წვდომა სჭირდება."</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 0f82f84..61d06d2 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Қолданбаға маңайдағы Bluetooth құрылғыларын анықтап, жұптауға рұқсат береді."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"жұпталған Bluetooth құрылғыларына қосылу"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Қолданбаға жұпталған Bluetooth құрылғыларына қосылуға рұқсат береді."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Таңдаулы NFC төлеу қызметі туралы ақпарат"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Қолданба тіркелген көмектер және баратын жер маршруты сияқты таңдаулы NFC төлеу қызметі туралы ақпаратты ала алатын болады."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC функциясын басқару"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Ешқандай PIN коды, өрнек немесе құпия сөз орнатылмаған."</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Аутентификациялауда қате шықты."</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Экран құлпын пайдалану"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Жалғастыру үшін құрылғының тіркелу деректерін енгізіңіз."</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Саусақ ізін өңдеу мүмкін емес. Әрекетті қайталаңыз."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Бетті қайта тіркеу"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз."</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Face Unlock функциясын реттеу"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефоныңызға қарап, оның құлпын ашыңыз."</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Құлыпты ашудың басқа тәсілдерін реттеу"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Саусақ ізін қосу үшін түртіңіз."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Бет деректері дұрыс алынбады. Әрекетті қайталаңыз."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Тым ашық. Күңгірттеу жарық керек."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Тым қараңғы. Молырақ жарық керек."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> беті"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Face Unlock функциясын пайдалану"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Face Lock функциясын немесе экран құлпын пайдалану"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Жалғастыру үшін Face Unlock функциясын пайдаланыңыз."</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Жалғастыру үшін бетті анықтау функциясын немесе экран құлпын пайдаланыңыз."</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Көшірілді"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> қолданбасынан <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> қолданбасына қойылды."</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Буферден <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> қолданбасына қойылды."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> сіз көшірген мәтінді қойды."</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> сіз көшірген суретті қойды."</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> сіз көшірген мазмұнды қойды."</string>
<string name="more_item_label" msgid="7419249600215749115">"Көбірек"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Mәзір+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Жұмыс"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көру"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жұмыс деректерін көру"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Әкімшіңіз тарабынан бөгелген"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бұл мазмұнды жұмыс қолданбаларымен бөлісу мүмкін емес."</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бұл мазмұнды жұмыс қолданбаларымен ашу мүмкін емес."</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бұл мазмұнды жеке қолданбалармен бөлісу мүмкін емес."</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Бұл мазмұнды жеке қолданбалармен ашу мүмкін емес."</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Жұмыс профилі кідіртілді."</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Қосу үшін түрту"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жұмыс қолданбалары жоқ."</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке қолданбалар жоқ."</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> қолданбасында жеке профильде ашу керек пе?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> қолданбасында жұмыс профилінде ашу керек пе?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке браузерді пайдалану"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жұмыс браузерін пайдалану"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM желісінің құлпын ашатын PIN коды"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM желісі ішкі жиынтығының құлпын ашатын PIN коды"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Корпоративтік SIM картасының құлпын ашатын PIN коды"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Жаңа ұлғайту параметрлері"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Енді экранның бір бөлігін ұлғайтуға болады."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Параметрлер бөлімінен қосу"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Қабылдамау"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Жалғастыру үшін <b><xliff:g id="APP">%s</xliff:g></b> қолданбасы құрылғыңыздың микрофонына рұқсат алу керек."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 8528118..2cdf658 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"អនុញ្ញាតឱ្យកម្មវិធីស្វែងរក និងផ្គូផ្គងឧបករណ៍ប៊្លូធូសដែលនៅជិត"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ភ្ជាប់ទៅឧបករណ៍ប៊្លូធូសដែលបានផ្គូផ្គង"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"អនុញ្ញាតឱ្យកម្មវិធីភ្ជាប់ទៅឧបករណ៍ប៊្លូធូសដែលបានផ្គូផ្គង"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ព័ត៌មានអំពីសេវាបង់ប្រាក់តាម NFC ជាអាទិភាព"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"អនុញ្ញាតឱ្យកម្មវិធីទទួលបានព័ត៌មានអំពីសេវាបង់ប្រាក់តាម nfc ជាអាទិភាពដូចជា គោលដៅផ្លូវ និងព័ត៌មានកំណត់អត្តសញ្ញាណកម្មវិធី ដែលបានចុះឈ្មោះជាដើម។"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ពិនិត្យការទាក់ទងនៅក្បែរ (NFC)"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"គ្មានការកំណត់កូដ pin លំនាំ ឬពាក្យសម្ងាត់ទេ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"មានបញ្ហាក្នុងការផ្ទៀងផ្ទាត់"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ប្រើការចាក់សោអេក្រង់"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"បញ្ចូលព័ត៌មានផ្ទៀងផ្ទាត់ឧបករណ៍របស់អ្នក ដើម្បីបន្ត"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"មិនអាចដំណើរការស្នាមម្រាមដៃបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ការដោះសោតាមទម្រង់មុខ"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ដើម្បីធ្វើឱ្យការសម្គាល់មុខប្រសើរជាងមុន សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"រៀបចំការដោះសោតាមទម្រង់មុខ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ដោះសោទូរសព្ទរបស់អ្នកដោយសម្លឹងមើលវា"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"រៀបចំវិធីច្រើនទៀតដើម្បីដោះសោ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ចុចដើម្បីបញ្ចូលស្នាមម្រាមដៃ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"មិនអាចថតទិន្នន័យទម្រង់មុខបានត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ភ្លឺពេក។ សូមសាកល្បងប្រើពន្លឺស្រាលជាងនេះ។"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ងងឹតជ្រុល។ សូមសាកល្បងប្រើពន្លឺភ្លឺជាងនេះ។"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ផ្ទៃមុខទី <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ប្រើការដោះសោតាមទម្រង់មុខ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ប្រើមុខ ឬការចាក់សោអេក្រង់"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ប្រើការដោះសោតាមទម្រង់មុខ ដើម្បីបន្ត"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ប្រើការចាក់សោអេក្រង់ ឬមុខរបស់អ្នក ដើម្បីបន្ត"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"បានចម្លង"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> បានដាក់ចូលពី <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> បានដាក់ចូលពីឃ្លីបបត"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> បានដាក់ចូលអត្ថបទដែលអ្នកបានចម្លង"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> បានដាក់ចូលរូបភាពដែលអ្នកបានចម្លង"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> បានដាក់ចូលខ្លឹមសារដែលអ្នកបានចម្លង"</string>
<string name="more_item_label" msgid="7419249600215749115">"ច្រើនទៀត"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ម៉ឺនុយ +"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ការងារ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ទិដ្ឋភាពផ្ទាល់ខ្លួន"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ទិដ្ឋភាពការងារ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"បានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ខ្លឹមសារនេះមិនអាចចែករំលែកតាមរយៈកម្មវិធីការងារបានទេ"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ខ្លឹមសារនេះមិនអាចបើកតាមរយៈកម្មវិធីការងារបានទេ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ខ្លឹមសារនេះមិនអាចចែករំលែកតាមរយៈកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ខ្លឹមសារនេះមិនអាចបើកតាមរយៈកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"កម្រងព័ត៌មានការងារត្រូវបានផ្អាក"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ចុចដើម្បីបើក"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"គ្មានកម្មវិធីការងារទេ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"គ្មានកម្មវិធីផ្ទាល់ខ្លួនទេ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"បើកនៅក្នុង <xliff:g id="APP">%s</xliff:g> ក្នុងកម្រងព័ត៌មានផ្ទាល់ខ្លួនឬ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"បើកនៅក្នុង <xliff:g id="APP">%s</xliff:g> ក្នុងកម្រងព័ត៌មានការងារឬ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ប្រើកម្មវិធីរុករកតាមអ៊ីនធឺណិតផ្ទាល់ខ្លួន"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ប្រើកម្មវិធីរុករកតាមអ៊ីនធឺណិតសម្រាប់ការងារ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"កូដ PIN ដោះសោបណ្ដាញស៊ីម"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"កូដ PIN ដោះសោសំណុំរងនៃបណ្ដាញស៊ីម"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"កូដ PIN ដោះសោក្រុមហ៊ុនស៊ីម"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ការកំណត់ការពង្រីកថ្មី"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ឥឡូវនេះ អ្នកអាចពង្រីកផ្នែកនៃអេក្រង់របស់អ្នកបានហើយ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"បើកនៅក្នុងការកំណត់"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ច្រានចោល"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ដើម្បីបន្ត <b><xliff:g id="APP">%s</xliff:g></b> ត្រូវការសិទ្ធិចូលប្រើមីក្រូហ្វូនរបស់ឧបករណ៍អ្នក។"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index f0ed6fa..9460a55 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಮತ್ತು ಅವುಗಳಿಗೆ ಜೋಡಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ಜೋಡಿಸಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ಜೋಡಿಸಲಾಗಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವಾ ಮಾಹಿತಿ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಅಪ್ಲಿಕೇಶನ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ಸಮೀಪ ಕ್ಷೇತ್ರ ಸಂವಹನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಸೆಟ್ ಮಾಡಿಲ್ಲ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ದೃಢೀಕರಿಸುವಾಗ ದೋಷ ಎದುರಾಗಿದೆ"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಬಳಸಿ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಸಾಧನದ ರುಜುವಾತನ್ನು ನಮೂದಿಸಿ"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ಫೇಸ್ ಅನ್ಲಾಕ್"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಸೆಟಪ್ ಮಾಡಿ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ಫೋನ್ ಅನ್ನು ನೋಡುವ ಮೂಲಕ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಹೆಚ್ಚಿನ ಮಾರ್ಗಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಸೇರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ ಮಂದ ಪ್ರಕಾಶಮಾನವಿರುವ ಲೈಟ್ ಬಳಸಿ"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ತುಂಬಾ ಕಪ್ಪು ಛಾಯೆಯಿದೆ. ಪ್ರಕಾಶಮಾನವಾದ ಲೈಟಿಂಗ್ ಬಳಸಿ."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ಮುಖದ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ಫೇಸ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ಮುಂದುವರಿಸಲು ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"ನಕಲಿಸಲಾಗಿದೆ"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ಅನ್ನು <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ನಿಂದ ಅಂಟಿಸಲಾಗಿದೆ"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ಅನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ನಿಂದ ಅಂಟಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"ನೀವು ನಕಲಿಸಿರುವ ಪಠ್ಯವನ್ನು <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ನಿಂದ ಅಂಟಿಸಲಾಗಿದೆ"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"ನೀವು ನಕಲಿಸಿರುವ ಚಿತ್ರವನ್ನು <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ನಿಂದ ಅಂಟಿಸಲಾಗಿದೆ"</string>
+ <string name="pasted_content" msgid="646276353060777131">"ನೀವು ನಕಲಿಸಿರುವ ವಿಷಯವನ್ನು <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ನಿಂದ ಅಂಟಿಸಲಾಗಿದೆ"</string>
<string name="more_item_label" msgid="7419249600215749115">"ಇನ್ನಷ್ಟು"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ಮೆನು+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ಕೆಲಸ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ವೈಯಕ್ತಿಕ ವೀಕ್ಷಣೆ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ಕೆಲಸದ ವೀಕ್ಷಣೆ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳ ಈ ವಿಷಯವನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳ ಈ ವಿಷಯವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳ ಮೂಲಕ ಈ ವಿಷಯವನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳ ಮೂಲಕ ಈ ವಿಷಯವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ಆನ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> ನ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ತೆರೆಯುವುದೇ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> ನ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ತೆರೆಯುವುದೇ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ವೈಯಕ್ತಿಕ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ಉದ್ಯೋಗ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ನೆಟ್ವರ್ಕ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ನ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM ಕಾರ್ಪೊರೇಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ಹೊಸ ಹಿಗ್ಗಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ನೀವು ಇದೀಗ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಭಾಗವನ್ನು ಹಿಗ್ಗಿಸಬಹುದು"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಆನ್ ಮಾಡಿ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ಮುಂದುವರಿಯಲು, <b><xliff:g id="APP">%s</xliff:g></b> ಗೆ ನಿಮ್ಮ ಸಾಧನದ ಮೈಕ್ರೋಫೋನ್ನ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ."</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index bbac5e8..765e0ab 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"앱이 근처의 블루투스 기기를 찾고 페어링하도록 허용"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"페어링된 블루투스 기기에 연결"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"앱이 페어링된 블루투스 기기에 연결하도록 허용"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"기본 NFC 결제 서비스 정보"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"앱이 등록된 AID와 경로 목적지 같은 기본 NFC 결제 서비스 정보를 확인하도록 허용합니다."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC(Near Field Communication) 제어"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN, 패턴, 비밀번호가 설정되지 않음"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"인증 오류"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"화면 잠금 사용"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"계속하려면 기기의 사용자 인증 정보를 입력하세요"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"얼굴인식 잠금해제"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"얼굴 재등록 필요"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"인식률을 개선하려면 얼굴을 다시 등록하세요."</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"얼굴인식 잠금해제 설정"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"휴대전화의 화면을 응시하여 잠금 해제할 수 있습니다."</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"다른 잠금 해제 방법 설정"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"지문을 추가하려면 탭하세요."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"너무 어둡습니다. 조명을 밝게 해 보세요."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"얼굴 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"얼굴인식 잠금해제 사용"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"얼굴 또는 화면 잠금 사용"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"얼굴인식 잠금해제를 사용하여 계속하세요"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"계속하려면 얼굴 또는 화면 잠금을 사용하세요"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"복사 완료"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> 앱이 <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> 앱에서 복사하여 붙여넣음"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> 앱이 클립보드에서 복사하여 붙여넣음"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>에서 복사한 텍스트를 붙여넣음"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>에서 복사한 이미지를 붙여넣음"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>에서 복사한 콘텐츠를 붙여넣음"</string>
<string name="more_item_label" msgid="7419249600215749115">"더보기"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"직장"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"개인 뷰"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"직장 뷰"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT 관리자에 의해 차단됨"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"이 콘텐츠는 직장 앱을 통해 공유할 수 없습니다."</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"이 콘텐츠는 직장 앱으로 열 수 없습니다."</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"이 콘텐츠는 개인 앱을 통해 공유할 수 없습니다."</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"이 콘텐츠는 개인 앱으로 열 수 없습니다."</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"직장 프로필이 일시중지됨"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"탭하여 사용"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"직장 앱 없음"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"개인 앱 없음"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"개인 프로필의 <xliff:g id="APP">%s</xliff:g>에서 여시겠습니까?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"직장 프로필의 <xliff:g id="APP">%s</xliff:g>에서 여시겠습니까?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"개인 브라우저 사용"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"직장 브라우저 사용"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 네트워크 잠금 해제 PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM 네트워크 하위 집합 잠금 해제 PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM 회사 잠금 해제 PIN"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"새 확대 설정"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"이제 화면 일부를 확대할 수 있습니다."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"설정에서 사용 설정"</string>
<string name="dismiss_action" msgid="1728820550388704784">"닫기"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"계속하려면 <b><xliff:g id="APP">%s</xliff:g></b>에서 기기 마이크에 액세스해야 합니다."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 89d2398..0d5f9be 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Колдонмого жакын жердеги Bluetooth түзмөктөрүн аныктап, жупташтырууга уруксат берет"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"жупташтырылган Bluetooth түзмөктөрү"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Колдонмого жупташтырылган Bluetooth түзмөктөрү менен байланышууга уруксат берет"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Тандалган NFC төлөм кызматы жөнүндө маалымат"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Колдонмого катталган жардам же көздөлгөн жерге маршрут сыяктуу тандалган nfc төлөм кызматы жөнүндө маалыматты алууга уруксат берүү."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication көзөмөлү"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN код, графикалык ачкыч же сырсөз коюлган жок"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Аутентификация катасы"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Экран кулпусун колдонуу"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Улантуу үчүн түзмөгүңүздүн эсептик дайындарын киргизиңиз"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Манжа изи иштелбей койду. Кайталап көрүңүз."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Жүзүнөн таануу"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Жүзүңүздү кайра таанытыңыз."</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Жүзүнөн таанып ачуу функциясын жөндөңүз"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефонуңузду карап туруп эле кулпусун ачып алыңыз"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Кулпусун ачуунун көбүрөөк жолдорун жөндөңүз"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Манжа изин кошуу үчүн басыңыз"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Жүзүңүз жакшы тартылган жок. Кайталап көрүңүз."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Өтө жарык. Жарыктыкты азайтып көрүңүз."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Өтө караңгы. Жарыгыраак жерден тартып көрүңүз."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Жүз <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Жүзүнөн таанып ачууну колдонуу"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Жүзүнөн таанып ачууну же экрандын кулпусун колдонуу"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Улантуу үчүн жүзүнөн таанып ачууну колдонуу"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Улантуу үчүн жүзүңүздү же экрандын кулпусун колдонуңуз"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Көчүрүлдү"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> колдонмосунан чапталды"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> алмашуу буферинен чапталды"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: көчүрүлгөн текст чапталды"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: көчүрүлгөн сүрөт чапталды"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: көчүрүлгөн мазмун чапталды"</string>
<string name="more_item_label" msgid="7419249600215749115">"Дагы"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Меню+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Жумуш"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көрүнүш"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жумуш көрүнүшү"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT администраторуңуз бөгөттөп койгон"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бул мазмунду жумуш колдонмолору менен бөлүшүү мүмкүн эмес"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бул мазмунду жумуш колдонмолору менен ачуу мүмкүн эмес"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бул мазмунду жеке колдонмолор менен бөлүшүү мүмкүн эмес"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Бул мазмунду жеке колдонмолор менен ачуу мүмкүн эмес"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Жумуш профили тындырылган"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Күйгүзүү үчүн таптап коюңуз"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке колдонмолор жок"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> колдонмосунда жеке профилде ачылсынбы?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> колдонмосунда жумуш профилинде ачылсынбы?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке серепчини колдонуу"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жумуш серепчисин колдонуу"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM карта тармагынын кулпусун ачуучу PIN код"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM кичи тармагынын кулпусун ачуучу PIN код"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM картанын корпоративдик кулпусун ачуучу PIN код"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Жаңы чоңойтуу жөндөөлөрү"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Эми экрандын бир бөлүгүн чоңойто аласыз"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Жөндөөлөрдөн күйгүзүү"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Жабуу"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Улантуу үчүн <b><xliff:g id="APP">%s</xliff:g></b> колдонмосуна түзмөгүңүздүн микрофонун пайдаланууга уруксат беришиңиз керек."</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 8baca08..13f4926 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ອະນຸຍາດໃຫ້ແອັບຄົ້ນພົບ ແລະ ຈັບຄູ່ອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງໄດ້"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth ທີ່ຈັບຄູ່ໄວ້"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ອະນຸຍາດໃຫ້ແອັບເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth ທີ່ຈັບຄູ່ແລ້ວໄດ້"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ຂໍ້ມູນບໍລິການການຈ່າຍເງິນ NFC ທີ່ຕ້ອງການ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ອະນຸຍາດໃຫ້ແອັບຮັບຂໍ້ມູນບໍລິການການຈ່າຍເງິນ NFC ທີ່ຕ້ອງການໄດ້ ເຊັ່ນ: ການຊ່ວຍເຫຼືອແບບລົງທະບຽນ ແລະ ປາຍທາງເສັ້ນທາງ."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ຄວບຄຸມ Near Field Communication"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ບໍ່ໄດ້ຕັ້ງ PIN, ຮູບແບບປົດລັອກ ຫຼື ລະຫັດຜ່ານ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ເກີດຄວາມຜິດພາດໃນການພິສູດຢືນຢັນ"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ໃຊ້ການລັອກໜ້າຈໍ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ລະບຸຂໍ້ມູນການເຂົ້າສູ່ລະບົບອຸປະກອນຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ບໍ່ສາມາດດຳເນີນການລາຍນີ້ວມືໄດ້. ກະລຸນາລອງໃໝ່ອີກ."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ປົດລັອກດ້ວຍໜ້າ"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່."</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ຕັ້ງຄ່າການປົດລັອກດ້ວຍໜ້າ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ປົດລັອກໂທລະສັບຂອງທ່ານໂດຍການເບິ່ງມັນ"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ຕັ້ງຄ່າວິທີເພີ່ມເຕີມເພື່ອປົດລັອກ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ແຕະເພື່ອເພີ່ມລາຍນິ້ວມື"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ແຈ້ງເກີນໄປ. ລອງຄ່ອຍແສງໄຟລົງ."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ມືດເກີນ. ກະລຸນາລອງໃຊ້ສະພາບແສງທີ່ແຈ້ງຂຶ້ນ."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ໃບໜ້າ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ໃຊ້ການປົດລັອກດ້ວຍໜ້າ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ໃຊ້ໃບໜ້າ ຫຼື ການລັອກໜ້າຈໍ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ໃຊ້ການປົດລັອກດ້ວຍໜ້າເພື່ອດຳເນີນການຕໍ່"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ໃຊ້ໃບໜ້າ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"ສຳເນົາແລ້ວ"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"ວາງ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ຈາກ <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ແລ້ວ"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ວາງ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ຈາກຄລິບບອດແລ້ວ"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ວາງຂໍ້ຄວາມທີ່ທ່ານສຳເນົາແລ້ວ"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ວາງຮູບທີ່ທ່ານສຳເນົາແລ້ວ"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ວາງເນື້ອຫາທີ່ທ່ານສຳເນົາແລ້ວ"</string>
<string name="more_item_label" msgid="7419249600215749115">"ເພີ່ມເຕີມ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ເມນູ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ວຽກ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ມຸມມອງສ່ວນຕົວ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ມຸມມອງວຽກ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ຖືກບລັອກໄວ້ໂດຍຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານ"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ເນື້ອຫານີ້ບໍ່ສາມາດຖືກແບ່ງປັນກັບແອັບບ່ອນເຮັດວຽກໄດ້"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ເນື້ອຫານີ້ບໍ່ສາມາດຖືກເປີດໄດ້ດ້ວຍແອັບບ່ອນເຮັດວຽກ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ເນື້ອຫານີ້ບໍ່ສາມາດຖືກແບ່ງປັນກັບແອັບສ່ວນຕົວໄດ້"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ເນື້ອຫານີ້ບໍ່ສາມາດຖືກເປີດໄດ້ດ້ວຍແອັບສ່ວນຕົວ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ຢຸດໂປຣໄຟລ໌ວຽກໄວ້ຊົ່ວຄາວແລ້ວ"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ແຕະເພື່ອເປີດໃຊ້"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ບໍ່ມີແອັບບ່ອນເຮັດວຽກ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ບໍ່ມີແອັບສ່ວນຕົວ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ເປີດໃນ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ສ່ວນຕົວບໍ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"ເປີດໃນ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກບໍ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບສ່ວນຕົວ"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບບ່ອນເຮັດວຽກ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ປົດລັອກເຄືອຂ່າຍຊິມ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN ການປົດລັອກຊຸດຍ່ອຍເຄືອຂ່າຍຊິມ"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN ປົດລັອກ SIM ອົງການ"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ການຕັ້ງຄ່າການຂະຫຍາຍໃໝ່"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ຕອນນີ້ທ່ານສາມາດຂະຫຍາຍບາງສ່ວນຂອງໜ້າຈໍໄດ້ແລ້ວ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ເປີດໃຊ້ໃນການຕັ້ງຄ່າ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ປິດໄວ້"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ເພື່ອດຳເນີນການຕໍ່, <b><xliff:g id="APP">%s</xliff:g></b> ຕ້ອງການສິດເຂົ້າເຖິງໄມໂຄຣໂຟນອຸປະກອນທ່ານ."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index aac2dc6..72e21f4 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -545,6 +545,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Leidžiama programai aptikti ir susieti „Bluetooth“ įrenginius netoliese"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"prisijungimas prie susietų „Bluetooth“ įrenginių"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Leidžiama programai prisijungti prie susietų „Bluetooth“ įrenginių"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Pageidaujama ARL mokėjimo paslaugos informacija"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Programai leidžiama gauti pageidaujamą ARL mokamos paslaugos informaciją, pvz., užregistruotą pagalbą ir maršrutų tikslus."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"valdyti artimo lauko perdavimą (angl. „Near Field Communication“)"</string>
@@ -579,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nenustatytas PIN kodas, atrakinimo piešinys arba slaptažodis"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Autentifikuojant įvyko klaida"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Naudoti ekrano užraktą"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Jei norite tęsti, įveskite įrenginio prisijungimo duomenis"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nepavyko apdoroti piršto antspaudo. Bandykite dar kartą."</string>
@@ -626,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Atrakinimas pagal veidą"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Pakartotinis veido registravimas"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Atrakinimo pagal veidą nustatymas"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Atrakinkite telefoną pažiūrėję į jį"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Per šviesu. Išbandykite mažesnį apšvietimą."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Per tamsu. Išbandykite šviesesnį apšvietimą."</string>
@@ -670,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> veidas"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Naudoti atrakinimą pagal veidą"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Naudoti atrakinimą pagal veidą arba ekrano užraktą"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Norėdami tęsti, naudokite atrakinimą pagal veidą"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jei norite tęsti, naudokite veido atpažinimo funkciją arba ekrano užraktą"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Nukopijuota"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"„<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>“ įklijuota iš „<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>“"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"„<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>“ įklijuota iš iškarpinės"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"„<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>“ įklijavo jūsų nukopijuotą tekstą"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"„<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>“ įklijavo jūsų nukopijuotą vaizdą"</string>
+ <string name="pasted_content" msgid="646276353060777131">"„<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>“ įklijavo jūsų nukopijuotą turinį"</string>
<string name="more_item_label" msgid="7419249600215749115">"Daugiau"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Meniu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"„Meta“ +"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Darbo"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Asmeninė peržiūra"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Darbo peržiūra"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Užblokavo jūsų IT administratorius"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Šio turinio negalima bendrinti su darbo programomis"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Šio turinio negalima atidaryti naudojant darbo programas"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Šio turinio negalima bendrinti su asmeninėmis programomis"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Šio turinio negalima atidaryti naudojant asmenines programas"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Darbo profilis pristabdytas"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Paliesti, norint įjungti"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nėra darbo programų"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nėra asmeninių programų"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Atidaryti programoje „<xliff:g id="APP">%s</xliff:g>“ asmeniniame profilyje?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Atidaryti programoje „<xliff:g id="APP">%s</xliff:g>“ darbo profilyje?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Naudoti asmeninę naršyklę"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Naudoti darbo naršyklę"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tinklo operatoriaus pasirinkimo ribojimo panaikinimo PIN kodas"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM tinklo poaibio operatoriaus pasirinkimo ribojimo panaikinimo PIN kodas"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM bendrojo operatoriaus pasirinkimo ribojimo panaikinimo PIN kodas"</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nauji didinimo nustatymai"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Dabar galite padidinti dalį ekrano"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Įjungti nustatymuose"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Atmesti"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Kad būtų galima tęsti, <b><xliff:g id="APP">%s</xliff:g></b> reikalinga prieiga prie įrenginio mikrofono."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index d4b2f7e8..a4f87b3 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Ļauj lietotnei atrast un savienot pārī tuvumā esošas Bluetooth ierīces."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"piekļūt pārī savienotām Bluetooth ierīcēm"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Ļauj lietotnei piekļūt pārī savienotām Bluetooth ierīcēm."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informācija par vēlamo NFC maksājumu pakalpojumu"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ļauj lietotnei iegūt informāciju par vēlamo NFC maksājumu pakalpojumu, piemēram, par reģistrētajiem lietojumprogrammu ID un maršruta galamērķi."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolē tuvlauka saziņu"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN, kombinācija vai parole nav iestatīta"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Autentifikācijas kļūda"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ekrāna bloķēšanas metodes izmantošana"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Lai turpinātu, ievadiet savas ierīces akreditācijas datus"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nevarēja apstrādāt pirksta nospiedumu. Lūdzu, mēģiniet vēlreiz."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Autorizācija pēc sejas"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Atkārtoti reģistrējiet seju"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Autorizācijas pēc sejas iestatīšana"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Atbloķējiet tālruni, skatoties uz to"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Citi atbloķēšanas veidi"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Pieskarieties, lai pievienotu pirksta nospiedumu"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Pārāk tumšs. Izmēģiniet spožāku apgaismojumu."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Seja <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Autorizācija pēc sejas"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Autorizācijas pēc sejas vai ekrāna bloķēšanas metodes izmantošana"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Lai turpinātu, izmantojiet autorizāciju pēc sejas"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Izmantojiet autorizāciju pēc sejas vai ekrāna bloķēšanas opciju, lai turpinātu"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Nokopēts"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Lietotnē <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> tika ielīmēti dati no lietotnes <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>."</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Lietotnē <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> tika ielīmēti dati no starpliktuves."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ielīmēja jūsu nokopēto tekstu"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ielīmēja jūsu nokopēto attēlu"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ielīmēja jūsu nokopēto saturu"</string>
<string name="more_item_label" msgid="7419249600215749115">"Vairāk"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Izvēlne+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta taustiņš +"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Darba profils"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personisks skats"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Darba skats"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloķējis jūsu IT administrators"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Šo saturu nevar kopīgot ar darba lietotnēm"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Šo saturu nevar atvērt darba lietotnēs"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Šo saturu nevar kopīgot ar personīgajām lietotnēm"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Šo saturu nevar atvērt personīgajās lietotnēs"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Darba profila darbība ir apturēta."</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Lai ieslēgtu, pieskarieties"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nav darba lietotņu"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nav personīgu lietotņu"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vai atvērt lietotnē <xliff:g id="APP">%s</xliff:g>, izmantojot personīgo profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vai atvērt lietotnē <xliff:g id="APP">%s</xliff:g>, izmantojot darba profilu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Izmantot personīgo pārlūku"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Izmantot darba pārlūku"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tīkla atbloķēšanas PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM tīkla apakškopas atbloķēšanas PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM Corporate atbloķēšanas PIN"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Jauni palielinājuma iestatījumi"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Tagad varat palielināt ekrāna daļu."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ieslēgt sadaļā Iestatījumi"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Nerādīt"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Lai turpinātu, lietotnei <b><xliff:g id="APP">%s</xliff:g></b> nepieciešama piekļuve jūsu ierīces mikrofonam."</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 99a888d..f86201f 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозволува апликацијата да открива и да се поврзува со спарени уреди со Bluetooth во близина"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"да се поврзува со спарени уреди со Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозволува апликацијата да се поврзува со спарени уреди со Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информации за претпочитаната услуга за плаќање преку NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволува апликацијата да добие информации за претпочитаната услуга за плаќање преку NFC, како регистрирани помагала и дестинација на маршрутата."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контролирај комуникација на блиско поле"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Не е поставен PIN, шема или лозинка"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Грешка при проверката"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користи заклучување екран"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Внесете го акредитивот на уредот за да продолжите"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатокот не може да се обработи. Обидете се повторно."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Отклучување со лик"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Повторно регистрирајте го ликот"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"За да се подобри препознавањето, повторно регистрирајте го ликот"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Поставете „Отклучување со лик“"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Отклучете го телефонот со гледање во него"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Поставете уште начини за отклучување"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Допрете за да додадете отпечаток"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Не се сними прецизна слика. Обидете се повторно."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Премногу светла. Пробајте со послабо осветлување."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Премногу темна. Пробајте со посилно осветлување."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Користи отклучување со лик"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користи лик или заклучување екран"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Користете отклучување со лик за да продолжите"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користете отклучување со лик или заклучување екран за да продолжите"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Копирано"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> залепи од <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> залепи од привремената меморија"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> го залепи текстот што го копиравте"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ја залепи сликата што ја копиравте"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ги залепи содржините што ги копиравте"</string>
<string name="more_item_label" msgid="7419249600215749115">"Повеќе"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Мени+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"копче Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Службени"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен приказ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Работен приказ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Блокирано од вашиот IT-администратор"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Овие содржини не може да се споделуваат со работни апликации"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Овие содржини не може да се отвораат со работни апликации"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Овие содржини не може да се споделуваат со лични апликации"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Овие содржини не може да се отвораат со лични апликации"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Работниот профил е паузиран"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Допрете за да вклучите"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема работни апликации"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема лични апликации"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Да се отвори во <xliff:g id="APP">%s</xliff:g> во личниот профил?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Да се отвори во <xliff:g id="APP">%s</xliff:g> во работниот профил?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи личен прелистувач"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи работен прелистувач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за отклучување на мрежата на SIM-картичката"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN за отклучување на подмножество на мрежата на SIM-картичката"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN за отклучување на корпоративната SIM-картичка"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Нови поставки за зголемување"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Сега може да зголемувате дел од екранот"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Вклучи во „Поставки“"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Отфрли"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"За да продолжи, на <b><xliff:g id="APP">%s</xliff:g></b> ѝ е потребен пристап до микрофонот на уредот."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 45a99f1..5f49f2c 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്താനും ജോടിയാക്കാനും ആപ്പിനെ അനുവദിക്കുന്നു"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ജോടിയായ Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യൂ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ജോടിയാക്കിയ Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"തിരഞ്ഞെടുത്ത NFC പേയ്മെന്റ് സേവനത്തെ സംബന്ധിച്ച വിവരങ്ങൾ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"റൂട്ട് ലക്ഷ്യസ്ഥാനം, രജിസ്റ്റർ ചെയ്തിരിക്കുന്ന സഹായങ്ങൾ എന്നിവ പോലുള്ള, തിരഞ്ഞെടുത്ത NFC പേയ്മെന്റ് സേവനത്തെ സംബന്ധിച്ച വിവരങ്ങൾ ലഭിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"സമീപ ഫീൽഡുമായുള്ള ആശയവിനിമയം നിയന്ത്രിക്കുക"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"പിന്നോ പാറ്റേണോ പാസ്വേഡോ സജ്ജീകരിച്ചിട്ടില്ല"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"പിശക് പരിശോധിച്ചുറപ്പിക്കുന്നു"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"തുടരാൻ നിങ്ങളുടെ ഉപകരണ ക്രെഡൻഷ്യലുകൾ നൽകുക"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ഫിംഗർപ്രിന്റ് പ്രോസസ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് സജ്ജീകരിക്കുക"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ഫോണിലേക്ക് നോക്കി അത് അൺലോക്ക് ചെയ്യുക"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"അൺലോക്ക് ചെയ്യുന്നതിനുള്ള കൂടുതൽ വഴികൾ സജ്ജീകരിക്കുക"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ഫിംഗർപ്രിന്റ് ചേർക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"വളരെ ഇരുണ്ടത്. തിളക്കമേറിയ ലൈറ്റിംഗ് പരീക്ഷിക്കുക."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"മുഖം <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഉപയോഗിക്കുക"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"മുഖം അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"തുടരാൻ മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഉപയോഗിക്കുക"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"തുടരാൻ നിങ്ങളുടെ മുഖം അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"പകർത്തി"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്ന് <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ഒട്ടിച്ചു"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ക്ലിപ്ബോർഡിൽ നിന്ന് <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ഒട്ടിച്ചു"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> നിങ്ങൾ പകർത്തിയ ടെക്സ്റ്റ് ഒട്ടിച്ചു"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> നിങ്ങൾ പകർത്തിയ ഒരു ചിത്രം ഒട്ടിച്ചു"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> നിങ്ങൾ പകർത്തിയ ഉള്ളടക്കം ഒട്ടിച്ചു"</string>
<string name="more_item_label" msgid="7419249600215749115">"കൂടുതൽ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"മെനു+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"മെറ്റ+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ഔദ്യോഗികം"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"വ്യക്തിപര കാഴ്ച"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ഔദ്യോഗിക കാഴ്ച"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"നിങ്ങളുടെ ഐടി അഡ്മിൻ ബ്ലോക്ക് ചെയ്തു"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ഔദ്യോഗിക ആപ്പുകൾ ഉപയോഗിച്ച് ഈ ഉള്ളടക്കം പങ്കിടാനാകില്ല"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ഔദ്യോഗിക ആപ്പുകൾ ഉപയോഗിച്ച് ഈ ഉള്ളടക്കം തുറക്കാനാകില്ല"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"വ്യക്തിപര ആപ്പുകൾ ഉപയോഗിച്ച് ഈ ഉള്ളടക്കം പങ്കിടാനാകില്ല"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"വ്യക്തിപര ആപ്പുകൾ ഉപയോഗിച്ച് ഈ ഉള്ളടക്കം തുറക്കാനാകില്ല"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ഔദ്യോഗിക പ്രൊഫൈൽ തൽക്കാലം നിർത്തിയിരിക്കുന്നു"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ഓണാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ഔദ്യോഗിക ആപ്പുകൾ ഇല്ല"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"വ്യക്തിപര ആപ്പുകൾ ഇല്ല"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"വ്യക്തിപരമായ പ്രൊഫൈലിൽ <xliff:g id="APP">%s</xliff:g> എന്നതിൽ തുറക്കണോ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"ഔദ്യോഗിക പ്രൊഫൈലിൽ <xliff:g id="APP">%s</xliff:g> എന്നതിൽ തുറക്കണോ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"വ്യക്തിപരമായ ബ്രൗസർ ഉപയോഗിക്കുക"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ഔദ്യോഗിക ബ്രൗസർ ഉപയോഗിക്കുക"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"സിം നെറ്റ്വർക്ക് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"സിം നെറ്റ്വർക്ക് സബ്സെറ്റ് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"സിം കോർപ്പറേറ്റ് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"പുതിയ മാഗ്നിഫിക്കേഷൻ ക്രമീകരണം"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"നിങ്ങളുടെ സ്ക്രീനിന്റെ ഒരു ഭാഗം ഇപ്പോൾ മാഗ്നിഫൈ ചെയ്യാനാകും"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ക്രമീകരണത്തിൽ ഓണാക്കുക"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ഡിസ്മിസ് ചെയ്യുക"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"തുടരാൻ, <b><xliff:g id="APP">%s</xliff:g></b> ആപ്പിന് നിങ്ങളുടെ ഉപകരണത്തിന്റെ മൈക്രോഫോണിലേക്ക് ആക്സസ് നൽകേണ്ടതുണ്ട്."</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index bc07890..692d16a 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Апп ажиллаж байна"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Апп батарей ашиглаж байна"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Томруулах"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Хандалтын ашиглалт"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> батерей ашиглаж байна"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> апп батерей ашиглаж байна"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Батерей, дата ашиглалтын талаар дэлгэрэнгүйг харахын тулд товшино уу"</string>
@@ -445,7 +444,7 @@
<string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"байршилд ард хандах"</string>
<string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"Энэ апп нь дурын үед, түүнийг ашиглаагүй байх үед ч байршилд хандах боломжтой."</string>
<string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"Аудио тохиргоо солих"</string>
- <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"Апп нь дууны хэмжээ, спикерын гаралтад ашиглагдах глобал аудио тохиргоог өөрчлөх боломжтой."</string>
+ <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"Апп нь дууны түвшин, спикерын гаралтад ашиглагдах глобал аудио тохиргоог өөрчлөх боломжтой."</string>
<string name="permlab_recordAudio" msgid="1208457423054219147">"аудио бичих"</string>
<string name="permdesc_recordAudio" msgid="5857246765327514062">"Энэ аппыг ашиглаж байх үед энэ нь микрофон ашиглан аудио бичих боломжтой."</string>
<string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"ард видео бичих"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aппыг ойролцоох Bluetooth төхөөрөмжүүдийг илрүүлж, хослуулахыг зөвшөөрдөг"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"хослуулсан Bluetooth төхөөрөмжүүдэд холбогдох"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Аппыг хослуулсан Bluetooth төхөөрөмжүүдэд холбогдохыг зөвшөөрдөг"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Сонгосон NFC төлбөрийн үйлчилгээний мэдээлэл"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Бүртгүүлсэн төхөөрөмж болон маршрутын хүрэх цэг зэрэг сонгосон nfc төлбөрийн үйлчилгээний мэдээллийг авахыг аппад зөвшөөрдөг."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ойролцоо талбарын холбоог удирдах"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Тохируулсан пин, хээ эсвэл нууц үг алга"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Баталгаажуулахад алдаа гарлаа"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Дэлгэцийн түгжээг ашиглах"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Үргэлжлүүлэхийн тулд төхөөрөмжийнхөө мандат үнэмлэхийг оруулна уу"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Хэсэгчилсэн хурууны хээ илэрлээ"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Хурууны хээ боловсруулж чадахгүй байна. Дахин оролдоно уу."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Мэдрэгчийг цэвэрлэнэ үү"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Хуруу хэт хурдан хөдөллөө"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Хуруу хэт удаан хөдөлгөсөн байна. Дахин оролдоно уу."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Өөр хурууны хээ туршина уу"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Хэт гэрэлтэй байна"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Тохируулж үзнэ үү"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Хурууны хээг нотолсон"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Царайг баталгаажууллаа"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Царайг баталгаажууллаа. Баталгаажуулах товчлуурыг дарна уу"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Хурууны хээний төхөөрөмж бэлэн бус байна."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Хурууны хээ тохируулах боломжгүй"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Хурууны хээний бүртгэл амжилтгүй боллоо."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Хэрэглэгч хурууны хээний баталгаажуулалтыг цуцалсан байна."</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Царайгаар тайлах"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Царайгаа дахин бүртгүүлнэ үү"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Царайгаар тайлах онцлогийг тохируулна уу"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Утас руугаа харж түгжээг нь тайлна уу"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Түгжээ тайлах илүү олон арга тохируулна уу"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Хурууны хээ нэмэхийн тулд товшино уу"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Хэт цайвар байна. Гэрэл багатай газар оролдоно уу."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Хэт харанхуй байна. Гэрэлтэй орчинд туршина уу."</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Царай <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Царайгаар тайлахыг ашиглах"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Царай эсвэл дэлгэцийн түгжээ ашиглах"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Үргэлжлүүлэхийн тулд царайгаар тайлахыг ашиглана уу"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Үргэлжлүүлэхийн тулд царай эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Хуулсан"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>-с буулгасан <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Түр санах ойгоос буулгасан <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> таны хуулсан текстийг буулгасан"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> таны хуулсан зургийг буулгасан"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> таны хуулсан контентыг буулгасан"</string>
<string name="more_item_label" msgid="7419249600215749115">"Илүү"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Цэс+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Мета+"</string>
@@ -1285,20 +1276,20 @@
<string name="dump_heap_system_text" msgid="6805155514925350849">"<xliff:g id="PROC">%1$s</xliff:g>-н боловсруулалт санах ойн багтаамжийнхаа хязгаар болох <xliff:g id="SIZE">%2$s</xliff:g>-с хэтэрсэн байна. Та санах ойн агшин зургийг (heap dump) хуваалцах боломжтой. Сануулга: энэ санах ойн агшин зураг таны бичсэн зүйл зэрэг тухайн боловсруулалтын хандах эрхтэй аливаа мэдрэг хувийн мэдээллийг агуулж болно."</string>
<string name="dump_heap_ready_text" msgid="5849618132123045516">"Та <xliff:g id="PROC">%1$s</xliff:g>-н боловсруулалтын санах ойн агшин зургийг хуваалцах боломжтой. Сануулга: энэ санах ойн агшин зураг таны бичсэн зүйл зэрэг тухайн боловсруулалтын хандах эрхтэй аливаа мэдрэг хувийн мэдээллийг агуулж болзошгүй."</string>
<string name="sendText" msgid="493003724401350724">"Текст илгээх үйлдлийг сонгох"</string>
- <string name="volume_ringtone" msgid="134784084629229029">"Хонхны аяны хэмжээ"</string>
+ <string name="volume_ringtone" msgid="134784084629229029">"Хонхны аяны түвшин"</string>
<string name="volume_music" msgid="7727274216734955095">"Медиа дууны түвшин"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Блютүүтээр тоглож байна"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Хонхны дууг чимээгүй болгов"</string>
- <string name="volume_call" msgid="7625321655265747433">"Ирсэн дуудлагын дууны хэмжээ"</string>
- <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth ирсэн дуудлагын дууны хэмжээ"</string>
+ <string name="volume_call" msgid="7625321655265747433">"Ирсэн дуудлагын дууны түвшин"</string>
+ <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth ирсэн дуудлагын дууны түвшин"</string>
<string name="volume_alarm" msgid="4486241060751798448">"Сэрүүлгийн дууны түвшин"</string>
- <string name="volume_notification" msgid="6864412249031660057">"Мэдэгдлийн дууны хэмжээ"</string>
- <string name="volume_unknown" msgid="4041914008166576293">"Дууны хэмжээ"</string>
+ <string name="volume_notification" msgid="6864412249031660057">"Мэдэгдлийн дууны түвшин"</string>
+ <string name="volume_unknown" msgid="4041914008166576293">"Дууны түвшин"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Блютүүтын хэмжээ"</string>
- <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Хонхны дууны хэмжээ"</string>
- <string name="volume_icon_description_incall" msgid="4491255105381227919">"Дуудлагын дууны хэмжээ"</string>
+ <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Хонхны дууны түвшин"</string>
+ <string name="volume_icon_description_incall" msgid="4491255105381227919">"Дуудлагын дууны түвшин"</string>
<string name="volume_icon_description_media" msgid="4997633254078171233">"Медиа дууны түвшин"</string>
- <string name="volume_icon_description_notification" msgid="579091344110747279">"Мэдэгдлийн дууны хэмжээ"</string>
+ <string name="volume_icon_description_notification" msgid="579091344110747279">"Мэдэгдлийн дууны түвшин"</string>
<string name="ringtone_default" msgid="9118299121288174597">"Үндсэн хонхны ая"</string>
<string name="ringtone_default_with_actual" msgid="2709686194556159773">"Үндсэн (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="397111123930141876">"Алийг нь ч биш"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Ажил"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Хувийн харагдах байдал"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ажлын харагдах байдал"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Таны IT админ блоклосон"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Энэ контентыг ажлын аппуудаар хуваалцах боломжгүй"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Энэ контентыг ажлын аппуудаар нээх боломжгүй"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Энэ контентыг хувийн аппуудаар хуваалцах боломжгүй"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Энэ контентыг хувийн аппуудаар нээх боломжгүй"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Ажлын профайлыг түр зогсоосон"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Асаахын тулд товших"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ямар ч ажлын апп байхгүй байна"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ямар ч хувийн апп байхгүй байна"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Хувийн профайлд <xliff:g id="APP">%s</xliff:g>-д нээх үү?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ажлын профайлд <xliff:g id="APP">%s</xliff:g>-д нээх үү?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Хувийн хөтөч ашиглах"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ажлын хөтөч ашиглах"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Сүлжээний SIM-н түгжээг тайлах ПИН"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Сүлжээний дэд олонлогийн SIM-н түгжээг тайлах ПИН"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Байгууллагын SIM-н түгжээг тайлах ПИН"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Томруулах онцлогийн шинэ тохиргоо"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Та одоо дэлгэцийнхээ хэсгийг томруулах боломжтой"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Тохиргоонд асаана уу"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Үл хэрэгсэх"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Үргэлжлүүлэхийн тулд, <b><xliff:g id="APP">%s</xliff:g></b> таны төхөөрөмжийн микрофонд хандах шаардлагатай."</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index b63d6a7..ac267a1 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ॲपला जवळपासची ब्लूटूथ डिव्हाइस शोधण्यासाठी आणि ती पेअर करण्यासाठी अनुमती देते"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"पेअर केलेल्या ब्लूटूथ डिव्हाइसशी कनेक्ट करा"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"पेअर केलेल्या ब्लूटूथ डिव्हाइसशी कनेक्ट करण्यासाठी ॲपला अनुमती द्या"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"प्राधान्यकृत NFC पेमेंट सेवा माहिती"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"नोंदणीकृत एड्स आणि मार्ग गंतव्यस्थान सारखी प्राधान्यकृत एनएफसी पेमेंट सेवेची माहिती मिळवण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"फील्ड जवळील कम्युनिकेशन नियंत्रित करा"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"कोणताही पिन, पॅटर्न किंवा पासवर्ड सेट केलेला नाही"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"एरर ऑथेंटिकेट करत आहे"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"स्क्रीन लॉक वापरा"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"पुढे सुरू ठेवण्यासाठी तुमच्या डिव्हाइसचे क्रेडेंशियल एंटर करा"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फिंगरप्रिंटवर प्रक्रिया करणे शक्य झाले नाही. कृपया पुन्हा प्रयत्न करा."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फेस अनलॉक"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"फेस अनलॉक सेट करा"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"तुमच्या फोनकडे पाहून तो अनलॉक करा"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलॉक करण्याच्या आणखी पद्धती सेट करा"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिंट जोडण्यासाठी टॅप करा"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"खूप प्रखर. आणखी सौम्य प्रकाश वापरून पहा."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"खूप गडद. आणखी प्रखर प्रकाश वापरून पहा."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"फेस अनलॉक वापरा"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"फेस किंवा स्क्रीन लॉक वापरा"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"पुढे सुरू ठेवण्यासाठी फेस अनलॉक वापरा"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा किंवा स्क्रीन लॉक वापरा"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"कॉपी केले"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> वरून <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> पेस्ट केले"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"क्लिपबोर्डवरून <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> पेस्ट केले"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"तुम्ही कॉपी केलेला मजकूर <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने पेस्ट केला"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"तुम्ही कॉपी केलेली इमेज <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने पेस्ट केली"</string>
+ <string name="pasted_content" msgid="646276353060777131">"तुम्ही कॉपी केलेला आशय <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ने पेस्ट केला"</string>
<string name="more_item_label" msgid="7419249600215749115">"अधिक"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"मेनू+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"कार्य"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"वैयक्तिक दृश्य"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"तुमच्या IT ॲडमिनने ब्लॉक केले"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"हा आशय कार्य ॲप्ससह शेअर केला जाऊ शकत नाही"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"हा आशय कार्य ॲप्स वापरून उघडला जाऊ शकत नाही"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"हा आशय वैयक्तिक ॲप्ससह शेअर केला जाऊ शकत नाही"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"हा आशय वैयक्तिक ॲप्स वापरून उघडला जाऊ शकत नाही"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"कार्य प्रोफाइल थांबवली आहे"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"सुरू करण्यासाठी टॅप करा"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> च्या वैयक्तिक प्रोफाइलमध्ये उघडायचे आहे का?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> च्या कार्य प्रोफाइलमध्ये उघडायचे आहे का?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"वैयक्तिक ब्राउझर वापरा"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउझर वापरा"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क अनलॉक पिन"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM नेटवर्क सबसेट अनलॉक पिन"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM कॉर्पोरेट अनलॉक पिन"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"नवीन मॅग्निफिकेशन सेटिंग्ज"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"आता तुम्ही तुमच्या स्क्रीनचा एखादा भाग मॅग्निफाय करू शकता"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिंग्ज मध्ये सुरू करा"</string>
<string name="dismiss_action" msgid="1728820550388704784">"डिसमिस करा"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"पुढे सुरू ठेवण्यासाठी, <b><xliff:g id="APP">%s</xliff:g></b> ला तुमच्या डिव्हाइसचा मायक्रोफोन अॅक्सेस करण्याची आवश्यकता आहे."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 1a04741..b11028f 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Membenarkan apl menemukan dan berganding dengan peranti Bluetooth yang berdekatan"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"sambung kepada peranti Bluetooth yang digandingkan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Membenarkan apl untuk menyambung kepada peranti Bluetooth yang digandingkan"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Maklumat Perkhidmatan Pembayaran NFC Pilihan"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Membenarkan apl mendapatkan maklumat perkhidmatan pembayaran nfc pilihan seperti bantuan berdaftar dan destinasi laluan."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"mengawal Komunikasi Medan Dekat"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Pin, corak atau kata laluan tidak ditetapkan"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Ralat semasa membuat pengesahan"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Gunakan kunci skrin"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Masukkan bukti kelayakan peranti anda untuk meneruskan"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Tidak dapat memproses cap jari. Sila cuba lagi."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Wajah buka kunci"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Daftarkan semula wajah anda"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Sediakan wajah buka kunci"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci telefon anda dengan melihat telefon anda"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Sediakan lebih banyak cara untuk membuka kunci"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketik untuk menambahkan cap jari"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Cuba pencahayaan yang lebih cerah."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Wajah <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Gunakan wajah buka kunci"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gunakan kunci wajah atau skrin"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Gunakan wajah buka kunci untuk meneruskan"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan wajah atau kunci skrin anda untuk meneruskan"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Disalin"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ditampalkan daripada <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ditampalkan daripada papan keratan"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> telah menampal teks yang anda salin"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> telah menampal imej yang anda salin"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> telah menampal kandungan yang anda salin"</string>
<string name="more_item_label" msgid="7419249600215749115">"Lagi"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Paparan peribadi"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Paparan kerja"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Disekat oleh pentadbir IT anda"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Kandungan ini tidak boleh dikongsi dengan apl kerja"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Kandungan ini tidak boleh dibuka dengan apl kerja"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Kandungan ini tidak boleh dikongsi dengan apl peribadi"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Kandungan ini tidak boleh dibuka dengan apl peribadi"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profil kerja dijeda"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Ketik untuk menghidupkan profil"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tiada apl kerja"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tiada apl peribadi"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buka dalam <xliff:g id="APP">%s</xliff:g> pada profil peribadi?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buka dalam <xliff:g id="APP">%s</xliff:g> pada profil kerja?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan penyemak imbas peribadi"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan penyemak imbas kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN buka kunci rangkaian SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN buka kunci subset rangkaian SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN buka kunci korporat SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Tetapan pembesaran baharu"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Kini anda boleh membesarkan sebahagian skrin anda"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Hidupkan dalam Tetapan"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Tolak"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Untuk meneruskan proses, <b><xliff:g id="APP">%s</xliff:g></b> memerlukan akses kepada mikrofon peranti anda."</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 9e41ccd..45773f3 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်သုံးစက်များကို ရှာဖွေပြီးတွဲချိတ်ရန် အက်ပ်ကိုခွင့်ပြုမည်"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"တွဲချိတ်ထားသော ဘလူးတုသ်စက်များနှင့် ချိတ်ဆက်ခြင်း"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"တွဲချိတ်ထားသော ဘလူးတုသ်သုံးစက်များနှင့် ချိတ်ဆက်ရန် အက်ပ်ကိုခွင့်ပြုမည်"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ဦးစားပေး NFC ငွေပေးချေမှုဆိုင်ရာ ဝန်ဆောင်မှု အချက်အလက်များ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"အက်ပ်အား ဦစားပေး NFC ငွေပေးချေမှုဆိုင်ရာ ဝန်ဆောင်မှု အချက်အလက်များဖြစ်သည့် မှတ်ပုံတင်ထားသော အကူအညီများနှင့် သွားလာရာ လမ်းကြောင်းတို့ကို ရယူရန် ခွင့်ပြုသည်။"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communicationအား ထိန်းချုပ်ရန်"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ပင်နံပါတ်၊ လော့ခ်ပုံစံ သို့မဟုတ် စကားဝှက် သတ်မှတ်မထားပါ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"အထောက်အထားစိစစ်ရာတွင် အမှားအယွင်းရှိနေသည်"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ရှေ့ဆက်ရန် သင့်စက်ပစ္စည်း၏ အထောက်အထားကို ထည့်သွင်းပါ"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"လက်ဗွေယူ၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို စနစ်ထည့်သွင်းပါ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"သင့်ဖုန်းကိုကြည့်၍ သော့ဖွင့်ပါ"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"သော့ဖွင့်ရန် နောက်ထပ်နည်းလမ်းများကို စနစ်ထည့်သွင်းပါ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"လက်ဗွေထည့်ရန် တို့ပါ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"အလွန်မှောင်သည်။ ပိုလင်းအောင် လုပ်ကြည့်ပါ။"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"မျက်နှာ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"မျက်နှာမှတ်သော့ဖွင့်ခြင်းကို သုံးခြင်း"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"မျက်နှာမှတ်သော့ဖွင့်ခြင်း (သို့) ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ရှေ့ဆက်ရန် မျက်နှာမှတ်သော့ဖွင့်ခြင်းကို သုံးပါ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ရှေ့ဆက်ရန် သင်၏ မျက်နှာ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"မိတ္တူကူးပြီးပါပြီ"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> မှ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> သို့ ကူးထည့်ထားသည်"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ကလစ်ဘုတ်မှ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> သို့ ကူးထည့်ထားသည်"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> က သင်မိတ္တူကူးထားသော စာသားကို ထည့်လိုက်သည်"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> က သင်မိတ္တူကူးထားသော ပုံကို ထည့်လိုက်သည်"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> က သင်မိတ္တူကူးထားသော အကြောင်းအရာကို ထည့်လိုက်သည်"</string>
<string name="more_item_label" msgid="7419249600215749115">"နောက်ထပ်"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"အလုပ်"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ပုဂ္ဂိုလ်ရေးဆိုင်ရာ မြင်ကွင်း"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"အလုပ် မြင်ကွင်း"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"သင်၏ IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ဤအကြောင်းအရာကို အလုပ်သုံးအက်ပ်များဖြင့် မမျှဝေနိုင်ပါ"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ဤအကြောင်းအရာကို အလုပ်သုံးအက်ပ်များဖြင့် မဖွင့်နိုင်ပါ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ဤအကြောင်းအရာကို ကိုယ်ပိုင်အက်ပ်များဖြင့် မမျှဝေနိုင်ပါ"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ဤအကြောင်းအရာကို ကိုယ်ပိုင်အက်ပ်များဖြင့် မဖွင့်နိုင်ပါ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"အလုပ်ပရိုဖိုင် ခဏရပ်ထားသည်"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ဖွင့်ရန်တို့ပါ"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"အလုပ်သုံးအက်ပ်များ မရှိပါ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ကိုယ်ပိုင်အက်ပ်များ မရှိပါ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ကိုယ်ပိုင်ပရိုဖိုင်ရှိ <xliff:g id="APP">%s</xliff:g> တွင် ဖွင့်မလား။"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"အလုပ်ပရိုဖိုင်ရှိ <xliff:g id="APP">%s</xliff:g> တွင် ဖွင့်မလား။"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ကိုယ်ပိုင်ဘရောင်ဇာ သုံးရန်"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"အလုပ်သုံးဘရောင်ဇာ သုံးရန်"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ဆင်းမ်ကွန်ရက် လော့ခ်ဖွင့်ရန် ပင်နံပါတ်"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"ဆင်းမ်ကွန်ရက်ခွဲ လော့ခ်ဖွင့်ရန် ပင်နံပါတ်"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"ဆင်းမ်ကော်ပိုရိတ် လော့ခ်ဖွင့်ရန် ပင်နံပါတ်"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ချဲ့ခြင်းဆိုင်ရာ ဆက်တင်အသစ်များ"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ဖန်သားပြင်တစ်စိတ်တစ်ပိုင်းကို ယခုချဲ့နိုင်ပါပြီ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"\'ဆက်တင်များ\' တွင် ဖွင့်ရန်"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ပယ်ရန်"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ဆက်လက်လုပ်ဆောင်ရန် <b><xliff:g id="APP">%s</xliff:g></b> က သင့်စက်၏ မိုက်ခရိုဖုန်းကို အသုံးပြုခွင့်ရရန် လိုအပ်သည်။"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 0ca8b91..a7f40c8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lar appen oppdage og koble til Bluetooth-enheter i nærheten"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"koble til tilkoblede Bluetooth-enheter"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lar appen koble til tilkoblede Bluetooth-enheter"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informasjon om prioritert NFC-betalingstjeneste"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gir appen tilgang til informasjon om prioritert NFC-betalingstjeneste, for eksempel registrerte hjelpemidler og destinasjon."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontroller overføring av data med NFC-teknologi"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN-kode, mønster eller passord er ikke angitt"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Feil under autentiseringen"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Bruk skjermlås"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Skriv inn enhetslegitimasjonen din for å fortsette"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kunne ikke registrere fingeravtrykket. Prøv på nytt."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansiktslås"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrer ansiktet ditt på nytt"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurer ansiktslås"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås opp telefonen ved å se på den"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måter å låse opp på"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trykk for å legge til et fingeravtrykk"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"For lyst. Prøv svakere belysning."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv sterkere belysning."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Ansikt <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Bruk ansiktslås"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Bruk ansikts- eller skjermlås"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Bruk ansiktslås for å fortsette"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Bruk ansikts- eller skjermlåsen for å fortsette"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopiert"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> limte inn fra <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> limte inn fra utklippstavlen"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> limte inn tekst du kopierte"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> limte inn et bilde du kopierte"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> limte inn innhold du kopierte"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mer"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"menyknapp+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig visning"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Jobbvisning"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokkert av IT-administratoren din"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Dette innholdet kan ikke deles med jobbapper"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Dette innholdet kan ikke åpnes med jobbapper"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Dette innholdet kan ikke deles med personlige apper"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Dette innholdet kan ikke åpnes med personlige apper"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Jobbprofilen er satt på pause"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Trykk for å slå på"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ingen jobbapper"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ingen personlige apper"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vil du åpne i <xliff:g id="APP">%s</xliff:g> i den personlige profilen?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vil du åpne i <xliff:g id="APP">%s</xliff:g> i jobbprofilen?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Bruk den personlige nettleseren"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Bruk jobbnettleseren"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-kode for å fjerne operatørlåser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-kode for å fjerne bestemte operatørlåser"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-kode for å låse opp SIM-kort for bedrifter"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nye forstørringsinnstillinger"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nå kan du forstørre en del av skjermen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Slå på i innstillingene"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Avvis"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"For å fortsette må <b><xliff:g id="APP">%s</xliff:g></b> ha tilgang til enhetsmikrofonen."</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 6a0ba3b..bbe7c5d 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"यो अनुमति दिइएमा एपले नजिकै रहेका ब्लुटुथ चल्ने यन्त्रहरू भेट्टाउन र ती यन्त्रहरूसँग कनेक्ट गर्न सक्छ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"लिंक गरिएका ब्लुटुथ चल्ने यन्त्रहरूसँग कनेक्ट गर्ने"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"यो अनुमति दिइएमा एपले लिंक गरिएका ब्लुटुथ चल्ने यन्त्रहरूसँग कनेक्ट गर्न सक्छ"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC भुक्तानी सेवासम्बन्धी रुचाइएको जानकारी"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"यसले एपलाई दर्ता गरिएका सहायता तथा मार्गको गन्तव्य जस्ता रुचाइएका NFC भुक्तानी सेवासम्बन्धी जानकारी प्राप्त गर्न दिन्छ।"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"नजिक क्षेत्र संचार नियन्त्रणहरू"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"कुनै पनि PIN, ढाँचा वा पासवर्ड सेट गरिएको छैन"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"प्रमाणित गर्ने क्रममा त्रुटि भयो"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"स्क्रिन लक प्रयोग गर्नुहोस्"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"जारी राख्न आफ्नो यन्त्रको PIN, प्याटर्न वा पासवर्ड हाल्नुहोस्"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फिंगरप्रिन्ट प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फेस अनलक"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"फेस अनलक सेटअप गर्नुहोस्"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"फोनमा हेरेकै भरमा फोन अनलक गर्नुहोस्"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलक गर्ने अन्य तरिकाहरू सेटअप गर्नुहोस्"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिन्ट हाल्न ट्याप गर्नुहोस्"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ज्यादै चम्किलो। अझ मधुरो प्रकाश प्रयोग गरी हेर्नु…"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ज्यादै अँध्यारो छ। अझ बढी प्रकाशमा गई हेर्नुहोस्"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"फेस अनलक प्रयोग गर्नुहोस्"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"फेस अनलक वा स्क्रिन लक प्रयोग गर्नुहोस्"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"जारी राख्न फेस अनलक प्रयोग गर्नुहोस्"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी राख्न आफ्नो फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"प्रतिलिपि गरियो"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> मा रहेको डेटा कपी गरी <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> मा पेस्ट गरियो"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"क्लिपबोर्डमा रहेको डेटा कपी गरी <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> मा पेस्ट गरियो"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ले तपाईंले कपी गरेको टेक्स्ट पेस्ट गरेको छ"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ले तपाईंले कपी गरेको एउटा फोटो पेस्ट गरेको छ"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ले तपाईंले कपी गरेको सामग्री पेस्ट गरेको छ"</string>
<string name="more_item_label" msgid="7419249600215749115">"बढी"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"मेनु+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"काम"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"व्यक्तिगत दृश्य"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"तपाईंका IT एड्मिनले ब्लक गर्नुभएको छ"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"यो सामग्री कामसम्बन्धी एपहरूमार्फत सेयर गर्न मिल्दैन"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"यो सामग्री कामसम्बन्धी एपहरूमार्फत खोल्न मिल्दैन"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"यो सामग्री व्यक्तिगत एपहरूमार्फत सेयर गर्न मिल्दैन"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"यो सामग्री व्यक्तिगत एपहरूमार्फत खोल्न मिल्दैन"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"कार्य प्रोफाइल पज गरिएको छ"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"अन गर्न ट्याप गर्नुहोस्"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यो सामग्री खोल्न मिल्ने कुनै पनि कामसम्बन्धी एप छैन"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यो सामग्री खोल्न मिल्ने कुनै पनि व्यक्तिगत एप छैन"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"व्यक्तिगत प्रोफाइल प्रयोग गरी <xliff:g id="APP">%s</xliff:g> मा खोल्ने हो?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"कार्य प्रोफाइल प्रयोग गरी <xliff:g id="APP">%s</xliff:g> मा खोल्ने हो?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"व्यक्तिगत ब्राउजर प्रयोग गर्नुहोस्"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउजर प्रयोग गर्नुहोस्"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM को नेटवर्क अनलक गर्ने PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM को नेटवर्कको सबसेट अनलक गर्ने PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM को कर्पोरेट लक खोल्ने PIN"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"जुम इन गर्ने सुविधासम्बन्धी नयाँ सेटिङ"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"तपाईं अब स्क्रिनको जुनसुकै भाग जुम इन गर्न सक्नुहुन्छ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिङमा गई यो सुविधा अन गर्नुहोस्"</string>
<string name="dismiss_action" msgid="1728820550388704784">"हटाउनुहोस्"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"जारी राख्न <b><xliff:g id="APP">%s</xliff:g></b> लाई तपाईंको यन्त्रको माइक्रोफोन प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ।"</string>
diff --git a/core/res/res/values-night/values.xml b/core/res/res/values-night/values.xml
index 3fd82b8..1571fab 100644
--- a/core/res/res/values-night/values.xml
+++ b/core/res/res/values-night/values.xml
@@ -16,7 +16,7 @@
-->
<resources>
- <style name="Theme.DeviceDefault.QuickSettings" parent="android:Theme.DeviceDefault">
+ <style name="Theme.DeviceDefault.SystemUI" parent="android:Theme.DeviceDefault">
<!-- Color palette -->
<item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
<item name="colorSecondary">@color/secondary_device_default_settings</item>
@@ -27,5 +27,5 @@
<item name="forceDarkAllowed">false</item>
</style>
- <style name="Theme.DeviceDefault.QuickSettings.Dialog" parent="Theme.DeviceDefault.Dialog" />
+ <style name="Theme.DeviceDefault.SystemUI.Dialog" parent="Theme.DeviceDefault.Dialog" />
</resources>
\ No newline at end of file
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 92cd82b..800b66e 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -49,7 +49,7 @@
<string name="invalidPuk" msgid="8831151490931907083">"Typ een pukcode die 8 cijfers of langer is."</string>
<string name="needPuk" msgid="7321876090152422918">"Je simkaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen."</string>
<string name="needPuk2" msgid="7032612093451537186">"Voer de PUK2-code in om de simkaart te ontgrendelen."</string>
- <string name="enablePin" msgid="2543771964137091212">"Mislukt. Schakel SIM/RUIM-vergrendeling in."</string>
+ <string name="enablePin" msgid="2543771964137091212">"Mislukt. Zet SIM/RUIM-vergrendeling aan."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
<item quantity="other">Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart wordt vergrendeld.</item>
<item quantity="one">Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat de simkaart wordt vergrendeld.</item>
@@ -124,7 +124,7 @@
<string name="roamingTextSearching" msgid="5323235489657753486">"Service zoeken"</string>
<string name="wfcRegErrorTitle" msgid="3193072971584858020">"Bellen via wifi kan niet worden ingesteld"</string>
<string-array name="wfcOperatorErrorAlertMessages">
- <item msgid="468830943567116703">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen. (Foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="468830943567116703">"Als je wilt bellen en berichten wilt sturen via wifi, moet je eerst je provider vragen deze service in te stellen. Zet bellen via wifi dan opnieuw aan via Instellingen. (Foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
<item msgid="4795145070505729156">"Probleem bij registratie van Bellen via wifi bij je provider: <xliff:g id="CODE">%1$s</xliff:g>"</item>
@@ -208,8 +208,8 @@
<string name="factory_reset_warning" msgid="6858705527798047809">"Je apparaat wordt gewist"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"De beheer-app kan niet worden gebruikt. Je apparaat wordt nu gewist.\n\nNeem contact op met de beheerder van je organisatie als je vragen hebt."</string>
<string name="printing_disabled_by" msgid="3517499806528864633">"Afdrukken uitgezet door <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
- <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Schakel je werkprofiel in"</string>
- <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Je persoonlijke apps zijn geblokkeerd totdat je je werkprofiel inschakelt"</string>
+ <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Zet je werkprofiel aan"</string>
+ <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Je persoonlijke apps zijn geblokkeerd totdat je je werkprofiel aanzet"</string>
<string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Apps die worden gebruikt voor persoonlijke doeleinden, worden geblokkeerd op <xliff:g id="DATE">%1$s</xliff:g> om <xliff:g id="TIME">%2$s</xliff:g>. Je IT-beheerder staat niet toe dat je werkprofiel langer dan <xliff:g id="NUMBER">%3$d</xliff:g> dagen uitstaat."</string>
<string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aanzetten"</string>
<string name="me" msgid="6207584824693813140">"Ik"</string>
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App actief"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps die de batterij gebruiken"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Vergroting"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Toegankelijkheidsgebruik"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> gebruikt de batterij"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps gebruiken de batterij"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tik voor batterij- en datagebruik"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Hiermee kan de app bluetooth-apparaten in de buurt vinden en koppelen"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"verbinding maken met gekoppelde bluetooth-apparaten"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Hiermee kan de app verbinding maken met gekoppelde bluetooth-apparaten"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informatie over voorkeursservice voor NFC-betaling"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Hiermee kun je zorgen dat de app informatie krijgt over de voorkeursservice voor NFC-betaling, zoals geregistreerde hulpmiddelen en routebestemmingen."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication regelen"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Geen pincode, patroon of wachtwoord ingesteld"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Fout bij verificatie"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Schermvergrendeling gebruiken"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Geef de inloggegevens van je apparaat op om door te gaan"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Gedeeltelijke vingerafdruk gedetecteerd"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kan vingerafdruk niet verwerken. Probeer het opnieuw."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Maak de sensor schoon"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Vinger bewoog te snel"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Vinger te langzaam bewogen. Probeer het opnieuw."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Probeer een andere vingerafdruk"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Te veel licht"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Verplaats je vinger"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Vingerafdruk geverifieerd"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Gezicht geverifieerd"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Gezicht geverifieerd. Druk op Bevestigen."</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware voor vingerafdruk niet beschikbaar."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Kan vingerafdruk niet instellen"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Vingerafdrukbewerking geannuleerd."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Vingerafdrukverificatie geannuleerd door gebruiker."</string>
@@ -604,7 +601,7 @@
<string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Probeer het opnieuw."</string>
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Geen vingerafdrukken geregistreerd."</string>
<string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Dit apparaat heeft geen vingerafdruksensor."</string>
- <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensor tijdelijk uitgeschakeld."</string>
+ <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensor staat tijdelijk uit."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Vingerafdruk gebruiken"</string>
<string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Vingerafdruk of schermvergrendeling gebruiken"</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ontgrendelen via gezichtsherkenning"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Je gezicht opnieuw registreren"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Registreer je gezicht opnieuw om de herkenning te verbeteren"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Stel ontgrendelen via gezichtsherkenning in"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontgrendel je telefoon door ernaar te kijken"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer manieren in om te ontgrendelen"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om een vingerafdruk toe te voegen"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Geen accurate gegevens. Probeer het nog eens."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Overbelicht. Probeer een minder felle belichting."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Te donker. Probeer een fellere verlichting."</string>
@@ -660,11 +653,12 @@
<string name="face_error_unable_to_process" msgid="5723292697366130070">"Kan gezicht niet verifiëren. Probeer het nog eens."</string>
<string name="face_error_not_enrolled" msgid="7369928733504691611">"Je hebt ontgrendelen via gezichtsherkenning niet ingesteld."</string>
<string name="face_error_hw_not_present" msgid="1070600921591729944">"Ontgrendelen via gezichtsherkenning wordt niet ondersteund op dit apparaat."</string>
- <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor tijdelijk uitgeschakeld."</string>
+ <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor staat tijdelijk uit."</string>
<string name="face_name_template" msgid="3877037340223318119">"Gezicht <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Ontgrendelen via gezichtsherkenning gebruiken"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gezicht of schermgrendeling gebruiken"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Gebruik ontgrendelen via gezichtsherkenning om door te gaan"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik je gezicht of schermvergrendeling om door te gaan"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -672,7 +666,7 @@
<string name="permlab_readSyncSettings" msgid="6250532864893156277">"synchronisatie-instellingen lezen"</string>
<string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."</string>
<string name="permlab_writeSyncSettings" msgid="6583154300780427399">"synchronisatie aan- of uitzetten"</string>
- <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om synchronisatie van de app Personen in te schakelen voor een account."</string>
+ <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om de synchronisatie van de app Personen aan te zetten voor een account."</string>
<string name="permlab_readSyncStats" msgid="3747407238320105332">"synchronisatiestatistieken lezen"</string>
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"de content van je gedeelde opslag lezen"</string>
@@ -903,7 +897,7 @@
<string name="lockscreen_missing_sim_instructions" msgid="8473601862688263903">"Plaats een simkaart."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3664999892038416334">"De simkaart ontbreekt of kan niet worden gelezen. Plaats een simkaart."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="3812893366715730539">"Onbruikbare simkaart."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="4358929052509450807">"Je simkaart is permanent uitgeschakeld.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="4358929052509450807">"Je simkaart is definitief uitgezet.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart."</string>
<string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"Vorig nummer"</string>
<string name="lockscreen_transport_next_description" msgid="2931509904881099919">"Volgend nummer"</string>
<string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"Onderbreken"</string>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Gekopieerd"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> geplakt vanuit <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> geplakt vanaf het klembord"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> heeft door jou gekopieerde tekst geplakt"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> heeft een door jou gekopieerde afbeelding geplakt"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> heeft door jou gekopieerde content geplakt"</string>
<string name="more_item_label" msgid="7419249600215749115">"Meer"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -1377,15 +1368,15 @@
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Analoog audioaccessoire gedetecteerd"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Het aangesloten apparaat werkt niet met deze telefoon. Tik voor meer informatie."</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"USB-foutopsporing verbonden"</string>
- <string name="adb_active_notification_message" msgid="5617264033476778211">"Tik om USB-foutopsporing uit te schakelen."</string>
- <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Selecteer deze optie om USB-foutopsporing uit te schakelen."</string>
+ <string name="adb_active_notification_message" msgid="5617264033476778211">"Tik om USB-foutopsporing uit te zetten."</string>
+ <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Selecteer deze optie om USB-foutopsporing uit te zetten."</string>
<string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Draadloze foutopsporing verbonden"</string>
- <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Tik om draadloze foutopsporing uit te schakelen"</string>
- <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Selecteer deze optie om draadloze foutopsporing uit te schakelen."</string>
+ <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Tik om draadloze foutopsporing uit te zetten"</string>
+ <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Selecteer deze optie om draadloze foutopsporing uit te zetten."</string>
<string name="test_harness_mode_notification_title" msgid="2282785860014142511">"Test harness-modus staat aan"</string>
- <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Reset de fabrieksinstellingen om de test harness-modus uit te schakelen."</string>
+ <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Reset de fabrieksinstellingen om de test harness-modus uit te zetten."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriële console staat aan"</string>
- <string name="console_running_notification_message" msgid="7892751888125174039">"Dit is van invloed op de prestaties. Controleer de bootloader om dit uit te schakelen."</string>
+ <string name="console_running_notification_message" msgid="7892751888125174039">"Dit is van invloed op de prestaties. Controleer de bootloader om dit uit te zetten."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Vloeistof of vuil in USB-poort"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-poort is automatisch uitgezet. Tik voor meer informatie."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-poort kan worden gebruikt"</string>
@@ -1406,7 +1397,7 @@
<string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"Weergeven vóór andere apps"</string>
<string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string>
<string name="alert_windows_notification_title" msgid="6331662751095228536">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven vóór andere apps"</string>
- <string name="alert_windows_notification_message" msgid="6538171456970725333">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
+ <string name="alert_windows_notification_message" msgid="6538171456970725333">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en zet je de functie uit."</string>
<string name="alert_windows_notification_turn_off_action" msgid="7805857234839123780">"Uitzetten"</string>
<string name="ext_media_checking_notification_title" msgid="8299199995416510094">"<xliff:g id="NAME">%s</xliff:g> controleren…"</string>
<string name="ext_media_checking_notification_message" msgid="2231566971425375542">"Huidige content controleren"</string>
@@ -1658,7 +1649,7 @@
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Geef de pincode van de simkaart op"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Pincode opgeven"</string>
<string name="kg_password_instructions" msgid="7179782578809398050">"Wachtwoord invoeren"</string>
- <string name="kg_puk_enter_puk_hint" msgid="6696187482616360994">"De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="6696187482616360994">"De simkaart is nu uitgezet. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
<string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"Gewenste pincode opgeven"</string>
<string name="kg_enter_confirm_pin_hint" msgid="6372557107414074580">"Gewenste pincode bevestigen"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8871937892678885545">"Simkaart ontgrendelen..."</string>
@@ -1693,7 +1684,7 @@
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Snelkoppeling toegankelijkheid gebruiken?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Als de snelkoppeling aanstaat, houd je beide volumeknoppen 3 seconden ingedrukt om een toegankelijkheidsfunctie te starten."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Snelkoppeling voor toegankelijkheidsfuncties aanzetten?"</string>
- <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Als je beide volumetoetsen een paar seconden ingedrukt houdt, schakel je de toegankelijkheidsfuncties in. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nHuidige functies:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nJe kunt de geselecteerde functies wijzigen via Instellingen > Toegankelijkheid."</string>
+ <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Als je beide volumetoetsen een paar seconden ingedrukt houdt, zet je de toegankelijkheidsfuncties aan. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nHuidige functies:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nJe kunt de geselecteerde functies wijzigen via Instellingen > Toegankelijkheid."</string>
<string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
<string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Snelkoppeling voor <xliff:g id="SERVICE">%1$s</xliff:g> aanzetten?"</string>
<string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Als je beide volumetoetsen een paar seconden ingedrukt houdt, wordt de toegankelijkheidsfunctie <xliff:g id="SERVICE">%1$s</xliff:g> aangezet. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nJe kunt deze sneltoets op een andere functie instellen via Instellingen > Toegankelijkheid."</string>
@@ -1702,7 +1693,7 @@
<string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"AAN"</string>
<string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"UIT"</string>
<string name="accessibility_enable_service_title" msgid="3931558336268541484">"Toestaan dat <xliff:g id="SERVICE">%1$s</xliff:g> volledige controle over je apparaat heeft?"</string>
- <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Als je <xliff:g id="SERVICE">%1$s</xliff:g> inschakelt, maakt je apparaat geen gebruik van schermvergrendeling om de gegevensversleuteling te verbeteren."</string>
+ <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Als je <xliff:g id="SERVICE">%1$s</xliff:g> aanzet, gebruikt je apparaat geen schermvergrendeling om de gegevensversleuteling te verbeteren."</string>
<string name="accessibility_service_warning_description" msgid="291674995220940133">"Volledige controle is gepast voor apps die je helpen met toegankelijkheid, maar voor de meeste apps is het ongepast."</string>
<string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Scherm bekijken en bedienen"</string>
<string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"De functie kan alle content op het scherm lezen en content via andere apps weergeven."</string>
@@ -1827,7 +1818,7 @@
<string name="reason_unknown" msgid="5599739807581133337">"onbekend"</string>
<string name="reason_service_unavailable" msgid="5288405248063804713">"Afdrukservice staat niet aan"</string>
<string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g>-service geïnstalleerd"</string>
- <string name="print_service_installed_message" msgid="7005672469916968131">"Tik om in te schakelen"</string>
+ <string name="print_service_installed_message" msgid="7005672469916968131">"Tik om aan te zetten"</string>
<string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"Beheerderspincode invoeren"</string>
<string name="restr_pin_enter_pin" msgid="373139384161304555">"Geef de pincode op"</string>
<string name="restr_pin_incorrect" msgid="3861383632940852496">"Onjuist"</string>
@@ -1864,7 +1855,7 @@
<string name="package_deleted_device_owner" msgid="2292335928930293023">"Verwijderd door je beheerder"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
<string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donkere thema aanzetten\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken\n\n"<annotation id="url">"Meer informatie"</annotation></string>
- <string name="battery_saver_description" msgid="6794188153647295212">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donker thema aanzetten.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken."</string>
+ <string name="battery_saver_description" msgid="6794188153647295212">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema aanzetten.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken."</string>
<string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing aanzetten?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aanzetten"</string>
@@ -1903,8 +1894,8 @@
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (volgende wekker)"</string>
- <string name="zen_mode_forever" msgid="740585666364912448">"Totdat je uitschakelt"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Totdat u \'Niet storen\' uitschakelt"</string>
+ <string name="zen_mode_forever" msgid="740585666364912448">"Totdat je uitzet"</string>
+ <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Totdat je Niet storen uitzet"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Samenvouwen"</string>
<string name="zen_mode_feature_name" msgid="3785547207263754500">"Niet storen"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlijke weergave"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Werkweergave"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Geblokkeerd door je IT-beheerder"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Deze content kan niet worden gedeeld met werk-apps"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Deze content kan niet worden geopend met werk-apps"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Deze content kan niet worden gedeeld met persoonlijke apps"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Deze content kan niet worden geopend met persoonlijke apps"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Werkprofiel is onderbroken"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te zetten"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werk-apps"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlijke apps"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Openen in <xliff:g id="APP">%s</xliff:g> in persoonlijk profiel?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Openen in <xliff:g id="APP">%s</xliff:g> in werkprofiel?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Persoonlijke browser gebruiken"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Werkbrowser gebruiken"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Ontgrendelingspincode voor SIM-netwerk"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Ontgrendelingspincode voor subset van SIM-netwerk"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Ontgrendelingspincode voor zakelijke simkaart"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nieuwe vergrotingsinstellingen"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Je kunt nu een deel van je scherm vergroten"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aanzetten in Instellingen"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Sluiten"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> heeft toegang tot de microfoon van je apparaat nodig om door te gaan."</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e392f64..e1176a2 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"ଆପ୍ ଚାଲୁଛି"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"ଆପ୍ଗୁଡ଼ିକ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରିଥା\'ନ୍ତି"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"ଆକ୍ସେସିବିଲିଟୀ ବ୍ୟବହାର"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରୁଛି"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g>ଟି ଆପ୍ ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"ବ୍ୟାଟେରୀ ଏବଂ ଡାଟା ବ୍ୟବହାର ଉପରେ ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜି ପେୟାର୍ କରିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ପେୟାର୍ କରାଯାଇଥିବା ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ ସହ ସଂଯୋଗ କର"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ପେୟାର୍ କରାଯାଇଥିବା ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ ସହ ସଂଯୋଗ କରିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ପସନ୍ଦର NFC ପେମେଣ୍ଟ ସେବା ସୂଚନା"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ପଞ୍ଜିକୃତ ଯନ୍ତ୍ର ଏବଂ ମାର୍ଗ ଲକ୍ଷସ୍ଥଳ ପରି ପସନ୍ଦର nfc ପେମେଣ୍ଟ ସେବା ସୂଚନା ପାଇବାକୁ ଆପ୍ ଅନୁମତି କରିଥାଏ।"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେଶନ୍ ଉପରେ ନିୟନ୍ତ୍ରଣ ରଖନ୍ତୁ"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"କୌଣସି ପିନ୍, ପେଟେର୍ନ ବା ପାସ୍ୱର୍ଡ ସେଟ୍ ନାହିଁ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ପ୍ରାମାଣିକରଣ କରିବା ସମୟରେ ତ୍ରୁଟି"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସର କ୍ରେଡେନ୍ସିଆଲ୍ ଲେଖନ୍ତୁ"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"ଆଂଶିକ ଟିପଚିହ୍ନ ଚିହ୍ନଟ କରାଯାଇଛି"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ଟିପଚିହ୍ନ ପ୍ରୋସେସ୍ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ସେନ୍ସରକୁ ସଫା କରନ୍ତୁ"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"ଆଙ୍ଗୁଠିକୁ ବହୁତ ଶୀଘ୍ର ମୁଭ୍ କରାଯାଇଛି"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ଆଙ୍ଗୁଠି ଖୁବ୍ ଧୀରେ ନିଆଗଲା। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ବହୁତ ଉଜ୍ଜ୍ୱଳ"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"ଆଡଜଷ୍ଟ କରି ଦେଖନ୍ତୁ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ଟିପଚିହ୍ନ ପ୍ରମାଣିତ ହେଲା"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି, ଦୟାକରି ସୁନିଶ୍ଚିତ ଦବାନ୍ତୁ"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"ଟିପଚିହ୍ନ ହାର୍ଡୱେର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"ଟିପଚିହ୍ନକୁ ସେଟ୍ ଅପ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"ଟିପଚିହ୍ନର ସମୟ ଶେଷ ହେଲା । ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"ଟିପଚିହ୍ନ କାର୍ଯ୍ୟ ବାତିଲ୍ କରାଗଲା।"</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"ଉପଯୋଗକର୍ତ୍ତା ଟିପଚିହ୍ନ କାର୍ଯ୍ୟ ବାତିଲ୍ କରିଛନ୍ତି।"</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ଫେସ୍ ଅନ୍ଲକ୍"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ଫୋନକୁ ଦେଖି ଏହାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ଅନଲକ୍ କରିବା ପାଇଁ ଆହୁରି ଅଧିକ ଉପାୟ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ଅତ୍ୟଧିକ ଉଜ୍ଵଳ। କମ୍ ଉଜ୍ବଳକରଣରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ଅତ୍ୟଧିକ ଅନ୍ଧକାର। ଉଜ୍ବଳ ଲାଇଟ୍ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g>ଙ୍କ ଫେସ୍"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ଫେସ୍ ଅନଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ଫେସ୍ ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ଜାରି ରଖିବାକୁ ଫେସ୍ ଅନଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଚେହେରା କିମ୍ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"କପି କରାଗଲା"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>ରୁ ପେଷ୍ଟ କରିଛି"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> କ୍ଲିପବୋର୍ଡରୁ ପେଷ୍ଟ କରିଛି"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"ଆପଣ କପି କରିଥିବା ଟେକ୍ସଟକୁ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ପେଷ୍ଟ କରିଛି"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"ଆପଣ କପି କରିଥିବା ଏକ ଛବିକୁ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ପେଷ୍ଟ କରିଛି"</string>
+ <string name="pasted_content" msgid="646276353060777131">"ଆପଣ କପି କରିଥିବା ବିଷୟବସ୍ତୁକୁ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ପେଷ୍ଟ କରିଛି"</string>
<string name="more_item_label" msgid="7419249600215749115">"ଅଧିକ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ମେନୁ"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1328,7 +1319,7 @@
<item msgid="9177085807664964627">"VPN"</item>
</string-array>
<string name="network_switch_type_name_unknown" msgid="3665696841646851068">"ଏକ ଅଜଣା ନେଟ୍ୱର୍କ ପ୍ରକାର"</string>
- <string name="accept" msgid="5447154347815825107">"ସ୍ୱୀକାର କରନ୍ତୁ"</string>
+ <string name="accept" msgid="5447154347815825107">"ଗ୍ରହଣ କରନ୍ତୁ"</string>
<string name="decline" msgid="6490507610282145874">"ପ୍ରତ୍ୟାଖ୍ୟାନ"</string>
<string name="select_character" msgid="3352797107930786979">"ବର୍ଣ୍ଣ ଲେଖନ୍ତୁ"</string>
<string name="sms_control_title" msgid="4748684259903148341">"SMS ମେସେଜ୍ଗୁଡ଼ିକୁ ପଠାଯାଉଛି"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ୱାର୍କ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ବ୍ୟକ୍ତିଗତ ଭ୍ୟୁ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"କାର୍ଯ୍ୟସ୍ଥଳୀ ସମ୍ବନ୍ଧିତ ଭ୍ୟୁ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ବ୍ଲକ୍ କରାଯାଇଛି"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ଏହି ବିଷୟବସ୍ତୁ ୱାର୍କ ଆପଗୁଡ଼ିକରେ ସେୟାର୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ଏହି ବିଷୟବସ୍ତୁ ୱାର୍କ ଆପଗୁଡ଼ିକରେ ଖୋଲାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ଏହି ବିଷୟବସ୍ତୁ ବ୍ୟକ୍ତିଗତ ଆପଗୁଡ଼ିକରେ ସେୟାର୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ଏହି ବିଷୟବସ୍ତୁ ବ୍ୟକ୍ତିଗତ ଆପଗୁଡ଼ିକରେ ଖୋଲାଯାଇପାରିବ ନାହିଁ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ୱାର୍କ ପ୍ରୋଫାଇଲକୁ ବିରତ କରାଯାଇଛି"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ଚାଲୁ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"କୌଣସି ୱାର୍କ ଆପ୍ ନାହିଁ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ନାହିଁ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲକୁ <xliff:g id="APP">%s</xliff:g>ରେ ଖୋଲିବେ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"ୱାର୍କ ପ୍ରୋଫାଇଲକୁ <xliff:g id="APP">%s</xliff:g>ରେ ଖୋଲିବେ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ବ୍ୟକ୍ତିଗତ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ୱାର୍କ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ନେଟୱାର୍କ ଅନଲକ୍ PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ନେଟୱାର୍କର ସବସେଟ୍ ଅନଲକ୍ PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM କର୍ପୋରେଟ୍ ଅନଲକ୍ PIN"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ନୂଆ ମ୍ୟାଗ୍ନିଫିକେସନ୍ ସେଟିଂସ୍"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ଆପଣ ଏବେ ଆପଣଙ୍କ ସ୍କ୍ରିନର ଅଂଶକୁ ମ୍ୟାଗ୍ନିଫାଏ କରିପାରିବେ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ସେଟିଂସରେ ଚାଲୁ କରନ୍ତୁ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ଜାରି ରଖିବାକୁ, <b><xliff:g id="APP">%s</xliff:g></b> ଆପଣଙ୍କ ଡିଭାଇସର ମାଇକ୍ରୋଫୋନକୁ ଆକ୍ସେସ୍ ଆବଶ୍ୟକ କରେ।"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 5daf8c88..f2d9bfd 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ਐਪ ਨੂੰ ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨੂੰ ਖੋਜਣ ਅਤੇ ਉਹਨਾਂ ਨਾਲ ਜੋੜਾਬੱਧ ਕਰਨ ਦਿੰਦੀ ਹੈ"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ਜੋੜਾਬੱਧ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ਐਪਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਦਿੰਦੀ ਹੈ"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ਤਰਜੀਹੀ NFC ਭੁਗਤਾਨਸ਼ੁਦਾ ਸੇਵਾ ਜਾਣਕਾਰੀ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ਐਪ ਨੂੰ ਤਰਜੀਹੀ NFC ਭੁਗਤਾਨਸ਼ੁਦਾ ਸੇਵਾ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਕਿ ਰਜਿਸਟਰ ਕੀਤੇ ਸਾਧਨ ਅਤੇ ਮੰਜ਼ਿਲ ਰਸਤਾ।"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ਨਜ਼ਦੀਕੀ ਖੇਤਰ ਸੰਚਾਰ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ਕੋਈ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ਗੜਬੜ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਨੂੰ ਦਾਖਲ ਕਰੋ"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ਫਿੰਗਰਪ੍ਰਿੰਟ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਹੋ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ਚਿਹਰਾ ਅਣਲਾਕ"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ਚਿਹਰਾ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖ ਕੇ ਇਸਨੂੰ ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ਅਣਲਾਕ ਕਰਨ ਦੇ ਹੋਰ ਤਰੀਕਿਆਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ। ਹਲਕੀ ਚਮਕ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ਬਹੁਤ ਗੂੜ੍ਹਾ। ਤੇਜ਼ ਰੋਸ਼ਨੀ ਕਰਕੇ ਦੇਖੋ।"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ਚਿਹਰਾ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ਚਿਹਰਾ ਅਣਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਚਿਹਰਾ ਅਣਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"ਕਾਪੀ ਕੀਤੀ ਗਈ"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ਤੋਂ ਕਾਪੀ ਕੀਤੇ ਡਾਟੇ ਨੂੰ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਪੇਸਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"ਕਲਿੱਪਬੋਰਡ ਦੇ ਡਾਟੇ ਨੂੰ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਪੇਸਟ ਕੀਤਾ ਗਿਆ"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੀ ਗਈ ਲਿਖਤ ਨੂੰ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ਨੇ ਪੇਸਟ ਕੀਤਾ"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੇ ਗਏ ਚਿੱਤਰ ਨੂੰ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ਨੇ ਪੇਸਟ ਕੀਤਾ"</string>
+ <string name="pasted_content" msgid="646276353060777131">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੀ ਗਈ ਸਮੱਗਰੀ ਨੂੰ <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ਨੇ ਪੇਸਟ ਕੀਤਾ"</string>
<string name="more_item_label" msgid="7419249600215749115">"ਹੋਰ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"ਮੀਨੂ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ਕੰਮ"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ਵਿਅਕਤੀਗਤ ਦ੍ਰਿਸ਼"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ਕਾਰਜ ਦ੍ਰਿਸ਼"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨਾਲ ਨਹੀਂ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਨਿੱਜੀ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਨਿੱਜੀ ਐਪਾਂ ਨਾਲ ਨਹੀਂ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ਚਾਲੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ਕੀ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"ਕੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ਨਿੱਜੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ਕੰਮ ਸੰਬੰਧੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਪਿੰਨ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"ਸਿਮ ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਅਣਲਾਕ ਪਿੰਨ"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"ਸਿਮ ਕਾਰਪੋਰੇਟ ਅਣਲਾਕ ਪਿੰਨ"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ਨਵੀਆਂ ਵੱਡਦਰਸ਼ੀਕਰਨ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ਹੁਣ ਤੁਸੀਂ ਆਪਣੀ ਸਕ੍ਰੀਨ ਦਾ ਕੁਝ ਹਿੱਸਾ ਵੱਡਦਰਸ਼ੀ ਕਰ ਸਕਦੇ ਹੋ"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰੋ"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ਖਾਰਜ ਕਰੋ"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"ਜਾਰੀ ਰੱਖਣ ਲਈ, <b><xliff:g id="APP">%s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ।"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c07b40f..78e1326 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -545,6 +545,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Zezwala na wykrywanie i parowanie przez aplikację urządzeń Bluetooth w pobliżu"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"łączenie ze sparowanymi urządzeniami Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Zezwala na łączenie aplikacji ze sparowanymi urządzeniami Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacje o preferowanych usługach płatniczych NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pozwala aplikacji uzyskiwać informacje o preferowanych usługach płatniczych NFC, np. zarejestrowanych pomocach i miejscach docelowych tras."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolowanie łączności Near Field Communication"</string>
@@ -579,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nie ustawiono kodu PIN, wzoru ani hasła"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Podczas uwierzytelniania wystąpił błąd"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Używaj blokady ekranu"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Podaj dane logowania do urządzenia, aby kontynuować"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nie udało się przetworzyć odcisku palca. Spróbuj ponownie."</string>
@@ -626,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Rozpoznawanie twarzy"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Zarejestruj swoją twarz ponownie"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Skonfiguruj rozpoznawanie twarzy"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Popatrz na ekran telefonu, aby go odblokować"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Skonfiguruj więcej sposobów odblokowywania"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Kliknij, aby dodać odcisk palca"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Nie udało się zarejestrować danych twarzy. Spróbuj ponownie."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Zbyt jasno. Spróbuj przy słabszym świetle."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Zbyt ciemno. Spróbuj w jaśniejszym świetle."</string>
@@ -670,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Twarz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Używaj rozpoznawania twarzy"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Używaj rozpoznawania twarzy lub blokady ekranu"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Użyj rozpoznawania twarzy, aby kontynuować"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aby kontynuować, użyj rozpoznawania twarzy lub blokady ekranu"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Skopiowano"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikacja <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> wkleiła dane z aplikacji <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikacja <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> wkleiła dane ze schowka"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikacja <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> wkleiła skopiowany tekst"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikacja <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> wkleiła skopiowany obraz"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikacja <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> wkleiła skopiowane treści"</string>
<string name="more_item_label" msgid="7419249600215749115">"Więcej"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Służbowe"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Widok osobisty"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Widok służbowy"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Działanie zablokowane przez administratora IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Tych treści nie można udostępniać w aplikacjach służbowych"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Tych treści nie można otworzyć w aplikacjach służbowych"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Tych treści nie można udostępniać w aplikacjach osobistych"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Tych treści nie można otworzyć w aplikacjach osobistych"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Działanie profilu służbowego jest wstrzymane"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Kliknij, aby włączyć"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Brak aplikacji służbowych"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Brak aplikacji osobistych"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otworzyć w aplikacji <xliff:g id="APP">%s</xliff:g> w profilu osobistym?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otworzyć w aplikacji <xliff:g id="APP">%s</xliff:g> w profilu służbowym?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Użyj przeglądarki osobistej"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Użyj przeglądarki służbowej"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kod PIN do karty SIM odblokowujący sieć"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Kod PIN odblokowujący podzbiór sieci na karcie SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Kod PIN odblokowujący dane korporacyjne na karcie SIM"</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nowe ustawienia powiększenia"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Możesz teraz powiększyć część ekranu"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Włącz w Ustawieniach"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odrzuć"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Aby kontynuować, musisz przyznać aplikacji „<xliff:g id="APP">%s</xliff:g>” dostęp do mikrofonu urządzenia."</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c286e23..ab52b26 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App em execução"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps que estão consumindo a bateria"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Ampliação"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uso de acessibilidade"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está consumindo a bateria"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps estão consumindo a bateria"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que o app descubra e se pareie a dispositivos Bluetooth por perto"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conecte-se a dispositivos Bluetooth pareados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que o app se conecte a dispositivos Bluetooth pareados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações preferidas de serviço de pagamento por NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nenhum PIN, padrão ou senha configurado"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Erro na autenticação"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar bloqueio de tela"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Insira as credenciais do dispositivo para continuar"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impressão digital parcial detectada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpe o sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"O dedo se moveu rápido demais"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"O movimento do dedo está muito lento. Tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Use outra impressão digital"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Claro demais"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Ajuste a posição do dedo"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impressão digital autenticada"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Rosto autenticado"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware de impressão digital não disponível."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Não foi possível configurar a impressão digital"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string>
@@ -660,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueio facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar reconhecimento facial ou bloqueio de tela"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use o desbloqueio facial para continuar"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -2260,8 +2258,7 @@
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
<string name="window_magnification_prompt_title" msgid="2876703640772778215">"Novas configurações de ampliação"</string>
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Agora você pode ampliar parte da tela"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Configurações"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dispensar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar o microfone do dispositivo."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 80b0f03..b1ddb54 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que a app descubra e sincronize com dispositivos Bluetooth próximos"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ligar-se a dispositivos Bluetooth sincronizados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que a app se ligue a dispositivos Bluetooth sincronizados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações de serviços de pagamento com NFC preferenciais"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a app obtenha informações de serviços de pagamento com NFC preferenciais, como apoios registados e destino da rota."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlo Near Field Communication"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nenhum PIN, padrão ou palavra-passe definidos."</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Erro ao autenticar."</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Utilizar o bloqueio de ecrã"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Introduza a credencial do dispositivo para continuar."</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio facial"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volte a inscrever o seu rosto"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para melhorar o reconhecimento, volte a inscrever o seu rosto."</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configure o desbloqueio facial"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o telemóvel ao olhar para ele"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Imp. capt. dados rosto precisos. Tente novamente."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado clara. Experimente uma luz mais suave."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado escura. Experimente local com mais luz."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Utilizar o desbloqueio facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilizar o bloqueio através do rosto ou de ecrã"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Utilize o desbloqueio facial para continuar."</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilize o rosto ou o bloqueio de ecrã para continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Copiado"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"A app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> colou da app <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"A app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> colou da área de transferência"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"A app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> colou o texto que copiou"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"A app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> colou uma imagem que copiou"</string>
+ <string name="pasted_content" msgid="646276353060777131">"A app <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> colou o conteúdo que copiou"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mais"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista pessoal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de trabalho"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bloqueado pelo administrador de TI"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Não é possível partilhar este conteúdo com apps de trabalho"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Não é possível abrir este conteúdo com apps de trabalho"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Não é possível partilhar este conteúdo com apps pessoais"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Não é possível abrir este conteúdo com apps pessoais"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Perfil de trabalho em pausa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para ativar"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Sem apps de trabalho"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Sem apps pessoais"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Pretende abrir no perfil pessoal da app <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Abrir no perfil de trabalho da app <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador pessoal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio de rede do cartão SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN para desbloqueio do subconjunto da rede do cartão SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN para desbloqueio empresarial do cartão SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Novas definições de ampliação"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Já pode ampliar o ecrã parcialmente"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Definições"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ignorar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, a app <b><xliff:g id="APP">%s</xliff:g></b> precisa de acesso ao microfone do dispositivo."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c286e23..ab52b26 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"App em execução"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Apps que estão consumindo a bateria"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Ampliação"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uso de acessibilidade"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está consumindo a bateria"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> apps estão consumindo a bateria"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite que o app descubra e se pareie a dispositivos Bluetooth por perto"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"conecte-se a dispositivos Bluetooth pareados"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite que o app se conecte a dispositivos Bluetooth pareados"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informações preferidas de serviço de pagamento por NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nenhum PIN, padrão ou senha configurado"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Erro na autenticação"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Usar bloqueio de tela"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Insira as credenciais do dispositivo para continuar"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impressão digital parcial detectada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpe o sensor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"O dedo se moveu rápido demais"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"O movimento do dedo está muito lento. Tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Use outra impressão digital"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Claro demais"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Ajuste a posição do dedo"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impressão digital autenticada"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Rosto autenticado"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardware de impressão digital não disponível."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Não foi possível configurar a impressão digital"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string>
@@ -660,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueio facial"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar reconhecimento facial ou bloqueio de tela"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Use o desbloqueio facial para continuar"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -2260,8 +2258,7 @@
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
<string name="window_magnification_prompt_title" msgid="2876703640772778215">"Novas configurações de ampliação"</string>
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Agora você pode ampliar parte da tela"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ativar nas Configurações"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Dispensar"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para continuar, o app <b><xliff:g id="APP">%s</xliff:g></b> precisa acessar o microfone do dispositivo."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index a3435a3..38171d2 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Permite aplicației să descopere și să asocieze dispozitive Bluetooth din apropiere"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"să se conecteze la dispozitive Bluetooth asociate"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Permite aplicației să se conecteze la dispozitive Bluetooth asociate"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informații despre serviciul de plăți NFC preferat"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite aplicației să obțină informații despre serviciul de plăți NFC preferat, de exemplu, identificatorii de aplicație înregistrați și destinația traseului."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlare schimb de date prin Near Field Communication"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nu este setat niciun cod PIN, model sau parolă"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Eroare la autentificare"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Folosiți blocarea ecranului"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Introduceți datele de conectare ale dispozitivului pentru a continua"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Amprenta nu a putut fi procesată. Încercați din nou."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Deblocare facială"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Reînregistrați-vă chipul"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Configurați deblocarea facială"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Deblocați-vă telefonul uitându-vă la acesta"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurați mai multe moduri de deblocare"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Atingeți ca să adăugați o amprentă"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Nu s-a putut fotografia fața cu precizie. Încercați din nou."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Prea luminos. Încercați o lumină mai slabă."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Prea întunecat. Încercați o lumină mai puternică."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Chip <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Folosiți deblocarea facială"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Folosiți blocarea ecranului sau blocarea facială"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Folosiți deblocarea facială pentru a continua"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Folosiți-vă chipul sau blocarea ecranului pentru a continua"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Copiat"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a inserat date din <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a inserat date din clipboard"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a inserat textul copiat"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a inserat o imagine copiată"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> a inserat conținutul copiat"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mai multe"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Meniu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Serviciu"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Afișarea conținutului personal"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Afișarea conținutului de lucru"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blocat de administratorul IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Acest conținut nu poate fi trimis cu aplicații pentru lucru"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Acest conținut nu poate fi deschis cu aplicații pentru lucru"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Acest conținut nu poate fi trimis cu aplicații personale"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Acest conținut nu poate fi deschis cu aplicații personale"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profilul de serviciu este întrerupt"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Atingeți pentru a activa"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nicio aplicație pentru lucru"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nicio aplicație personală"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Deschideți în <xliff:g id="APP">%s</xliff:g> în profilul personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Deschideți în <xliff:g id="APP">%s</xliff:g> în profilul de serviciu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Folosiți browserul personal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Folosiți browserul de serviciu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Codul PIN de deblocare SIM privind rețeaua"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Codul PIN de deblocare SIM privind subsetul de rețea"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Codul PIN de deblocare SIM corporativă"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Noi setări de mărire"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Acum puteți mări o parte a ecranului"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activați din Setări"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Respingeți"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Pentru a continua, <b><xliff:g id="APP">%s</xliff:g></b> necesită acces la microfonul dispozitivului."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 58e86a7..022dfc4 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -545,6 +545,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Приложение сможет находить устройства Bluetooth поблизости и подключаться к ним."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"доступ к подключенным устройствам Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"У приложения будет доступ к подключенным устройствам Bluetooth."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Сведения о предпочтительном платежном сервисе NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Приложение сможет получать сведения о предпочтительном платежном сервисе NFC (например, зарегистрированные идентификаторы AID и конечный пункт маршрута)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Управление NFC-модулем"</string>
@@ -579,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Укажите PIN-код, пароль или графический ключ"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Ошибка аутентификации."</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Использовать блокировку экрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Чтобы продолжить, введите учетные данные устройства."</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не удалось распознать отпечаток. Повторите попытку."</string>
@@ -626,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Фейсконтроль"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Зарегистрируйте лицо ещё раз"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Настройте фейсконтроль"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Вы сможете разблокировать телефон, просто посмотрев на него."</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройте другие способы разблокировки"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Нажмите, чтобы добавить отпечаток пальца."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Не удалось собрать данные. Повторите попытку."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Слишком светло. Сделайте освещение менее ярким."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Слишком темно. Сделайте освещение ярче."</string>
@@ -670,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Лицо <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Использовать фейсконтроль"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Использовать фейсконтроль или блокировку экрана"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Чтобы продолжить, используйте фейсконтроль."</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Чтобы продолжить, посмотрите на экран или используйте данные для разблокировки."</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Скопировано"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Данные из приложения \"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>\" вставлены в приложение \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\"."</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Данные из буфера обмена вставлены в приложение \"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>\"."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: скопированный текст вставлен"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: скопированное изображение вставлено"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>: скопированный контент вставлен"</string>
<string name="more_item_label" msgid="7419249600215749115">"Ещё"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Меню+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Рабочее"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Просмотр личных данных"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Просмотр рабочих данных"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Заблокировано вашим администратором"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Этот контент нельзя открывать через рабочие приложения."</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Этот контент нельзя открыть в рабочем приложении."</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Этот контент нельзя открывать через личные приложения."</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Этот контент нельзя открыть в личном приложении."</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Действие рабочего профиля приостановлено."</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Нажмите, чтобы включить"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Не поддерживается рабочими приложениями."</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Не поддерживается личными приложениями."</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Посмотреть на <xliff:g id="APP">%s</xliff:g> в личном профиле?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Посмотреть на <xliff:g id="APP">%s</xliff:g> в рабочем профиле?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Использовать личный браузер"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Использовать рабочий браузер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код для разблокировки сети SIM-карты"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-код для разблокировки подмножества сети SIM-карты"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-код для разблокировки корпоративной SIM-карты"</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Новые настройки увеличения"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Теперь можно увеличивать часть экрана."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Включить в настройках"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Закрыть"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Чтобы продолжить, предоставьте приложению <b><xliff:g id="APP">%s</xliff:g></b> доступ к микрофону устройства."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 97da7bd..3676f62 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"යෙදුම ධාවනය කරමින්"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"බැටරිය භාවිත කරන යෙදුම්"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"විශාලනය"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"ප්රවේශ්යතා භාවිතය"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> බැටරිය භාවිත කරයි"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"යෙදුම් <xliff:g id="NUMBER">%1$d</xliff:g>ක් බැටරිය භාවිත කරයි"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"බැටරි හා දත්ත භාවිතය පිළිබඳව විස්තර සඳහා තට්ටු කරන්න"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"අවට ඇති බ්ලූටූත් උපාංග සොයා ගැනීමට සහ යුගල කිරීමට යෙදුමට ඉඩ දෙයි"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"යුගල කළ බ්ලූටූත් උපාංගවලට සම්බන්ධ වන්න"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"යුගල කළ බ්ලූටූත් උපාංග සමඟ සම්බන්ධ වීමට යෙදුමට ඉඩ දෙයි"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"කැමති NFC ගෙවීම් සේවා තොරතුරු"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ලියාපදිංචි කළ ආධාර සහ ගමන් මාර්ග ගමනාන්ත වැනි කැමති nfc ගෙවීම් සේවා තොරතුරු ලබා ගැනීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ආසන්න ක්ෂේත්ර සන්නිවේදනය පාලනය කරන්න"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"රහස් අංක, රටා, හෝ මුරපද කිසිවක් සකසා නැත"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"සත්යාපනය කිරීමේ දෝෂයකි"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"තිර අගුල භාවිත කරන්න"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ඉදිරියට යාමට ඔබගේ උපාංග අක්තපත්ර ඇතුළු කරන්න"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"අර්ධ ඇඟිලි සලකුණක් අනාවරණය කරන ලදි"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ඇඟිලි සලකුණ පිරිසැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"සංවේදකය පිරිසිදු කරන්න"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"ඇඟිල්ල වඩා වේගයෙන් ගෙන යන ලදි"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ඇඟිල්ල වඩා සෙමෙන් ගෙන යන ලදි. කරුණාකර නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"තවත් ඇඟිලි සලකුණක් උත්සාහ කරන්න"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"දීප්තිය වැඩියි"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"සීරුමාරු කිරීම උත්සාහ කරන්න"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ඇඟිලි සලකුණ සත්යාපනය කරන ලදී"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"මුහුණ සත්යාපනය කරන ලදී"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"මුහුණ සත්යාපනය කරන ලදී, කරුණාකර තහවුරු කරන්න ඔබන්න"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"ඇඟිලි සලකුණු දෘඪාංගය ලද නොහැකිය."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"ඇඟිලි සලකුණ පිහිටුවිය නොහැකිය"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"ඇඟිලි සලකුණු මෙහෙයුම අවලංගු කරන ලදී."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"පරිශීලක විසින් ඇඟිලි සලකුණු මෙහෙයුම අවසන් කරන ලදී."</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"මුහුණු අඟුලු ඇරීම"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"මුහුණු අඟුලු හැරීම පිහිටුවන්න"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ඔබගේ දුරකථනය දෙස බැලීමෙන් එහි අගුලු හරින්න"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"අගුලු හැරීමට තවත් ක්රම සකසන්න"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ඇඟිලි සලකුණක් එක් කිරීමට තට්ටු කරන්න"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"නිරවද්ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"දීප්තිය වැඩියි. තවත් මඳ ආලෝකය උත්සාහ කරන්න."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"ඉතා අඳුරුයි. තවත් දීප්තිමත් ආලෝකය උත්සාහ කරන්න."</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"මුහුණු <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"මුහුණු අගුලු හැරීම භාවිත කරන්න"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"මුහුණු අගුලු හැරීම හෝ තිර අගුල භාවිත කරන්න"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ඉදිරියට යාමට මුහුණු අගුලු හැරීම භාවිත කරන්න"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ඉදිරියට යාමට ඔබගේ මුහුණු හෝ තිර අගුල භාවිත කරන්න"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"පිටපත් කළා"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> වෙතින් අලවන ලදි"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> පසුරු පුවරුව වෙතින් අලවන ලදි"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ඔබ පිටපත් කළ පෙළ ඇලවීය"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ඔබ පිටපත් කළ රූපයක් ඇලවීය"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ඔබ පිටපත් කළ අන්තර්ගතය ඇලවීය"</string>
<string name="more_item_label" msgid="7419249600215749115">"තව"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"මෙනුව+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"කාර්යාල"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"පෞද්ගලික දසුන"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"කාර්යාල දසුන"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ඔබගේ IT පරිපාලක විසින් අවහිර කර ඇත"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"මෙම අන්තර්ගතය කාර්යාල යෙදුම් සමඟ බෙදා ගත නොහැකිය"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"මෙම අන්තර්ගතය කාර්යාල යෙදුම් සමඟ විවෘත කළ නොහැකිය"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"මෙම අන්තර්ගතය පුද්ගලික යෙදුම් සමඟ බෙදා ගත නොහැකිය"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"මෙම අන්තර්ගතය පුද්ගලික යෙදුම් සමඟ විවෘත කළ නොහැකිය"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"කාර්යාල පැතිකඩ විරාම කර ඇත"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ක්රියාත්මක කිරීමට තට්ටු කරන්න"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"කාර්යාල යෙදුම් නැත"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"පුද්ගලික යෙදුම් නැත"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> පුද්ගලික පැතිකඩ තුළ විවෘත කරන්නද?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> කාර්යාල පැතිකඩ තුළ විවෘත කරන්නද?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"පුද්ගලික බ්රව්සරය භාවිත කරන්න"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"කාර්යාල බ්රව්සරය භාවිත කරන්න"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ජාල අගුලු හැරීමේ PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ජාල උප කට්ටල අගුලු හැරීමේ PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM සමාගම් අගුලු හැරීමේ PIN"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"නව විශාලන සැකසීම්"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"ඔබට දැන් ඔබගේ තිරයේ කොටසක් විශාලනය කළ හැකිය"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"සැකසීම් තුළ ක්රියාත්මක කරන්න"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ඉවත ලන්න"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"දිගටම කර ගෙන යාමට, <b><xliff:g id="APP">%s</xliff:g></b> හට ඔබගේ උපාංගයෙහි මයික්රෆෝනයට ප්රවේශය අවශ්යයි."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index ca71551..ba0199a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -300,8 +300,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikácia je spustená"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikácie spotrebúvajúce batériu"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Zväčšenie"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Využitie dostupnosti"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> používa batériu"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"Aplikácie (<xliff:g id="NUMBER">%1$d</xliff:g>) používajú batériu"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Klepnutím zobrazíte podrobnosti o batérii a spotrebe dát"</string>
@@ -545,6 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Umožňuje aplikácii objaviť zariadenia s rozhraním Bluetooth nablízku a spárovať sa s nimi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"pripojiť sa k spárovaným zariadeniam Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Umožňuje aplikácii pripojiť sa k spárovaným zariadeniam s rozhraním Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Preferované informácie platenej služby NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikácii získavať preferované informácie platenej služby NFC, napríklad o registrovanej pomoci a trasách k cieľu."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ovládať technológiu NFC"</string>
@@ -579,29 +582,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nie je nastavený PIN, vzor ani heslo"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Chyba overenia"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Použiť zámku obrazovky"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Ak chcete pokračovať, zadajte prihlasovacie údaje zariadenia"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Bol rozpoznaný čiastočný odtlačok prsta"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Odtlačok prsta sa nepodarilo spracovať. Skúste to znova."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Vyčistite senzor"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Prst ste posúvali príliš rýchlo"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Pohli ste prstom príliš pomaly. Skúste to znova."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Vyskúšajte iný odtlačok prsta"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Príliš jasno"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Vyskúšajte upraviť"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Odtlačok prsta bol overený"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Tvár bola overená"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Tvár bola overená, stlačte tlačidlo potvrdenia"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Hardvér na snímanie odtlačku prsta nie je k dispozícii"</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Odtlačok prsta sa nedá nastaviť"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Časový limit rozpoznania odtlačku prsta vypršal. Skúste to znova."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Overenie odtlačku prsta zrušil používateľ."</string>
@@ -626,14 +623,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odomknutie tvárou"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Znova zaregistrujte svoju tvár"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavte odomknutie tvárou"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Odomykajte telefón tak, že sa naň pozriete"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte viac spôsobov odomknutia"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím pridajte odtlačok prsta"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Príliš veľká tma. Skúste lepšie osvetlenie."</string>
@@ -670,7 +663,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Tvár <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Použiť odomknutie tvárou"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Použiť tvár alebo zámku obrazovky"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Ak chcete pokračovať, použite odomknutie tvárou"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte použitím tváre alebo zámky obrazovky"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"Skopírované"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikácia <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> prilepila údaje z aplikácie <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikácia <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> prilepila údaje zo schránky"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikácia <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> prilepila text, ktorý ste skopírovali"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplik. <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> prilepila obrázok, ktorý ste skopírovali"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikácia <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> prilepila obsah, ktorý ste skopírovali"</string>
<string name="more_item_label" msgid="7419249600215749115">"Viac"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2209,31 +2200,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Práca"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobné zobrazenie"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pracovné zobrazenie"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokované vaším správcom IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Tento obsah sa nedá zdieľať pomocou pracovných aplikácií"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Tento obsah sa nedá otvoriť pomocou pracovných aplikácií"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Tento obsah sa nedá zdieľať pomocou osobných aplikácií"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Tento obsah sa nedá otvoriť pomocou osobných aplikácií"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Pracovný profil je pozastavený"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Zapnúť klepnutím"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žiadne pracovné aplikácie"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žiadne osobné aplikácie"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v osobnom profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v pracovnom profile?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použiť osobný prehliadač"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použiť pracovný prehliadač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN na odomknutie siete pre SIM kartu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN na odomknutie podmnožiny siete pre SIM kartu"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN na odomknutie podnikovej SIM karty"</string>
@@ -2346,10 +2325,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nové nastavenia zväčšenia"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Teraz môžete zväčšiť časť obrazovky"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Zapnúť v Nastaveniach"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Zavrieť"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ak chcete pokračovať, <b><xliff:g id="APP">%s</xliff:g></b> požaduje prístup k mikrofónu zariadenia."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 0da1ec6..c8b96cb 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -300,8 +300,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikacija se izvaja"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikacije, ki porabljajo energijo baterije"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Povečava"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uporaba funkcij za ljudi s posebnimi potrebami"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> porablja energijo baterije"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"Toliko aplikacij porablja energijo baterije: <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Dotaknite se za prikaz podrobnosti porabe baterije in prenosa podatkov"</string>
@@ -545,6 +544,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Aplikaciji omogoča odkrivanje naprav Bluetooth v bližini in seznanjanje z njimi."</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"povezovanje s seznanjenimi napravami Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Aplikaciji omogoča povezovanje s seznanjenimi napravami Bluetooth."</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Podatki o prednostni storitvi za plačevanje prek povezave NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Aplikaciji omogoča pridobivanje podatkov o prednostni storitvi za plačevanje prek povezave NFC, kot so registrirani pripomočki in cilj preusmeritve."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"nadzor nad komunikacijo s tehnologijo bližnjega polja"</string>
@@ -579,29 +582,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nastavljena ni nobena koda PIN, vzorec ali geslo"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Napaka pri preverjanju pristnosti"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Uporaba odklepanja s poverilnico"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Za nadaljevanje vnesite poverilnico za napravo."</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Zaznan je delni prstni odtis."</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Prstnega odtisa ni bilo mogoče obdelati. Poskusite znova."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Očistite tipalo."</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Prehitro ste odmaknili prst."</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Prepočasen premik prsta. Poskusite znova."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Poskusite z drugim prstnim odtisom."</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Presvetlo je."</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Poskusite popraviti položaj prsta."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Pristnost prstnega odtisa je preverjena"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Pristnost obraza je potrjena"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Pristnost obraza je preverjena. Pritisnite gumb »Potrdi«."</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Strojna oprema za prstne odtise ni na voljo."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Prstnega odtisa ni mogoče nastaviti."</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Dejanje s prstnim odtisom je bilo preklicano."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Dejanje s prstnim odtisom je preklical uporabnik."</string>
@@ -626,14 +623,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odklepanje z obrazom"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Znova registrirajte obraz"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Za izboljšanje prepoznavanja znova registrirajte svoj obraz"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavite odklepanje z obrazom"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Odklenite telefon tako, da ga pogledate."</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavite več načinov odklepanja"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dotaknite se, da dodate prstni odtis."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvetlo. Poskusite z blažjo osvetlitvijo."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Pretemno. Poskusite z močnejšo osvetlitvijo."</string>
@@ -670,7 +663,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Obraz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Uporaba odklepanja z obrazom"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Uporaba odklepanja z obrazom ali s poverilnico"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Za nadaljevanje uporabite odklepanje z obrazom."</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nadaljevanje uporabite obraz ali odklepanje s poverilnico."</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1031,9 @@
<string name="copied" msgid="4675902854553014676">"Kopirano"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je prilepila iz aplikacije <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>."</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je prilepila iz odložišča."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je prilepila besedilo iz odložišča."</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je prilepila sliko iz odložišča."</string>
+ <string name="pasted_content" msgid="646276353060777131">"Aplikacija <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> je prilepila vsebino iz odložišča."</string>
<string name="more_item_label" msgid="7419249600215749115">"Več"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Meni+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2209,31 +2200,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Služba"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pogled osebnega profila"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pogled delovnega profila"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokiral skrbnik za IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Te vsebine ni mogoče deliti z delovnimi aplikacijami."</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Te vsebine ni mogoče odpreti z delovnimi aplikacijami."</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Te vsebine ni mogoče deliti z osebnimi aplikacijami."</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Te vsebine ni mogoče odpreti z osebnimi aplikacijami."</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Delovni profil je začasno zaustavljen"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Dotaknite se za vklop"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nobena delovna aplikacija"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nobena osebna aplikacija"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Želite odpreti v aplikaciji <xliff:g id="APP">%s</xliff:g> v osebnem profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Želite odpreti v aplikaciji <xliff:g id="APP">%s</xliff:g> v delovnem profilu?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Uporabi osebni brskalnik"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Uporabi delovni brskalnik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Koda PIN za odklepanje omrežja kartice SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Koda PIN za odklepanje podnabora omrežja kartice SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Koda PIN za odklepanje kartice SIM za podjetje"</string>
@@ -2346,10 +2325,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nove nastavitve povečave"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Zdaj lahko povečate samo del zaslona."</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Vklopite v nastavitvah"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Opusti"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Za nadaljevanje potrebuje aplikacija <b><xliff:g id="APP">%s</xliff:g></b> dostop do mikrofona v napravi."</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 07be4ee..0816ab6 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Lejon që aplikacioni të zbulojë dhe të çiftohet me pajisjet me Bluetooth në afërsi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"të lidhet me pajisjet e çiftuara me Bluetooth"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Lejon që aplikacioni të lidhet me pajisjet e çiftuara me Bluetooth"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Informacionet për shërbimin e preferuar të pagesës me NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Lejon aplikacionin të marrë informacione për shërbimin e preferuar të pagesës me NFC si p.sh. ndihmat e regjistruara dhe destinacionin e itinerarit."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrollo \"Komunikimin e fushës në afërsi\" NFC"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Nuk është vendosur kod PIN, motiv ose fjalëkalim"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Gabim gjatë vërtetimit"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Përdor kyçjen e ekranit"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Fut kredencialet e pajisjes për të vazhduar"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Gjurma e gishtit nuk mund të përpunohej. Provo përsëri."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Shkyçja me fytyrë"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Regjistro përsëri fytyrën tënde"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Konfiguro shkyçjen me fytyrë"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Shkyçe telefonin duke parë tek ai"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguri më shumë mënyra për të shkyçur"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trokit për të shtuar një gjurmë gishti"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Me shumë ndriçim. Provo një ndriçim më të butë."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Shumë i errët. Provo një ndriçim më të fortë."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Fytyra <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Përdor shkyçjen me fytyrë"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Përdor kyçjen me fytyrë ose kyçjen e ekranit"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Përdor shkyçjen me fytyrë për të vazhduar"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Përdor fytyrën tënde ose kyçjen e ekranit për të vazhduar"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"U kopjua"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> u ngjit nga <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> u ngjit nga kujtesa e fragmenteve"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ngjiti një tekst që kopjove"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ngjiti një imazh që kopjove"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ngjiti një përmbajtje që kopjove"</string>
<string name="more_item_label" msgid="7419249600215749115">"Më shumë"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menyja+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Puna"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pamja personale"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pamja e punës"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bllokuar nga administratori yt i teknologjisë së informacionit"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Kjo përmbajtje nuk mund të shpërndahet me aplikacione pune"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Kjo përmbajtje nuk mund të hapet me aplikacione pune"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Kjo përmbajtje nuk mund të shpërndahet me aplikacione personale"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Kjo përmbajtje nuk mund të hapet me aplikacione personale"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Profili i punës është në pauzë"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Trokit për ta aktivizuar"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nuk ka aplikacione pune"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nuk ka aplikacione personale"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Të hapet në <xliff:g id="APP">%s</xliff:g> te profili personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Të hapet në <xliff:g id="APP">%s</xliff:g> te profili i punës?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Përdor shfletuesin personal"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Përdor shfletuesin e punës"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kodi PIN i shkyçjes së rrjetit të kartës SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Kodi PIN i shkyçjes së nënrenditjes së rrjetit të kartës SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Kodi PIN i shkyçjes së kartës SIM të korporatës"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Cilësimet e reja të zmadhimit"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Tani mund të zmadhosh pjesë të ekranit tënd"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivizo te \"Cilësimet\""</string>
<string name="dismiss_action" msgid="1728820550388704784">"Hiq"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Për të vazhduar, <b><xliff:g id="APP">%s</xliff:g></b> ka nevojë të qaset në mikrofonin e pajisjes sate."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 27ffe44..b73c4ae 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -542,6 +542,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозвољава апликацији да открива Bluetooth уређаје у близини и упарује се са њима"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"повезивање са упареним Bluetooth уређајима"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозвољава апликацији да се повезује са упареним Bluetooth уређајима"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Информације о жељеној NFC услузи за плаћање"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозвољава апликацији да преузима информације о жељеној NFC услузи за плаћање, попут регистрованих идентификатора апликација и одредишта преусмеравања."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контрола комуникације у ужем пољу (Near Field Communication)"</string>
@@ -576,7 +580,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Нисте подесили ни PIN, ни шаблон, ни лозинку"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Грешка при потврди идентитета"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користите закључавање екрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Унесите акредитив за уређај да бисте наставили"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Није успела обрада отиска прста. Пробајте поново."</string>
@@ -623,14 +628,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Откључавање лицем"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Поново региструјте лице"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Да бисте побољшали препознавање, поново региструјте лице"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Подесите откључавање лицем"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Откључајте телефон тако што ћете га погледати"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Подесите још начина за откључавање"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Додирните да бисте додали отисак прста"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Снимање лица није успело. Пробајте поново."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Превише је светло. Пробајте са слабијим осветљењем."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Претамно је. Пробајте са јачим осветљењем."</string>
@@ -667,7 +668,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Користите откључавање лицем"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или закључавање екрана"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Користите откључавање лицем да бисте наставили"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или закључавање екрана да бисте наставили"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1034,12 +1036,9 @@
<string name="copied" msgid="4675902854553014676">"Копирано је"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Апликација<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> је налепила податке из апликације <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Апликација<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> налепила податке из привремене меморије"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Апликација<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> је налепила текст који сте копирали"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Апликација<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> је налепила слику коју сте копирали"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Апликација<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> је налепила садржај који сте копирали"</string>
<string name="more_item_label" msgid="7419249600215749115">"Још"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Мени+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -1498,7 +1497,7 @@
<string name="ime_action_previous" msgid="6548799326860401611">"Претходно"</string>
<string name="ime_action_default" msgid="8265027027659800121">"Изврши"</string>
<string name="dial_number_using" msgid="6060769078933953531">"Бирај број\nкористећи <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="create_contact_using" msgid="6200708808003692594">"Креирајте контакт\nкористећи <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="6200708808003692594">"Направите контакт\nкористећи <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Следеће апликације захтевају дозволу за приступ налогу, како сада, тако и убудуће."</string>
<string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Желите да одобрите овај захтев?"</string>
<string name="grant_permissions_header_text" msgid="3420736827804657201">"Захтев за приступ"</string>
@@ -2175,31 +2174,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Пословно"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Лични приказ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Приказ за посао"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Блокира ИТ администратор"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Овај садржај не може да се дели помоћу пословних апликација"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Овај садржај не може да се отвара помоћу пословних апликација"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Овај садржај не може да се дели помоћу личних апликација"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Овај садржај не може да се отвара помоћу личних апликација"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Пословни профил је паузиран"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Додирните да бисте укључили"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема пословних апликација"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема личних апликација"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Желите да отворите на личном профилу у: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Желите да отворите на пословном профилу у: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи лични прегледач"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи пословни прегледач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за откључавање SIM мреже"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN за откључавање подскупа SIM мреже"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN за откључавање пословне SIM картице"</string>
@@ -2312,10 +2299,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Нова подешавања увећања"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Сада можете да увећате део екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Укључите у Подешавањима"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Одбаци"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> захтева приступ микрофону уређаја ради настављања."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index ed5b746..0f3bb64 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Tillåter appen att hitta och parkoppla Bluetooth-enheter i närheten"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"ansluta till parkopplade Bluetooth-enheter"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Tillåter appen att ansluta till parkopplade Bluetooth-enheter"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Information kopplad till standardtjänsten för NFC-betalning"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillåter att appen hämtar information kopplad till standardtjänsten för NFC-betalning, till exempel registrerade hjälpmedel och ruttdestinationer."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrollera närfältskommunikationen"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Pinkod, grafiskt lösenord eller lösenord har inte angetts"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Ett fel uppstod vid autentiseringen"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Använd skärmlåset"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Fortsätt genom att ange enhetens autentiseringsuppgifter"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Det gick inte att bearbeta fingeravtrycket. Försök igen."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansiktslås"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrera ansiktet på nytt"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurera ansiktslås"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås upp telefonen genom att titta på den"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurera fler sätt att låsa upp"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryck för att lägga till ett fingeravtryck"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Det gick inte att fånga ansiktsdata. Försök igen."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Det är för ljust. Testa lägre belysning."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Det är för mörkt. Testa med bättre belysning."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Ansikte <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Använd ansiktslåset"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Använd ansiktslåset eller skärmlåset"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Fortsätt med hjälp av ansiktslåset"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Fortsätt med hjälp av ditt ansikte eller skärmlåset"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopierat"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> klistrade in från <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> klistrade in från urklipp"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> klistrade in text som du kopierade"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> klistrade in en bild som du kopierade"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> klistrade in innehåll som du kopierade"</string>
<string name="more_item_label" msgid="7419249600215749115">"Mer"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta + "</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig vy"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Jobbvy"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blockeras av IT-administratören"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Det här innehållet kan inte delas med jobbappar"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Det här innehållet kan inte öppnas med jobbappar"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Det här innehållet kan inte delas med privata appar"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Det här innehållet kan inte öppnas med privata appar"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Jobbprofilen är pausad"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Tryck för att aktivera"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Inga jobbappar"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Inga privata appar"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vill du öppna detta i <xliff:g id="APP">%s</xliff:g> i den privata profilen?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vill du öppna detta i <xliff:g id="APP">%s</xliff:g> i jobbprofilen?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Använd privat webbläsare"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Använd jobbwebbläsare"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkod för upplåsning av nätverk för SIM-kort"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Pinkod för upplåsning av delnätverk för SIM-kort"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Pinkod för upplåsning av företag för SIM-kort"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nya inställningar för förstoring"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Nu kan du förstora delar av skärmen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aktivera i inställningarna"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Stäng"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> behöver behörighet till enhetens mikrofon för att fortsätta."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 21998ed..5c68c6b 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Huruhusu programu itambue na kuoanisha kwenye vifaa vyenye Bluetooth vilivyo karibu"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kuunganisha kwenye vifaa vyenye Bluetooth vilivyooanishwa"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Huruhusu programu iunganishe kwenye vifaa vyenye Bluetooth vilivyooanishwa"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Maelezo ya Huduma Inayopendelewa ya Malipo ya NFC"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Huruhusu programu kupata maelezo ya huduma inayopendelewa ya malipo ya nfc kama vile huduma zilizosajiliwa na njia."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kudhibiti Mawasiliano ya Vifaa Vilivyokaribu (NFC)"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Hujaweka pin, mchoro au nenosiri"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Hitilafu imetokea wakati wa uthibitishaji"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Tumia mbinu ya kufunga skrini"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Weka kitambulisho cha kifaa chako ili uendelee."</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Imeshindwa kuchakata alama ya kidole. Tafadhali jaribu tena."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Kufungua kwa uso"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Sajili uso wako tena"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ili kuimarisha utambuzi, tafadhali sajili uso wako tena"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Weka mipangilio ya kufungua kwa uso"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Inang\'aa mno. Jaribu mwangaza hafifu"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Hakuna mwangaza wa kutosha. Jaribu kuongeza mwangaza."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Tumia kipengele cha kufungua kwa uso"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Tumia uso au mbinu ya kufunga skrini"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Tumia kipengele cha kufungua kwa uso ili uendelee"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Tumia uso au mbinu yako ya kufunga skrini ili uendelee"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Umenakili"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> imebandika kutoka <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> imebandika kutoka ubao wa kunakili"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> imebandika maandishi uliyonakili"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> imebandika picha uliyonakili"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> imebandika maudhui uliyonakili"</string>
<string name="more_item_label" msgid="7419249600215749115">"Zaidi"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menyu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Kazini"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Mwonekano wa binafsi"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Mwonekano wa kazini"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Imezuiwa na msimamizi wako wa Tehama"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Huwezi kushiriki maudhui haya na programu za kazini"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Huwezi kufungua maudhui haya ukitumia programu za kazini"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Huwezi kushiriki maudhui haya na programu za binafsi"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Huwezi kufungua maudhui haya ukitumia programu za binafsi"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Wasifu wa kazini umesimamishwa"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Gusa ili uwashe"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Hakuna programu za kazini"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Hakuna programu za binafsi"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ungependa kufungua katika <xliff:g id="APP">%s</xliff:g> kwenye wasifu wa binafsi?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ungependa kufungua katika <xliff:g id="APP">%s</xliff:g> kwenye wasifu wa kazini?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Tumia kivinjari cha binafsi"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Tumia kivinjari cha kazini"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ya kufungua mtandao wa SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN ya kufungua SIM iliyofungwa na mtoa huduma za simu"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN ya kufungua SIM ya shirika"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Mipangilio mipya ya ukuzaji"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Sasa unaweza kukuza sehemu ya skrini yako"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Washa katika Mipangilio"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Ondoa"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ili uendelee, <b><xliff:g id="APP">%s</xliff:g></b> inahitaji ruhusa ya kufikia maikrofoni ya kifaa chako."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index c27d495..c6e86f5 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"அருகிலுள்ள புளூடூத் சாதனங்களைக் கண்டறிந்து அவற்றுடன் இணைவதற்கு ஆப்ஸை அனுமதிக்கும்"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"இணைக்கப்பட்ட புளூடூத் சாதனங்களுடன் இணைத்தல்"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"இணைக்கப்பட்ட புளூடூத் சாதனங்களுடன் இணைவதற்கு ஆப்ஸை அனுமதிக்கும்"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"விருப்பமான NFC பேமெண்ட் சேவை தொடர்பான தகவல்கள்"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"பதிவுசெய்யப்பட்ட கருவிகள், சேருமிடத்திற்கான வழி போன்ற விருப்பமான NFC பேமெண்ட் சேவை தொடர்பான தகவல்களைப் பெற ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"குறுகிய இடைவெளி தகவல்பரிமாற்றத்தைக் கட்டுப்படுத்துதல்"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"பின்னோ, பேட்டர்னோ, கடவுச்சொல்லோ அமைக்கப்படவில்லை"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"அங்கீகரிப்பதில் பிழை"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"திரைப் பூட்டைப் பயன்படுத்து"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"தொடர, சாதன அனுமதிச் சான்றை உள்ளிடுங்கள்"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"கைரேகையைச் செயலாக்க முடியவில்லை. மீண்டும் முயலவும்."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"முகம் காட்டித் திறத்தல்"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"முகத்தை மீண்டும் பதிவுசெய்யவும்"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"முகம் காட்டித் திறத்தலை அமையுங்கள்"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"மொபைலைப் பார்ப்பதன் மூலம் அதைத் திறக்கலாம்"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"திறக்க, மேலும் பல வழிகளை அமையுங்கள்"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"கைரேகையைச் சேர்க்கத் தட்டுங்கள்"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"அதிக ஒளிர்வு. மிதமான ஒளியில் முயலவும்."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"இருட்டாக உள்ளது. பிரகாசமான ஒளியில் முயலவும்."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"முகம் <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"முகம் காட்டித் திறத்தலை உபயோகி"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"முகத்தையோ திரைப் பூட்டையோ பயன்படுத்து"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"தொடர, \'முகம் காட்டித் திறத்தல்\' அம்சத்தை உபயோகியுங்கள்"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"தொடர, உங்கள் முகத்தையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"நகலெடுக்கப்பட்டது"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ஆப்ஸிலிருந்து <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ஒட்டப்பட்டது"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"கிளிப்போர்டிலிருந்து <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ஒட்டப்பட்டது"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"நீங்கள் நகலெடுத்த உரையை <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ஆப்ஸ் ஒட்டியது"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"நீங்கள் நகலெடுத்த படத்தை <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ஆப்ஸ் ஒட்டியது"</string>
+ <string name="pasted_content" msgid="646276353060777131">"நீங்கள் நகலெடுத்த உள்ளடக்கத்தை <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ஆப்ஸ் ஒட்டியது"</string>
<string name="more_item_label" msgid="7419249600215749115">"மேலும்"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"மெனு+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"மெட்டா மற்றும்"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"பணிச் சுயவிவரம்"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"தனிப்பட்ட காட்சி"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"பணிக் காட்சி"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"இதை உங்கள் IT நிர்வாகி தடைசெய்துள்ளார்"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"பணி ஆப்ஸுடன் இந்த உள்ளடக்கத்தைப் பகிர முடியாது"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"பணி ஆப்ஸ் மூலம் இந்த உள்ளடக்கத்தைத் திறக்க முடியாது"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"தனிப்பட்ட ஆப்ஸுடன் இந்த உள்ளடக்கத்தைப் பகிர முடியாது"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"தனிப்பட்ட ஆப்ஸ் மூலம் இந்த உள்ளடக்கத்தைத் திறக்க முடியாது"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"பணிக் கணக்கு இடைநிறுத்தப்பட்டுள்ளது"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ஆன் செய்யத் தட்டுக"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"பணி ஆப்ஸ் எதுவுமில்லை"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"தனிப்பட்ட ஆப்ஸ் எதுவுமில்லை"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"தனிப்பட்ட கணக்கிலுள்ள <xliff:g id="APP">%s</xliff:g> ஆப்ஸில் திறக்கவா?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"பணிக் கணக்கிலுள்ள <xliff:g id="APP">%s</xliff:g> ஆப்ஸில் திறக்கவா?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"தனிப்பட்ட உலாவியைப் பயன்படுத்து"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"பணி உலாவியைப் பயன்படுத்து"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"சிம் நெட்வொர்க் அன்லாக் பின்"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"சிம் நெட்வொர்க் சப்செட் அன்லாக் பின்"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"கார்ப்பரேட் அன்லாக் பின்"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"பெரிதாக்கலுக்கான புதிய அமைப்புகள்"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"இப்போது உங்கள் திரையின் ஒரு பகுதியைப் பெரிதாக்கலாம்"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"அமைப்புகளில் ஆன் செய்க"</string>
<string name="dismiss_action" msgid="1728820550388704784">"மூடுக"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"தொடர, உங்கள் சாதனத்தின் மைக்ரோஃபோனை அணுகுவதற்கு <b><xliff:g id="APP">%s</xliff:g></b> ஆப்ஸுக்கு அனுமதி வேண்டும்."</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index e1d4cfb..2503c15 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొనడానికి, పెయిర్ చేయడానికి యాప్ను అనుమతిస్తుంది"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"పెయిర్ చేసిన బ్లూటూత్ పరికరాలకు కనెక్ట్ అవ్వండి"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"పెయిర్ చేసిన బ్లూటూత్ పరికరాలకు కనెక్ట్ అవ్వడానికి యాప్ను అనుమతిస్తుంది"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ప్రాధాన్యత ఇవ్వబడిన NFC చెల్లింపు సేవల సమాచారం"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ప్రాధాన్యత ఇవ్వబడిన NFC చెల్లింపు సేవల సమాచారాన్ని, అంటే రిజిస్టర్ చేయబడిన సహాయక సాధనాలు, మార్గం, గమ్యస్థానం వంటి వాటిని పొందేందుకు యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"సమీప క్షేత్ర కమ్యూనికేషన్ను నియంత్రించడం"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"పిన్, ఆకృతి లేదా పాస్వర్డ్ సెట్ చేయబడలేదు"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"ప్రామాణీకరిస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"కొనసాగడానికి, మీ పరికర ఆధారాలను ఎంటర్ చేయండి"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"వేలిముద్రను ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ఫేస్ అన్లాక్"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"మీ ముఖాన్ని తిరిగి నమోదు చేయండి"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ఫేస్ అన్లాక్ను సెటప్ చేయండి"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"మీ ఫోన్ను చూడటం ద్వారా దాన్ని అన్లాక్ చేయండి"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"అన్లాక్ చేయడానికి మరిన్ని మార్గాలను సెటప్ చేయండి"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"వేలిముద్రను జోడించడానికి ట్యాప్ చేయండి"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"వెలుతురు అధికంగా ఉంది. తక్కువ ఉండేలా చూడండి."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"చాలా చీకటిగా ఉంది. బాగా వెలుతురులో ప్రయత్నించండి."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ముఖ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ఫేస్ అన్లాక్ను ఉపయోగించండి"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ముఖం లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"కొనసాగించడానికి, మీ ఫేస్ అన్లాక్ను ఉపయోగించండి"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"కొనసాగించడానికి మీ ముఖం లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"కాపీ చేయబడింది"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> నుండి పేస్ట్ చేయబడింది"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> క్లిప్బోర్డ్ నుండి పేస్ట్ చేయబడింది"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> మీరు కాపీ చేసిన టెక్స్ట్ను పేస్ట్ చేసింది"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> మీరు కాపీ చేసిన ఇమేజ్ను పేస్ట్ చేసింది"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> మీరు కాపీ చేసిన కంటెంట్ను పేస్ట్ చేసింది"</string>
<string name="more_item_label" msgid="7419249600215749115">"ఎక్కువ"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"మెనూ+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"ఆఫీస్"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"వ్యక్తిగత వీక్షణ"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"పని వీక్షణ"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"మీ IT అడ్మిన్ ద్వారా బ్లాక్ చేయబడింది"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ఈ కంటెంట్ వర్క్ యాప్తో షేర్ చేయడం సాధ్యం కాదు"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ఈ కంటెంట్ వర్క్ యాప్తో తెరవడం సాధ్యం కాదు"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"ఈ కంటెంట్ వ్యక్తిగత యాప్తో షేర్ చేయడం సాధ్యం కాదు"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"ఈ కంటెంట్ వ్యక్తిగత యాప్తో తెరవడం సాధ్యం కాదు"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"కార్యాలయ ప్రొఫైల్ పాజ్ చేయబడింది"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"ఆన్ చేయడానికి ట్యాప్ చేయి"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"వర్క్ యాప్లు లేవు"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"వ్యక్తిగత యాప్లు లేవు"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"వ్యక్తిగత ప్రొఫైల్లో <xliff:g id="APP">%s</xliff:g>లో తెరవాలా?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"వర్క్ ప్రొఫైల్లో <xliff:g id="APP">%s</xliff:g>లో తెరవాలా?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"వ్యక్తిగత బ్రౌజర్ను ఉపయోగించు"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"వర్క్ బ్రౌజర్ను ఉపయోగించు"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM నెట్వర్క్ అన్లాక్ పిన్"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM నెట్వర్క్ సబ్సెట్ అన్లాక్ పిన్"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM కార్పొరేట్ అన్లాక్ పిన్"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"కొత్త మ్యాగ్నిఫికేషన్ సెట్టింగ్లు"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"మీరు ఇప్పుడు మీ స్క్రీన్ కొంత భాగాన్ని మాగ్నిఫై చేయవచ్చు"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"సెట్టింగ్లలో ఆన్ చేయండి"</string>
<string name="dismiss_action" msgid="1728820550388704784">"విస్మరించు"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"కొనసాగించడానికి, <b><xliff:g id="APP">%s</xliff:g></b>కు మీ పరికరం యొక్క మైక్రోఫోన్ యాక్సెస్ అవసరం."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index c46c43b..fe86299 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"อนุญาตให้แอปค้นหาและจับคู่อุปกรณ์บลูทูธที่อยู่ใกล้เคียง"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"เชื่อมต่อกับอุปกรณ์บลูทูธที่จับคู่"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"อนุญาตให้แอปเชื่อมต่อกับอุปกรณ์บลูทูธที่จับคู่"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ข้อมูลบริการชำระเงิน NFC ที่ต้องการ"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"อนุญาตให้แอปรับข้อมูลบริการชำระเงิน NFC ที่ต้องการ เช่น รหัสแอป (AID) ที่ลงทะเบียนและปลายทางของเส้นทาง"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"ควบคุม Near Field Communication"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"ไม่ได้ตั้ง PIN, รูปแบบ หรือรหัสผ่าน"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"การตรวจสอบข้อผิดพลาด"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"ใช้การล็อกหน้าจอ"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"ป้อนข้อมูลเข้าสู่ระบบอุปกรณ์เพื่อดำเนินการต่อ"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ประมวลผลลายนิ้วมือไม่ได้ โปรดลองอีกครั้ง"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ปลดล็อกด้วยใบหน้า"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ลงทะเบียนใบหน้าอีกครั้ง"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"ตั้งค่าการปลดล็อกด้วยใบหน้า"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"ปลดล็อกโทรศัพท์โดยมองไปที่โทรศัพท์"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ตั้งค่าการปลดล็อกด้วยวิธีอื่น"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"แตะเพื่อเพิ่มลายนิ้วมือ"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"สว่างเกินไป ลองหาตำแหน่งที่แสงน้อยกว่านี้"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"มืดเกินไป ลองหาตำแหน่งที่สว่างขึ้น"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"ใบหน้า <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"ใช้การปลดล็อกด้วยใบหน้า"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ใช้การล็อกด้วยใบหน้าหรือการล็อกหน้าจอ"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"ใช้การปลดล็อกด้วยใบหน้าเพื่อดำเนินการต่อ"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ใช้ใบหน้าหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"คัดลอกแล้ว"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"วาง <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> จาก <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> แล้ว"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"วาง <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> จากคลิปบอร์ดแล้ว"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> วางข้อความที่คุณคัดลอก"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> วางรูปภาพที่คุณคัดลอก"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> วางเนื้อหาที่คุณคัดลอก"</string>
<string name="more_item_label" msgid="7419249600215749115">"เพิ่มเติม"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"เมนู+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"งาน"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"มุมมองส่วนตัว"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ดูงาน"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"ผู้ดูแลระบบไอทีบล็อกไว้"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"แชร์เนื้อหานี้โดยใช้แอปงานไม่ได้"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"เปิดเนื้อหานี้โดยใช้แอปงานไม่ได้"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"แชร์เนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"เปิดเนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"โปรไฟล์งานหยุดชั่วคราว"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"แตะเพื่อเปิด"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ไม่มีแอปงาน"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ไม่มีแอปส่วนตัว"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"เปิดใน <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์ส่วนตัวไหม"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"เปิดใน <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์งานไหม"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ใช้เบราว์เซอร์ส่วนตัว"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"ใช้เบราว์เซอร์งาน"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ปลดล็อกเครือข่ายที่ใช้กับ SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN ปลดล็อกเครือข่ายย่อยที่ใช้กับ SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN ปลดล็อกองค์กรที่ใช้กับ SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"การตั้งค่าการขยายใหม่"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"คุณขยายบางส่วนของหน้าจอได้แล้วตอนนี้"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"เปิดในการตั้งค่า"</string>
<string name="dismiss_action" msgid="1728820550388704784">"ปิด"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"<b><xliff:g id="APP">%s</xliff:g></b> ต้องได้รับสิทธิ์เข้าถึงไมโครโฟนของอุปกรณ์เพื่อดำเนินการต่อ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 790c25e..d647ddd 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Nagbibigay-daan sa app na tumuklas at makipagpares sa mga malapit na Bluetooth device"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kumonekta sa mga nakapares na Bluetooth device"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Nagbibigay-daan sa app na kumonekta sa mga nakapares na Bluetooth device"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Impormasyon sa Gustong NFC na Serbisyo sa Pagbabayad"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pinapayagan ang app na makakuha ng impormasyon sa gustong nfc na serbisyo sa pagbabayad tulad ng mga nakarehistrong application ID at destinasyon ng ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kontrolin ang Near Field Communication"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Walang itinakdang pin, pattern, o password"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Nagkaroon ng error sa pag-authenticate"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Gumamit ng lock ng screen"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Ilagay ang kredensyal ng device para magpatuloy"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Hindi maproseso ang fingerprint. Pakisubukan ulit."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"I-enroll ulit ang iyong mukha"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"I-set up ang face unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"I-unlock ang iyong telepono sa pamamagitan ng pagtingin dito"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Mag-set up ng higit pang paraan para mag-unlock"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"I-tap para magdagdag ng fingerprint"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Hindi makakuha ng tamang face data. Subukang muli."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Masyadong madilim. Subukan sa mas maliwanag."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Mukha <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Gumamit ng face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gumamit ng mukha o lock ng screen"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Gumamit ng face unlock para magpatuloy"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gamitin ang iyong mukha o lock ng screen para magpatuloy"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Nakopya"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Na-paste ang <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> mula sa <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Na-paste ang <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> mula sa clipboard"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Nag-paste ang <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ng text na nakopya mo"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Nag-paste ang <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ng larawang nakopya mo"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Nag-paste ang <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> ng content na nakopya mo"</string>
<string name="more_item_label" msgid="7419249600215749115">"Higit pa"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabaho"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal na view"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"View ng trabaho"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Na-block ng iyong IT admin"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Hindi puwedeng ibahagi sa mga app para sa trabaho ang content na ito"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Hindi puwedeng buksan sa mga app para sa trabaho ang content na ito"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hindi puwedeng ibahagi sa mga personal na app ang content na ito"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Hindi puwedeng buksan sa mga personal na app ang content na ito"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Naka-pause ang profile sa trabaho"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"I-tap para i-on"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Walang app para sa trabaho"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Walang personal na app"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buksan sa <xliff:g id="APP">%s</xliff:g> sa personal na profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buksan sa <xliff:g id="APP">%s</xliff:g> sa profile sa trabaho?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gamitin ang personal na browser"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gamitin ang browser sa trabaho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para sa pag-unlock ng network ng SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN para sa pag-unlock ng subset ng network ng SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN para sa pangkumpanyang pag-unlock ng SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Mga bagong setting ng pag-magnify"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Puwede mo na ngayong i-magnify ang isang bahagi ng iyong screen"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"I-on sa Mga Setting"</string>
<string name="dismiss_action" msgid="1728820550388704784">"I-dismiss"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Para magpatuloy, kailangan ng <b><xliff:g id="APP">%s</xliff:g></b> ng access sa mikropono ng iyong device."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index be54f7c..4ec9d7e 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Uygulamaya, yakındaki Bluetooth cihazları keşfedip eşleme izni verir"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"eşlenen Bluetooth cihazlara bağlan"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Uygulamaya, eşlenen Bluetooth cihazlara bağlanma izni verir"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Tercih Edilen NFC Ödeme Hizmeti Bilgileri"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Uygulamaya, kayıtlı yardımlar ve rota hedefi gibi tercih edilen NFC ödeme hizmeti bilgilerini alma izni verir."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Yakın Alan İletişimini denetle"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN, desen veya şifre seti yok"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Kimlik doğrulama sırasında hata oluştu"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ekran kilidi kullan"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Devam etmek için cihaz kimlik bilginizi girin"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Parmak izi işlenemedi. Lütfen tekrar deneyin."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Yüz tanıma kilidi"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Yüzünüzü yeniden kaydedin"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Yüz tanıma kilidini kurun"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonunuza bakarak kilidini açın"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kilidi açmak için daha fazla yöntem ayarlayın"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Parmak izi eklemek için dokunun"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Çok karanlık. Daha parlak ışıkta deneyin."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Yüz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Yüz tanıma kilidi kullan"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Yüz tanıma veya ekran kilidi kullan"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Devam etmek için yüz tanıma kilidini kullanın"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Devam etmek için yüz veya ekran kilidinizi kullanın"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kopyalandı"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> uygulaması <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> kaynağından yapıştırdı"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>, panodan yapıştırıldı."</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>, kopyaladığınız metni yapıştırdı"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>, kopyaladığınız resmi yapıştırdı"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>, kopyaladığınız içeriği yapıştırdı"</string>
<string name="more_item_label" msgid="7419249600215749115">"Diğer"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menü+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Kişisel görünüm"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"İş görünümü"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"BT yöneticiniz tarafından engellendi"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Bu içerik, iş uygulamalarıyla paylaşılamaz"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Bu içerik, iş uygulamalarıyla açılamaz"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Bu içerik, kişisel uygulamalarla paylaşılamaz"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Bu içerik, kişisel uygulamalarla açılamaz"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"İş profili duraklatıldı"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Açmak için dokunun"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş uygulaması yok"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Kişisel uygulama yok"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Kişisel profildeki <xliff:g id="APP">%s</xliff:g> uygulamasında açılsın mı?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"İş profilindeki <xliff:g id="APP">%s</xliff:g> uygulamasında açılsın mı?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kişisel tarayıcıyı kullan"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş tarayıcısını kullan"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ağ kilidi açma PIN kodu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM ağ alt kümesi kilidini açma PIN kodu"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM kurumsal kilidi açma PIN kodu"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Yeni büyütme ayarları"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Artık ekranınızın bir bölümünü büyütebilirsiniz"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Ayarlar\'da aç"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Kapat"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Devam etmek için <b><xliff:g id="APP">%s</xliff:g></b> uygulamasının cihazınızın mikrofonuna erişmesi gerekiyor."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 2cb286f..7774f56 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -545,6 +545,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Дозволяє додатку знаходити поблизу пристрої Bluetooth і створювати з ними пару"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"підключатися до пристроїв із Bluetooth, з якими є пара"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Дозволяє додатку підключатися до пристроїв із Bluetooth, з якими створено пару"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Використання інформації з платіжного NFC-сервісу"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволяє додатку отримувати доступ до інформації потрібного платіжного NFC-сервісу (наприклад, пов\'язаних ідентифікаторів чи даних про маршрутизацію трансакцій)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"контрол. Near Field Communication"</string>
@@ -579,7 +583,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Не вказано PIN-код, ключ або пароль"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Помилка автентифікації"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Доступ розблокуванням екрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Щоб продовжити, введіть дані для розблокування екрана пристрою"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не вдалось обробити відбиток пальця. Повторіть спробу."</string>
@@ -626,14 +631,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Фейсконтроль"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Повторно проскануйте обличчя"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Повторно проскануйте обличчя для ефективнішого розпізнавання"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Налаштуйте фейсконтроль"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Ви зможете розблоковувати телефон, подивившись на нього"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Налаштуйте більше способів розблокування"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Натисніть, щоб додати відбиток пальця"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Не вдалося чітко зняти обличчя. Повторіть спробу."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадто яскраво. Потрібно менше світла."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Занадто темно. Потрібно більше світла."</string>
@@ -670,7 +671,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Доступ через фейсконтроль"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Використовувати фейсконтроль або дані для розблокування екрана"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Щоб продовжити, скористайтеся фейсконтролем"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Щоб продовжити, скористайтеся фейсконтролем або даними для розблокування екрана"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1037,12 +1039,9 @@
<string name="copied" msgid="4675902854553014676">"Скопійовано"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"Дані з додатка <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> вставлено в <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Дані з буфера обміну вставлено в <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"Скопійований текст вставлено в додатку <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"Скопійоване зображення вставлено в додатку <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
+ <string name="pasted_content" msgid="646276353060777131">"Скопійований контент вставлено в додатку <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>"</string>
<string name="more_item_label" msgid="7419249600215749115">"Більше"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Меню+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2209,31 +2208,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Робоче"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Особистий перегляд"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Робочий перегляд"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Заблокував адміністратор"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Цим контентом не можна ділитися в робочих додатках"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Цей контент не можна відкривати в робочих додатках"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Цим контентом не можна ділитися в особистих додатках"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Цей контент не можна відкривати в особистих додатках"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Робочий профіль призупинено"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Торкніться, щоб увімкнути"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Немає робочих додатків"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Немає особистих додатків"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Відкрити в додатку <xliff:g id="APP">%s</xliff:g> в особистому профілі?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Відкрити в додатку <xliff:g id="APP">%s</xliff:g> у робочому профілі?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Використати особистий веб-переглядач"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Використати робочий веб-переглядач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код розблокування мережі SIM-карти"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"PIN-код розблокування підгрупи мереж SIM-карти"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"PIN-код розблокування корпоративної SIM-карти"</string>
@@ -2346,10 +2333,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Нові налаштування збільшення"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Тепер можна збільшувати частину екрана"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Увімкнути в налаштуваннях"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Закрити"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Щоб продовжити, надайте додатку <b><xliff:g id="APP">%s</xliff:g></b> доступ до мікрофона пристрою."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index c0f21c4..bbf771a 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"ایپ کو قریبی بلوٹوتھ آلات دریافت کرنے اور ان کا جوڑا بنانے کی اجازت دیں"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"جوڑا بنائے ہوئے بلوٹوتھ آلات سے منسلک کریں"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"ایپ کو جوڑا بنائے ہوئے بلوٹوتھ آلات سے منسلک کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"ترجیح شدہ NFC ادائیگی کی سروس کی معلومات"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ایپ کو رجسٹرشدہ ایڈز اور روٹ ڈسٹنیشن جیسی ترجیح شدہ nfc ادائیگی سروس کی معلومات حاصل کرنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"Near Field کمیونیکیشن کنٹرول کریں"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"کوئی پن، پیٹرن، یا پاس ورڈ سیٹ نہیں ہے"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"خرابی کی توثیق ہو رہی ہے"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"اسکرین لاک استعمال کریں"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"جاری رکھنے کیلئے اپنے آلے کی سند درج کریں"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"فنگر پرنٹ پر کارروائی نہیں کی جا سکی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
@@ -664,7 +669,8 @@
<string name="face_name_template" msgid="3877037340223318119">"چہرہ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"چہرے کے ذریعے غیر مقفل کرنا استعمال کریں"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"چہرہ یا اسکرین لاک استعمال کریں"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"جاری رکھنے کیلئے چہرے کے ذریعے غیر مقفل کرنا استعمال کریں"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"جاری رکھنے کے لیے اپنے چہرے یا اسکرین لاک کا استعمال کریں"</string>
<string-array name="face_error_vendor">
</string-array>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index f7ed329..1f3108f 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -294,8 +294,7 @@
<string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Ilova faol"</string>
<string name="notification_channel_foreground_service" msgid="7102189948158885178">"Batareya quvvatini sarflayotgan ilovalar"</string>
<string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Kattalashtirish"</string>
- <!-- no translation found for notification_channel_accessibility_security_policy (1727787021725251912) -->
- <skip />
+ <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Qulayliklar ishlatilishi"</string>
<string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi batareya quvvatini sarflamoqda"</string>
<string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> ta ilova batareya quvvatini sarflamoqda"</string>
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Batareya va trafik sarfi tafsilotlari uchun ustiga bosing"</string>
@@ -539,6 +538,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Ilovaga yaqin-atrofdagi Bluetooth qurilmalarini topish va juftlashish uchun ruxsat beradi"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"juftlangan Bluetooth qurilmalariga ulanish"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Ilovaga juftlangan Bluetooth qurilmalariga ulanish uchun ruxsat beradi"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Asosiy NFC toʻlov xizmati haqidagi axborot"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Bu ilovaga asosiy NFC toʻlov xizmati haqidagi axborotni olish imkonini beradi (masalan, qayd qilingan AID identifikatorlari va marshrutning yakuniy manzili)."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"NFC modulini boshqarish"</string>
@@ -573,29 +576,23 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"PIN kod, grafik kalit yoki parol sozlanmagan"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Autentifikatsiya amalga oshmadi"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Ekran qulfi"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Davom etish uchun qurilma kalitini kiritish"</string>
- <!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
<skip />
+ <string name="fingerprint_acquired_partial" msgid="694598777291084823">"Barmoq izi qismi aniqlandi"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Barmoq izi aniqlanmadi. Qaytadan urining."</string>
- <!-- no translation found for fingerprint_acquired_imager_dirty (5236744087471419479) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (1254724478300787385) -->
- <skip />
+ <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Sensorni tozalang"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1254724478300787385">"Barmoq juda tez olindi"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Barmoq juda sekin harakatlandi. Qayta urinib ko‘ring."</string>
- <!-- no translation found for fingerprint_acquired_already_enrolled (2285166003936206785) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_bright (3863560181670915607) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_try_adjusting (3667006071003809364) -->
- <skip />
+ <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Boshqa barmoq izi bilan urining"</string>
+ <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Juda yorqin"</string>
+ <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"Moslashga urining"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Barmoq izi tekshirildi"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Yuzingiz aniqlandi"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Yuzingiz aniqlandi, tasdiqlash uchun bosing"</string>
<string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"Barmoq izi skaneri ish holatida emas."</string>
- <!-- no translation found for fingerprint_error_no_space (7285481581905967580) -->
- <skip />
+ <string name="fingerprint_error_no_space" msgid="7285481581905967580">"Barmoq izi sozlanmadi"</string>
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Barmoq izi tekshiruvi bekor qilindi."</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Barmoq izi amali foydalanuvchi tomonidan bekor qilindi"</string>
@@ -620,14 +617,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Yuz bilan ochish"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Yuzingizni yana qayd qiling"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Yuz bilan ochishni sozlash"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefoningizni yuz tekshiruvi yordamida qulfdan chiqaring"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Qulfdan chiqarishning boshqa usullarini sozlang"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmoq izi kiritish uchun bosing"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Yuz ravshan suratga olinmadi. Qaytadan urining."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Juda yorqin. Biroz soyaroq joy tanlang."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Juda qorongʻi. Atrofingizni yoriting."</string>
@@ -664,7 +657,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Yuz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Yuz bilan ochish"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Yuz bilan ochish yoki ekran qulfi"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Davom etish uchun yuz bilan oching"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davom etish uchun yuz tekshiruvi yoki ekran qulfidan foydalaning"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1025,9 @@
<string name="copied" msgid="4675902854553014676">"Nusxalandi"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> ilovasidan <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> joylandi"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"Vaqtincha xotiradan <xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> joylandi"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> siz nusxa olgan matnni joyladi"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> siz nusxa olgan rasmni joyladi"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> siz nusxa olgan kontentni joyladi"</string>
<string name="more_item_label" msgid="7419249600215749115">"Yana"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Menyu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2132,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Ish"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Shaxsiy rejim"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ishchi rejim"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"AT administratori tomonidan bloklangan"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Bu kontent ishga oid ilovalar bilan ulashilmaydi"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Bu kontent ishga oid ilovalar bilan ochilmaydi"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Bu kontent shaxsiy ilovalar bilan ulashilmaydi"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Bu kontent shaxsiy ilovalar bilan ochilmaydi"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Ish profili pauzada"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Yoqish uchun bosing"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ishga oid ilovalar topilmadi"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Shaxsiy ilovalar topilmadi"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> orqali shaxsiy profilda ochilsinmi?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> orqali ish profilida ochilsinmi?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Shaxsiy brauzerdan foydalanish"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ishga oid brauzerdan foydalanish"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM kartaning tarmoqdagi qulfini ochish uchun PIN kod"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM karta tarmoq qismini qulfdan chiqarish uchun PIN kod"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Korporativ SIM kartalar qulfini ochish uchun PIN kod"</string>
@@ -2278,10 +2257,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Yangi kattalashtirish sozlamalari"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Ekranni qisman kattalashtirish mumkin"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Sozlamalar orqali yoqish"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Yopish"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Davom etish uchun <b><xliff:g id="APP">%s</xliff:g></b> mikrofoningizdan foydalanishi kerak."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index cabfdfa..55ead8a 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Cho phép ứng dụng khám phá và ghép nối với các thiết bị Bluetooth ở gần"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"kết nối với các thiết bị Bluetooth đã ghép nối"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Cho phép ứng dụng kết nối với thiết bị Bluetooth đã ghép nối"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Thông tin về dịch vụ thanh toán qua công nghệ giao tiếp tầm gần (NFC) được ưu tiên"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Cho phép ứng dụng nhận thông tin về dịch vụ thanh toán qua công nghệ giao tiếp tầm gần mà bạn ưu tiên, chẳng hạn như các hình thức hỗ trợ đã đăng ký và điểm đến trong hành trình."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"kiểm soát Liên lạc trường gần"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Chưa đặt mã PIN, hình mở khóa hoặc mật khẩu"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Lỗi khi xác thực"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Dùng phương thức khóa màn hình"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Nhập thông tin xác thực thiết bị của bạn để tiếp tục"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Không thể xử lý vân tay. Vui lòng thử lại."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Mở khóa bằng khuôn mặt"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Đăng ký lại khuôn mặt của bạn"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Thiết lập tính năng mở khóa bằng khuôn mặt"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Mở khóa điện thoại bằng cách nhìn vào điện thoại"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Thiết lập thêm những cách mở khóa khác"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Nhấn để thêm vân tay"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Quá sáng. Hãy thử giảm độ sáng."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Quá tối. Hãy thử tăng độ sáng."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Khuôn mặt <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Dùng tính năng mở khóa bằng khuôn mặt"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Dùng khuôn mặt hoặc phương thức khóa màn hình"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Dùng tính năng mở khóa bằng khuôn mặt để tiếp tục"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Dùng khuôn mặt của bạn hoặc phương thức khóa màn hình để tiếp tục"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Đã sao chép"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> đã dán dữ liệu từ <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> đã dán dữ liệu từ bảng nhớ tạm"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> đã dán văn bản mà bạn sao chép"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> đã dán một hình ảnh mà bạn sao chép"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> đã dán nội dung mà bạn sao chép"</string>
<string name="more_item_label" msgid="7419249600215749115">"Thêm"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Trình đơn+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Công việc"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Chế độ xem cá nhân"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Chế độ xem công việc"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bị quản trị viên CNTT chặn"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Bạn không thể chia sẻ nội dung này bằng ứng dụng công việc"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Bạn không thể mở nội dung này bằng ứng dụng công việc"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Bạn không thể chia sẻ nội dung này bằng ứng dụng cá nhân"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Bạn không thể mở nội dung này bằng ứng dụng cá nhân"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Hồ sơ công việc đã bị tạm dừng"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Nhấn để bật"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Không có ứng dụng công việc"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Không có ứng dụng cá nhân"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Mở trên <xliff:g id="APP">%s</xliff:g> trong hồ sơ cá nhân?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Mở trên <xliff:g id="APP">%s</xliff:g> trong hồ sơ công việc?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Dùng trình duyệt cá nhân"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Dùng trình duyệt công việc"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Mã PIN mở khóa mạng SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Mã PIN mở khóa tập con của mạng SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Mã PIN mở khóa SIM corporate"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Chế độ cài đặt phóng to mới"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Giờ đây, bạn có thể phóng to một phần màn hình"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bật trong phần Cài đặt"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Đóng"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Để tiếp tục, <b><xliff:g id="APP">%s</xliff:g></b> cần quyền truy cập vào micrô trên thiết bị của bạn."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index c8f035a..6ee5151 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允许该应用发现附近的蓝牙设备并与其配对"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"连接到已配对的蓝牙设备"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允许该应用连接到已配对的蓝牙设备"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"首选 NFC 付款服务信息"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允许应用获取首选 NFC 付款服务信息,例如注册的应用标识符和路线目的地。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距离通信"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"未设置任何 PIN 码、图案和密码"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"进行身份验证时出错"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"使用屏幕锁定凭据"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"输入您的设备凭据才能继续"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"无法处理指纹,请重试。"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"人脸解锁"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"重新注册您的面孔"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"要提升识别精确度,请重新注册您的面孔"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"设置人脸解锁"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"脸部对准手机即可将其解锁"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"设置更多解锁方式"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"点按即可添加指纹"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"无法捕获准确的人脸数据,请重试。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度过高,请尝试使用较柔和的亮度。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,请尝试将光线调亮。"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"面孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"使用人脸解锁"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用人脸解锁或屏幕锁定凭据"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"使用人脸解锁验证身份才能继续"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"使用人脸解锁或屏幕锁定凭据验证身份,才能继续操作"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"已复制"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>已粘贴从<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>复制的内容"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>已粘贴剪贴板中的内容"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>已粘贴您复制的文字"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>已粘贴您复制的图片"</string>
+ <string name="pasted_content" msgid="646276353060777131">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>已粘贴您复制的内容"</string>
<string name="more_item_label" msgid="7419249600215749115">"更多"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"MENU+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"个人视图"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作视图"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"已被 IT 管理员禁止"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"无法使用工作应用分享该内容"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"无法使用工作应用打开该内容"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"无法使用个人应用分享该内容"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"无法使用个人应用打开该内容"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"工作资料已被暂停"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"点按即可开启"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"没有支持该内容的工作应用"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"没有支持该内容的个人应用"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要使用个人资料在<xliff:g id="APP">%s</xliff:g>中打开吗?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"要使用工作资料在<xliff:g id="APP">%s</xliff:g>中打开吗?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用个人浏览器"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作浏览器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 网络解锁 PIN 码"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM 网络子集解锁 PIN 码"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM 企业解锁 PIN 码"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"推出了新的放大功能设置"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"现在您可以放大屏幕上的部分内容"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在“设置”中开启"</string>
<string name="dismiss_action" msgid="1728820550388704784">"关闭"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要继续操作,请向<b><xliff:g id="APP">%s</xliff:g></b>授予设备的麦克风使用权。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 68fef91..31d61ff 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允許應用程式探索並配對附近的藍牙裝置"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"連接附近的藍牙裝置"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允許應用程式連接已配對的藍牙裝置"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"由用戶允許授權的 NFC 付款服務資訊"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得由用戶允許授權的 NFC 付款服務資訊 (如已註冊的付款輔助功能和最終付款對象)。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"未設定 PIN、圖案或密碼"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"驗證時發生錯誤"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"使用螢幕鎖定"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"如要繼續操作,請輸入裝置憑證"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"無法處理指紋。請再試一次。"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"臉孔解鎖"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"重新註冊臉孔"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"如要提高識別能力,請重新註冊您的臉孔"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"設定臉孔解鎖功能"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"直望手機即可解鎖"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方法"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕按即可新增指紋"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取準確的臉容資料。請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"影像太亮。請嘗試在更暗的環境下使用。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"影像太暗。請嘗試在更明亮的環境下使用。"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"使用臉孔解鎖"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用臉孔或螢幕鎖定"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"如要繼續操作,請使用臉孔解鎖驗證身分"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用臉孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"已複製"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> 已貼上從 <xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g> 複製的資料"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> 已貼上剪貼簿中的資料"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"您複製的文字已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"您複製的圖片已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
+ <string name="pasted_content" msgid="646276353060777131">"您複製的內容已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
<string name="more_item_label" msgid="7419249600215749115">"更多"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"選單鍵 +"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"公司"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作檢視模式"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"已被您的 IT 管理員封鎖"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"無法使用工作應用程式分享此內容"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"無法使用工作應用程式開啟此內容"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"無法使用個人應用程式分享此內容"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"無法使用個人應用程式開啟此內容"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"工作設定檔已暫停使用"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"輕按即可啟用"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要在個人設定檔中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"要在工作設定檔中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 網絡解鎖 PIN"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM 網絡子集解鎖 PIN"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM 公司解鎖 PIN"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"放大功能推出新設定"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"您現在可以放大部分畫面"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在「設定」中開啟"</string>
<string name="dismiss_action" msgid="1728820550388704784">"關閉"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要繼續,<b><xliff:g id="APP">%s</xliff:g></b> 需要裝置的麥克風存取權。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1ab5024..23b083f 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"允許應用程式探索鄰近藍牙裝置並進行配對"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"與已配對的藍牙裝置連線"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"允許應用程式與已配對的藍牙裝置連線"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"首選 NFC 付費服務資訊"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得首選 NFC 付費服務資訊,例如已註冊的輔助工具和路線目的地。"</string>
<string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"未設定 PIN 碼、解鎖圖案或密碼"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"驗證時發生錯誤"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"使用螢幕鎖定功能"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"如要繼續操作,請輸入裝置憑證"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"無法處理指紋,請再試一次。"</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"人臉解鎖"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"請重新註冊你的臉孔"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"為提升辨識精準度,請重新註冊你的臉孔"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"設定人臉解鎖功能"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"看著手機就能解鎖"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方式"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕觸即可新增指紋"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取精準臉孔資料,請再試一次。"</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度過高,請嘗試使用較柔和的照明方式。"</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,請嘗試使用較明亮的照明方式。"</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"使用人臉解鎖功能"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用人臉解鎖或螢幕鎖定功能"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"如要繼續操作,請使用人臉解鎖功能驗證身分"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用人臉解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"已複製"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」已貼上從「<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>」複製的資料"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」已貼上剪貼簿中的資料"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"你複製的文字已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"你複製的圖片已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
+ <string name="pasted_content" msgid="646276353060777131">"你複製的內容已貼到「<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g>」"</string>
<string name="more_item_label" msgid="7419249600215749115">"更多"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"[Menu] +"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta +"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作檢視模式"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"IT 管理員已封鎖這項操作"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"無法透過工作應用程式分享這項內容"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"無法使用工作應用程式開啟這項內容"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"無法透過個人應用程式分享這項內容"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"無法使用個人應用程式開啟這項內容"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"工作資料夾已暫停使用"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"輕觸即可啟用"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要使用個人資料夾中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"要使用工作資料夾中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 卡網路解鎖 PIN 碼"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"SIM 卡網路子集解鎖 PIN 碼"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"SIM 卡企業解鎖 PIN 碼"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"放大功能推出新設定"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"你現在可以放大局部畫面了"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在「設定」中開啟"</string>
<string name="dismiss_action" msgid="1728820550388704784">"關閉"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"如要繼續操作,請將裝置的麥克風存取權授予「<xliff:g id="APP">%s</xliff:g>」<b></b>。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index d6fcb0d..eff5a5f 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -539,6 +539,10 @@
<string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Kuvumela i-app ithole futhi ibhangqe amadivayisi we-Bluetooth aseduze"</string>
<string name="permlab_bluetooth_connect" msgid="6657463246355003528">"xhuma kumadivayisi we-Bluetooth abhangqiwe"</string>
<string name="permdesc_bluetooth_connect" product="default" msgid="4546016548795544617">"Kuvumela i-app ixhume kumadivayisi we-Bluetooth abhangqiwe"</string>
+ <!-- no translation found for permlab_uwb_ranging (1386872477514626447) -->
+ <skip />
+ <!-- no translation found for permdesc_uwb_ranging (1583519616137382182) -->
+ <skip />
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Ulwazi Lwesevisi Yenkokhelo Ye-NFC Okhethwayo"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ivuemela uhlelo lokusebenza ukuthola ulwazi lesevisi yenkokhelo ye-nfc njengezinsiza zokubhalisa nezindawo zomzila."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"lawula Uxhumano Lwenkambu Eseduze"</string>
@@ -573,7 +577,8 @@
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Ayikho iphinikhodi, iphethini, noma iphasiwedi esethiwe"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Iphutha lokufakazela ubuqiniso"</string>
<string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Sebenzisa isikhiya sesikrini"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="8638638125397857315">"Faka izifakazelo zedivayisi yakho ukuze uqhubeke"</string>
+ <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) -->
+ <skip />
<!-- no translation found for fingerprint_acquired_partial (694598777291084823) -->
<skip />
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ayikwazanga ukucubungula izigxivizo zeminwe. Sicela uzame futhi."</string>
@@ -620,14 +625,10 @@
<string name="face_recalibrate_notification_name" msgid="6006095897989257026">"I-Face unlock"</string>
<string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Phinda ubhalise ubuso bakho"</string>
<string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho"</string>
- <!-- no translation found for face_setup_notification_title (550617822603450009) -->
- <skip />
- <!-- no translation found for face_setup_notification_content (5463999831057751676) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_title (2002630611398849495) -->
- <skip />
- <!-- no translation found for fingerprint_setup_notification_content (205578121848324852) -->
- <skip />
+ <string name="face_setup_notification_title" msgid="550617822603450009">"Setha i-face unlock"</string>
+ <string name="face_setup_notification_content" msgid="5463999831057751676">"Vula ifoni yakho ngokuyibheka"</string>
+ <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Setha izindlela eziningi zokuvula"</string>
+ <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Thepha ukuze ungeze izigxivizo zomunwe"</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string>
<string name="face_acquired_too_dark" msgid="252573548464426546">"Kumnyama kakhulu Zama ukukhanyisa okukhanyayo."</string>
@@ -664,7 +665,8 @@
<string name="face_name_template" msgid="3877037340223318119">"Ubuso be-<xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="8130135875458467243">"Sebenzisa i-face unlock"</string>
<string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Sebenzisa i-face lock noma ukukhiya isikrini"</string>
- <string name="face_dialog_default_subtitle" msgid="4979205739418564856">"Sebenzisa i-face unlock ukuze uqhubeke"</string>
+ <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) -->
+ <skip />
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Sebenzisa ubuso bakho noma ukukhiya isikrini ukuze uqhubeke"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1031,12 +1033,9 @@
<string name="copied" msgid="4675902854553014676">"Kukopishiwe"</string>
<string name="pasted_from_app" msgid="5627698450808256545">"I-<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> inamathiselwe kusuka ku-<xliff:g id="SOURCE_APP_NAME">%2$s</xliff:g>"</string>
<string name="pasted_from_clipboard" msgid="6295556725844421812">"I-<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> inamathiselwe kusuka ebhodini yokunamathisela"</string>
- <!-- no translation found for pasted_text (4298871641549173733) -->
- <skip />
- <!-- no translation found for pasted_image (4729097394781491022) -->
- <skip />
- <!-- no translation found for pasted_content (646276353060777131) -->
- <skip />
+ <string name="pasted_text" msgid="4298871641549173733">"U-<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> unamathisele umbhalo owukopishile"</string>
+ <string name="pasted_image" msgid="4729097394781491022">"U-<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> unamathisele isithombe osikopishile"</string>
+ <string name="pasted_content" msgid="646276353060777131">"U-<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> unamathisele okuqukethwe okukopishile"</string>
<string name="more_item_label" msgid="7419249600215749115">"Okuningi"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Imenyu+"</string>
<string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
@@ -2141,31 +2140,19 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Umsebenzi"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ukubuka komuntu siqu"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ukubuka komsebenzi"</string>
- <!-- no translation found for resolver_cross_profile_blocked (3014597376026044840) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_work_apps_explanation (9071442683080586643) -->
- <skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (1129960195389373279) -->
- <skip />
- <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (6349766201904601544) -->
- <skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1679399548862724359) -->
- <skip />
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Kuvinjelwe umlawuli wakho we-IT"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Lokhu okuqukethwe akukwazi ukwabiwa nama-app womsebenzi"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Lokhu okuqukethwe akukwazi ukukopishwa ngama-app womsebenzi"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Lokhu okuqukethwe akukwazi ukwabiwa nama-app womuntu siqu"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Lokhu okuqukethwe akukwazi ukukopishwa ngama-app womuntu siqu"</string>
<string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Iphrofayela yomsebenzi iphunyuziwe"</string>
- <!-- no translation found for resolver_switch_on_work (463709043650610420) -->
- <skip />
- <!-- no translation found for resolver_no_work_apps_available (3298291360133337270) -->
- <skip />
- <!-- no translation found for resolver_no_personal_apps_available (6284837227019594881) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_personal (2937599899213467617) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (152208044699347924) -->
- <skip />
- <!-- no translation found for miniresolver_use_personal_browser (776072682871133308) -->
- <skip />
- <!-- no translation found for miniresolver_use_work_browser (543575306251952994) -->
- <skip />
+ <string name="resolver_switch_on_work" msgid="463709043650610420">"Thepha ukuze uvule"</string>
+ <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Awekho ama-app womsebenzi"</string>
+ <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Awekho ama-app womuntu siqu"</string>
+ <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vula ku-<xliff:g id="APP">%s</xliff:g> kuphrofayela yomuntu siqu?"</string>
+ <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vula ku-<xliff:g id="APP">%s</xliff:g> kuphrofayela yomsebenzi?"</string>
+ <string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Sebenzisa isiphequluli somuntu siqu"</string>
+ <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Sebenzisa isiphequluli somsebenzi"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Iphinikhodi yokuvula inethiwekhi ye-SIM"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY" msgid="7164399703751688214">"Iphinikhodi yokuvula yesethi engaphansi yenethiwekhi ye-SIM"</string>
<string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY" msgid="4447629474818217364">"Iphinikhodi yokuvula yenkampani ye-SIM"</string>
@@ -2278,10 +2265,8 @@
<string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
<string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
<string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
- <!-- no translation found for window_magnification_prompt_title (2876703640772778215) -->
- <skip />
- <!-- no translation found for window_magnification_prompt_content (8159173903032344891) -->
- <skip />
+ <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Amasethingi amasha wokukhuliswa"</string>
+ <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Manje ungakhulisa ingxenye yesikrini sakho"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Vula Kumasethingi"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Cashisa"</string>
<string name="sensor_privacy_start_use_mic_notification_content" msgid="8063355861118105607">"Ukuze uqhubeke, <b>i-<xliff:g id="APP">%s</xliff:g></b> idinga ukufinyelela imakrofoni yedivayisi yakho."</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index bf790fa..180fc12 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -59,7 +59,6 @@
<item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_no_calling</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_call_strength</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_sensors_off</xliff:g></item>
</string-array>
@@ -97,7 +96,6 @@
<string translatable="false" name="status_bar_camera">camera</string>
<string translatable="false" name="status_bar_airplane">airplane</string>
<string translatable="false" name="status_bar_no_calling">no_calling</string>
- <string translatable="false" name="status_bar_call_strength">call_strength</string>
<string translatable="false" name="status_bar_sensors_off">sensors_off</string>
<string translatable="false" name="status_bar_screen_record">screen_record</string>
@@ -3939,10 +3937,6 @@
color supplied by the Notification.Builder if present. -->
<bool name="config_tintNotificationActionButtons">true</bool>
- <!-- Flag indicating that tinted items (actions, expander, etc) are to be tinted using the
- theme color, rather than the notification color. -->
- <bool name="config_tintNotificationsWithTheme">true</bool>
-
<!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
<bool name="config_showAreaUpdateInfoSettings">false</bool>
@@ -4434,6 +4428,9 @@
-->
</integer-array>
+ <!-- Indicates whether device has a power button fingerprint sensor. -->
+ <bool name="config_is_powerbutton_fps" translatable="false" >false</bool>
+
<!-- Messages that should not be shown to the user during face auth enrollment. This should be
used to hide messages that may be too chatty or messages that the user can't do much about.
Entries are defined in android.hardware.biometrics.face@1.0 types.hal -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9e159f9..6cccdb5 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3030,12 +3030,12 @@
<!-- ===============================================================
Resources added in version S of the platform
- NOTE: add <public> elements within a <public-group> like so:
+ NOTE: add <public> elements within a <staging-public-group> like so:
- <public-group type="attr" first-id="0x01010531">
+ <staging-public-group type="attr" first-id="0x01010531">
<public name="exampleAttr1" />
<public name="exampleAttr2" />
- </public-group>
+ </staging-public-group>
To add a new public-group block, choose an id value that is 1 greater
than the last of that item above. For example, the last "attr" id
@@ -3044,7 +3044,7 @@
=============================================================== -->
<eat-comment />
- <public-group type="attr" first-id="0x01010617">
+ <staging-public-group type="attr" first-id="0x01010617">
<public name="rollbackDataPolicy" />
<public name="allowClickWhenDisabled" />
<public name="windowLayoutAffinity" />
@@ -3099,13 +3099,13 @@
<!-- @hide @SystemApi -->
<public name="throttleDurationMillis" />
<public name="showInInputMethodPicker" />
- </public-group>
+ </staging-public-group>
- <public-group type="drawable" first-id="0x010800b5">
+ <staging-public-group type="drawable" first-id="0x010800b5">
<!-- drawable definitions go here -->
- </public-group>
+ </staging-public-group>
- <public-group type="color" first-id="0x0106001d">
+ <staging-public-group type="color" first-id="0x0106001d">
<!-- color definitions go here -->
<!-- Material design dynamic system palette:-->
@@ -3171,26 +3171,26 @@
<public name="system_accent3_800" />
<public name="system_accent3_900" />
<public name="system_accent3_1000" />
- </public-group>
+ </staging-public-group>
- <public-group type="dimen" first-id="0x01050008">
+ <staging-public-group type="dimen" first-id="0x01050008">
<!-- dimension definitions go here -->
<!-- System-provided dimensions for app widgets. -->
<public name="system_app_widget_background_radius" />
<public name="system_app_widget_inner_radius" />
<public name="system_app_widget_internal_padding" />
- </public-group>
+ </staging-public-group>
- <public-group type="bool" first-id="0x01110007">
+ <staging-public-group type="bool" first-id="0x01110007">
<!-- boolean definitions go here -->
- </public-group>
+ </staging-public-group>
- <public-group type="style" first-id="0x010302e5">
+ <staging-public-group type="style" first-id="0x010302e5">
<!-- style definitions go here -->
- </public-group>
+ </staging-public-group>
- <public-group type="string" first-id="0x01040028">
+ <staging-public-group type="string" first-id="0x01040028">
<!-- @hide @SystemApi @TestApi -->
<public name="config_systemAutomotiveCluster" />
<!-- @hide @SystemApi @TestApi -->
@@ -3211,11 +3211,11 @@
<public name="config_systemWellbeing" />
<!-- @hide @SystemApi -->
<public name="config_systemTelevisionNotificationHandler" />
- </public-group>
+ </staging-public-group>
- <public-group type="id" first-id="0x01020055">
+ <staging-public-group type="id" first-id="0x01020055">
<!-- id definitions go here -->
- </public-group>
+ </staging-public-group>
<!-- ===============================================================
DO NOT ADD UN-GROUPED ITEMS HERE
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 58fa8de..61e766e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1485,6 +1485,11 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]-->
<string name="permdesc_bluetooth_connect" product="default">Allows the app to connect to paired Bluetooth devices</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50]-->
+ <string name="permlab_uwb_ranging">range to devices using ultra-wideband</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]-->
+ <string name="permdesc_uwb_ranging" product="default">Allows the app to range to devices using ultra-wideband</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_preferredPaymentInfo">Preferred NFC Payment Service Information</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 1ab3c84..eb1fe1d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1889,7 +1889,6 @@
<java-symbol type="bool" name="config_notificationHeaderClickableForExpand" />
<java-symbol type="bool" name="config_enableNightMode" />
<java-symbol type="bool" name="config_tintNotificationActionButtons" />
- <java-symbol type="bool" name="config_tintNotificationsWithTheme" />
<java-symbol type="bool" name="config_dozeAfterScreenOffByDefault" />
<java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" />
@@ -2559,6 +2558,7 @@
<java-symbol type="array" name="config_biometric_sensors" />
<java-symbol type="bool" name="allow_test_udfps" />
<java-symbol type="array" name="config_udfps_sensor_props" />
+ <java-symbol type="bool" name="config_is_powerbutton_fps" />
<java-symbol type="array" name="config_face_acquire_enroll_ignorelist" />
<java-symbol type="array" name="config_face_acquire_vendor_enroll_ignorelist" />
@@ -2974,7 +2974,6 @@
<java-symbol type="string" name="status_bar_clock" />
<java-symbol type="string" name="status_bar_airplane" />
<java-symbol type="string" name="status_bar_no_calling" />
- <java-symbol type="string" name="status_bar_call_strength" />
<java-symbol type="string" name="status_bar_mobile" />
<java-symbol type="string" name="status_bar_ethernet" />
<java-symbol type="string" name="status_bar_vpn" />
@@ -3571,7 +3570,7 @@
<java-symbol type="bool" name="config_quickSettingsSupported" />
- <java-symbol type="style" name="Theme.DeviceDefault.QuickSettings" />
+ <java-symbol type="style" name="Theme.DeviceDefault.SystemUI" />
<java-symbol type="integer" name="default_data_warning_level_mb" />
<java-symbol type="bool" name="config_useVideoPauseWorkaround" />
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index e40e31e..ca4265a 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -1884,9 +1884,7 @@
<item name="opacityListDivider">@color/list_divider_opacity_device_default_light</item>
</style>
- <!-- @hide DeviceDefault theme for a window that should use Settings theme colors
- but has a full dark palette. ONLY USED FOR QUICK SETTINGS THEME -->
- <style name="Theme.DeviceDefault.QuickSettings" parent="Theme.DeviceDefault.Light">
+ <style name="Theme.DeviceDefault.SystemUI" parent="Theme.DeviceDefault.Light">
<!-- Color palette -->
<item name="colorPrimary">@color/primary_device_default_settings_light</item>
<item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
@@ -1914,7 +1912,7 @@
<item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
</style>
- <style name="Theme.DeviceDefault.QuickSettings.Dialog" parent="Theme.DeviceDefault.Light.Dialog">
+ <style name="Theme.DeviceDefault.SystemUI.Dialog" parent="Theme.DeviceDefault.Light.Dialog">
<!-- Color palette -->
<item name="colorPrimary">@color/primary_device_default_settings_light</item>
<item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
index dbe5773..0f3bb1d 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
@@ -16,261 +16,99 @@
package com.android.frameworks.core.batterystatsloadtests;
-import android.os.Process;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
+import android.os.BatteryConsumer;
+import android.os.BatteryUsageStats;
+import android.os.UidBatteryConsumer;
+import android.util.DebugUtils;
+import android.util.Range;
import java.util.ArrayList;
import java.util.List;
public class PowerMetrics {
- private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar";
- private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media";
- private static final String PACKAGE_SYSTEMUI = "com.android.systemui";
- private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER,
- PACKAGE_CALENDAR_PROVIDER, PACKAGE_SYSTEMUI};
enum MetricKind {
POWER,
DURATION,
}
- public static final String METRIC_APP_POWER = "appPower";
- public static final String METRIC_APP_POWER_EXCLUDE_SYSTEM_FROM_TOTAL = "appPowerExcludeSystem";
- public static final String METRIC_APP_POWER_EXCLUDE_SMEARED = "appPowerExcludeSmeared";
- public static final String METRIC_SCREEN_POWER = "screenPower";
- public static final String METRIC_WIFI_POWER = "wifiPower";
- public static final String METRIC_SYSTEM_SERVICE_CPU_POWER = "systemService";
- public static final String METRIC_OTHER_POWER = "otherPower";
- public static final String METRIC_CPU_POWER = "cpuPower";
- public static final String METRIC_RAM_POWER = "ramPower";
- public static final String METRIC_WAKELOCK_POWER = "wakelockPower";
- public static final String METRIC_MOBILE_RADIO_POWER = "mobileRadioPower";
- public static final String METRIC_BLUETOOTH_POWER = "bluetoothPower";
- public static final String METRIC_GPS_POWER = "gpsPower";
- public static final String METRIC_CAMERA_POWER = "cameraPower";
- public static final String METRIC_FLASHLIGHT_POWER = "flashlightPower";
- public static final String METRIC_SENSORS_POWER = "sensorsPower";
- public static final String METRIC_AUDIO_POWER = "audioPower";
- public static final String METRIC_VIDEO_POWER = "videoPower";
- public static final String METRIC_CPU_TIME = "cpuTime";
- public static final String METRIC_CPU_FOREGROUND_TIME = "cpuForegroundTime";
- public static final String METRIC_WAKELOCK_TIME = "wakelockTime";
- public static final String METRIC_WIFI_RUNNING_TIME = "wifiRunningTime";
- public static final String METRIC_BLUETOOTH_RUNNING_TIME = "bluetoothRunningTime";
- public static final String METRIC_GPS_TIME = "gpsTime";
- public static final String METRIC_CAMERA_TIME = "cameraTime";
- public static final String METRIC_FLASHLIGHT_TIME = "flashlightTime";
- public static final String METRIC_AUDIO_TIME = "audioTime";
- public static final String METRIC_VIDEO_TIME = "videoTime";
-
public static class Metric {
- public String metricType;
+ public String metricName;
public MetricKind metricKind;
- public String title;
+ public String statusKeyPrefix;
public double value;
public double total;
}
- private final double mMinDrainedPower;
- private final double mMaxDrainedPower;
+ private final double mDrainedPower;
private List<Metric> mMetrics = new ArrayList<>();
- public PowerMetrics(BatteryStatsHelper batteryStatsHelper, int uid) {
- mMinDrainedPower = batteryStatsHelper.getMinDrainedPower();
- mMaxDrainedPower = batteryStatsHelper.getMaxDrainedPower();
+ public PowerMetrics(BatteryUsageStats batteryUsageStats, int uid) {
+ final Range<Double> dischargedPowerRange = batteryUsageStats.getDischargedPowerRange();
+ mDrainedPower = (dischargedPowerRange.getLower() + dischargedPowerRange.getUpper()) / 2;
+ double[] totalPowerPerComponentMah = new double[BatteryConsumer.POWER_COMPONENT_COUNT];
+ long[] totalDurationPerComponentMs = new long[BatteryConsumer.POWER_COMPONENT_COUNT];
- List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
-
- double totalPowerMah = 0;
- double totalSmearedPowerMah = 0;
- double totalPowerExcludeSystemMah = 0;
- double totalScreenPower = 0;
- double totalProportionalSmearMah = 0;
- double totalCpuPowerMah = 0;
- double totalSystemServiceCpuPowerMah = 0;
- double totalUsagePowerMah = 0;
- double totalWakeLockPowerMah = 0;
- double totalMobileRadioPowerMah = 0;
- double totalWifiPowerMah = 0;
- double totalBluetoothPowerMah = 0;
- double totalGpsPowerMah = 0;
- double totalCameraPowerMah = 0;
- double totalFlashlightPowerMah = 0;
- double totalSensorPowerMah = 0;
- double totalAudioPowerMah = 0;
- double totalVideoPowerMah = 0;
-
- long totalCpuTimeMs = 0;
- long totalCpuFgTimeMs = 0;
- long totalWakeLockTimeMs = 0;
- long totalWifiRunningTimeMs = 0;
- long totalBluetoothRunningTimeMs = 0;
- long totalGpsTimeMs = 0;
- long totalCameraTimeMs = 0;
- long totalFlashlightTimeMs = 0;
- long totalAudioTimeMs = 0;
- long totalVideoTimeMs = 0;
-
- BatterySipper uidSipper = null;
- for (BatterySipper sipper : usageList) {
- if (sipper.drainType == BatterySipper.DrainType.SCREEN) {
- totalScreenPower = sipper.sumPower();
+ UidBatteryConsumer selectedBatteryConsumer = null;
+ for (UidBatteryConsumer uidBatteryConsumer : batteryUsageStats.getUidBatteryConsumers()) {
+ if (uidBatteryConsumer.getUid() == uid) {
+ selectedBatteryConsumer = uidBatteryConsumer;
}
- if (isHiddenDrainType(sipper.drainType)) {
- continue;
+ for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT;
+ component++) {
+ totalPowerPerComponentMah[component] += uidBatteryConsumer.getConsumedPower(
+ component);
}
- if (sipper.drainType == BatterySipper.DrainType.APP && sipper.getUid() == uid) {
- uidSipper = sipper;
+ for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) {
+ totalDurationPerComponentMs[component] +=
+ uidBatteryConsumer.getUsageDurationMillis(component);
}
-
- totalPowerMah += sipper.sumPower();
- totalSmearedPowerMah += sipper.totalSmearedPowerMah;
- totalProportionalSmearMah += sipper.proportionalSmearMah;
-
- if (!isSystemSipper(sipper)) {
- totalPowerExcludeSystemMah += sipper.totalSmearedPowerMah;
- }
-
- totalCpuPowerMah += sipper.cpuPowerMah;
- totalSystemServiceCpuPowerMah += sipper.systemServiceCpuPowerMah;
- totalUsagePowerMah += sipper.usagePowerMah;
- totalWakeLockPowerMah += sipper.wakeLockPowerMah;
- totalMobileRadioPowerMah += sipper.mobileRadioPowerMah;
- totalWifiPowerMah += sipper.wifiPowerMah;
- totalBluetoothPowerMah += sipper.bluetoothPowerMah;
- totalGpsPowerMah += sipper.gpsPowerMah;
- totalCameraPowerMah += sipper.cameraPowerMah;
- totalFlashlightPowerMah += sipper.flashlightPowerMah;
- totalSensorPowerMah += sipper.sensorPowerMah;
- totalAudioPowerMah += sipper.audioPowerMah;
- totalVideoPowerMah += sipper.videoPowerMah;
-
- totalCpuTimeMs += sipper.cpuTimeMs;
- totalCpuFgTimeMs += sipper.cpuFgTimeMs;
- totalWakeLockTimeMs += sipper.wakeLockTimeMs;
- totalWifiRunningTimeMs += sipper.wifiRunningTimeMs;
- totalBluetoothRunningTimeMs += sipper.bluetoothRunningTimeMs;
- totalGpsTimeMs += sipper.gpsTimeMs;
- totalCameraTimeMs += sipper.cameraTimeMs;
- totalFlashlightTimeMs += sipper.flashlightTimeMs;
- totalAudioTimeMs += sipper.audioTimeMs;
- totalVideoTimeMs += sipper.videoTimeMs;
}
- if (uidSipper == null) {
+ if (selectedBatteryConsumer == null) {
return;
}
- addMetric(METRIC_APP_POWER, MetricKind.POWER, "Total power",
- uidSipper.totalSmearedPowerMah, totalSmearedPowerMah);
- addMetric(METRIC_APP_POWER_EXCLUDE_SYSTEM_FROM_TOTAL, MetricKind.POWER,
- "Total power excluding system",
- uidSipper.totalSmearedPowerMah, totalPowerExcludeSystemMah);
- addMetric(METRIC_SCREEN_POWER, MetricKind.POWER, "Screen, smeared",
- uidSipper.screenPowerMah, totalScreenPower);
- addMetric(METRIC_OTHER_POWER, MetricKind.POWER, "Other, smeared",
- uidSipper.proportionalSmearMah, totalProportionalSmearMah);
- addMetric(METRIC_APP_POWER_EXCLUDE_SMEARED, MetricKind.POWER, "Excluding smeared",
- uidSipper.totalPowerMah, totalPowerMah);
- addMetric(METRIC_CPU_POWER, MetricKind.POWER, "CPU",
- uidSipper.cpuPowerMah, totalCpuPowerMah);
- addMetric(METRIC_SYSTEM_SERVICE_CPU_POWER, MetricKind.POWER, "System services",
- uidSipper.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah);
- addMetric(METRIC_RAM_POWER, MetricKind.POWER, "RAM",
- uidSipper.usagePowerMah, totalUsagePowerMah);
- addMetric(METRIC_WAKELOCK_POWER, MetricKind.POWER, "Wake lock",
- uidSipper.wakeLockPowerMah, totalWakeLockPowerMah);
- addMetric(METRIC_MOBILE_RADIO_POWER, MetricKind.POWER, "Mobile radio",
- uidSipper.mobileRadioPowerMah, totalMobileRadioPowerMah);
- addMetric(METRIC_WIFI_POWER, MetricKind.POWER, "WiFi",
- uidSipper.wifiPowerMah, totalWifiPowerMah);
- addMetric(METRIC_BLUETOOTH_POWER, MetricKind.POWER, "Bluetooth",
- uidSipper.bluetoothPowerMah, totalBluetoothPowerMah);
- addMetric(METRIC_GPS_POWER, MetricKind.POWER, "GPS",
- uidSipper.gpsPowerMah, totalGpsPowerMah);
- addMetric(METRIC_CAMERA_POWER, MetricKind.POWER, "Camera",
- uidSipper.cameraPowerMah, totalCameraPowerMah);
- addMetric(METRIC_FLASHLIGHT_POWER, MetricKind.POWER, "Flashlight",
- uidSipper.flashlightPowerMah, totalFlashlightPowerMah);
- addMetric(METRIC_SENSORS_POWER, MetricKind.POWER, "Sensors",
- uidSipper.sensorPowerMah, totalSensorPowerMah);
- addMetric(METRIC_AUDIO_POWER, MetricKind.POWER, "Audio",
- uidSipper.audioPowerMah, totalAudioPowerMah);
- addMetric(METRIC_VIDEO_POWER, MetricKind.POWER, "Video",
- uidSipper.videoPowerMah, totalVideoPowerMah);
+ for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; component++) {
+ addMetric(getPowerMetricName(component), MetricKind.POWER,
+ selectedBatteryConsumer.getConsumedPower(component),
+ totalPowerPerComponentMah[component]);
+ }
- addMetric(METRIC_CPU_TIME, MetricKind.DURATION, "CPU time",
- uidSipper.cpuTimeMs, totalCpuTimeMs);
- addMetric(METRIC_CPU_FOREGROUND_TIME, MetricKind.DURATION, "CPU foreground time",
- uidSipper.cpuFgTimeMs, totalCpuFgTimeMs);
- addMetric(METRIC_WAKELOCK_TIME, MetricKind.DURATION, "Wake lock time",
- uidSipper.wakeLockTimeMs, totalWakeLockTimeMs);
- addMetric(METRIC_WIFI_RUNNING_TIME, MetricKind.DURATION, "WiFi running time",
- uidSipper.wifiRunningTimeMs, totalWifiRunningTimeMs);
- addMetric(METRIC_BLUETOOTH_RUNNING_TIME, MetricKind.DURATION, "Bluetooth time",
- uidSipper.bluetoothRunningTimeMs, totalBluetoothRunningTimeMs);
- addMetric(METRIC_GPS_TIME, MetricKind.DURATION, "GPS time",
- uidSipper.gpsTimeMs, totalGpsTimeMs);
- addMetric(METRIC_CAMERA_TIME, MetricKind.DURATION, "Camera time",
- uidSipper.cameraTimeMs, totalCameraTimeMs);
- addMetric(METRIC_FLASHLIGHT_TIME, MetricKind.DURATION, "Flashlight time",
- uidSipper.flashlightTimeMs, totalFlashlightTimeMs);
- addMetric(METRIC_AUDIO_TIME, MetricKind.DURATION, "Audio time",
- uidSipper.audioTimeMs, totalAudioTimeMs);
- addMetric(METRIC_VIDEO_TIME, MetricKind.DURATION, "Video time",
- uidSipper.videoTimeMs, totalVideoTimeMs);
+ for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) {
+ addMetric(getTimeMetricName(component), MetricKind.DURATION,
+ selectedBatteryConsumer.getUsageDurationMillis(component),
+ totalDurationPerComponentMs[component]);
+ }
+ }
+
+ static String getTimeMetricName(int componentId) {
+ return "TIME_" + DebugUtils.constantToString(BatteryConsumer.class,
+ "TIME_COMPONENT_", componentId);
+ }
+
+ static String getPowerMetricName(int componentId) {
+ return "POWER_" + DebugUtils.constantToString(BatteryConsumer.class,
+ "POWER_COMPONENT_", componentId);
}
public List<Metric> getMetrics() {
return mMetrics;
}
- public double getMinDrainedPower() {
- return mMinDrainedPower;
+ public double getDrainedPower() {
+ return mDrainedPower;
}
- public double getMaxDrainedPower() {
- return mMaxDrainedPower;
- }
-
- protected boolean isHiddenDrainType(BatterySipper.DrainType drainType) {
- return drainType == BatterySipper.DrainType.IDLE
- || drainType == BatterySipper.DrainType.CELL
- || drainType == BatterySipper.DrainType.SCREEN
- || drainType == BatterySipper.DrainType.UNACCOUNTED
- || drainType == BatterySipper.DrainType.OVERCOUNTED
- || drainType == BatterySipper.DrainType.BLUETOOTH
- || drainType == BatterySipper.DrainType.WIFI;
- }
-
- private boolean isSystemSipper(BatterySipper sipper) {
- final int uid = sipper.uidObj == null ? -1 : sipper.getUid();
- if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) {
- return true;
- } else if (sipper.mPackages != null) {
- for (final String packageName : sipper.mPackages) {
- for (final String systemPackage : PACKAGES_SYSTEM) {
- if (systemPackage.equals(packageName)) {
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
- private void addMetric(String metricType, MetricKind metricKind, String title, double amount,
+ private void addMetric(String metricType, MetricKind metricKind, double amount,
double totalAmount) {
Metric metric = new Metric();
- metric.metricType = metricType;
+ metric.metricName = metricType;
metric.metricKind = metricKind;
- metric.title = title;
+ metric.statusKeyPrefix = metricKind.toString().toLowerCase();
metric.value = amount;
metric.total = totalAmount;
mMetrics.add(metric);
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
index 254458c..5b5da60 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
@@ -19,47 +19,43 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.app.Activity;
import android.app.Instrumentation;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.os.BatteryConsumer;
import android.os.BatteryManager;
-import android.os.BatteryStats;
+import android.os.BatteryStatsManager;
import android.os.Bundle;
+import android.os.ConditionVariable;
import android.os.Process;
import android.os.SystemClock;
-import android.os.UserManager;
+import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.TimeUtils;
import androidx.test.platform.app.InstrumentationRegistry;
-import com.android.compatibility.common.util.SystemUtil;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.internal.os.LoggingPrintStream;
-
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
-import java.io.PrintStream;
+import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
public class PowerMetricsCollector implements TestRule {
private final String mTag;
private final float mBatteryDrainThresholdPct;
private final int mTimeoutMillis;
+ private final Instrumentation mInstrumentation;
private final Context mContext;
- private final UserManager mUserManager;
private final int mUid;
- private final BatteryStatsHelper mStatsHelper;
- private final CountDownLatch mSuspendingBatteryInput = new CountDownLatch(1);
+ private final ConditionVariable mSuspendingBatteryInput = new ConditionVariable();
private long mStartTime;
private volatile float mInitialBatteryLevel;
@@ -68,29 +64,34 @@
private PowerMetrics mInitialPowerMetrics;
private PowerMetrics mFinalPowerMetrics;
private List<PowerMetrics.Metric> mPowerMetricsDelta;
- private Intent mBatteryStatus;
+ private final BatteryStatsManager mBatteryStatsManager;
+ private final BroadcastReceiver mBatteryLevelReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ handleBatteryStatus(intent);
+ }
+ };
+ private final Bundle mStatus = new Bundle();
+ private final StringWriter mReportStringWriter = new StringWriter();
+ private final IndentingPrintWriter mReportWriter =
+ new IndentingPrintWriter(mReportStringWriter);
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
- BroadcastReceiver batteryBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- handleBatteryStatus(intent);
- }
- };
- mBatteryStatus = mContext.registerReceiver(batteryBroadcastReceiver,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
disableCharger();
try {
- prepareBatteryLevelMonitor();
mStartTime = SystemClock.uptimeMillis();
+ mContext.registerReceiver(mBatteryLevelReceiver,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
base.evaluate();
captureFinalPowerStatsData();
+ mStatus.putString("report", mReportStringWriter.toString());
+ mInstrumentation.sendStatus(Activity.RESULT_OK, mStatus);
} finally {
- mContext.unregisterReceiver(batteryBroadcastReceiver);
+ mContext.unregisterReceiver(mBatteryLevelReceiver);
enableCharger();
}
}
@@ -102,35 +103,41 @@
mBatteryDrainThresholdPct = batteryDrainThresholdPct;
mTimeoutMillis = timeoutMillis;
- Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
- mContext = instrumentation.getContext();
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getContext();
mUid = Process.myUid();
- mUserManager = mContext.getSystemService(UserManager.class);
- // TODO(b/175324611): Use BatteryUsageStats instead
- mStatsHelper = new BatteryStatsHelper(mContext, false /* collectBatteryBroadcast */);
- mStatsHelper.create((Bundle) null);
+ mBatteryStatsManager = mContext.getSystemService(BatteryStatsManager.class);
}
- private void disableCharger() throws InterruptedException {
- SystemUtil.runShellCommand("dumpsys battery suspend_input");
- final boolean success = mSuspendingBatteryInput.await(10, TimeUnit.SECONDS);
- assertTrue("Timed out waiting for battery input to be suspended", success);
+ private void disableCharger() {
+ final BroadcastReceiver receiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!isCharging(intent)) {
+ mInitialBatteryLevel = mCurrentBatteryLevel = getBatteryLevel(intent);
+ mSuspendingBatteryInput.open();
+ }
+ }
+ };
+ final Intent intent = mContext.registerReceiver(
+ receiver,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+
+ if (isCharging(intent)) {
+ mBatteryStatsManager.suspendBatteryInput();
+ final boolean success = mSuspendingBatteryInput.block(10000);
+ assertTrue("Timed out waiting for battery input to be suspended", success);
+ }
+
+ mContext.unregisterReceiver(receiver);
}
private void enableCharger() {
- SystemUtil.runShellCommand("dumpsys battery reset");
+ mBatteryStatsManager.resetBattery(/* forceUpdate */false);
}
private PowerMetrics readBatteryStatsData() {
- mStatsHelper.clearStats();
- mStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED,
- mUserManager.getUserProfiles());
- return new PowerMetrics(mStatsHelper, mUid);
- }
-
- protected void prepareBatteryLevelMonitor() {
- handleBatteryStatus(mBatteryStatus);
- mInitialBatteryLevel = mCurrentBatteryLevel;
+ return new PowerMetrics(mBatteryStatsManager.getBatteryUsageStats(), mUid);
}
protected void handleBatteryStatus(Intent intent) {
@@ -138,36 +145,35 @@
return;
}
- final boolean isCharging = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0;
-
- if (mSuspendingBatteryInput.getCount() > 0) {
- if (!isCharging) {
- mSuspendingBatteryInput.countDown();
- }
- return;
- }
-
- if (isCharging) {
+ if (isCharging(intent)) {
fail("Device must remain disconnected from the power source "
+ "for the duration of the test");
}
- int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
- int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
-
- mCurrentBatteryLevel = level * 100 / (float) scale;
+ mCurrentBatteryLevel = getBatteryLevel(intent);
Log.i(mTag, "Battery level = " + mCurrentBatteryLevel);
// We delay tracking until the battery level drops. If the resolution of
// battery level is 1%, and the initially reported level is 73, we don't know whether
// it's 73.1 or 73.7. Once it drops to 72, we can be confident that the real battery
- // level it is very close to 72.0 and can start tracking.
+ // level is very close to 72.0 and can start tracking.
if (mInitialPowerMetrics == null && mCurrentBatteryLevel < mInitialBatteryLevel) {
mInitialBatteryLevel = mCurrentBatteryLevel;
mInitialPowerMetrics = readBatteryStatsData();
}
}
+ private boolean isCharging(Intent intent) {
+ return intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0;
+ }
+
+ private float getBatteryLevel(Intent intent) {
+ int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
+ int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
+
+ return level * 100 / (float) scale;
+ }
+
private void captureFinalPowerStatsData() {
if (mFinalPowerMetrics != null) {
return;
@@ -181,7 +187,7 @@
for (PowerMetrics.Metric initialMetric : initialPowerMetrics) {
PowerMetrics.Metric finalMetric = null;
for (PowerMetrics.Metric metric : finalPowerMetrics) {
- if (metric.title.equals(initialMetric.title)) {
+ if (metric.metricName.equals(initialMetric.metricName)) {
finalMetric = metric;
break;
}
@@ -189,9 +195,9 @@
if (finalMetric != null) {
PowerMetrics.Metric delta = new PowerMetrics.Metric();
- delta.metricType = initialMetric.metricType;
+ delta.metricName = initialMetric.metricName;
delta.metricKind = initialMetric.metricKind;
- delta.title = initialMetric.title;
+ delta.statusKeyPrefix = initialMetric.statusKeyPrefix;
delta.total = finalMetric.total - initialMetric.total;
delta.value = finalMetric.value - initialMetric.value;
mPowerMetricsDelta.add(delta);
@@ -230,73 +236,80 @@
return mIterations;
}
- public void dumpMetrics() {
- dumpMetrics(new LoggingPrintStream() {
- @Override
- protected void log(String line) {
- Log.i(mTag, line);
- }
- });
+ public void report(String line) {
+ mReportWriter.println(line);
}
- public void dumpMetrics(PrintStream out) {
+ public void reportMetrics() {
List<PowerMetrics.Metric> initialPowerMetrics = mInitialPowerMetrics.getMetrics();
List<PowerMetrics.Metric> finalPowerMetrics = mFinalPowerMetrics.getMetrics();
- out.println("== Power metrics at test start");
- dumpPowerStatsData(out, initialPowerMetrics);
+ mReportWriter.println("Power metrics at test start");
+ mReportWriter.increaseIndent();
+ reportPowerStatsData(initialPowerMetrics);
+ mReportWriter.decreaseIndent();
- out.println("== Power metrics at test end");
- dumpPowerStatsData(out, finalPowerMetrics);
+ mReportWriter.println("Power metrics at test end");
+ mReportWriter.increaseIndent();
+ reportPowerStatsData(finalPowerMetrics);
+ mReportWriter.decreaseIndent();
- out.println("== Power metrics delta");
- dumpPowerStatsData(out, mPowerMetricsDelta);
+ mReportWriter.println("Power metrics delta");
+ mReportWriter.increaseIndent();
+ reportPowerStatsData(mPowerMetricsDelta);
+ mReportWriter.decreaseIndent();
}
- protected void dumpPowerStatsData(PrintStream out, List<PowerMetrics.Metric> metrics) {
+ protected void reportPowerStatsData(List<PowerMetrics.Metric> metrics) {
Locale locale = Locale.getDefault();
for (PowerMetrics.Metric metric : metrics) {
double proportion = metric.total != 0 ? metric.value * 100 / metric.total : 0;
switch (metric.metricKind) {
case POWER:
- out.println(
- String.format(locale, " %-30s %7.1f mAh %4.1f%%", metric.title,
+ mReportWriter.println(
+ String.format(locale, "%-40s %7.1f mAh %4.1f%%", metric.metricName,
metric.value, proportion));
break;
case DURATION:
- out.println(
- String.format(locale, " %-30s %,7d ms %4.1f%%", metric.title,
+ mReportWriter.println(
+ String.format(locale, "%-40s %,7d ms %4.1f%%", metric.metricName,
(long) metric.value, proportion));
break;
}
}
}
- public void dumpMetricAsPercentageOfDrainedPower(String metricType) {
- double minDrainedPower =
- mFinalPowerMetrics.getMinDrainedPower() - mInitialPowerMetrics.getMinDrainedPower();
- double maxDrainedPower =
- mFinalPowerMetrics.getMaxDrainedPower() - mInitialPowerMetrics.getMaxDrainedPower();
+ public void reportMetricAsPercentageOfDrainedPower(
+ @BatteryConsumer.PowerComponent int component) {
+ double drainedPower =
+ mFinalPowerMetrics.getDrainedPower() - mInitialPowerMetrics.getDrainedPower();
- PowerMetrics.Metric metric = getMetric(metricType);
+ PowerMetrics.Metric metric = getPowerMetric(component);
double metricDelta = metric.value;
- if (maxDrainedPower - minDrainedPower < 0.1f) {
- Log.i(mTag, String.format(Locale.getDefault(),
- "%s power consumed by the test: %.1f of %.1f mAh (%.1f%%)",
- metric.title, metricDelta, maxDrainedPower,
- metricDelta / maxDrainedPower * 100));
- } else {
- Log.i(mTag, String.format(Locale.getDefault(),
- "%s power consumed by the test: %.1f of %.1f - %.1f mAh (%.1f%% - %.1f%%)",
- metric.title, metricDelta, minDrainedPower, maxDrainedPower,
- metricDelta / minDrainedPower * 100, metricDelta / maxDrainedPower * 100));
- }
+ final double percent = metricDelta / drainedPower * 100;
+ mStatus.putDouble(metric.statusKeyPrefix, metricDelta);
+ mStatus.putDouble(metric.statusKeyPrefix + "_pct", percent);
+
+ mReportWriter.println(String.format(Locale.getDefault(),
+ "%s power consumed by the test: %.1f of %.1f mAh (%.1f%%)",
+ metric.metricName, metricDelta, drainedPower, percent));
}
- public PowerMetrics.Metric getMetric(String metricType) {
+ public PowerMetrics.Metric getPowerMetric(@BatteryConsumer.PowerComponent int component) {
+ final String name = PowerMetrics.getPowerMetricName(component);
for (PowerMetrics.Metric metric : mPowerMetricsDelta) {
- if (metric.metricType.equals(metricType)) {
+ if (metric.metricName.equals(name)) {
+ return metric;
+ }
+ }
+ return null;
+ }
+
+ public PowerMetrics.Metric getTimeMetric(@BatteryConsumer.TimeComponent int component) {
+ final String name = PowerMetrics.getTimeMetricName(component);
+ for (PowerMetrics.Metric metric : mPowerMetricsDelta) {
+ if (metric.metricName.equals(name)) {
return metric;
}
}
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java
index 488469d..1ebc743 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java
@@ -23,7 +23,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
-import android.util.Log;
+import android.os.BatteryConsumer;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -58,12 +58,12 @@
assertNotNull(resolveInfo);
}
- mPowerMetricsCollector.dumpMetrics();
+ mPowerMetricsCollector.reportMetrics();
- Log.i(TAG, "==");
- Log.i(TAG, "Total system server calls made " + mPowerMetricsCollector.getIterationCount());
+ mPowerMetricsCollector.report(
+ "Total system server calls made: " + mPowerMetricsCollector.getIterationCount());
- mPowerMetricsCollector.dumpMetricAsPercentageOfDrainedPower(
- PowerMetrics.METRIC_SYSTEM_SERVICE_CPU_POWER);
+ mPowerMetricsCollector.reportMetricAsPercentageOfDrainedPower(
+ BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES);
}
}
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java
index 27495da..15bb3fc 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java
@@ -16,7 +16,7 @@
package com.android.frameworks.core.batterystatsloadtests;
-import android.util.Log;
+import android.os.BatteryConsumer;
import org.junit.Rule;
import org.junit.Test;
@@ -59,14 +59,15 @@
}
}
- mPowerMetricsCollector.dumpMetrics();
+ mPowerMetricsCollector.reportMetrics();
- Log.i(TAG, "==");
- Log.i(TAG, "WiFi running time: " + (long) mPowerMetricsCollector.getMetric(
- PowerMetrics.METRIC_WIFI_RUNNING_TIME).value);
- Log.i(TAG, "Total bytes read over WiFi: " + totalBytesRead);
+ mPowerMetricsCollector.report(
+ "WiFi running time: " + (long) mPowerMetricsCollector.getTimeMetric(
+ BatteryConsumer.POWER_COMPONENT_WIFI).value);
- mPowerMetricsCollector.dumpMetricAsPercentageOfDrainedPower(
- PowerMetrics.METRIC_WIFI_POWER);
+ mPowerMetricsCollector.report("Total bytes read over WiFi: " + totalBytesRead);
+
+ mPowerMetricsCollector.reportMetricAsPercentageOfDrainedPower(
+ BatteryConsumer.POWER_COMPONENT_WIFI);
}
}
diff --git a/core/tests/coretests/src/android/app/NotificationHistoryTest.java b/core/tests/coretests/src/android/app/NotificationHistoryTest.java
index 3df0a68..bd493f4 100644
--- a/core/tests/coretests/src/android/app/NotificationHistoryTest.java
+++ b/core/tests/coretests/src/android/app/NotificationHistoryTest.java
@@ -29,6 +29,8 @@
import org.junit.runner.RunWith;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -327,6 +329,48 @@
}
@Test
+ public void testRemoveChannelFromWrite() {
+ NotificationHistory history = new NotificationHistory();
+
+ List<HistoricalNotification> postRemoveExpectedEntries = new ArrayList<>();
+ Set<String> postRemoveExpectedStrings = new HashSet<>();
+ for (int i = 1; i <= 10; i++) {
+ HistoricalNotification n = getHistoricalNotification("pkg", i);
+
+ // Remove channel numbers 5 and 6
+ if (i != 5 && i != 6) {
+ postRemoveExpectedStrings.add(n.getPackage());
+ postRemoveExpectedStrings.add(n.getChannelName());
+ postRemoveExpectedStrings.add(n.getChannelId());
+ if (n.getConversationId() != null) {
+ postRemoveExpectedStrings.add(n.getConversationId());
+ }
+ postRemoveExpectedEntries.add(n);
+ }
+
+ history.addNotificationToWrite(n);
+ }
+ // add second notification with the same channel id that will also be removed
+ history.addNotificationToWrite(getHistoricalNotification("pkg", 6));
+
+ history.poolStringsFromNotifications();
+
+ assertThat(history.getNotificationsToWrite().size()).isEqualTo(11);
+ // 1 package name and 20 unique channel names and ids and 5 conversation ids
+ assertThat(history.getPooledStringsToWrite().length).isEqualTo(26);
+
+ history.removeChannelFromWrite("pkg", "channelId5");
+ history.removeChannelFromWrite("pkg", "channelId6");
+
+ // 1 package names and 8 * 2 unique channel names and ids and 4 conversation ids
+ assertThat(history.getPooledStringsToWrite().length).isEqualTo(21);
+ assertThat(Arrays.asList(history.getPooledStringsToWrite()))
+ .containsExactlyElementsIn(postRemoveExpectedStrings);
+ assertThat(history.getNotificationsToWrite())
+ .containsExactlyElementsIn(postRemoveExpectedEntries);
+ }
+
+ @Test
public void testParceling() {
NotificationHistory history = new NotificationHistory();
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index 0ea6364..0f8c9e2 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -28,6 +28,7 @@
import android.content.Intent;
import android.content.LocusId;
import android.graphics.BitmapFactory;
+import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.media.session.MediaSession;
import android.os.Build;
@@ -60,7 +61,7 @@
public void testColorizedByPermission() {
Notification n = new Notification.Builder(mContext, "test")
.setFlag(Notification.FLAG_CAN_COLORIZE, true)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.build();
assertTrue(n.isColorized());
@@ -71,7 +72,7 @@
n = new Notification.Builder(mContext, "test")
.setFlag(Notification.FLAG_CAN_COLORIZE, false)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.build();
assertFalse(n.isColorized());
}
@@ -80,7 +81,7 @@
public void testColorizedByForeground() {
Notification n = new Notification.Builder(mContext, "test")
.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.build();
assertTrue(n.isColorized());
@@ -91,7 +92,7 @@
n = new Notification.Builder(mContext, "test")
.setFlag(Notification.FLAG_FOREGROUND_SERVICE, false)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.build();
assertFalse(n.isColorized());
}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
index cfdb2b7..8643a37 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java
@@ -163,4 +163,7 @@
public void setGestureDetectionPassthroughRegion(int displayId, Region region) {}
public void setFocusAppearance(int strokeWidth, int color) {}
+
+ public void logTrace(long timestamp, String where, String callingParams, int processId,
+ long threadId, int callingUid, Bundle callingStack) {}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
index c67f901..cf47efd 100644
--- a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
@@ -19,7 +19,6 @@
import static com.google.common.truth.Truth.assertThat;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.SystemBatteryConsumer;
import android.view.Display;
@@ -71,6 +70,8 @@
// 100,000,00 uC / 1000 (micro-/milli-) / 360 (seconds/hour) = 27.777778 mAh
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
.isWithin(PRECISION).of(27.777778);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
}
@Test
@@ -85,8 +86,7 @@
AmbientDisplayPowerCalculator calculator =
new AmbientDisplayPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(
@@ -95,5 +95,7 @@
.isEqualTo(90 * MINUTE_IN_MS);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
.isWithin(PRECISION).of(15.0);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
index 80ab36e..1e614c4 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
@@ -43,6 +43,12 @@
import java.util.Arrays;
public class BatteryUsageStatsRule implements TestRule {
+ public static final BatteryUsageStatsQuery POWER_PROFILE_MODEL_ONLY =
+ new BatteryUsageStatsQuery.Builder()
+ .powerProfileModeledOnly()
+ .includePowerModels()
+ .build();
+
private final PowerProfile mPowerProfile;
private final MockClocks mMockClocks = new MockClocks();
private final MockBatteryStatsImpl mBatteryStats = new MockBatteryStatsImpl(mMockClocks) {
@@ -156,7 +162,8 @@
}
BatteryUsageStats apply(PowerCalculator... calculators) {
- return apply(BatteryUsageStatsQuery.DEFAULT, calculators);
+ return apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(),
+ calculators);
}
BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) {
@@ -165,8 +172,10 @@
final int customMeasuredEnergiesCount = customMeasuredEnergiesMicroJoules != null
? customMeasuredEnergiesMicroJoules.length
: 0;
+ final boolean includePowerModels = (query.getFlags()
+ & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0;
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(
- customMeasuredEnergiesCount, 0);
+ customMeasuredEnergiesCount, 0, includePowerModels);
SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
for (int i = 0; i < uidStats.size(); i++) {
builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
index a18a88c..60df968 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
@@ -103,7 +103,10 @@
}
public void validateBatteryUsageStats(BatteryUsageStats batteryUsageStats) {
- assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(21500);
+ // Camera: (10100 + 10200) - 20000 (consumed by apps) = 300
+ // App: 300 + 400 + 500 = 1200
+ // Total: 1500
+ assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(1500);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(20);
assertThat(batteryUsageStats.getDischargedPowerRange().getLower()).isEqualTo(1000);
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()).isEqualTo(2000);
diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
index 2769b16..1a87c10 100644
--- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
@@ -19,6 +19,8 @@
import static com.google.common.truth.Truth.assertThat;
import android.annotation.Nullable;
+import android.bluetooth.BluetoothActivityEnergyInfo;
+import android.bluetooth.UidTraffic;
import android.os.BatteryConsumer;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
@@ -41,7 +43,8 @@
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
.setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_IDLE, 10.0)
.setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_RX, 50.0)
- .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_TX, 100.0);
+ .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_TX, 100.0)
+ .initMeasuredEnergyStatsLocked(0);
@Test
public void testTimerBasedModel() {
@@ -60,16 +63,15 @@
BluetoothPowerCalculator calculator =
new BluetoothPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(APP_UID),
- 0.24722, 15000);
+ 0.24722, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertBluetoothPowerAndDuration(
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
- 0.51944, 9000, 0.51944, 0.36111);
+ 0.51944, 9000, 0.51944, 0.36111, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
@Test
@@ -89,16 +91,40 @@
BluetoothPowerCalculator calculator =
new BluetoothPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
+
+ assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
+ assertBluetoothPowerAndDuration(
+ mStatsRule.getUidBatteryConsumer(APP_UID),
+ 0.2, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
+ assertBluetoothPowerAndDuration(
+ mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
+ 0.45, 9000, 0.45, 0.3, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
+ }
+
+ @Test
+ public void testMeasuredEnergyBasedModel() {
+ final BluetoothActivityEnergyInfo info = new BluetoothActivityEnergyInfo(1000,
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 7000, 5000, 0, 100000);
+ info.setUidTraffic(new UidTraffic[]{
+ new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
+ new UidTraffic(APP_UID, 3000, 4000)
+ });
+ mStatsRule.getBatteryStats().updateBluetoothStateLocked(info, 1200000, 1000, 1000);
+
+ final BluetoothPowerCalculator calculator =
+ new BluetoothPowerCalculator(mStatsRule.getPowerProfile());
+
+ mStatsRule.apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(),
calculator);
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(APP_UID),
- 0.2, 15000);
+ 0.22950, 8416, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertBluetoothPowerAndDuration(
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
- 0.45, 9000, 0.45, 0.3);
+ 0.43712, 3584, 0.43712, 0.33329, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
}
private void setDurationsAndPower(
@@ -111,12 +137,14 @@
}
private void assertBluetoothPowerAndDuration(@Nullable BatteryConsumer batteryConsumer,
- double powerMah, int durationMs) {
+ double powerMah, int durationMs, @BatteryConsumer.PowerModel int powerModel) {
assertThat(batteryConsumer).isNotNull();
double consumedPower = batteryConsumer.getConsumedPower(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
assertThat(consumedPower).isWithin(PRECISION).of(powerMah);
+ assertThat(batteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_BLUETOOTH))
+ .isEqualTo(powerModel);
long usageDurationMillis = batteryConsumer.getUsageDurationMillis(
BatteryConsumer.TIME_COMPONENT_BLUETOOTH);
@@ -125,8 +153,9 @@
}
private void assertBluetoothPowerAndDuration(@Nullable SystemBatteryConsumer batteryConsumer,
- double powerMah, int durationMs, double consumedPower, double attributedPower) {
- assertBluetoothPowerAndDuration(batteryConsumer, powerMah, durationMs);
+ double powerMah, int durationMs, double consumedPower, double attributedPower,
+ @BatteryConsumer.PowerModel int powerModel) {
+ assertBluetoothPowerAndDuration(batteryConsumer, powerMah, durationMs, powerModel);
assertThat(batteryConsumer.getConsumedPower())
.isWithin(PRECISION).of(consumedPower);
diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
index 13d529c..a181bc8 100644
--- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
@@ -186,6 +186,7 @@
sPerProcStateTimesAvailable = fgCpuTimes != null;
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testCpuFreqTimes() throws Exception {
if (!sCpuFreqTimesAvailable) {
@@ -214,6 +215,7 @@
batteryOffScreenOn();
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testCpuFreqTimes_screenOff() throws Exception {
if (!sCpuFreqTimesAvailable) {
@@ -276,6 +278,7 @@
batteryOffScreenOn();
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testCpuFreqTimes_stateTop() throws Exception {
if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) {
@@ -309,6 +312,7 @@
batteryOffScreenOn();
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testIsolatedCpuFreqTimes_stateService() throws Exception {
if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) {
@@ -450,6 +454,7 @@
batteryOff();
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testCpuFreqTimes_stateBg() throws Exception {
if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) {
@@ -516,6 +521,7 @@
batteryOffScreenOn();
}
+ @SkipPresubmit("b/184201598 flaky")
@Test
public void testCpuFreqTimes_trackingDisabled() throws Exception {
if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) {
diff --git a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
index 496415a..31abbc2 100644
--- a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
@@ -26,7 +26,6 @@
import static org.mockito.Mockito.when;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.UidBatteryConsumer;
@@ -142,14 +141,15 @@
CpuPowerCalculator calculator =
new CpuPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
UidBatteryConsumer uidConsumer1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU))
.isEqualTo(3333);
assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
.isWithin(PRECISION).of(1.092233);
+ assertThat(uidConsumer1.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar");
UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
@@ -157,6 +157,8 @@
.isEqualTo(7777);
assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
.isWithin(PRECISION).of(2.672322);
+ assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull();
}
@@ -210,6 +212,8 @@
.isEqualTo(3333);
assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
.isWithin(PRECISION).of(3.18877);
+ assertThat(uidConsumer1.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar");
UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
@@ -217,6 +221,8 @@
.isEqualTo(7777);
assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
.isWithin(PRECISION).of(7.44072);
+ assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull();
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
index eed61cb..95c3b4e 100644
--- a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
@@ -19,7 +19,6 @@
import static com.google.common.truth.Truth.assertThat;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.UidBatteryConsumer;
@@ -54,14 +53,15 @@
GnssPowerCalculator calculator =
new GnssPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS))
.isEqualTo(1000);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
.isWithin(PRECISION).of(0.1);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
@Test
@@ -87,11 +87,15 @@
.isEqualTo(1000);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
.isWithin(PRECISION).of(2.77777);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
UidBatteryConsumer consumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
assertThat(consumer2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS))
.isEqualTo(2000);
assertThat(consumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
.isWithin(PRECISION).of(5.55555);
+ assertThat(consumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
index 813bc9f..3505e8c 100644
--- a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
@@ -26,7 +26,6 @@
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
@@ -99,13 +98,14 @@
MobileRadioPowerCalculator calculator =
new MobileRadioPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(2.2444);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(2.2444);
assertThat(consumer.getPowerConsumedByApps())
@@ -114,6 +114,8 @@
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(0.8);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
@Test
@@ -163,11 +165,15 @@
// 100000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) + 1.53934 (apps)= 4.31711 mAh
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(4.31711);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(consumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(1.53934);
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(1.53934);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
index d296afa..9cd6ea8 100644
--- a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
@@ -20,7 +20,6 @@
import android.app.ActivityManager;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
@@ -91,6 +90,8 @@
// 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) = 166.66666 mAh
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
.isWithin(PRECISION).of(166.66666);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(166.66666);
assertThat(consumer.getPowerConsumedByApps())
@@ -105,6 +106,8 @@
// Uid1 charge = 200000000 + 5 / 45 * 300000000 mAs = 64.81 mAh
assertThat(uid1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(64.81481);
+ assertThat(uid1.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
@@ -115,6 +118,8 @@
// Uid2 charge = 40 / 45 * 300000000 + 100000000 mAs = 101.85 mAh
assertThat(uid2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(101.85185);
+ assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
}
@Test
@@ -144,8 +149,7 @@
ScreenPowerCalculator calculator =
new ScreenPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
@@ -153,6 +157,8 @@
.isEqualTo(80 * MINUTE_IN_MS);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
.isWithin(PRECISION).of(92.0);
+ assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(92.0);
assertThat(consumer.getPowerConsumedByApps())
@@ -166,6 +172,8 @@
// Uid1 charge = 20 / 80 * 92.0 = 23.0 mAh
assertThat(uid1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(23.0);
+ assertThat(uid1.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
@@ -175,6 +183,8 @@
// Uid2 charge = 60 / 80 * 92.0 = 69.0 mAh
assertThat(uid2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(69.0);
+ assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
}
private void setProcState(int uid, int procState, boolean resumed, long realtimeMs,
diff --git a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
index 5df91dd..2e501db 100644
--- a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
@@ -24,7 +24,6 @@
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
-import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
@@ -85,14 +84,15 @@
batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
.isEqualTo(1423);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(0.2214666);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
@@ -100,6 +100,8 @@
.isEqualTo(5577);
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(1.11153);
+ assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(0.466333);
}
@@ -120,6 +122,8 @@
/* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(0.2214666 / (0.2214666 + 0.645200) * 1_000_000 / 3600000);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
@@ -128,6 +132,8 @@
/* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(1.11153 / (0.2214666 + 0.645200) * 1_000_000 / 3600000);
+ assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(0.14946);
}
@@ -153,14 +159,15 @@
batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
- mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(),
- calculator);
+ mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
.isEqualTo(1000);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(0.8231573);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
@@ -168,6 +175,8 @@
.isEqualTo(2222);
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(2.575000);
+ assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(1.69907);
}
@@ -189,6 +198,8 @@
/* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(0.8231573 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
+ assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
@@ -197,6 +208,8 @@
/* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(2.575000 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
+ assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
+ .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(0.277777);
}
diff --git a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
index e41805d..8271bed 100644
--- a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
+++ b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.content.AttributionSource;
import android.os.PersistableBundle;
import android.os.RemoteException;
@@ -45,13 +46,17 @@
private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
private static final PersistableBundle PARAMS = new PersistableBundle();
private static final @RangingChangeReason int REASON = RangingChangeReason.UNKNOWN;
+ private static final int UID = 343453;
+ private static final String PACKAGE_NAME = "com.uwb.test";
+ private static final AttributionSource ATTRIBUTION_SOURCE =
+ new AttributionSource.Builder(UID).setPackageName(PACKAGE_NAME).build();
@Test
public void testOpenSession_OpenRangingInvoked() throws RemoteException {
IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
- rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
verify(adapter, times(1)).openRanging(any(), eq(rangingManager), eq(PARAMS));
}
@@ -74,11 +79,11 @@
ArgumentCaptor.forClass(SessionHandle.class);
RangingManager rangingManager = new RangingManager(adapter);
- rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
- rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
@@ -100,7 +105,7 @@
ArgumentCaptor<SessionHandle> sessionHandleCaptor =
ArgumentCaptor.forClass(SessionHandle.class);
- rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle handle = sessionHandleCaptor.getValue();
@@ -145,11 +150,11 @@
ArgumentCaptor<SessionHandle> sessionHandleCaptor =
ArgumentCaptor.forClass(SessionHandle.class);
- rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
- rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
@@ -172,12 +177,12 @@
ArgumentCaptor.forClass(SessionHandle.class);
RangingManager rangingManager = new RangingManager(adapter);
- rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
rangingManager.onRangingStarted(sessionHandle1, PARAMS);
- rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
rangingManager.onRangingStarted(sessionHandle2, PARAMS);
@@ -224,7 +229,7 @@
ArgumentCaptor<SessionHandle> sessionHandleCaptor =
ArgumentCaptor.forClass(SessionHandle.class);
- rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
SessionHandle handle = sessionHandleCaptor.getValue();
@@ -232,7 +237,7 @@
verify(callback, times(1)).onOpenFailed(eq(reasonOut), eq(PARAMS));
// Open a new session
- rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
handle = sessionHandleCaptor.getValue();
rangingManager.onRangingOpened(handle);
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 1eecca5..89a2614 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -499,6 +499,10 @@
<permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<permission name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
+ <!-- Permission required for CTS test - SystemMediaRouter2Test -->
+ <permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
+ <!-- Permission required for CTS test - CtsPermission5TestCases -->
+ <permission name="android.permission.RENOUNCE_PERMISSIONS" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/drm/java/Android.bp b/drm/java/Android.bp
index 54e1a8c..21fc018 100644
--- a/drm/java/Android.bp
+++ b/drm/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-drm-sources",
srcs: ["**/*.java"],
diff --git a/graphics/java/Android.bp b/graphics/java/Android.bp
index dcfd5d72..63d1f6d 100644
--- a/graphics/java/Android.bp
+++ b/graphics/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-graphics-nonupdatable-sources",
srcs: [
diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java
index 8dd7f31..6c03ddc 100644
--- a/graphics/java/android/graphics/RecordingCanvas.java
+++ b/graphics/java/android/graphics/RecordingCanvas.java
@@ -17,6 +17,7 @@
package android.graphics;
import android.annotation.NonNull;
+import android.os.SystemProperties;
import android.util.Pools.SynchronizedPool;
import dalvik.annotation.optimization.CriticalNative;
@@ -36,7 +37,15 @@
// view hierarchy because display lists are generated recursively.
private static final int POOL_LIMIT = 25;
- private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB
+ /** @hide */
+ private static int getPanelFrameSize() {
+ final int DefaultSize = 100 * 1024 * 1024; // 100 MB;
+ return Math.max(SystemProperties.getInt("ro.hwui.max_texture_allocation_size", DefaultSize),
+ DefaultSize);
+ }
+
+ /** @hide */
+ public static final int MAX_BITMAP_SIZE = getPanelFrameSize();
private static final SynchronizedPool<RecordingCanvas> sPool =
new SynchronizedPool<>(POOL_LIMIT);
diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
index 94d5c22..9ee1ef1 100644
--- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java
+++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
@@ -41,31 +41,20 @@
private static final int ENTER_ANIM_DURATION = 450;
private static final int EXIT_ANIM_DURATION = 300;
private static final TimeInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
- private static final Interpolator FAST_OUT_LINEAR_IN =
- new PathInterpolator(0.4f, 0f, 1f, 1f);
+ private static final Interpolator FAST_OUT_SLOW_IN =
+ new PathInterpolator(0.4f, 0f, 0.2f, 1f);
private Consumer<RippleAnimationSession> mOnSessionEnd;
private final AnimationProperties<Float, Paint> mProperties;
private AnimationProperties<CanvasProperty<Float>, CanvasProperty<Paint>> mCanvasProperties;
private Runnable mOnUpdate;
private long mStartTime;
private boolean mForceSoftware;
- private final ValueAnimator mSparkle = ValueAnimator.ofFloat(0, 1);
+ private boolean mAnimateSparkle;
RippleAnimationSession(@NonNull AnimationProperties<Float, Paint> properties,
boolean forceSoftware) {
mProperties = properties;
mForceSoftware = forceSoftware;
-
- mSparkle.addUpdateListener(anim -> {
- final long now = AnimationUtils.currentAnimationTimeMillis();
- final long elapsed = now - mStartTime - ENTER_ANIM_DURATION;
- final float phase = (float) elapsed / 800;
- mProperties.getShader().setNoisePhase(phase);
- notifyUpdate();
- });
- mSparkle.setDuration(ENTER_ANIM_DURATION);
- mSparkle.setInterpolator(LINEAR_INTERPOLATOR);
- mSparkle.setRepeatCount(ValueAnimator.INFINITE);
}
@NonNull RippleAnimationSession enter(Canvas canvas) {
@@ -99,6 +88,16 @@
return this;
}
+ public boolean shouldAnimateSparkle() {
+ return mAnimateSparkle;
+ }
+
+ public float getSparklePhase() {
+ final long now = AnimationUtils.currentAnimationTimeMillis();
+ final long elapsed = now - mStartTime;
+ return (float) elapsed / 800;
+ }
+
private boolean isHwAccelerated(Canvas canvas) {
return canvas.isHardwareAccelerated() && !mForceSoftware;
}
@@ -115,7 +114,7 @@
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
- mSparkle.end();
+ mAnimateSparkle = false;
Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
}
@@ -149,7 +148,7 @@
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
- mSparkle.end();
+ mAnimateSparkle = false;
Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
}
@@ -174,11 +173,9 @@
private void startAnimation(Animator expand) {
expand.setDuration(ENTER_ANIM_DURATION);
expand.addListener(new AnimatorListener(this));
- expand.setInterpolator(FAST_OUT_LINEAR_IN);
+ expand.setInterpolator(FAST_OUT_SLOW_IN);
expand.start();
- if (!mSparkle.isRunning()) {
- mSparkle.start();
- }
+ mAnimateSparkle = true;
}
private void enterSoftware() {
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 3bd0a43..8b8cbbc 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -48,7 +48,6 @@
import android.graphics.Rect;
import android.graphics.Shader;
import android.os.Build;
-import android.os.SystemProperties;
import android.util.AttributeSet;
import android.view.animation.LinearInterpolator;
@@ -152,8 +151,7 @@
private static final int MAX_RIPPLES = 10;
private static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
/** Temporary flag for teamfood. **/
- private static final boolean FORCE_PATTERNED_STYLE =
- SystemProperties.getBoolean("persist.material.patternedripple", false);
+ private static final boolean FORCE_PATTERNED_STYLE = true;
private final Rect mTempRect = new Rect();
@@ -861,6 +859,15 @@
}
for (int i = 0; i < mRunningAnimations.size(); i++) {
RippleAnimationSession s = mRunningAnimations.get(i);
+ if (s.shouldAnimateSparkle()) {
+ final float phase = s.getSparklePhase();
+ if (useCanvasProps) {
+ s.getCanvasProperties().getShader().setNoisePhase(phase);
+ } else {
+ s.getProperties().getShader().setNoisePhase(phase);
+ }
+ invalidateSelf();
+ }
if (useCanvasProps) {
RippleAnimationSession.AnimationProperties<CanvasProperty<Float>,
CanvasProperty<Paint>>
diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java
index 6b2b959..aaab3bd 100644
--- a/graphics/java/android/graphics/drawable/RippleShader.java
+++ b/graphics/java/android/graphics/drawable/RippleShader.java
@@ -48,7 +48,7 @@
+ " float s = 0.0;\n"
+ " for (float i = 0; i < 4; i += 1) {\n"
+ " float l = i * 0.01;\n"
- + " float h = l + 0.1;\n"
+ + " float h = l + 0.2;\n"
+ " float o = smoothstep(n - l, h, n);\n"
+ " o *= abs(sin(PI * o * (t + 0.55 * i)));\n"
+ " s += o;\n"
@@ -62,7 +62,7 @@
+ " return 1. - smoothstep(1. - blurHalf, 1. + blurHalf, d / radius);\n"
+ "}\n"
+ "float softRing(vec2 uv, vec2 xy, float radius, float progress, float blur) {\n"
- + " float thickness = 0.2 * radius;\n"
+ + " float thickness = 0.3 * radius;\n"
+ " float currentRadius = radius * progress;\n"
+ " float circle_outer = softCircle(uv, xy, currentRadius + thickness, blur);\n"
+ " float circle_inner = softCircle(uv, xy, currentRadius - thickness, blur);\n"
@@ -73,18 +73,19 @@
+ " return (sub - start) / (end - start); \n"
+ "}\n";
private static final String SHADER_MAIN = "vec4 main(vec2 p) {\n"
- + " float fadeIn = subProgress(0., 0.175, in_progress);\n"
- + " float fadeOutNoise = subProgress(0.375, 1., in_progress);\n"
- + " float fadeOutRipple = subProgress(0.375, 0.75, in_progress);\n"
+ + " float fadeIn = subProgress(0., 0.1, in_progress);\n"
+ + " float scaleIn = subProgress(0., 0.45, in_progress);\n"
+ + " float fadeOutNoise = subProgress(0.5, 1., in_progress);\n"
+ + " float fadeOutRipple = subProgress(0.5, 0.75, in_progress);\n"
+ " vec2 center = mix(in_touch, in_origin, fadeIn);\n"
- + " float ring = softRing(p, center, in_maxRadius, fadeIn, 0.45);\n"
- + " float alpha = 1. - fadeOutNoise;\n"
+ + " float ring = softRing(p, center, in_maxRadius, scaleIn, 0.45);\n"
+ + " float alpha = min(fadeIn, 1. - fadeOutNoise);\n"
+ " vec2 uv = p * in_resolutionScale;\n"
+ " vec2 densityUv = uv - mod(uv, in_noiseScale);\n"
+ " float sparkle = sparkles(densityUv, in_noisePhase) * ring * alpha;\n"
+ " float fade = min(fadeIn, 1. - fadeOutRipple);\n"
+ " vec4 circle = in_color * (softCircle(p, center, in_maxRadius "
- + " * fadeIn, 0.2) * fade);\n"
+ + " * scaleIn, 0.2) * fade);\n"
+ " float mask = in_hasMask == 1. ? sample(in_shader).a > 0. ? 1. : 0. : 1.;\n"
+ " return mix(circle, vec4(sparkle), sparkle) * mask;\n"
+ "}";
@@ -134,7 +135,7 @@
}
public void setResolution(float w, float h, int density) {
- float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE;
+ float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE * 1.25f;
setUniform("in_resolutionScale", new float[] {1f / w, 1f / h});
setUniform("in_noiseScale", new float[] {densityScale / w, densityScale / h});
}
diff --git a/identity/Android.bp b/identity/Android.bp
new file mode 100644
index 0000000..826d6f8
--- /dev/null
+++ b/identity/Android.bp
@@ -0,0 +1,31 @@
+//
+// Copyright (C) 2021 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 {
+ default_applicable_licenses: ["frameworks_base_identity_license"],
+}
+
+// Added automatically by a large-scale-change
+// See: http://go/android-license-faq
+license {
+ name: "frameworks_base_identity_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ ],
+ license_text: [
+ "NOTICE",
+ ],
+}
diff --git a/identity/java/Android.bp b/identity/java/Android.bp
index 16aef5d..a193d97 100644
--- a/identity/java/Android.bp
+++ b/identity/java/Android.bp
@@ -1,3 +1,12 @@
+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_identity_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_identity_license"],
+}
+
filegroup {
name: "framework-identity-sources",
srcs: ["**/*.java"],
diff --git a/keystore/java/Android.bp b/keystore/java/Android.bp
index 6860f71..21edff1 100644
--- a/keystore/java/Android.bp
+++ b/keystore/java/Android.bp
@@ -1,3 +1,12 @@
+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_keystore_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_keystore_license"],
+}
+
filegroup {
name: "framework-keystore-sources",
srcs: [
diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
index 72cea0c..82639de 100644
--- a/keystore/java/android/security/AndroidKeyStoreMaintenance.java
+++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
@@ -47,7 +47,6 @@
* @hide
*/
public static int onUserAdded(@NonNull int userId) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
getService().onUserAdded(userId);
return 0;
@@ -68,7 +67,6 @@
* @hide
*/
public static int onUserRemoved(int userId) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
getService().onUserRemoved(userId);
return 0;
@@ -91,7 +89,6 @@
* @hide
*/
public static int onUserPasswordChanged(int userId, @Nullable byte[] password) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
getService().onUserPasswordChanged(userId, password);
return 0;
@@ -109,7 +106,6 @@
* be cleared.
*/
public static int clearNamespace(@Domain int domain, long namespace) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
getService().clearNamespace(domain, namespace);
return 0;
@@ -144,7 +140,6 @@
* Informs Keystore 2.0 that an off body event was detected.
*/
public static void onDeviceOffBody() {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return;
try {
getService().onDeviceOffBody();
} catch (Exception e) {
diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java
index 50a9082..bd72d45 100644
--- a/keystore/java/android/security/Authorization.java
+++ b/keystore/java/android/security/Authorization.java
@@ -48,7 +48,6 @@
* @return 0 if successful or {@code ResponseCode.SYSTEM_ERROR}.
*/
public static int addAuthToken(@NonNull HardwareAuthToken authToken) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
getService().addAuthToken(authToken);
return 0;
@@ -80,7 +79,6 @@
*/
public static int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId,
@Nullable byte[] syntheticPassword) {
- if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0;
try {
if (locked) {
getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null);
diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java
index ae9f8664..28c601b 100644
--- a/keystore/java/android/security/Credentials.java
+++ b/keystore/java/android/security/Credentials.java
@@ -208,78 +208,4 @@
pr.close();
}
}
-
- /**
- * Delete all types (private key, user certificate, CA certificate) for a
- * particular {@code alias}. All three can exist for any given alias.
- * Returns {@code true} if the alias no longer contains any types.
- */
- public static boolean deleteAllTypesForAlias(KeyStore keystore, String alias) {
- return deleteAllTypesForAlias(keystore, alias, KeyStore.UID_SELF);
- }
-
- /**
- * Delete all types (private key, user certificate, CA certificate) for a
- * particular {@code alias}. All three can exist for any given alias.
- * Returns {@code true} if the alias no longer contains any types.
- */
- public static boolean deleteAllTypesForAlias(KeyStore keystore, String alias, int uid) {
- /*
- * Make sure every type is deleted. There can be all three types, so
- * don't use a conditional here.
- */
- return deleteUserKeyTypeForAlias(keystore, alias, uid)
- & deleteCertificateTypesForAlias(keystore, alias, uid);
- }
-
- /**
- * Delete certificate types (user certificate, CA certificate) for a
- * particular {@code alias}. Both can exist for any given alias.
- * Returns {@code true} if the alias no longer contains either type.
- */
- public static boolean deleteCertificateTypesForAlias(KeyStore keystore, String alias) {
- return deleteCertificateTypesForAlias(keystore, alias, KeyStore.UID_SELF);
- }
-
- /**
- * Delete certificate types (user certificate, CA certificate) for a
- * particular {@code alias}. Both can exist for any given alias.
- * Returns {@code true} if the alias no longer contains either type.
- */
- public static boolean deleteCertificateTypesForAlias(KeyStore keystore, String alias, int uid) {
- /*
- * Make sure every certificate type is deleted. There can be two types,
- * so don't use a conditional here.
- */
- return keystore.delete(Credentials.USER_CERTIFICATE + alias, uid)
- & keystore.delete(Credentials.CA_CERTIFICATE + alias, uid);
- }
-
- /**
- * Delete user key for a particular {@code alias}.
- * Returns {@code true} if the entry no longer exists.
- */
- public static boolean deleteUserKeyTypeForAlias(KeyStore keystore, String alias) {
- return deleteUserKeyTypeForAlias(keystore, alias, KeyStore.UID_SELF);
- }
-
- /**
- * Delete user key for a particular {@code alias}.
- * Returns {@code true} if the entry no longer exists.
- */
- public static boolean deleteUserKeyTypeForAlias(KeyStore keystore, String alias, int uid) {
- int ret = keystore.delete2(Credentials.USER_PRIVATE_KEY + alias, uid);
- if (ret == KeyStore.KEY_NOT_FOUND) {
- return keystore.delete(Credentials.USER_SECRET_KEY + alias, uid);
- }
- return ret == KeyStore.NO_ERROR;
- }
-
- /**
- * Delete legacy prefixed entry for a particular {@code alias}
- * Returns {@code true} if the entry no longer exists.
- */
- public static boolean deleteLegacyKeyForAlias(KeyStore keystore, String alias, int uid) {
- return keystore.delete(Credentials.USER_SECRET_KEY + alias, uid);
- }
}
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 7c80f70..02cdeef 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -42,7 +42,6 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
-import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
import android.system.keystore2.Domain;
@@ -806,23 +805,13 @@
return null;
}
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- try {
- return android.security.keystore2.AndroidKeyStoreProvider
- .loadAndroidKeyStoreKeyPairFromKeystore(
- KeyStore2.getInstance(),
- getGrantDescriptor(keyId));
- } catch (UnrecoverableKeyException | KeyPermanentlyInvalidatedException e) {
- throw new KeyChainException(e);
- }
- } else {
- try {
- return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(
- KeyStore.getInstance(), keyId, KeyStore.UID_SELF);
- } catch (RuntimeException | UnrecoverableKeyException
- | KeyPermanentlyInvalidatedException e) {
- throw new KeyChainException(e);
- }
+ try {
+ return android.security.keystore2.AndroidKeyStoreProvider
+ .loadAndroidKeyStoreKeyPairFromKeystore(
+ KeyStore2.getInstance(),
+ getGrantDescriptor(keyId));
+ } catch (UnrecoverableKeyException | KeyPermanentlyInvalidatedException e) {
+ throw new KeyChainException(e);
}
}
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index b05149e..a954344 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -16,53 +16,11 @@
package android.security;
-import android.app.ActivityThread;
-import android.app.Application;
-import android.app.KeyguardManager;
import android.compat.annotation.UnsupportedAppUsage;
-import android.content.Context;
-import android.hardware.biometrics.BiometricManager;
-import android.os.Binder;
import android.os.Build;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
-import android.security.keymaster.ExportResult;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterBlob;
-import android.security.keymaster.KeymasterCertificateChain;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-import android.security.keystore.IKeystoreService;
-import android.security.keystore.KeyExpiredException;
-import android.security.keystore.KeyNotYetValidException;
-import android.security.keystore.KeyPermanentlyInvalidatedException;
-import android.security.keystore.KeyProperties;
-import android.security.keystore.KeystoreResponse;
-import android.security.keystore.UserNotAuthenticatedException;
import android.security.maintenance.UserState;
import android.system.keystore2.Domain;
-import android.util.Log;
-
-import com.android.internal.org.bouncycastle.asn1.ASN1InputStream;
-import com.android.internal.org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.security.InvalidKeyException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-import sun.security.util.ObjectIdentifier;
-import sun.security.x509.AlgorithmId;
/**
* @hide This should not be made public in its present form because it
@@ -75,79 +33,10 @@
// ResponseCodes - see system/security/keystore/include/keystore/keystore.h
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public static final int NO_ERROR = 1;
- public static final int LOCKED = 2;
- public static final int UNINITIALIZED = 3;
- public static final int SYSTEM_ERROR = 4;
- public static final int PROTOCOL_ERROR = 5;
- public static final int PERMISSION_DENIED = 6;
- public static final int KEY_NOT_FOUND = 7;
- public static final int VALUE_CORRUPTED = 8;
- public static final int UNDEFINED_ACTION = 9;
- public static final int WRONG_PASSWORD = 10;
- public static final int KEY_ALREADY_EXISTS = 16;
- public static final int CANNOT_ATTEST_IDS = -66;
- public static final int HARDWARE_TYPE_UNAVAILABLE = -68;
-
- /**
- * Per operation authentication is needed before this operation is valid.
- * This is returned from {@link #begin} when begin succeeds but the operation uses
- * per-operation authentication and must authenticate before calling {@link #update} or
- * {@link #finish}.
- */
- public static final int OP_AUTH_NEEDED = 15;
-
- // Used when a user changes their pin, invalidating old auth bound keys.
- public static final int KEY_PERMANENTLY_INVALIDATED = 17;
// Used for UID field to indicate the calling UID.
public static final int UID_SELF = -1;
- // Flags for "put" "import" and "generate"
- public static final int FLAG_NONE = 0;
-
- /**
- * Indicates that this key (or key pair) must be encrypted at rest. This will protect the key
- * (or key pair) with the secure lock screen credential (e.g., password, PIN, or pattern).
- *
- * <p>Note that this requires that the secure lock screen (e.g., password, PIN, pattern) is set
- * up, otherwise key (or key pair) generation or import will fail. Moreover, this key (or key
- * pair) will be deleted when the secure lock screen is disabled or reset (e.g., by the user or
- * a Device Administrator). Finally, this key (or key pair) cannot be used until the user
- * unlocks the secure lock screen after boot.
- *
- * @see KeyguardManager#isDeviceSecure()
- */
- public static final int FLAG_ENCRYPTED = 1;
-
- /**
- * Select Software keymaster device, which as of this writing is the lowest security
- * level available on an android device. If neither FLAG_STRONGBOX nor FLAG_SOFTWARE is provided
- * A TEE based keymaster implementation is implied.
- *
- * Need to be in sync with KeyStoreFlag in system/security/keystore/include/keystore/keystore.h
- * For historical reasons this corresponds to the KEYSTORE_FLAG_FALLBACK flag.
- */
- public static final int FLAG_SOFTWARE = 1 << 1;
-
- /**
- * A private flag that's only available to system server to indicate that this key is part of
- * device encryption flow so it receives special treatment from keystore. For example this key
- * will not be super encrypted, and it will be stored separately under an unique UID instead
- * of the caller UID i.e. SYSTEM.
- *
- * Need to be in sync with KeyStoreFlag in system/security/keystore/include/keystore/keystore.h
- */
- public static final int FLAG_CRITICAL_TO_DEVICE_ENCRYPTION = 1 << 3;
-
- /**
- * Select Strongbox keymaster device, which as of this writing the the highest security level
- * available an android devices. If neither FLAG_STRONGBOX nor FLAG_SOFTWARE is provided
- * A TEE based keymaster implementation is implied.
- *
- * Need to be in sync with KeyStoreFlag in system/security/keystore/include/keystore/keystore.h
- */
- public static final int FLAG_STRONGBOX = 1 << 4;
-
// States
public enum State {
@UnsupportedAppUsage
@@ -157,853 +46,87 @@
UNINITIALIZED
};
- private int mError = NO_ERROR;
-
- private final IKeystoreService mBinder;
- private final Context mContext;
-
- private IBinder mToken;
-
- private KeyStore(IKeystoreService binder) {
- mBinder = binder;
- mContext = getApplicationContext();
- }
-
- @UnsupportedAppUsage
- public static Context getApplicationContext() {
- Application application = ActivityThread.currentApplication();
- if (application == null) {
- throw new IllegalStateException(
- "Failed to obtain application Context from ActivityThread");
- }
- return application;
- }
+ private static final KeyStore KEY_STORE = new KeyStore();
@UnsupportedAppUsage
public static KeyStore getInstance() {
- IKeystoreService keystore = IKeystoreService.Stub.asInterface(ServiceManager
- .getService("android.security.keystore"));
- return new KeyStore(keystore);
+ return KEY_STORE;
}
- private synchronized IBinder getToken() {
- if (mToken == null) {
- mToken = new Binder();
- }
- return mToken;
- }
-
+ /** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public State state(int userId) {
- final int ret;
- try {
- if (android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) {
- int userState = AndroidKeyStoreMaintenance.getState(userId);
- switch (userState) {
- case UserState.UNINITIALIZED:
- return KeyStore.State.UNINITIALIZED;
- case UserState.LSKF_UNLOCKED:
- return KeyStore.State.UNLOCKED;
- case UserState.LSKF_LOCKED:
- return KeyStore.State.LOCKED;
- default:
- throw new AssertionError(userState);
- }
- }
- ret = mBinder.getState(userId);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- throw new AssertionError(e);
- }
-
- switch (ret) {
- case NO_ERROR: return State.UNLOCKED;
- case LOCKED: return State.LOCKED;
- case UNINITIALIZED: return State.UNINITIALIZED;
- default: throw new AssertionError(mError);
+ int userState = AndroidKeyStoreMaintenance.getState(userId);
+ switch (userState) {
+ case UserState.UNINITIALIZED:
+ return KeyStore.State.UNINITIALIZED;
+ case UserState.LSKF_UNLOCKED:
+ return KeyStore.State.UNLOCKED;
+ case UserState.LSKF_LOCKED:
+ return KeyStore.State.LOCKED;
+ default:
+ throw new AssertionError(userState);
}
}
+ /** @hide */
@UnsupportedAppUsage
public State state() {
return state(UserHandle.myUserId());
}
- public boolean isUnlocked() {
- return state() == State.UNLOCKED;
- }
-
- public byte[] get(String key, int uid) {
- return get(key, uid, false);
- }
-
+ /** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public byte[] get(String key) {
- return get(key, UID_SELF);
+ return null;
}
- public byte[] get(String key, int uid, boolean suppressKeyNotFoundWarning) {
- try {
- key = key != null ? key : "";
- return mBinder.get(key, uid);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (android.os.ServiceSpecificException e) {
- if (!suppressKeyNotFoundWarning || e.errorCode != KEY_NOT_FOUND) {
- Log.w(TAG, "KeyStore exception", e);
- }
- return null;
- }
- }
-
- public byte[] get(String key, boolean suppressKeyNotFoundWarning) {
- return get(key, UID_SELF, suppressKeyNotFoundWarning);
- }
-
-
- public boolean put(String key, byte[] value, int uid, int flags) {
- return insert(key, value, uid, flags) == NO_ERROR;
- }
-
- public int insert(String key, byte[] value, int uid, int flags) {
- try {
- if (value == null) {
- value = new byte[0];
- }
- int error = mBinder.insert(key, value, uid, flags);
- if (error == KEY_ALREADY_EXISTS) {
- mBinder.del(key, uid);
- error = mBinder.insert(key, value, uid, flags);
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- }
- }
-
- int delete2(String key, int uid) {
- try {
- return mBinder.del(key, uid);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- }
- }
-
- public boolean delete(String key, int uid) {
- int ret = delete2(key, uid);
- return ret == NO_ERROR || ret == KEY_NOT_FOUND;
- }
-
+ /** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public boolean delete(String key) {
- return delete(key, UID_SELF);
- }
-
- public boolean contains(String key, int uid) {
- try {
- return mBinder.exist(key, uid) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- public boolean contains(String key) {
- return contains(key, UID_SELF);
- }
-
- /**
- * List all entries in the keystore for {@code uid} starting with {@code prefix}.
- */
- public String[] list(String prefix, int uid) {
- try {
- return mBinder.list(prefix, uid);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (android.os.ServiceSpecificException e) {
- Log.w(TAG, "KeyStore exception", e);
- return null;
- }
+ return false;
}
/**
* List uids of all keys that are auth bound to the current user.
* Only system is allowed to call this method.
+ * @hide
+ * @deprecated This function always returns null.
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public int[] listUidsOfAuthBoundKeys() {
- // uids are returned as a list of strings because list of integers
- // as an output parameter is not supported by aidl-cpp.
- List<String> uidsOut = new ArrayList<>();
- try {
- int rc = mBinder.listUidsOfAuthBoundKeys(uidsOut);
- if (rc != NO_ERROR) {
- Log.w(TAG, String.format("listUidsOfAuthBoundKeys failed with error code %d", rc));
- return null;
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (android.os.ServiceSpecificException e) {
- Log.w(TAG, "KeyStore exception", e);
- return null;
- }
- // Turn list of strings into an array of uid integers.
- return uidsOut.stream().mapToInt(Integer::parseInt).toArray();
- }
-
- public String[] list(String prefix) {
- return list(prefix, UID_SELF);
+ return null;
}
+
/**
- * Attempt to lock the keystore for {@code user}.
- *
- * @param userId Android user to lock.
- * @return whether {@code user}'s keystore was locked.
+ * @hide
+ * @deprecated This function has no effect.
*/
- public boolean lock(int userId) {
- try {
- return mBinder.lock(userId) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- public boolean lock() {
- return lock(UserHandle.myUserId());
- }
-
- /**
- * Attempt to unlock the keystore for {@code user} with the password {@code password}.
- * This is required before keystore entries created with FLAG_ENCRYPTED can be accessed or
- * created.
- *
- * @param userId Android user ID to operate on
- * @param password user's keystore password. Should be the most recent value passed to
- * {@link #onUserPasswordChanged} for the user.
- *
- * @return whether the keystore was unlocked.
- */
- public boolean unlock(int userId, String password) {
- try {
- password = password != null ? password : "";
- mError = mBinder.unlock(userId, password);
- return mError == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public boolean unlock(String password) {
- return unlock(UserHandle.getUserId(Process.myUid()), password);
+ return false;
}
/**
- * Check if the keystore for {@code userId} is empty.
+ *
+ * @return
+ * @deprecated This function always returns true.
+ * @hide
*/
- public boolean isEmpty(int userId) {
- try {
- return mBinder.isEmpty(userId) != 0;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public boolean isEmpty() {
- return isEmpty(UserHandle.myUserId());
- }
-
- public String grant(String key, int uid) {
- try {
- String grantAlias = mBinder.grant(key, uid);
- if (grantAlias == "") return null;
- return grantAlias;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- }
- }
-
- public boolean ungrant(String key, int uid) {
- try {
- return mBinder.ungrant(key, uid) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- /**
- * Returns the last modification time of the key in milliseconds since the
- * epoch. Will return -1L if the key could not be found or other error.
- */
- public long getmtime(String key, int uid) {
- try {
- final long millis = mBinder.getmtime(key, uid);
- if (millis == -1L) {
- return -1L;
- }
-
- return millis * 1000L;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return -1L;
- }
- }
-
- public long getmtime(String key) {
- return getmtime(key, UID_SELF);
- }
-
- // TODO: remove this when it's removed from Settings
- public boolean isHardwareBacked() {
- return isHardwareBacked("RSA");
- }
-
- public boolean isHardwareBacked(String keyType) {
- try {
- return mBinder.is_hardware_backed(keyType.toUpperCase(Locale.US)) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- public boolean clearUid(int uid) {
- try {
- if (android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) {
- return AndroidKeyStoreMaintenance.clearNamespace(Domain.APP, uid) == 0;
- }
- return mBinder.clear_uid(uid) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- public int getLastError() {
- return mError;
- }
-
- public boolean addRngEntropy(byte[] data, int flags) {
- KeystoreResultPromise promise = new KeystoreResultPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- int errorCode = mBinder.addRngEntropy(promise, data, flags);
- if (errorCode == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture()).getErrorCode() == NO_ERROR;
- } else {
- return false;
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- } catch (ExecutionException e) {
- Log.e(TAG, "AddRngEntropy completed with exception", e);
- return false;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- private class KeyCharacteristicsCallbackResult {
- private KeystoreResponse keystoreResponse;
- private KeyCharacteristics keyCharacteristics;
-
- public KeyCharacteristicsCallbackResult(KeystoreResponse keystoreResponse,
- KeyCharacteristics keyCharacteristics) {
- this.keystoreResponse = keystoreResponse;
- this.keyCharacteristics = keyCharacteristics;
- }
-
- public KeystoreResponse getKeystoreResponse() {
- return keystoreResponse;
- }
-
- public void setKeystoreResponse(KeystoreResponse keystoreResponse) {
- this.keystoreResponse = keystoreResponse;
- }
-
- public KeyCharacteristics getKeyCharacteristics() {
- return keyCharacteristics;
- }
-
- public void setKeyCharacteristics(KeyCharacteristics keyCharacteristics) {
- this.keyCharacteristics = keyCharacteristics;
- }
- }
-
- private class KeyCharacteristicsPromise
- extends android.security.keystore.IKeystoreKeyCharacteristicsCallback.Stub
- implements IBinder.DeathRecipient {
- final private CompletableFuture<KeyCharacteristicsCallbackResult> future =
- new CompletableFuture<KeyCharacteristicsCallbackResult>();
- @Override
- public void onFinished(KeystoreResponse keystoreResponse,
- KeyCharacteristics keyCharacteristics)
- throws android.os.RemoteException {
- future.complete(
- new KeyCharacteristicsCallbackResult(keystoreResponse, keyCharacteristics));
- }
- public final CompletableFuture<KeyCharacteristicsCallbackResult> getFuture() {
- return future;
- }
- @Override
- public void binderDied() {
- future.completeExceptionally(new RemoteException("Keystore died"));
- }
- };
-
- private int generateKeyInternal(String alias, KeymasterArguments args, byte[] entropy, int uid,
- int flags, KeyCharacteristics outCharacteristics)
- throws RemoteException, ExecutionException {
- KeyCharacteristicsPromise promise = new KeyCharacteristicsPromise();
- int error = NO_ERROR;
- KeyCharacteristicsCallbackResult result = null;
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- error = mBinder.generateKey(promise, alias, args, entropy, uid, flags);
- if (error != NO_ERROR) {
- Log.e(TAG, "generateKeyInternal failed on request " + error);
- return error;
- }
- result = interruptedPreservingGet(promise.getFuture());
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
-
- error = result.getKeystoreResponse().getErrorCode();
- if (error != NO_ERROR) {
- Log.e(TAG, "generateKeyInternal failed on response " + error);
- return error;
- }
- KeyCharacteristics characteristics = result.getKeyCharacteristics();
- if (characteristics == null) {
- Log.e(TAG, "generateKeyInternal got empty key characteristics " + error);
- return SYSTEM_ERROR;
- }
- outCharacteristics.shallowCopyFrom(characteristics);
- return NO_ERROR;
- }
-
- public int generateKey(String alias, KeymasterArguments args, byte[] entropy, int uid,
- int flags, KeyCharacteristics outCharacteristics) {
- try {
- entropy = entropy != null ? entropy : new byte[0];
- args = args != null ? args : new KeymasterArguments();
- int error = generateKeyInternal(alias, args, entropy, uid, flags, outCharacteristics);
- if (error == KEY_ALREADY_EXISTS) {
- mBinder.del(alias, uid);
- error = generateKeyInternal(alias, args, entropy, uid, flags, outCharacteristics);
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "generateKey completed with exception", e);
- return SYSTEM_ERROR;
- }
- }
-
- public int generateKey(String alias, KeymasterArguments args, byte[] entropy, int flags,
- KeyCharacteristics outCharacteristics) {
- return generateKey(alias, args, entropy, UID_SELF, flags, outCharacteristics);
- }
-
- public int getKeyCharacteristics(String alias, KeymasterBlob clientId, KeymasterBlob appId,
- int uid, KeyCharacteristics outCharacteristics) {
- KeyCharacteristicsPromise promise = new KeyCharacteristicsPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- clientId = clientId != null ? clientId : new KeymasterBlob(new byte[0]);
- appId = appId != null ? appId : new KeymasterBlob(new byte[0]);
-
- int error = mBinder.getKeyCharacteristics(promise, alias, clientId, appId, uid);
- if (error != NO_ERROR) return error;
-
- KeyCharacteristicsCallbackResult result = interruptedPreservingGet(promise.getFuture());
- error = result.getKeystoreResponse().getErrorCode();
- if (error != NO_ERROR) return error;
-
- KeyCharacteristics characteristics = result.getKeyCharacteristics();
- if (characteristics == null) return SYSTEM_ERROR;
- outCharacteristics.shallowCopyFrom(characteristics);
- return NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "GetKeyCharacteristics completed with exception", e);
- return SYSTEM_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- public int getKeyCharacteristics(String alias, KeymasterBlob clientId, KeymasterBlob appId,
- KeyCharacteristics outCharacteristics) {
- return getKeyCharacteristics(alias, clientId, appId, UID_SELF, outCharacteristics);
- }
-
- private int importKeyInternal(String alias, KeymasterArguments args, int format, byte[] keyData,
- int uid, int flags, KeyCharacteristics outCharacteristics)
- throws RemoteException, ExecutionException {
- KeyCharacteristicsPromise promise = new KeyCharacteristicsPromise();
- mBinder.asBinder().linkToDeath(promise, 0);
- try {
- int error = mBinder.importKey(promise, alias, args, format, keyData, uid, flags);
- if (error != NO_ERROR) return error;
-
- KeyCharacteristicsCallbackResult result = interruptedPreservingGet(promise.getFuture());
-
- error = result.getKeystoreResponse().getErrorCode();
- if (error != NO_ERROR) return error;
-
- KeyCharacteristics characteristics = result.getKeyCharacteristics();
- if (characteristics == null) return SYSTEM_ERROR;
- outCharacteristics.shallowCopyFrom(characteristics);
- return NO_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- public int importKey(String alias, KeymasterArguments args, int format, byte[] keyData,
- int uid, int flags, KeyCharacteristics outCharacteristics) {
- try {
- int error = importKeyInternal(alias, args, format, keyData, uid, flags,
- outCharacteristics);
- if (error == KEY_ALREADY_EXISTS) {
- mBinder.del(alias, uid);
- error = importKeyInternal(alias, args, format, keyData, uid, flags,
- outCharacteristics);
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "ImportKey completed with exception", e);
- return SYSTEM_ERROR;
- }
- }
-
- public int importKey(String alias, KeymasterArguments args, int format, byte[] keyData,
- int flags, KeyCharacteristics outCharacteristics) {
- return importKey(alias, args, format, keyData, UID_SELF, flags, outCharacteristics);
- }
-
- private String getAlgorithmFromPKCS8(byte[] keyData) {
- try {
- final ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(keyData));
- final PrivateKeyInfo pki = PrivateKeyInfo.getInstance(bIn.readObject());
- final String algOid = pki.getPrivateKeyAlgorithm().getAlgorithm().getId();
- return new AlgorithmId(new ObjectIdentifier(algOid)).getName();
- } catch (IOException e) {
- Log.e(TAG, "getAlgorithmFromPKCS8 Failed to parse key data");
- Log.e(TAG, Log.getStackTraceString(e));
- return null;
- }
- }
-
- private KeymasterArguments makeLegacyArguments(String algorithm) {
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM,
- KeyProperties.KeyAlgorithm.toKeymasterAsymmetricKeyAlgorithm(algorithm));
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_SIGN);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_VERIFY);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- if (algorithm.equalsIgnoreCase(KeyProperties.KEY_ALGORITHM_RSA)) {
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_RSA_OAEP);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_RSA_PSS);
- }
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_NONE);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_MD5);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA1);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_224);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_256);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_384);
- args.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_512);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- args.addDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME, new Date(Long.MAX_VALUE));
- args.addDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME, new Date(Long.MAX_VALUE));
- args.addDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, new Date(0));
- return args;
- }
-
- public boolean importKey(String alias, byte[] keyData, int uid, int flags) {
- String algorithm = getAlgorithmFromPKCS8(keyData);
- if (algorithm == null) return false;
- KeymasterArguments args = makeLegacyArguments(algorithm);
- KeyCharacteristics out = new KeyCharacteristics();
- int result = importKey(alias, args, KeymasterDefs.KM_KEY_FORMAT_PKCS8, keyData, uid,
- flags, out);
- if (result != NO_ERROR) {
- Log.e(TAG, Log.getStackTraceString(
- new KeyStoreException(result, "legacy key import failed")));
- return false;
- }
return true;
}
- private int importWrappedKeyInternal(String wrappedKeyAlias, byte[] wrappedKey,
- String wrappingKeyAlias,
- byte[] maskingKey, KeymasterArguments args, long rootSid, long fingerprintSid,
- KeyCharacteristics outCharacteristics)
- throws RemoteException, ExecutionException {
- KeyCharacteristicsPromise promise = new KeyCharacteristicsPromise();
- mBinder.asBinder().linkToDeath(promise, 0);
- try {
- int error = mBinder.importWrappedKey(promise, wrappedKeyAlias, wrappedKey,
- wrappingKeyAlias, maskingKey, args, rootSid, fingerprintSid);
- if (error != NO_ERROR) return error;
-
- KeyCharacteristicsCallbackResult result = interruptedPreservingGet(promise.getFuture());
-
- error = result.getKeystoreResponse().getErrorCode();
- if (error != NO_ERROR) return error;
-
- KeyCharacteristics characteristics = result.getKeyCharacteristics();
- if (characteristics == null) return SYSTEM_ERROR;
- outCharacteristics.shallowCopyFrom(characteristics);
- return NO_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- public int importWrappedKey(String wrappedKeyAlias, byte[] wrappedKey,
- String wrappingKeyAlias,
- byte[] maskingKey, KeymasterArguments args, long rootSid, long fingerprintSid, int uid,
- KeyCharacteristics outCharacteristics) {
- // TODO b/119217337 uid parameter gets silently ignored.
- try {
- int error = importWrappedKeyInternal(wrappedKeyAlias, wrappedKey, wrappingKeyAlias,
- maskingKey, args, rootSid, fingerprintSid, outCharacteristics);
- if (error == KEY_ALREADY_EXISTS) {
- mBinder.del(wrappedKeyAlias, UID_SELF);
- error = importWrappedKeyInternal(wrappedKeyAlias, wrappedKey, wrappingKeyAlias,
- maskingKey, args, rootSid, fingerprintSid, outCharacteristics);
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "ImportWrappedKey completed with exception", e);
- return SYSTEM_ERROR;
- }
- }
-
- private class ExportKeyPromise
- extends android.security.keystore.IKeystoreExportKeyCallback.Stub
- implements IBinder.DeathRecipient {
- final private CompletableFuture<ExportResult> future = new CompletableFuture<ExportResult>();
- @Override
- public void onFinished(ExportResult exportKeyResult) throws android.os.RemoteException {
- future.complete(exportKeyResult);
- }
- public final CompletableFuture<ExportResult> getFuture() {
- return future;
- }
- @Override
- public void binderDied() {
- future.completeExceptionally(new RemoteException("Keystore died"));
- }
- };
-
- public ExportResult exportKey(String alias, int format, KeymasterBlob clientId,
- KeymasterBlob appId, int uid) {
- ExportKeyPromise promise = new ExportKeyPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- clientId = clientId != null ? clientId : new KeymasterBlob(new byte[0]);
- appId = appId != null ? appId : new KeymasterBlob(new byte[0]);
- int error = mBinder.exportKey(promise, alias, format, clientId, appId, uid);
- if (error == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture());
- } else {
- return new ExportResult(error);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (ExecutionException e) {
- Log.e(TAG, "ExportKey completed with exception", e);
- return null;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
- public ExportResult exportKey(String alias, int format, KeymasterBlob clientId,
- KeymasterBlob appId) {
- return exportKey(alias, format, clientId, appId, UID_SELF);
- }
-
- private class OperationPromise
- extends android.security.keystore.IKeystoreOperationResultCallback.Stub
- implements IBinder.DeathRecipient {
- final private CompletableFuture<OperationResult> future = new CompletableFuture<OperationResult>();
- @Override
- public void onFinished(OperationResult operationResult) throws android.os.RemoteException {
- future.complete(operationResult);
- }
- public final CompletableFuture<OperationResult> getFuture() {
- return future;
- }
- @Override
- public void binderDied() {
- future.completeExceptionally(new RemoteException("Keystore died"));
- }
- };
-
- public OperationResult begin(String alias, int purpose, boolean pruneable,
- KeymasterArguments args, byte[] entropy, int uid) {
- OperationPromise promise = new OperationPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- args = args != null ? args : new KeymasterArguments();
- entropy = entropy != null ? entropy : new byte[0];
- int errorCode = mBinder.begin(promise, getToken(), alias, purpose, pruneable, args,
- entropy, uid);
- if (errorCode == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture());
- } else {
- return new OperationResult(errorCode);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (ExecutionException e) {
- Log.e(TAG, "Begin completed with exception", e);
- return null;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- public OperationResult begin(String alias, int purpose, boolean pruneable,
- KeymasterArguments args, byte[] entropy) {
- entropy = entropy != null ? entropy : new byte[0];
- args = args != null ? args : new KeymasterArguments();
- return begin(alias, purpose, pruneable, args, entropy, UID_SELF);
- }
-
- public OperationResult update(IBinder token, KeymasterArguments arguments, byte[] input) {
- OperationPromise promise = new OperationPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- arguments = arguments != null ? arguments : new KeymasterArguments();
- input = input != null ? input : new byte[0];
- int errorCode = mBinder.update(promise, token, arguments, input);
- if (errorCode == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture());
- } else {
- return new OperationResult(errorCode);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (ExecutionException e) {
- Log.e(TAG, "Update completed with exception", e);
- return null;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
/**
- * Android KeyStore finish operation.
- *
- * @param token Authentication token.
- * @param arguments Keymaster arguments
- * @param input Optional additional input data.
- * @param signature Optional signature to be verified.
- * @param entropy Optional additional entropy
- * @return OperationResult that will indicate success or error of the operation.
+ * Forwards the request to clear a UID to Keystore 2.0.
+ * @hide
*/
- public OperationResult finish(IBinder token, KeymasterArguments arguments, byte[] input,
- byte[] signature, byte[] entropy) {
- OperationPromise promise = new OperationPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- arguments = arguments != null ? arguments : new KeymasterArguments();
- entropy = entropy != null ? entropy : new byte[0];
- input = input != null ? input : new byte[0];
- signature = signature != null ? signature : new byte[0];
- int errorCode = mBinder.finish(promise, token, arguments, input, signature, entropy);
- if (errorCode == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture());
- } else {
- return new OperationResult(errorCode);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return null;
- } catch (ExecutionException e) {
- Log.e(TAG, "Finish completed with exception", e);
- return null;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
+ public boolean clearUid(int uid) {
+ return AndroidKeyStoreMaintenance.clearNamespace(Domain.APP, uid) == 0;
}
- public OperationResult finish(IBinder token, KeymasterArguments arguments, byte[] signature) {
- return finish(token, arguments, null, signature, null);
- }
-
- private class KeystoreResultPromise
- extends android.security.keystore.IKeystoreResponseCallback.Stub
- implements IBinder.DeathRecipient {
- final private CompletableFuture<KeystoreResponse> future = new CompletableFuture<KeystoreResponse>();
- @Override
- public void onFinished(KeystoreResponse keystoreResponse) throws android.os.RemoteException {
- future.complete(keystoreResponse);
- }
- public final CompletableFuture<KeystoreResponse> getFuture() {
- return future;
- }
- @Override
- public void binderDied() {
- future.completeExceptionally(new RemoteException("Keystore died"));
- }
- };
-
- public int abort(IBinder token) {
- KeystoreResultPromise promise = new KeystoreResultPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- int errorCode = mBinder.abort(promise, token);
- if (errorCode == NO_ERROR) {
- return interruptedPreservingGet(promise.getFuture()).getErrorCode();
- } else {
- return errorCode;
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "Abort completed with exception", e);
- return SYSTEM_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
/**
* Add an authentication record to the keystore authorization table.
@@ -1013,191 +136,7 @@
* a {@code KeymasterDefs.KM_ERROR_} value or {@code KeyStore} ResponseCode.
*/
public int addAuthToken(byte[] authToken) {
- try {
- Authorization.addAuthToken(authToken);
- return mBinder.addAuthToken(authToken);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- }
- }
-
- /**
- * Notify keystore that a user's password has changed.
- *
- * @param userId the user whose password changed.
- * @param newPassword the new password or "" if the password was removed.
- */
- public boolean onUserPasswordChanged(int userId, String newPassword) {
- // Parcel.cpp doesn't support deserializing null strings and treats them as "". Make that
- // explicit here.
- if (newPassword == null) {
- newPassword = "";
- }
- try {
- return mBinder.onUserPasswordChanged(userId, newPassword) == NO_ERROR;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
- }
-
- /**
- * Notify keystore that a user was added.
- *
- * @param userId the new user.
- * @param parentId the parent of the new user, or -1 if the user has no parent. If parentId is
- * specified then the new user's keystore will be intialized with the same secure lockscreen
- * password as the parent.
- */
- public void onUserAdded(int userId, int parentId) {
- try {
- mBinder.onUserAdded(userId, parentId);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- }
- }
-
- /**
- * Notify keystore that a user was added.
- *
- * @param userId the new user.
- */
- public void onUserAdded(int userId) {
- onUserAdded(userId, -1);
- }
-
- /**
- * Notify keystore that a user was removed.
- *
- * @param userId the removed user.
- */
- public void onUserRemoved(int userId) {
- try {
- mBinder.onUserRemoved(userId);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- }
- }
-
- public boolean onUserPasswordChanged(String newPassword) {
- return onUserPasswordChanged(UserHandle.getUserId(Process.myUid()), newPassword);
- }
-
- /**
- * Notify keystore about the latest user locked state. This is to support keyguard-bound key.
- */
- public void onUserLockedStateChanged(int userHandle, boolean locked) {
- try {
- mBinder.onKeyguardVisibilityChanged(locked, userHandle);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to update user locked state " + userHandle, e);
- }
- }
-
- private class KeyAttestationCallbackResult {
- private KeystoreResponse keystoreResponse;
- private KeymasterCertificateChain certificateChain;
-
- public KeyAttestationCallbackResult(KeystoreResponse keystoreResponse,
- KeymasterCertificateChain certificateChain) {
- this.keystoreResponse = keystoreResponse;
- this.certificateChain = certificateChain;
- }
-
- public KeystoreResponse getKeystoreResponse() {
- return keystoreResponse;
- }
-
- public void setKeystoreResponse(KeystoreResponse keystoreResponse) {
- this.keystoreResponse = keystoreResponse;
- }
-
- public KeymasterCertificateChain getCertificateChain() {
- return certificateChain;
- }
-
- public void setCertificateChain(KeymasterCertificateChain certificateChain) {
- this.certificateChain = certificateChain;
- }
- }
-
- private class CertificateChainPromise
- extends android.security.keystore.IKeystoreCertificateChainCallback.Stub
- implements IBinder.DeathRecipient {
- final private CompletableFuture<KeyAttestationCallbackResult> future = new CompletableFuture<KeyAttestationCallbackResult>();
- @Override
- public void onFinished(KeystoreResponse keystoreResponse,
- KeymasterCertificateChain certificateChain) throws android.os.RemoteException {
- future.complete(new KeyAttestationCallbackResult(keystoreResponse, certificateChain));
- }
- public final CompletableFuture<KeyAttestationCallbackResult> getFuture() {
- return future;
- }
- @Override
- public void binderDied() {
- future.completeExceptionally(new RemoteException("Keystore died"));
- }
- };
-
-
- public int attestKey(
- String alias, KeymasterArguments params, KeymasterCertificateChain outChain) {
- CertificateChainPromise promise = new CertificateChainPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- if (params == null) {
- params = new KeymasterArguments();
- }
- if (outChain == null) {
- outChain = new KeymasterCertificateChain();
- }
- int error = mBinder.attestKey(promise, alias, params);
- if (error != NO_ERROR) return error;
- KeyAttestationCallbackResult result = interruptedPreservingGet(promise.getFuture());
- error = result.getKeystoreResponse().getErrorCode();
- if (error == NO_ERROR) {
- outChain.shallowCopyFrom(result.getCertificateChain());
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "AttestKey completed with exception", e);
- return SYSTEM_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
- }
-
- public int attestDeviceIds(KeymasterArguments params, KeymasterCertificateChain outChain) {
- CertificateChainPromise promise = new CertificateChainPromise();
- try {
- mBinder.asBinder().linkToDeath(promise, 0);
- if (params == null) {
- params = new KeymasterArguments();
- }
- if (outChain == null) {
- outChain = new KeymasterCertificateChain();
- }
- int error = mBinder.attestDeviceIds(promise, params);
- if (error != NO_ERROR) return error;
- KeyAttestationCallbackResult result = interruptedPreservingGet(promise.getFuture());
- error = result.getKeystoreResponse().getErrorCode();
- if (error == NO_ERROR) {
- outChain.shallowCopyFrom(result.getCertificateChain());
- }
- return error;
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return SYSTEM_ERROR;
- } catch (ExecutionException e) {
- Log.e(TAG, "AttestDevicdeIds completed with exception", e);
- return SYSTEM_ERROR;
- } finally {
- mBinder.asBinder().unlinkToDeath(promise, 0);
- }
+ return Authorization.addAuthToken(authToken);
}
/**
@@ -1205,77 +144,6 @@
*/
public void onDeviceOffBody() {
AndroidKeyStoreMaintenance.onDeviceOffBody();
- try {
- mBinder.onDeviceOffBody();
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- }
- }
-
- // Keep in sync with confirmationui/1.0/types.hal.
- public static final int CONFIRMATIONUI_OK = 0;
- public static final int CONFIRMATIONUI_CANCELED = 1;
- public static final int CONFIRMATIONUI_ABORTED = 2;
- public static final int CONFIRMATIONUI_OPERATION_PENDING = 3;
- public static final int CONFIRMATIONUI_IGNORED = 4;
- public static final int CONFIRMATIONUI_SYSTEM_ERROR = 5;
- public static final int CONFIRMATIONUI_UNIMPLEMENTED = 6;
- public static final int CONFIRMATIONUI_UNEXPECTED = 7;
- public static final int CONFIRMATIONUI_UIERROR = 0x10000;
- public static final int CONFIRMATIONUI_UIERROR_MISSING_GLYPH = 0x10001;
- public static final int CONFIRMATIONUI_UIERROR_MESSAGE_TOO_LONG = 0x10002;
- public static final int CONFIRMATIONUI_UIERROR_MALFORMED_UTF8_ENCODING = 0x10003;
-
- /**
- * Requests keystore call into the confirmationui HAL to display a prompt.
- *
- * @param listener the binder to use for callbacks.
- * @param promptText the prompt to display.
- * @param extraData extra data / nonce from application.
- * @param locale the locale as a BCP 47 langauge tag.
- * @param uiOptionsAsFlags the UI options to use, as flags.
- * @return one of the {@code CONFIRMATIONUI_*} constants, for
- * example {@code KeyStore.CONFIRMATIONUI_OK}.
- */
- public int presentConfirmationPrompt(IBinder listener, String promptText, byte[] extraData,
- String locale, int uiOptionsAsFlags) {
- try {
- return mBinder.presentConfirmationPrompt(listener, promptText, extraData, locale,
- uiOptionsAsFlags);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return CONFIRMATIONUI_SYSTEM_ERROR;
- }
- }
-
- /**
- * Requests keystore call into the confirmationui HAL to cancel displaying a prompt.
- *
- * @param listener the binder passed to the {@link #presentConfirmationPrompt} method.
- * @return one of the {@code CONFIRMATIONUI_*} constants, for
- * example {@code KeyStore.CONFIRMATIONUI_OK}.
- */
- public int cancelConfirmationPrompt(IBinder listener) {
- try {
- return mBinder.cancelConfirmationPrompt(listener);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return CONFIRMATIONUI_SYSTEM_ERROR;
- }
- }
-
- /**
- * Requests keystore to check if the confirmationui HAL is available.
- *
- * @return whether the confirmationUI HAL is available.
- */
- public boolean isConfirmationPromptSupported() {
- try {
- return mBinder.isConfirmationPromptSupported();
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
- return false;
- }
}
/**
@@ -1284,143 +152,6 @@
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public static KeyStoreException getKeyStoreException(int errorCode) {
- if (errorCode > 0) {
- // KeyStore layer error
- switch (errorCode) {
- case NO_ERROR:
- return new KeyStoreException(errorCode, "OK");
- case LOCKED:
- return new KeyStoreException(errorCode, "User authentication required");
- case UNINITIALIZED:
- return new KeyStoreException(errorCode, "Keystore not initialized");
- case SYSTEM_ERROR:
- return new KeyStoreException(errorCode, "System error");
- case PERMISSION_DENIED:
- return new KeyStoreException(errorCode, "Permission denied");
- case KEY_NOT_FOUND:
- return new KeyStoreException(errorCode, "Key not found");
- case VALUE_CORRUPTED:
- return new KeyStoreException(errorCode, "Key blob corrupted");
- case OP_AUTH_NEEDED:
- return new KeyStoreException(errorCode, "Operation requires authorization");
- case KEY_PERMANENTLY_INVALIDATED:
- return new KeyStoreException(errorCode, "Key permanently invalidated");
- default:
- return new KeyStoreException(errorCode, String.valueOf(errorCode));
- }
- } else {
- // Keymaster layer error
- switch (errorCode) {
- case KeymasterDefs.KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT:
- // The name of this parameter significantly differs between Keymaster and
- // framework APIs. Use the framework wording to make life easier for developers.
- return new KeyStoreException(errorCode,
- "Invalid user authentication validity duration");
- default:
- return new KeyStoreException(errorCode,
- KeymasterDefs.getErrorMessage(errorCode));
- }
- }
- }
-
- /**
- * Returns an {@link InvalidKeyException} corresponding to the provided
- * {@link KeyStoreException}.
- */
- public InvalidKeyException getInvalidKeyException(
- String keystoreKeyAlias, int uid, KeyStoreException e) {
- switch (e.getErrorCode()) {
- case LOCKED:
- return new UserNotAuthenticatedException();
- case KeymasterDefs.KM_ERROR_KEY_EXPIRED:
- return new KeyExpiredException();
- case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID:
- return new KeyNotYetValidException();
- case KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED:
- case OP_AUTH_NEEDED:
- {
- // We now need to determine whether the key/operation can become usable if user
- // authentication is performed, or whether it can never become usable again.
- // User authentication requirements are contained in the key's characteristics. We
- // need to check whether these requirements can be be satisfied by asking the user
- // to authenticate.
- KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
- int getKeyCharacteristicsErrorCode =
- getKeyCharacteristics(keystoreKeyAlias, null, null, uid,
- keyCharacteristics);
- if (getKeyCharacteristicsErrorCode != NO_ERROR) {
- return new InvalidKeyException(
- "Failed to obtained key characteristics",
- getKeyStoreException(getKeyCharacteristicsErrorCode));
- }
- List<BigInteger> keySids =
- keyCharacteristics.getUnsignedLongs(KeymasterDefs.KM_TAG_USER_SECURE_ID);
- if (keySids.isEmpty()) {
- // Key is not bound to any SIDs -- no amount of authentication will help here.
- return new KeyPermanentlyInvalidatedException();
- }
- long rootSid = GateKeeper.getSecureUserId();
- if ((rootSid != 0) && (keySids.contains(KeymasterArguments.toUint64(rootSid)))) {
- // One of the key's SIDs is the current root SID -- user can be authenticated
- // against that SID.
- return new UserNotAuthenticatedException();
- }
-
- final BiometricManager bm = mContext.getSystemService(BiometricManager.class);
- long[] biometricSids = bm.getAuthenticatorIds();
-
- // The key must contain every biometric SID. This is because the current API surface
- // treats all biometrics (capable of keystore integration) equally. e.g. if the
- // device has multiple keystore-capable sensors, and one of the sensor's SIDs
- // changed, 1) there is no way for a developer to specify authentication with a
- // specific sensor (the one that hasn't changed), and 2) currently the only
- // signal to developers is the UserNotAuthenticatedException, which doesn't
- // indicate a specific sensor.
- boolean canUnlockViaBiometrics = true;
- for (long sid : biometricSids) {
- if (!keySids.contains(KeymasterArguments.toUint64(sid))) {
- canUnlockViaBiometrics = false;
- break;
- }
- }
-
- if (canUnlockViaBiometrics) {
- // All of the biometric SIDs are contained in the key's SIDs.
- return new UserNotAuthenticatedException();
- }
-
- // None of the key's SIDs can ever be authenticated
- return new KeyPermanentlyInvalidatedException();
- }
- case UNINITIALIZED:
- return new KeyPermanentlyInvalidatedException();
- default:
- return new InvalidKeyException("Keystore operation failed", e);
- }
- }
-
- /**
- * Returns an {@link InvalidKeyException} corresponding to the provided keystore/keymaster error
- * code.
- */
- public InvalidKeyException getInvalidKeyException(String keystoreKeyAlias, int uid,
- int errorCode) {
- return getInvalidKeyException(keystoreKeyAlias, uid, getKeyStoreException(errorCode));
- }
-
- private static <R> R interruptedPreservingGet(CompletableFuture<R> future)
- throws ExecutionException {
- boolean wasInterrupted = false;
- while (true) {
- try {
- R result = future.get();
- if (wasInterrupted) {
- Thread.currentThread().interrupt();
- }
- return result;
- } catch (InterruptedException e) {
- wasInterrupted = true;
- }
- }
+ return new KeyStoreException(-10000, "Should not be called.");
}
}
diff --git a/keystore/java/android/security/LegacyVpnProfileStore.java b/keystore/java/android/security/LegacyVpnProfileStore.java
index 41cfb27..1d2738e 100644
--- a/keystore/java/android/security/LegacyVpnProfileStore.java
+++ b/keystore/java/android/security/LegacyVpnProfileStore.java
@@ -19,7 +19,6 @@
import android.annotation.NonNull;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
-import android.security.keystore.AndroidKeyStoreProvider;
import android.security.vpnprofilestore.IVpnProfileStore;
import android.util.Log;
@@ -53,13 +52,8 @@
*/
public static boolean put(@NonNull String alias, @NonNull byte[] profile) {
try {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- getService().put(alias, profile);
- return true;
- } else {
- return KeyStore.getInstance().put(
- alias, profile, KeyStore.UID_SELF, 0);
- }
+ getService().put(alias, profile);
+ return true;
} catch (Exception e) {
Log.e(TAG, "Failed to put vpn profile.", e);
return false;
@@ -77,11 +71,7 @@
*/
public static byte[] get(@NonNull String alias) {
try {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- return getService().get(alias);
- } else {
- return KeyStore.getInstance().get(alias, true /* suppressKeyNotFoundWarning */);
- }
+ return getService().get(alias);
} catch (ServiceSpecificException e) {
if (e.errorCode != PROFILE_NOT_FOUND) {
Log.e(TAG, "Failed to get vpn profile.", e);
@@ -100,12 +90,8 @@
*/
public static boolean remove(@NonNull String alias) {
try {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- getService().remove(alias);
- return true;
- } else {
- return KeyStore.getInstance().delete(alias);
- }
+ getService().remove(alias);
+ return true;
} catch (ServiceSpecificException e) {
if (e.errorCode != PROFILE_NOT_FOUND) {
Log.e(TAG, "Failed to remove vpn profile.", e);
@@ -124,16 +110,11 @@
*/
public static @NonNull String[] list(@NonNull String prefix) {
try {
- if (AndroidKeyStoreProvider.isKeystore2Enabled()) {
- final String[] aliases = getService().list(prefix);
- for (int i = 0; i < aliases.length; ++i) {
- aliases[i] = aliases[i].substring(prefix.length());
- }
- return aliases;
- } else {
- final String[] result = KeyStore.getInstance().list(prefix);
- return result != null ? result : new String[0];
+ final String[] aliases = getService().list(prefix);
+ for (int i = 0; i < aliases.length; ++i) {
+ aliases[i] = aliases[i].substring(prefix.length());
}
+ return aliases;
} catch (Exception e) {
Log.e(TAG, "Failed to list vpn profiles.", e);
}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStore3DESCipherSpi.java b/keystore/java/android/security/keystore/AndroidKeyStore3DESCipherSpi.java
deleted file mode 100644
index 01fd062..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStore3DESCipherSpi.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 2018 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.security.keystore;
-
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.ProviderException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
-import java.util.Arrays;
-
-import javax.crypto.CipherSpi;
-import javax.crypto.spec.IvParameterSpec;
-
-/**
- * Base class for Android Keystore 3DES {@link CipherSpi} implementations.
- *
- * @hide
- */
-public class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
-
- private static final int BLOCK_SIZE_BYTES = 8;
-
- private final int mKeymasterBlockMode;
- private final int mKeymasterPadding;
- /** Whether this transformation requires an IV. */
- private final boolean mIvRequired;
-
- private byte[] mIv;
-
- /** Whether the current {@code #mIv} has been used by the underlying crypto operation. */
- private boolean mIvHasBeenUsed;
-
- AndroidKeyStore3DESCipherSpi(
- int keymasterBlockMode,
- int keymasterPadding,
- boolean ivRequired) {
- mKeymasterBlockMode = keymasterBlockMode;
- mKeymasterPadding = keymasterPadding;
- mIvRequired = ivRequired;
- }
-
- abstract static class ECB extends AndroidKeyStore3DESCipherSpi {
- protected ECB(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_ECB, keymasterPadding, false);
- }
-
- public static class NoPadding extends ECB {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
- }
-
- public static class PKCS7Padding extends ECB {
- public PKCS7Padding() {
- super(KeymasterDefs.KM_PAD_PKCS7);
- }
- }
- }
-
- abstract static class CBC extends AndroidKeyStore3DESCipherSpi {
- protected CBC(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_CBC, keymasterPadding, true);
- }
-
- public static class NoPadding extends CBC {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
- }
-
- public static class PKCS7Padding extends CBC {
- public PKCS7Padding() {
- super(KeymasterDefs.KM_PAD_PKCS7);
- }
- }
- }
-
- @Override
- protected void initKey(int i, Key key) throws InvalidKeyException {
- if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeyException(
- "Unsupported key: " + ((key != null) ? key.getClass().getName() : "null"));
- }
- if (!KeyProperties.KEY_ALGORITHM_3DES.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException(
- "Unsupported key algorithm: " + key.getAlgorithm() + ". Only " +
- KeyProperties.KEY_ALGORITHM_3DES + " supported");
- }
- setKey((AndroidKeyStoreSecretKey) key);
- }
-
- @Override
- protected int engineGetBlockSize() {
- return BLOCK_SIZE_BYTES;
- }
-
- @Override
- protected int engineGetOutputSize(int inputLen) {
- return inputLen + 3 * BLOCK_SIZE_BYTES;
- }
-
- @Override
- protected final byte[] engineGetIV() {
- return ArrayUtils.cloneIfNotEmpty(mIv);
- }
-
- @Override
- protected AlgorithmParameters engineGetParameters() {
- if (!mIvRequired) {
- return null;
- }
- if ((mIv != null) && (mIv.length > 0)) {
- try {
- AlgorithmParameters params = AlgorithmParameters.getInstance("DESede");
- params.init(new IvParameterSpec(mIv));
- return params;
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain 3DES AlgorithmParameters", e);
- } catch (InvalidParameterSpecException e) {
- throw new ProviderException(
- "Failed to initialize 3DES AlgorithmParameters with an IV",
- e);
- }
- }
- return null;
- }
-
- @Override
- protected void initAlgorithmSpecificParameters() throws InvalidKeyException {
- if (!mIvRequired) {
- return;
- }
-
- // IV is used
- if (!isEncrypting()) {
- throw new InvalidKeyException("IV required when decrypting"
- + ". Use IvParameterSpec or AlgorithmParameters to provide it.");
- }
- }
-
- @Override
- protected void initAlgorithmSpecificParameters(AlgorithmParameterSpec params)
- throws InvalidAlgorithmParameterException {
- if (!mIvRequired) {
- if (params != null) {
- throw new InvalidAlgorithmParameterException("Unsupported parameters: " + params);
- }
- return;
- }
-
- // IV is used
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException(
- "IvParameterSpec must be provided when decrypting");
- }
- return;
- }
- if (!(params instanceof IvParameterSpec)) {
- throw new InvalidAlgorithmParameterException("Only IvParameterSpec supported");
- }
- mIv = ((IvParameterSpec) params).getIV();
- if (mIv == null) {
- throw new InvalidAlgorithmParameterException("Null IV in IvParameterSpec");
- }
- }
-
- @Override
- protected void initAlgorithmSpecificParameters(AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
- if (!mIvRequired) {
- if (params != null) {
- throw new InvalidAlgorithmParameterException("Unsupported parameters: " + params);
- }
- return;
- }
-
- // IV is used
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV required when decrypting"
- + ". Use IvParameterSpec or AlgorithmParameters to provide it.");
- }
- return;
- }
-
- if (!"DESede".equalsIgnoreCase(params.getAlgorithm())) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported AlgorithmParameters algorithm: " + params.getAlgorithm()
- + ". Supported: DESede");
- }
-
- IvParameterSpec ivSpec;
- try {
- ivSpec = params.getParameterSpec(IvParameterSpec.class);
- } catch (InvalidParameterSpecException e) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV required when decrypting"
- + ", but not found in parameters: " + params, e);
- }
- mIv = null;
- return;
- }
- mIv = ivSpec.getIV();
- if (mIv == null) {
- throw new InvalidAlgorithmParameterException("Null IV in AlgorithmParameters");
- }
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- if ((mIvRequired) && (mIv == null) && (isEncrypting())) {
- // IV will need to be generated
- return BLOCK_SIZE_BYTES;
- }
-
- return 0;
- }
-
- @Override
- protected int getAdditionalEntropyAmountForFinish() {
- return 0;
- }
-
- @Override
- protected void addAlgorithmSpecificParametersToBegin(KeymasterArguments keymasterArgs) {
- if ((isEncrypting()) && (mIvRequired) && (mIvHasBeenUsed)) {
- // IV is being reused for encryption: this violates security best practices.
- throw new IllegalStateException(
- "IV has already been used. Reusing IV in encryption mode violates security best"
- + " practices.");
- }
-
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_3DES);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockMode);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, mKeymasterPadding);
- if ((mIvRequired) && (mIv != null)) {
- keymasterArgs.addBytes(KeymasterDefs.KM_TAG_NONCE, mIv);
- }
- }
-
- @Override
- protected void loadAlgorithmSpecificParametersFromBeginResult(
- KeymasterArguments keymasterArgs) {
- mIvHasBeenUsed = true;
-
- // NOTE: Keymaster doesn't always return an IV, even if it's used.
- byte[] returnedIv = keymasterArgs.getBytes(KeymasterDefs.KM_TAG_NONCE, null);
- if ((returnedIv != null) && (returnedIv.length == 0)) {
- returnedIv = null;
- }
-
- if (mIvRequired) {
- if (mIv == null) {
- mIv = returnedIv;
- } else if ((returnedIv != null) && (!Arrays.equals(returnedIv, mIv))) {
- throw new ProviderException("IV in use differs from provided IV");
- }
- } else {
- if (returnedIv != null) {
- throw new ProviderException(
- "IV in use despite IV not being used by this transformation");
- }
- }
- }
-
- @Override
- protected final void resetAll() {
- mIv = null;
- mIvHasBeenUsed = false;
- super.resetAll();
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreAuthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreAuthenticatedAESCipherSpi.java
deleted file mode 100644
index feb6101..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreAuthenticatedAESCipherSpi.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-import android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.Stream;
-
-import libcore.util.EmptyArray;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.ProviderException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
-import java.util.Arrays;
-
-import javax.crypto.CipherSpi;
-import javax.crypto.spec.GCMParameterSpec;
-
-/**
- * Base class for Android Keystore authenticated AES {@link CipherSpi} implementations.
- *
- * @hide
- */
-abstract class AndroidKeyStoreAuthenticatedAESCipherSpi extends AndroidKeyStoreCipherSpiBase {
-
- abstract static class GCM extends AndroidKeyStoreAuthenticatedAESCipherSpi {
- static final int MIN_SUPPORTED_TAG_LENGTH_BITS = 96;
- private static final int MAX_SUPPORTED_TAG_LENGTH_BITS = 128;
- private static final int DEFAULT_TAG_LENGTH_BITS = 128;
- private static final int IV_LENGTH_BYTES = 12;
-
- private int mTagLengthBits = DEFAULT_TAG_LENGTH_BITS;
-
- GCM(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_GCM, keymasterPadding);
- }
-
- @Override
- protected final void resetAll() {
- mTagLengthBits = DEFAULT_TAG_LENGTH_BITS;
- super.resetAll();
- }
-
- @Override
- protected final void resetWhilePreservingInitState() {
- super.resetWhilePreservingInitState();
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters() throws InvalidKeyException {
- if (!isEncrypting()) {
- throw new InvalidKeyException("IV required when decrypting"
- + ". Use IvParameterSpec or AlgorithmParameters to provide it.");
- }
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters(AlgorithmParameterSpec params)
- throws InvalidAlgorithmParameterException {
- // IV is used
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException(
- "GCMParameterSpec must be provided when decrypting");
- }
- return;
- }
- if (!(params instanceof GCMParameterSpec)) {
- throw new InvalidAlgorithmParameterException("Only GCMParameterSpec supported");
- }
- GCMParameterSpec spec = (GCMParameterSpec) params;
- byte[] iv = spec.getIV();
- if (iv == null) {
- throw new InvalidAlgorithmParameterException("Null IV in GCMParameterSpec");
- } else if (iv.length != IV_LENGTH_BYTES) {
- throw new InvalidAlgorithmParameterException("Unsupported IV length: "
- + iv.length + " bytes. Only " + IV_LENGTH_BYTES
- + " bytes long IV supported");
- }
- int tagLengthBits = spec.getTLen();
- if ((tagLengthBits < MIN_SUPPORTED_TAG_LENGTH_BITS)
- || (tagLengthBits > MAX_SUPPORTED_TAG_LENGTH_BITS)
- || ((tagLengthBits % 8) != 0)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported tag length: " + tagLengthBits + " bits"
- + ". Supported lengths: 96, 104, 112, 120, 128");
- }
- setIv(iv);
- mTagLengthBits = tagLengthBits;
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters(AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV required when decrypting"
- + ". Use GCMParameterSpec or GCM AlgorithmParameters to provide it.");
- }
- return;
- }
-
- if (!"GCM".equalsIgnoreCase(params.getAlgorithm())) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported AlgorithmParameters algorithm: " + params.getAlgorithm()
- + ". Supported: GCM");
- }
-
- GCMParameterSpec spec;
- try {
- spec = params.getParameterSpec(GCMParameterSpec.class);
- } catch (InvalidParameterSpecException e) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV and tag length required when"
- + " decrypting, but not found in parameters: " + params, e);
- }
- setIv(null);
- return;
- }
- initAlgorithmSpecificParameters(spec);
- }
-
- @Nullable
- @Override
- protected final AlgorithmParameters engineGetParameters() {
- byte[] iv = getIv();
- if ((iv != null) && (iv.length > 0)) {
- try {
- AlgorithmParameters params = AlgorithmParameters.getInstance("GCM");
- params.init(new GCMParameterSpec(mTagLengthBits, iv));
- return params;
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain GCM AlgorithmParameters", e);
- } catch (InvalidParameterSpecException e) {
- throw new ProviderException(
- "Failed to initialize GCM AlgorithmParameters", e);
- }
- }
- return null;
- }
-
- @NonNull
- @Override
- protected KeyStoreCryptoOperationStreamer createMainDataStreamer(
- KeyStore keyStore, IBinder operationToken) {
- KeyStoreCryptoOperationStreamer streamer = new KeyStoreCryptoOperationChunkedStreamer(
- new KeyStoreCryptoOperationChunkedStreamer.MainDataStream(
- keyStore, operationToken), 0);
- if (isEncrypting()) {
- return streamer;
- } else {
- // When decrypting, to avoid leaking unauthenticated plaintext, do not return any
- // plaintext before ciphertext is authenticated by KeyStore.finish.
- return new BufferAllOutputUntilDoFinalStreamer(streamer);
- }
- }
-
- @NonNull
- @Override
- protected final KeyStoreCryptoOperationStreamer createAdditionalAuthenticationDataStreamer(
- KeyStore keyStore, IBinder operationToken) {
- return new KeyStoreCryptoOperationChunkedStreamer(
- new AdditionalAuthenticationDataStream(keyStore, operationToken), 0);
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- if ((getIv() == null) && (isEncrypting())) {
- // IV will need to be generated
- return IV_LENGTH_BYTES;
- }
-
- return 0;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForFinish() {
- return 0;
- }
-
- @Override
- protected final void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- super.addAlgorithmSpecificParametersToBegin(keymasterArgs);
- keymasterArgs.addUnsignedInt(KeymasterDefs.KM_TAG_MAC_LENGTH, mTagLengthBits);
- }
-
- protected final int getTagLengthBits() {
- return mTagLengthBits;
- }
-
- public static final class NoPadding extends GCM {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
-
- @Override
- protected final int engineGetOutputSize(int inputLen) {
- int tagLengthBytes = (getTagLengthBits() + 7) / 8;
- long result;
- if (isEncrypting()) {
- result = getConsumedInputSizeBytes() - getProducedOutputSizeBytes() + inputLen
- + tagLengthBytes;
- } else {
- result = getConsumedInputSizeBytes() - getProducedOutputSizeBytes() + inputLen
- - tagLengthBytes;
- }
- if (result < 0) {
- return 0;
- } else if (result > Integer.MAX_VALUE) {
- return Integer.MAX_VALUE;
- }
- return (int) result;
- }
- }
- }
-
- private static final int BLOCK_SIZE_BYTES = 16;
-
- private final int mKeymasterBlockMode;
- private final int mKeymasterPadding;
-
- private byte[] mIv;
-
- /** Whether the current {@code #mIv} has been used by the underlying crypto operation. */
- private boolean mIvHasBeenUsed;
-
- AndroidKeyStoreAuthenticatedAESCipherSpi(
- int keymasterBlockMode,
- int keymasterPadding) {
- mKeymasterBlockMode = keymasterBlockMode;
- mKeymasterPadding = keymasterPadding;
- }
-
- @Override
- protected void resetAll() {
- mIv = null;
- mIvHasBeenUsed = false;
- super.resetAll();
- }
-
- @Override
- protected final void initKey(int opmode, Key key) throws InvalidKeyException {
- if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeyException(
- "Unsupported key: " + ((key != null) ? key.getClass().getName() : "null"));
- }
- if (!KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException(
- "Unsupported key algorithm: " + key.getAlgorithm() + ". Only " +
- KeyProperties.KEY_ALGORITHM_AES + " supported");
- }
- setKey((AndroidKeyStoreSecretKey) key);
- }
-
- @Override
- protected void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- if ((isEncrypting()) && (mIvHasBeenUsed)) {
- // IV is being reused for encryption: this violates security best practices.
- throw new IllegalStateException(
- "IV has already been used. Reusing IV in encryption mode violates security best"
- + " practices.");
- }
-
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockMode);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, mKeymasterPadding);
- if (mIv != null) {
- keymasterArgs.addBytes(KeymasterDefs.KM_TAG_NONCE, mIv);
- }
- }
-
- @Override
- protected final void loadAlgorithmSpecificParametersFromBeginResult(
- @NonNull KeymasterArguments keymasterArgs) {
- mIvHasBeenUsed = true;
-
- // NOTE: Keymaster doesn't always return an IV, even if it's used.
- byte[] returnedIv = keymasterArgs.getBytes(KeymasterDefs.KM_TAG_NONCE, null);
- if ((returnedIv != null) && (returnedIv.length == 0)) {
- returnedIv = null;
- }
-
- if (mIv == null) {
- mIv = returnedIv;
- } else if ((returnedIv != null) && (!Arrays.equals(returnedIv, mIv))) {
- throw new ProviderException("IV in use differs from provided IV");
- }
- }
-
- @Override
- protected final int engineGetBlockSize() {
- return BLOCK_SIZE_BYTES;
- }
-
- @Override
- protected final byte[] engineGetIV() {
- return ArrayUtils.cloneIfNotEmpty(mIv);
- }
-
- protected void setIv(byte[] iv) {
- mIv = iv;
- }
-
- protected byte[] getIv() {
- return mIv;
- }
-
- /**
- * {@link KeyStoreCryptoOperationStreamer} which buffers all output until {@code doFinal} from
- * which it returns all output in one go, provided {@code doFinal} succeeds.
- */
- private static class BufferAllOutputUntilDoFinalStreamer
- implements KeyStoreCryptoOperationStreamer {
-
- private final KeyStoreCryptoOperationStreamer mDelegate;
- private ByteArrayOutputStream mBufferedOutput = new ByteArrayOutputStream();
- private long mProducedOutputSizeBytes;
-
- private BufferAllOutputUntilDoFinalStreamer(KeyStoreCryptoOperationStreamer delegate) {
- mDelegate = delegate;
- }
-
- @Override
- public byte[] update(byte[] input, int inputOffset, int inputLength)
- throws KeyStoreException {
- byte[] output = mDelegate.update(input, inputOffset, inputLength);
- if (output != null) {
- try {
- mBufferedOutput.write(output);
- } catch (IOException e) {
- throw new ProviderException("Failed to buffer output", e);
- }
- }
- return EmptyArray.BYTE;
- }
-
- @Override
- public byte[] doFinal(byte[] input, int inputOffset, int inputLength,
- byte[] signature, byte[] additionalEntropy) throws KeyStoreException {
- byte[] output = mDelegate.doFinal(input, inputOffset, inputLength, signature,
- additionalEntropy);
- if (output != null) {
- try {
- mBufferedOutput.write(output);
- } catch (IOException e) {
- throw new ProviderException("Failed to buffer output", e);
- }
- }
- byte[] result = mBufferedOutput.toByteArray();
- mBufferedOutput.reset();
- mProducedOutputSizeBytes += result.length;
- return result;
- }
-
- @Override
- public long getConsumedInputSizeBytes() {
- return mDelegate.getConsumedInputSizeBytes();
- }
-
- @Override
- public long getProducedOutputSizeBytes() {
- return mProducedOutputSizeBytes;
- }
- }
-
- /**
- * Additional Authentication Data (AAD) stream via a KeyStore streaming operation. This stream
- * sends AAD into the KeyStore.
- */
- private static class AdditionalAuthenticationDataStream implements Stream {
-
- private final KeyStore mKeyStore;
- private final IBinder mOperationToken;
-
- private AdditionalAuthenticationDataStream(KeyStore keyStore, IBinder operationToken) {
- mKeyStore = keyStore;
- mOperationToken = operationToken;
- }
-
- @Override
- public OperationResult update(byte[] input) {
- KeymasterArguments keymasterArgs = new KeymasterArguments();
- keymasterArgs.addBytes(KeymasterDefs.KM_TAG_ASSOCIATED_DATA, input);
-
- // KeyStore does not reflect AAD in inputConsumed, but users of Stream rely on this
- // field. We fix this discrepancy here. KeyStore.update contract is that all of AAD
- // has been consumed if the method succeeds.
- OperationResult result = mKeyStore.update(mOperationToken, keymasterArgs, null);
- if (result.resultCode == KeyStore.NO_ERROR) {
- result = new OperationResult(
- result.resultCode,
- result.token,
- result.operationHandle,
- input.length, // inputConsumed
- result.output,
- result.outParams);
- }
- return result;
- }
-
- @Override
- public OperationResult finish(byte[] input, byte[] signature, byte[] additionalEntropy) {
- if ((additionalEntropy != null) && (additionalEntropy.length > 0)) {
- throw new ProviderException("AAD stream does not support additional entropy");
- }
- return new OperationResult(
- KeyStore.NO_ERROR,
- mOperationToken,
- 0, // operation handle -- nobody cares about this being returned from finish
- 0, // inputConsumed
- EmptyArray.BYTE, // output
- new KeymasterArguments() // additional params returned by finish
- );
- }
- }
-}
\ No newline at end of file
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
deleted file mode 100644
index 5730234..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.Provider;
-
-/**
- * {@link Provider} of JCA crypto operations operating on Android KeyStore keys.
- *
- * <p>This provider was separated out of {@link AndroidKeyStoreProvider} to work around the issue
- * that Bouncy Castle provider incorrectly declares that it accepts arbitrary keys (incl. Android
- * KeyStore ones). This causes JCA to select the Bouncy Castle's implementation of JCA crypto
- * operations for Android KeyStore keys unless Android KeyStore's own implementations are installed
- * as higher-priority than Bouncy Castle ones. The purpose of this provider is to do just that: to
- * offer crypto operations operating on Android KeyStore keys and to be installed at higher priority
- * than the Bouncy Castle provider.
- *
- * <p>Once Bouncy Castle provider is fixed, this provider can be merged into the
- * {@code AndroidKeyStoreProvider}.
- *
- * @hide
- */
-public class AndroidKeyStoreBCWorkaroundProvider extends Provider {
-
- // IMPLEMENTATION NOTE: Class names are hard-coded in this provider to avoid loading these
- // classes when this provider is instantiated and installed early on during each app's
- // initialization process.
-
- private static final String PACKAGE_NAME = "android.security.keystore";
- private static final String KEYSTORE_SECRET_KEY_CLASS_NAME =
- PACKAGE_NAME + ".AndroidKeyStoreSecretKey";
- private static final String KEYSTORE_PRIVATE_KEY_CLASS_NAME =
- PACKAGE_NAME + ".AndroidKeyStorePrivateKey";
- private static final String KEYSTORE_PUBLIC_KEY_CLASS_NAME =
- PACKAGE_NAME + ".AndroidKeyStorePublicKey";
-
- private static final String DESEDE_SYSTEM_PROPERTY = "ro.hardware.keystore_desede";
-
- /** @hide */
- public AndroidKeyStoreBCWorkaroundProvider() {
- this("AndroidKeyStoreBCWorkaround");
- }
-
- /** @hide **/
- public AndroidKeyStoreBCWorkaroundProvider(String providerName) {
- super(providerName,
- 1.0,
- "Android KeyStore security provider to work around Bouncy Castle");
-
- // --------------------- javax.crypto.Mac
- putMacImpl("HmacSHA1", PACKAGE_NAME + ".AndroidKeyStoreHmacSpi$HmacSHA1");
- put("Alg.Alias.Mac.1.2.840.113549.2.7", "HmacSHA1");
- put("Alg.Alias.Mac.HMAC-SHA1", "HmacSHA1");
- put("Alg.Alias.Mac.HMAC/SHA1", "HmacSHA1");
-
- putMacImpl("HmacSHA224", PACKAGE_NAME + ".AndroidKeyStoreHmacSpi$HmacSHA224");
- put("Alg.Alias.Mac.1.2.840.113549.2.9", "HmacSHA224");
- put("Alg.Alias.Mac.HMAC-SHA224", "HmacSHA224");
- put("Alg.Alias.Mac.HMAC/SHA224", "HmacSHA224");
-
- putMacImpl("HmacSHA256", PACKAGE_NAME + ".AndroidKeyStoreHmacSpi$HmacSHA256");
- put("Alg.Alias.Mac.1.2.840.113549.2.9", "HmacSHA256");
- put("Alg.Alias.Mac.HMAC-SHA256", "HmacSHA256");
- put("Alg.Alias.Mac.HMAC/SHA256", "HmacSHA256");
-
- putMacImpl("HmacSHA384", PACKAGE_NAME + ".AndroidKeyStoreHmacSpi$HmacSHA384");
- put("Alg.Alias.Mac.1.2.840.113549.2.10", "HmacSHA384");
- put("Alg.Alias.Mac.HMAC-SHA384", "HmacSHA384");
- put("Alg.Alias.Mac.HMAC/SHA384", "HmacSHA384");
-
- putMacImpl("HmacSHA512", PACKAGE_NAME + ".AndroidKeyStoreHmacSpi$HmacSHA512");
- put("Alg.Alias.Mac.1.2.840.113549.2.11", "HmacSHA512");
- put("Alg.Alias.Mac.HMAC-SHA512", "HmacSHA512");
- put("Alg.Alias.Mac.HMAC/SHA512", "HmacSHA512");
-
- // --------------------- javax.crypto.Cipher
- putSymmetricCipherImpl("AES/ECB/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$ECB$NoPadding");
- putSymmetricCipherImpl("AES/ECB/PKCS7Padding",
- PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$ECB$PKCS7Padding");
-
- putSymmetricCipherImpl("AES/CBC/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$NoPadding");
- putSymmetricCipherImpl("AES/CBC/PKCS7Padding",
- PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding");
-
- putSymmetricCipherImpl("AES/CTR/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$CTR$NoPadding");
-
- if ("true".equals(android.os.SystemProperties.get(DESEDE_SYSTEM_PROPERTY))) {
- putSymmetricCipherImpl("DESede/CBC/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$NoPadding");
- putSymmetricCipherImpl("DESede/CBC/PKCS7Padding",
- PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$PKCS7Padding");
-
- putSymmetricCipherImpl("DESede/ECB/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$NoPadding");
- putSymmetricCipherImpl("DESede/ECB/PKCS7Padding",
- PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$PKCS7Padding");
- }
-
- putSymmetricCipherImpl("AES/GCM/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding");
-
- putAsymmetricCipherImpl("RSA/ECB/NoPadding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$NoPadding");
- put("Alg.Alias.Cipher.RSA/None/NoPadding", "RSA/ECB/NoPadding");
- putAsymmetricCipherImpl("RSA/ECB/PKCS1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$PKCS1Padding");
- put("Alg.Alias.Cipher.RSA/None/PKCS1Padding", "RSA/ECB/PKCS1Padding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPPadding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA1AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPPadding", "RSA/ECB/OAEPPadding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPWithSHA-1AndMGF1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA1AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-1AndMGF1Padding",
- "RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPWithSHA-224AndMGF1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA224AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-224AndMGF1Padding",
- "RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPWithSHA-256AndMGF1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA256AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-256AndMGF1Padding",
- "RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPWithSHA-384AndMGF1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA384AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-384AndMGF1Padding",
- "RSA/ECB/OAEPWithSHA-384AndMGF1Padding");
- putAsymmetricCipherImpl("RSA/ECB/OAEPWithSHA-512AndMGF1Padding",
- PACKAGE_NAME + ".AndroidKeyStoreRSACipherSpi$OAEPWithSHA512AndMGF1Padding");
- put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-512AndMGF1Padding",
- "RSA/ECB/OAEPWithSHA-512AndMGF1Padding");
-
- // --------------------- java.security.Signature
- putSignatureImpl("NONEwithRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$NONEWithPKCS1Padding");
-
- putSignatureImpl("MD5withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$MD5WithPKCS1Padding");
- put("Alg.Alias.Signature.MD5WithRSAEncryption", "MD5withRSA");
- put("Alg.Alias.Signature.MD5/RSA", "MD5withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.2.5with1.2.840.113549.1.1.1", "MD5withRSA");
-
- putSignatureImpl("SHA1withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA1WithPKCS1Padding");
- put("Alg.Alias.Signature.SHA1WithRSAEncryption", "SHA1withRSA");
- put("Alg.Alias.Signature.SHA1/RSA", "SHA1withRSA");
- put("Alg.Alias.Signature.SHA-1/RSA", "SHA1withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.5", "SHA1withRSA");
- put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.1", "SHA1withRSA");
- put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.5", "SHA1withRSA");
- put("Alg.Alias.Signature.1.3.14.3.2.29", "SHA1withRSA");
-
- putSignatureImpl("SHA224withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA224WithPKCS1Padding");
- put("Alg.Alias.Signature.SHA224WithRSAEncryption", "SHA224withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA224withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.1",
- "SHA224withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.11",
- "SHA224withRSA");
-
- putSignatureImpl("SHA256withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA256WithPKCS1Padding");
- put("Alg.Alias.Signature.SHA256WithRSAEncryption", "SHA256withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA256withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.1",
- "SHA256withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.11",
- "SHA256withRSA");
-
- putSignatureImpl("SHA384withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA384WithPKCS1Padding");
- put("Alg.Alias.Signature.SHA384WithRSAEncryption", "SHA384withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.12", "SHA384withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.2with1.2.840.113549.1.1.1",
- "SHA384withRSA");
-
- putSignatureImpl("SHA512withRSA",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA512WithPKCS1Padding");
- put("Alg.Alias.Signature.SHA512WithRSAEncryption", "SHA512withRSA");
- put("Alg.Alias.Signature.1.2.840.113549.1.1.13", "SHA512withRSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.3with1.2.840.113549.1.1.1",
- "SHA512withRSA");
-
- putSignatureImpl("SHA1withRSA/PSS",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA1WithPSSPadding");
- putSignatureImpl("SHA224withRSA/PSS",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA224WithPSSPadding");
- putSignatureImpl("SHA256withRSA/PSS",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA256WithPSSPadding");
- putSignatureImpl("SHA384withRSA/PSS",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA384WithPSSPadding");
- putSignatureImpl("SHA512withRSA/PSS",
- PACKAGE_NAME + ".AndroidKeyStoreRSASignatureSpi$SHA512WithPSSPadding");
-
- putSignatureImpl("NONEwithECDSA",
- PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$NONE");
-
- putSignatureImpl("SHA1withECDSA", PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$SHA1");
- put("Alg.Alias.Signature.ECDSA", "SHA1withECDSA");
- put("Alg.Alias.Signature.ECDSAwithSHA1", "SHA1withECDSA");
- // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA1(1)
- put("Alg.Alias.Signature.1.2.840.10045.4.1", "SHA1withECDSA");
- put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10045.2.1", "SHA1withECDSA");
-
- // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA2(3)
- putSignatureImpl("SHA224withECDSA",
- PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$SHA224");
- // ecdsa-with-SHA224(1)
- put("Alg.Alias.Signature.1.2.840.10045.4.3.1", "SHA224withECDSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.10045.2.1", "SHA224withECDSA");
-
- // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA2(3)
- putSignatureImpl("SHA256withECDSA",
- PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$SHA256");
- // ecdsa-with-SHA256(2)
- put("Alg.Alias.Signature.1.2.840.10045.4.3.2", "SHA256withECDSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.10045.2.1", "SHA256withECDSA");
-
- putSignatureImpl("SHA384withECDSA",
- PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$SHA384");
- // ecdsa-with-SHA384(3)
- put("Alg.Alias.Signature.1.2.840.10045.4.3.3", "SHA384withECDSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.2with1.2.840.10045.2.1", "SHA384withECDSA");
-
- putSignatureImpl("SHA512withECDSA",
- PACKAGE_NAME + ".AndroidKeyStoreECDSASignatureSpi$SHA512");
- // ecdsa-with-SHA512(4)
- put("Alg.Alias.Signature.1.2.840.10045.4.3.4", "SHA512withECDSA");
- put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.3with1.2.840.10045.2.1", "SHA512withECDSA");
- }
-
- private void putMacImpl(String algorithm, String implClass) {
- put("Mac." + algorithm, implClass);
- put("Mac." + algorithm + " SupportedKeyClasses", KEYSTORE_SECRET_KEY_CLASS_NAME);
- }
-
- private void putSymmetricCipherImpl(String transformation, String implClass) {
- put("Cipher." + transformation, implClass);
- put("Cipher." + transformation + " SupportedKeyClasses", KEYSTORE_SECRET_KEY_CLASS_NAME);
- }
-
- private void putAsymmetricCipherImpl(String transformation, String implClass) {
- put("Cipher." + transformation, implClass);
- put("Cipher." + transformation + " SupportedKeyClasses",
- KEYSTORE_PRIVATE_KEY_CLASS_NAME + "|" + KEYSTORE_PUBLIC_KEY_CLASS_NAME);
- }
-
- private void putSignatureImpl(String algorithm, String implClass) {
- put("Signature." + algorithm, implClass);
- put("Signature." + algorithm + " SupportedKeyClasses",
- KEYSTORE_PRIVATE_KEY_CLASS_NAME + "|" + KEYSTORE_PUBLIC_KEY_CLASS_NAME);
- }
-
- public static String[] getSupportedEcdsaSignatureDigests() {
- return new String[] {"NONE", "SHA-1", "SHA-224", "SHA-256", "SHA-384", "SHA-512"};
- }
-
- public static String[] getSupportedRsaSignatureWithPkcs1PaddingDigests() {
- return new String[] {"NONE", "MD5", "SHA-1", "SHA-224", "SHA-256", "SHA-384", "SHA-512"};
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java
deleted file mode 100644
index ccc3153..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreCipherSpiBase.java
+++ /dev/null
@@ -1,920 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.CallSuper;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-
-import libcore.util.EmptyArray;
-
-import java.nio.BufferOverflowException;
-import java.nio.ByteBuffer;
-import java.security.AlgorithmParameters;
-import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.InvalidParameterException;
-import java.security.Key;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.ProviderException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-
-import javax.crypto.AEADBadTagException;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.CipherSpi;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.ShortBufferException;
-import javax.crypto.spec.SecretKeySpec;
-
-/**
- * Base class for {@link CipherSpi} implementations of Android KeyStore backed ciphers.
- *
- * @hide
- */
-abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStoreCryptoOperation {
- private final KeyStore mKeyStore;
-
- // Fields below are populated by Cipher.init and KeyStore.begin and should be preserved after
- // doFinal finishes.
- private boolean mEncrypting;
- private int mKeymasterPurposeOverride = -1;
- private AndroidKeyStoreKey mKey;
- private SecureRandom mRng;
-
- /**
- * Token referencing this operation inside keystore service. It is initialized by
- * {@code engineInit} and is invalidated when {@code engineDoFinal} succeeds and on some error
- * conditions in between.
- */
- private IBinder mOperationToken;
- private long mOperationHandle;
- private KeyStoreCryptoOperationStreamer mMainDataStreamer;
- private KeyStoreCryptoOperationStreamer mAdditionalAuthenticationDataStreamer;
- private boolean mAdditionalAuthenticationDataStreamerClosed;
-
- /**
- * Encountered exception which could not be immediately thrown because it was encountered inside
- * a method that does not throw checked exception. This exception will be thrown from
- * {@code engineDoFinal}. Once such an exception is encountered, {@code engineUpdate} and
- * {@code engineDoFinal} start ignoring input data.
- */
- private Exception mCachedException;
-
- AndroidKeyStoreCipherSpiBase() {
- mKeyStore = KeyStore.getInstance();
- }
-
- @Override
- protected final void engineInit(int opmode, Key key, SecureRandom random)
- throws InvalidKeyException {
- resetAll();
-
- boolean success = false;
- try {
- init(opmode, key, random);
- initAlgorithmSpecificParameters();
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidAlgorithmParameterException e) {
- throw new InvalidKeyException(e);
- }
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- @Override
- protected final void engineInit(int opmode, Key key, AlgorithmParameters params,
- SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
- resetAll();
-
- boolean success = false;
- try {
- init(opmode, key, random);
- initAlgorithmSpecificParameters(params);
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- @Override
- protected final void engineInit(int opmode, Key key, AlgorithmParameterSpec params,
- SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
- resetAll();
-
- boolean success = false;
- try {
- init(opmode, key, random);
- initAlgorithmSpecificParameters(params);
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- private void init(int opmode, Key key, SecureRandom random) throws InvalidKeyException {
- switch (opmode) {
- case Cipher.ENCRYPT_MODE:
- case Cipher.WRAP_MODE:
- mEncrypting = true;
- break;
- case Cipher.DECRYPT_MODE:
- case Cipher.UNWRAP_MODE:
- mEncrypting = false;
- break;
- default:
- throw new InvalidParameterException("Unsupported opmode: " + opmode);
- }
- initKey(opmode, key);
- if (mKey == null) {
- throw new ProviderException("initKey did not initialize the key");
- }
- mRng = random;
- }
-
- /**
- * Resets this cipher to its pristine pre-init state. This must be equivalent to obtaining a new
- * cipher instance.
- *
- * <p>Subclasses storing additional state should override this method, reset the additional
- * state, and then chain to superclass.
- */
- @CallSuper
- protected void resetAll() {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- mEncrypting = false;
- mKeymasterPurposeOverride = -1;
- mKey = null;
- mRng = null;
- mOperationToken = null;
- mOperationHandle = 0;
- mMainDataStreamer = null;
- mAdditionalAuthenticationDataStreamer = null;
- mAdditionalAuthenticationDataStreamerClosed = false;
- mCachedException = null;
- }
-
- /**
- * Resets this cipher while preserving the initialized state. This must be equivalent to
- * rolling back the cipher's state to just after the most recent {@code engineInit} completed
- * successfully.
- *
- * <p>Subclasses storing additional post-init state should override this method, reset the
- * additional state, and then chain to superclass.
- */
- @CallSuper
- protected void resetWhilePreservingInitState() {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- mOperationToken = null;
- mOperationHandle = 0;
- mMainDataStreamer = null;
- mAdditionalAuthenticationDataStreamer = null;
- mAdditionalAuthenticationDataStreamerClosed = false;
- mCachedException = null;
- }
-
- private void ensureKeystoreOperationInitialized() throws InvalidKeyException,
- InvalidAlgorithmParameterException {
- if (mMainDataStreamer != null) {
- return;
- }
- if (mCachedException != null) {
- return;
- }
- if (mKey == null) {
- throw new IllegalStateException("Not initialized");
- }
-
- KeymasterArguments keymasterInputArgs = new KeymasterArguments();
- addAlgorithmSpecificParametersToBegin(keymasterInputArgs);
- byte[] additionalEntropy = KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng(
- mRng, getAdditionalEntropyAmountForBegin());
-
- int purpose;
- if (mKeymasterPurposeOverride != -1) {
- purpose = mKeymasterPurposeOverride;
- } else {
- purpose = mEncrypting
- ? KeymasterDefs.KM_PURPOSE_ENCRYPT : KeymasterDefs.KM_PURPOSE_DECRYPT;
- }
- OperationResult opResult = mKeyStore.begin(
- mKey.getAlias(),
- purpose,
- true, // permit aborting this operation if keystore runs out of resources
- keymasterInputArgs,
- additionalEntropy,
- mKey.getUid());
- if (opResult == null) {
- throw new KeyStoreConnectException();
- }
-
- // Store operation token and handle regardless of the error code returned by KeyStore to
- // ensure that the operation gets aborted immediately if the code below throws an exception.
- mOperationToken = opResult.token;
- mOperationHandle = opResult.operationHandle;
-
- // If necessary, throw an exception due to KeyStore operation having failed.
- GeneralSecurityException e = KeyStoreCryptoOperationUtils.getExceptionForCipherInit(
- mKeyStore, mKey, opResult.resultCode);
- if (e != null) {
- if (e instanceof InvalidKeyException) {
- throw (InvalidKeyException) e;
- } else if (e instanceof InvalidAlgorithmParameterException) {
- throw (InvalidAlgorithmParameterException) e;
- } else {
- throw new ProviderException("Unexpected exception type", e);
- }
- }
-
- if (mOperationToken == null) {
- throw new ProviderException("Keystore returned null operation token");
- }
- if (mOperationHandle == 0) {
- throw new ProviderException("Keystore returned invalid operation handle");
- }
-
- loadAlgorithmSpecificParametersFromBeginResult(opResult.outParams);
- mMainDataStreamer = createMainDataStreamer(mKeyStore, opResult.token);
- mAdditionalAuthenticationDataStreamer =
- createAdditionalAuthenticationDataStreamer(mKeyStore, opResult.token);
- mAdditionalAuthenticationDataStreamerClosed = false;
- }
-
- /**
- * Creates a streamer which sends plaintext/ciphertext into the provided KeyStore and receives
- * the corresponding ciphertext/plaintext from the KeyStore.
- *
- * <p>This implementation returns a working streamer.
- */
- @NonNull
- protected KeyStoreCryptoOperationStreamer createMainDataStreamer(
- KeyStore keyStore, IBinder operationToken) {
- return new KeyStoreCryptoOperationChunkedStreamer(
- new KeyStoreCryptoOperationChunkedStreamer.MainDataStream(
- keyStore, operationToken), 0);
- }
-
- /**
- * Creates a streamer which sends Additional Authentication Data (AAD) into the KeyStore.
- *
- * <p>This implementation returns {@code null}.
- *
- * @return stream or {@code null} if AAD is not supported by this cipher.
- */
- @Nullable
- protected KeyStoreCryptoOperationStreamer createAdditionalAuthenticationDataStreamer(
- @SuppressWarnings("unused") KeyStore keyStore,
- @SuppressWarnings("unused") IBinder operationToken) {
- return null;
- }
-
- @Override
- protected final byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) {
- if (mCachedException != null) {
- return null;
- }
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
- mCachedException = e;
- return null;
- }
-
- if (inputLen == 0) {
- return null;
- }
-
- byte[] output;
- try {
- flushAAD();
- output = mMainDataStreamer.update(input, inputOffset, inputLen);
- } catch (KeyStoreException e) {
- mCachedException = e;
- return null;
- }
-
- if (output.length == 0) {
- return null;
- }
-
- return output;
- }
-
- private void flushAAD() throws KeyStoreException {
- if ((mAdditionalAuthenticationDataStreamer != null)
- && (!mAdditionalAuthenticationDataStreamerClosed)) {
- byte[] output;
- try {
- output = mAdditionalAuthenticationDataStreamer.doFinal(
- EmptyArray.BYTE, 0, 0,
- null, // no signature
- null // no additional entropy needed flushing AAD
- );
- } finally {
- mAdditionalAuthenticationDataStreamerClosed = true;
- }
- if ((output != null) && (output.length > 0)) {
- throw new ProviderException(
- "AAD update unexpectedly returned data: " + output.length + " bytes");
- }
- }
- }
-
- @Override
- protected final int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output,
- int outputOffset) throws ShortBufferException {
- byte[] outputCopy = engineUpdate(input, inputOffset, inputLen);
- if (outputCopy == null) {
- return 0;
- }
- int outputAvailable = output.length - outputOffset;
- if (outputCopy.length > outputAvailable) {
- throw new ShortBufferException("Output buffer too short. Produced: "
- + outputCopy.length + ", available: " + outputAvailable);
- }
- System.arraycopy(outputCopy, 0, output, outputOffset, outputCopy.length);
- return outputCopy.length;
- }
-
- @Override
- protected final int engineUpdate(ByteBuffer input, ByteBuffer output)
- throws ShortBufferException {
- if (input == null) {
- throw new NullPointerException("input == null");
- }
- if (output == null) {
- throw new NullPointerException("output == null");
- }
-
- int inputSize = input.remaining();
- byte[] outputArray;
- if (input.hasArray()) {
- outputArray =
- engineUpdate(
- input.array(), input.arrayOffset() + input.position(), inputSize);
- input.position(input.position() + inputSize);
- } else {
- byte[] inputArray = new byte[inputSize];
- input.get(inputArray);
- outputArray = engineUpdate(inputArray, 0, inputSize);
- }
-
- int outputSize = (outputArray != null) ? outputArray.length : 0;
- if (outputSize > 0) {
- int outputBufferAvailable = output.remaining();
- try {
- output.put(outputArray);
- } catch (BufferOverflowException e) {
- throw new ShortBufferException(
- "Output buffer too small. Produced: " + outputSize + ", available: "
- + outputBufferAvailable);
- }
- }
- return outputSize;
- }
-
- @Override
- protected final void engineUpdateAAD(byte[] input, int inputOffset, int inputLen) {
- if (mCachedException != null) {
- return;
- }
-
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
- mCachedException = e;
- return;
- }
-
- if (mAdditionalAuthenticationDataStreamerClosed) {
- throw new IllegalStateException(
- "AAD can only be provided before Cipher.update is invoked");
- }
-
- if (mAdditionalAuthenticationDataStreamer == null) {
- throw new IllegalStateException("This cipher does not support AAD");
- }
-
- byte[] output;
- try {
- output = mAdditionalAuthenticationDataStreamer.update(input, inputOffset, inputLen);
- } catch (KeyStoreException e) {
- mCachedException = e;
- return;
- }
-
- if ((output != null) && (output.length > 0)) {
- throw new ProviderException("AAD update unexpectedly produced output: "
- + output.length + " bytes");
- }
- }
-
- @Override
- protected final void engineUpdateAAD(ByteBuffer src) {
- if (src == null) {
- throw new IllegalArgumentException("src == null");
- }
- if (!src.hasRemaining()) {
- return;
- }
-
- byte[] input;
- int inputOffset;
- int inputLen;
- if (src.hasArray()) {
- input = src.array();
- inputOffset = src.arrayOffset() + src.position();
- inputLen = src.remaining();
- src.position(src.limit());
- } else {
- input = new byte[src.remaining()];
- inputOffset = 0;
- inputLen = input.length;
- src.get(input);
- }
- engineUpdateAAD(input, inputOffset, inputLen);
- }
-
- @Override
- protected final byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
- throws IllegalBlockSizeException, BadPaddingException {
- if (mCachedException != null) {
- throw (IllegalBlockSizeException)
- new IllegalBlockSizeException().initCause(mCachedException);
- }
-
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
- throw (IllegalBlockSizeException) new IllegalBlockSizeException().initCause(e);
- }
-
- byte[] output;
- try {
- flushAAD();
- byte[] additionalEntropy =
- KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng(
- mRng, getAdditionalEntropyAmountForFinish());
- output = mMainDataStreamer.doFinal(
- input, inputOffset, inputLen,
- null, // no signature involved
- additionalEntropy);
- } catch (KeyStoreException e) {
- switch (e.getErrorCode()) {
- case KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH:
- throw (IllegalBlockSizeException) new IllegalBlockSizeException().initCause(e);
- case KeymasterDefs.KM_ERROR_INVALID_ARGUMENT:
- throw (BadPaddingException) new BadPaddingException().initCause(e);
- case KeymasterDefs.KM_ERROR_VERIFICATION_FAILED:
- throw (AEADBadTagException) new AEADBadTagException().initCause(e);
- default:
- throw (IllegalBlockSizeException) new IllegalBlockSizeException().initCause(e);
- }
- }
-
- resetWhilePreservingInitState();
- return output;
- }
-
- @Override
- protected final int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
- int outputOffset) throws ShortBufferException, IllegalBlockSizeException,
- BadPaddingException {
- byte[] outputCopy = engineDoFinal(input, inputOffset, inputLen);
- if (outputCopy == null) {
- return 0;
- }
- int outputAvailable = output.length - outputOffset;
- if (outputCopy.length > outputAvailable) {
- throw new ShortBufferException("Output buffer too short. Produced: "
- + outputCopy.length + ", available: " + outputAvailable);
- }
- System.arraycopy(outputCopy, 0, output, outputOffset, outputCopy.length);
- return outputCopy.length;
- }
-
- @Override
- protected final int engineDoFinal(ByteBuffer input, ByteBuffer output)
- throws ShortBufferException, IllegalBlockSizeException, BadPaddingException {
- if (input == null) {
- throw new NullPointerException("input == null");
- }
- if (output == null) {
- throw new NullPointerException("output == null");
- }
-
- int inputSize = input.remaining();
- byte[] outputArray;
- if (input.hasArray()) {
- outputArray =
- engineDoFinal(
- input.array(), input.arrayOffset() + input.position(), inputSize);
- input.position(input.position() + inputSize);
- } else {
- byte[] inputArray = new byte[inputSize];
- input.get(inputArray);
- outputArray = engineDoFinal(inputArray, 0, inputSize);
- }
-
- int outputSize = (outputArray != null) ? outputArray.length : 0;
- if (outputSize > 0) {
- int outputBufferAvailable = output.remaining();
- try {
- output.put(outputArray);
- } catch (BufferOverflowException e) {
- throw new ShortBufferException(
- "Output buffer too small. Produced: " + outputSize + ", available: "
- + outputBufferAvailable);
- }
- }
- return outputSize;
- }
-
- @Override
- protected final byte[] engineWrap(Key key)
- throws IllegalBlockSizeException, InvalidKeyException {
- if (mKey == null) {
- throw new IllegalStateException("Not initilized");
- }
-
- if (!isEncrypting()) {
- throw new IllegalStateException(
- "Cipher must be initialized in Cipher.WRAP_MODE to wrap keys");
- }
-
- if (key == null) {
- throw new NullPointerException("key == null");
- }
- byte[] encoded = null;
- if (key instanceof SecretKey) {
- if ("RAW".equalsIgnoreCase(key.getFormat())) {
- encoded = key.getEncoded();
- }
- if (encoded == null) {
- try {
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(key.getAlgorithm());
- SecretKeySpec spec =
- (SecretKeySpec) keyFactory.getKeySpec(
- (SecretKey) key, SecretKeySpec.class);
- encoded = spec.getEncoded();
- } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
- throw new InvalidKeyException(
- "Failed to wrap key because it does not export its key material",
- e);
- }
- }
- } else if (key instanceof PrivateKey) {
- if ("PKCS8".equalsIgnoreCase(key.getFormat())) {
- encoded = key.getEncoded();
- }
- if (encoded == null) {
- try {
- KeyFactory keyFactory = KeyFactory.getInstance(key.getAlgorithm());
- PKCS8EncodedKeySpec spec =
- keyFactory.getKeySpec(key, PKCS8EncodedKeySpec.class);
- encoded = spec.getEncoded();
- } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
- throw new InvalidKeyException(
- "Failed to wrap key because it does not export its key material",
- e);
- }
- }
- } else if (key instanceof PublicKey) {
- if ("X.509".equalsIgnoreCase(key.getFormat())) {
- encoded = key.getEncoded();
- }
- if (encoded == null) {
- try {
- KeyFactory keyFactory = KeyFactory.getInstance(key.getAlgorithm());
- X509EncodedKeySpec spec =
- keyFactory.getKeySpec(key, X509EncodedKeySpec.class);
- encoded = spec.getEncoded();
- } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
- throw new InvalidKeyException(
- "Failed to wrap key because it does not export its key material",
- e);
- }
- }
- } else {
- throw new InvalidKeyException("Unsupported key type: " + key.getClass().getName());
- }
-
- if (encoded == null) {
- throw new InvalidKeyException(
- "Failed to wrap key because it does not export its key material");
- }
-
- try {
- return engineDoFinal(encoded, 0, encoded.length);
- } catch (BadPaddingException e) {
- throw (IllegalBlockSizeException) new IllegalBlockSizeException().initCause(e);
- }
- }
-
- @Override
- protected final Key engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm,
- int wrappedKeyType) throws InvalidKeyException, NoSuchAlgorithmException {
- if (mKey == null) {
- throw new IllegalStateException("Not initilized");
- }
-
- if (isEncrypting()) {
- throw new IllegalStateException(
- "Cipher must be initialized in Cipher.WRAP_MODE to wrap keys");
- }
-
- if (wrappedKey == null) {
- throw new NullPointerException("wrappedKey == null");
- }
-
- byte[] encoded;
- try {
- encoded = engineDoFinal(wrappedKey, 0, wrappedKey.length);
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- throw new InvalidKeyException("Failed to unwrap key", e);
- }
-
- switch (wrappedKeyType) {
- case Cipher.SECRET_KEY:
- {
- return new SecretKeySpec(encoded, wrappedKeyAlgorithm);
- // break;
- }
- case Cipher.PRIVATE_KEY:
- {
- KeyFactory keyFactory = KeyFactory.getInstance(wrappedKeyAlgorithm);
- try {
- return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encoded));
- } catch (InvalidKeySpecException e) {
- throw new InvalidKeyException(
- "Failed to create private key from its PKCS#8 encoded form", e);
- }
- // break;
- }
- case Cipher.PUBLIC_KEY:
- {
- KeyFactory keyFactory = KeyFactory.getInstance(wrappedKeyAlgorithm);
- try {
- return keyFactory.generatePublic(new X509EncodedKeySpec(encoded));
- } catch (InvalidKeySpecException e) {
- throw new InvalidKeyException(
- "Failed to create public key from its X.509 encoded form", e);
- }
- // break;
- }
- default:
- throw new InvalidParameterException(
- "Unsupported wrappedKeyType: " + wrappedKeyType);
- }
- }
-
- @Override
- protected final void engineSetMode(String mode) throws NoSuchAlgorithmException {
- // This should never be invoked because all algorithms registered with the AndroidKeyStore
- // provide explicitly specify block mode.
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected final void engineSetPadding(String arg0) throws NoSuchPaddingException {
- // This should never be invoked because all algorithms registered with the AndroidKeyStore
- // provide explicitly specify padding mode.
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected final int engineGetKeySize(Key key) throws InvalidKeyException {
- throw new UnsupportedOperationException();
- }
-
- @CallSuper
- @Override
- public void finalize() throws Throwable {
- try {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- } finally {
- super.finalize();
- }
- }
-
- @Override
- public final long getOperationHandle() {
- return mOperationHandle;
- }
-
- protected final void setKey(@NonNull AndroidKeyStoreKey key) {
- mKey = key;
- }
-
- /**
- * Overrides the default purpose/type of the crypto operation.
- */
- protected final void setKeymasterPurposeOverride(int keymasterPurpose) {
- mKeymasterPurposeOverride = keymasterPurpose;
- }
-
- protected final int getKeymasterPurposeOverride() {
- return mKeymasterPurposeOverride;
- }
-
- /**
- * Returns {@code true} if this cipher is initialized for encryption, {@code false} if this
- * cipher is initialized for decryption.
- */
- protected final boolean isEncrypting() {
- return mEncrypting;
- }
-
- @NonNull
- protected final KeyStore getKeyStore() {
- return mKeyStore;
- }
-
- protected final long getConsumedInputSizeBytes() {
- if (mMainDataStreamer == null) {
- throw new IllegalStateException("Not initialized");
- }
- return mMainDataStreamer.getConsumedInputSizeBytes();
- }
-
- protected final long getProducedOutputSizeBytes() {
- if (mMainDataStreamer == null) {
- throw new IllegalStateException("Not initialized");
- }
- return mMainDataStreamer.getProducedOutputSizeBytes();
- }
-
- static String opmodeToString(int opmode) {
- switch (opmode) {
- case Cipher.ENCRYPT_MODE:
- return "ENCRYPT_MODE";
- case Cipher.DECRYPT_MODE:
- return "DECRYPT_MODE";
- case Cipher.WRAP_MODE:
- return "WRAP_MODE";
- case Cipher.UNWRAP_MODE:
- return "UNWRAP_MODE";
- default:
- return String.valueOf(opmode);
- }
- }
-
- // The methods below need to be implemented by subclasses.
-
- /**
- * Initializes this cipher with the provided key.
- *
- * @throws InvalidKeyException if the {@code key} is not suitable for this cipher in the
- * specified {@code opmode}.
- *
- * @see #setKey(AndroidKeyStoreKey)
- */
- protected abstract void initKey(int opmode, @Nullable Key key) throws InvalidKeyException;
-
- /**
- * Returns algorithm-specific parameters used by this cipher or {@code null} if no
- * algorithm-specific parameters are used.
- */
- @Nullable
- @Override
- protected abstract AlgorithmParameters engineGetParameters();
-
- /**
- * Invoked by {@code engineInit} to initialize algorithm-specific parameters when no additional
- * initialization parameters were provided.
- *
- * @throws InvalidKeyException if this cipher cannot be configured based purely on the provided
- * key and needs additional parameters to be provided to {@code Cipher.init}.
- */
- protected abstract void initAlgorithmSpecificParameters() throws InvalidKeyException;
-
- /**
- * Invoked by {@code engineInit} to initialize algorithm-specific parameters when additional
- * parameters were provided.
- *
- * @param params additional algorithm parameters or {@code null} if not specified.
- *
- * @throws InvalidAlgorithmParameterException if there is insufficient information to configure
- * this cipher or if the provided parameters are not suitable for this cipher.
- */
- protected abstract void initAlgorithmSpecificParameters(
- @Nullable AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException;
-
- /**
- * Invoked by {@code engineInit} to initialize algorithm-specific parameters when additional
- * parameters were provided.
- *
- * @param params additional algorithm parameters or {@code null} if not specified.
- *
- * @throws InvalidAlgorithmParameterException if there is insufficient information to configure
- * this cipher or if the provided parameters are not suitable for this cipher.
- */
- protected abstract void initAlgorithmSpecificParameters(@Nullable AlgorithmParameters params)
- throws InvalidAlgorithmParameterException;
-
- /**
- * Returns the amount of additional entropy (in bytes) to be provided to the KeyStore's
- * {@code begin} operation. This amount of entropy is typically what's consumed to generate
- * random parameters, such as IV.
- *
- * <p>For decryption, the return value should be {@code 0} because decryption should not be
- * consuming any entropy. For encryption, the value combined with
- * {@link #getAdditionalEntropyAmountForFinish()} should match (or exceed) the amount of Shannon
- * entropy of the ciphertext produced by this cipher assuming the key, the plaintext, and all
- * explicitly provided parameters to {@code Cipher.init} are known. For example, for AES CBC
- * encryption with an explicitly provided IV the return value should be {@code 0}, whereas for
- * the case where IV is generated by the KeyStore's {@code begin} operation it should be
- * {@code 16}.
- */
- protected abstract int getAdditionalEntropyAmountForBegin();
-
- /**
- * Returns the amount of additional entropy (in bytes) to be provided to the KeyStore's
- * {@code finish} operation. This amount of entropy is typically what's consumed by encryption
- * padding scheme.
- *
- * <p>For decryption, the return value should be {@code 0} because decryption should not be
- * consuming any entropy. For encryption, the value combined with
- * {@link #getAdditionalEntropyAmountForBegin()} should match (or exceed) the amount of Shannon
- * entropy of the ciphertext produced by this cipher assuming the key, the plaintext, and all
- * explicitly provided parameters to {@code Cipher.init} are known. For example, for RSA with
- * OAEP the return value should be the size of the OAEP hash output. For RSA with PKCS#1 padding
- * the return value should be the size of the padding string or could be raised (for simplicity)
- * to the size of the modulus.
- */
- protected abstract int getAdditionalEntropyAmountForFinish();
-
- /**
- * Invoked to add algorithm-specific parameters for the KeyStore's {@code begin} operation.
- *
- * @param keymasterArgs keystore/keymaster arguments to be populated with algorithm-specific
- * parameters.
- */
- protected abstract void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs);
-
- /**
- * Invoked to obtain algorithm-specific parameters from the result of the KeyStore's
- * {@code begin} operation.
- *
- * <p>Some parameters, such as IV, are not required to be provided to {@code Cipher.init}. Such
- * parameters, if not provided, must be generated by KeyStore and returned to the user of
- * {@code Cipher} and potentially reused after {@code doFinal}.
- *
- * @param keymasterArgs keystore/keymaster arguments returned by KeyStore {@code begin}
- * operation.
- */
- protected abstract void loadAlgorithmSpecificParametersFromBeginResult(
- @NonNull KeymasterArguments keymasterArgs);
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreECDSASignatureSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreECDSASignatureSpi.java
deleted file mode 100644
index 45f2110..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreECDSASignatureSpi.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.NonNull;
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import libcore.util.EmptyArray;
-
-import java.io.ByteArrayOutputStream;
-import java.security.InvalidKeyException;
-import java.security.SignatureSpi;
-
-/**
- * Base class for {@link SignatureSpi} providing Android KeyStore backed ECDSA signatures.
- *
- * @hide
- */
-abstract class AndroidKeyStoreECDSASignatureSpi extends AndroidKeyStoreSignatureSpiBase {
-
- public final static class NONE extends AndroidKeyStoreECDSASignatureSpi {
- public NONE() {
- super(KeymasterDefs.KM_DIGEST_NONE);
- }
-
- @Override
- protected KeyStoreCryptoOperationStreamer createMainDataStreamer(KeyStore keyStore,
- IBinder operationToken) {
- return new TruncateToFieldSizeMessageStreamer(
- super.createMainDataStreamer(keyStore, operationToken),
- getGroupSizeBits());
- }
-
- /**
- * Streamer which buffers all input, then truncates it to field size, and then sends it into
- * KeyStore via the provided delegate streamer.
- */
- private static class TruncateToFieldSizeMessageStreamer
- implements KeyStoreCryptoOperationStreamer {
-
- private final KeyStoreCryptoOperationStreamer mDelegate;
- private final int mGroupSizeBits;
- private final ByteArrayOutputStream mInputBuffer = new ByteArrayOutputStream();
- private long mConsumedInputSizeBytes;
-
- private TruncateToFieldSizeMessageStreamer(
- KeyStoreCryptoOperationStreamer delegate,
- int groupSizeBits) {
- mDelegate = delegate;
- mGroupSizeBits = groupSizeBits;
- }
-
- @Override
- public byte[] update(byte[] input, int inputOffset, int inputLength)
- throws KeyStoreException {
- if (inputLength > 0) {
- mInputBuffer.write(input, inputOffset, inputLength);
- mConsumedInputSizeBytes += inputLength;
- }
- return EmptyArray.BYTE;
- }
-
- @Override
- public byte[] doFinal(byte[] input, int inputOffset, int inputLength, byte[] signature,
- byte[] additionalEntropy) throws KeyStoreException {
- if (inputLength > 0) {
- mConsumedInputSizeBytes += inputLength;
- mInputBuffer.write(input, inputOffset, inputLength);
- }
-
- byte[] bufferedInput = mInputBuffer.toByteArray();
- mInputBuffer.reset();
- // Truncate input at field size (bytes)
- return mDelegate.doFinal(bufferedInput,
- 0,
- Math.min(bufferedInput.length, ((mGroupSizeBits + 7) / 8)),
- signature, additionalEntropy);
- }
-
- @Override
- public long getConsumedInputSizeBytes() {
- return mConsumedInputSizeBytes;
- }
-
- @Override
- public long getProducedOutputSizeBytes() {
- return mDelegate.getProducedOutputSizeBytes();
- }
- }
- }
-
- public final static class SHA1 extends AndroidKeyStoreECDSASignatureSpi {
- public SHA1() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public final static class SHA224 extends AndroidKeyStoreECDSASignatureSpi {
- public SHA224() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public final static class SHA256 extends AndroidKeyStoreECDSASignatureSpi {
- public SHA256() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public final static class SHA384 extends AndroidKeyStoreECDSASignatureSpi {
- public SHA384() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public final static class SHA512 extends AndroidKeyStoreECDSASignatureSpi {
- public SHA512() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- private final int mKeymasterDigest;
-
- private int mGroupSizeBits = -1;
-
- AndroidKeyStoreECDSASignatureSpi(int keymasterDigest) {
- mKeymasterDigest = keymasterDigest;
- }
-
- @Override
- protected final void initKey(AndroidKeyStoreKey key) throws InvalidKeyException {
- if (!KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException("Unsupported key algorithm: " + key.getAlgorithm()
- + ". Only" + KeyProperties.KEY_ALGORITHM_EC + " supported");
- }
-
- KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
- int errorCode = getKeyStore().getKeyCharacteristics(
- key.getAlias(), null, null, key.getUid(), keyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- throw getKeyStore().getInvalidKeyException(key.getAlias(), key.getUid(), errorCode);
- }
- long keySizeBits = keyCharacteristics.getUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, -1);
- if (keySizeBits == -1) {
- throw new InvalidKeyException("Size of key not known");
- } else if (keySizeBits > Integer.MAX_VALUE) {
- throw new InvalidKeyException("Key too large: " + keySizeBits + " bits");
- }
- mGroupSizeBits = (int) keySizeBits;
-
- super.initKey(key);
- }
-
- @Override
- protected final void resetAll() {
- mGroupSizeBits = -1;
- super.resetAll();
- }
-
- @Override
- protected final void resetWhilePreservingInitState() {
- super.resetWhilePreservingInitState();
- }
-
- @Override
- protected final void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_EC);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigest);
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForSign() {
- return (mGroupSizeBits + 7) / 8;
- }
-
- protected final int getGroupSizeBits() {
- if (mGroupSizeBits == -1) {
- throw new IllegalStateException("Not initialized");
- }
- return mGroupSizeBits;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreECPrivateKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreECPrivateKey.java
deleted file mode 100644
index aa7bdff..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreECPrivateKey.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.PrivateKey;
-import java.security.interfaces.ECKey;
-import java.security.spec.ECParameterSpec;
-
-/**
- * EC private key (instance of {@link PrivateKey} and {@link ECKey}) backed by keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreECPrivateKey extends AndroidKeyStorePrivateKey implements ECKey {
- private final ECParameterSpec mParams;
-
- public AndroidKeyStoreECPrivateKey(String alias, int uid, ECParameterSpec params) {
- super(alias, uid, KeyProperties.KEY_ALGORITHM_EC);
- mParams = params;
- }
-
- @Override
- public ECParameterSpec getParams() {
- return mParams;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreECPublicKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreECPublicKey.java
deleted file mode 100644
index 2efaeb6..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreECPublicKey.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.interfaces.ECPublicKey;
-import java.security.spec.ECParameterSpec;
-import java.security.spec.ECPoint;
-
-/**
- * {@link ECPublicKey} backed by keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreECPublicKey extends AndroidKeyStorePublicKey implements ECPublicKey {
-
- private final ECParameterSpec mParams;
- private final ECPoint mW;
-
- public AndroidKeyStoreECPublicKey(String alias, int uid, byte[] x509EncodedForm, ECParameterSpec params,
- ECPoint w) {
- super(alias, uid, KeyProperties.KEY_ALGORITHM_EC, x509EncodedForm);
- mParams = params;
- mW = w;
- }
-
- public AndroidKeyStoreECPublicKey(String alias, int uid, ECPublicKey info) {
- this(alias, uid, info.getEncoded(), info.getParams(), info.getW());
- if (!"X.509".equalsIgnoreCase(info.getFormat())) {
- throw new IllegalArgumentException(
- "Unsupported key export format: " + info.getFormat());
- }
- }
-
- @Override
- public ECParameterSpec getParams() {
- return mParams;
- }
-
- @Override
- public ECPoint getW() {
- return mW;
- }
-}
\ No newline at end of file
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreHmacSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreHmacSpi.java
deleted file mode 100644
index 2e8ac32..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreHmacSpi.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.ProviderException;
-import java.security.spec.AlgorithmParameterSpec;
-
-import javax.crypto.MacSpi;
-
-/**
- * {@link MacSpi} which provides HMAC implementations backed by Android KeyStore.
- *
- * @hide
- */
-public abstract class AndroidKeyStoreHmacSpi extends MacSpi implements KeyStoreCryptoOperation {
-
- public static class HmacSHA1 extends AndroidKeyStoreHmacSpi {
- public HmacSHA1() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public static class HmacSHA224 extends AndroidKeyStoreHmacSpi {
- public HmacSHA224() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public static class HmacSHA256 extends AndroidKeyStoreHmacSpi {
- public HmacSHA256() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public static class HmacSHA384 extends AndroidKeyStoreHmacSpi {
- public HmacSHA384() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public static class HmacSHA512 extends AndroidKeyStoreHmacSpi {
- public HmacSHA512() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- private final KeyStore mKeyStore = KeyStore.getInstance();
- private final int mKeymasterDigest;
- private final int mMacSizeBits;
-
- // Fields below are populated by engineInit and should be preserved after engineDoFinal.
- private AndroidKeyStoreSecretKey mKey;
-
- // Fields below are reset when engineDoFinal succeeds.
- private KeyStoreCryptoOperationChunkedStreamer mChunkedStreamer;
- private IBinder mOperationToken;
- private long mOperationHandle;
-
- protected AndroidKeyStoreHmacSpi(int keymasterDigest) {
- mKeymasterDigest = keymasterDigest;
- mMacSizeBits = KeymasterUtils.getDigestOutputSizeBits(keymasterDigest);
- }
-
- @Override
- protected int engineGetMacLength() {
- return (mMacSizeBits + 7) / 8;
- }
-
- @Override
- protected void engineInit(Key key, AlgorithmParameterSpec params) throws InvalidKeyException,
- InvalidAlgorithmParameterException {
- resetAll();
-
- boolean success = false;
- try {
- init(key, params);
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- private void init(Key key, AlgorithmParameterSpec params) throws InvalidKeyException,
- InvalidAlgorithmParameterException {
- if (key == null) {
- throw new InvalidKeyException("key == null");
- } else if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeyException(
- "Only Android KeyStore secret keys supported. Key: " + key);
- }
- mKey = (AndroidKeyStoreSecretKey) key;
-
- if (params != null) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported algorithm parameters: " + params);
- }
-
- }
-
- private void resetAll() {
- mKey = null;
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- mOperationToken = null;
- mOperationHandle = 0;
- mChunkedStreamer = null;
- }
-
- private void resetWhilePreservingInitState() {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- mOperationToken = null;
- mOperationHandle = 0;
- mChunkedStreamer = null;
- }
-
- @Override
- protected void engineReset() {
- resetWhilePreservingInitState();
- }
-
- private void ensureKeystoreOperationInitialized() throws InvalidKeyException {
- if (mChunkedStreamer != null) {
- return;
- }
- if (mKey == null) {
- throw new IllegalStateException("Not initialized");
- }
-
- KeymasterArguments keymasterArgs = new KeymasterArguments();
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_HMAC);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigest);
- keymasterArgs.addUnsignedInt(KeymasterDefs.KM_TAG_MAC_LENGTH, mMacSizeBits);
-
- OperationResult opResult = mKeyStore.begin(
- mKey.getAlias(),
- KeymasterDefs.KM_PURPOSE_SIGN,
- true,
- keymasterArgs,
- null, // no additional entropy needed for HMAC because it's deterministic
- mKey.getUid());
-
- if (opResult == null) {
- throw new KeyStoreConnectException();
- }
-
- // Store operation token and handle regardless of the error code returned by KeyStore to
- // ensure that the operation gets aborted immediately if the code below throws an exception.
- mOperationToken = opResult.token;
- mOperationHandle = opResult.operationHandle;
-
- // If necessary, throw an exception due to KeyStore operation having failed.
- InvalidKeyException e = KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(
- mKeyStore, mKey, opResult.resultCode);
- if (e != null) {
- throw e;
- }
-
- if (mOperationToken == null) {
- throw new ProviderException("Keystore returned null operation token");
- }
- if (mOperationHandle == 0) {
- throw new ProviderException("Keystore returned invalid operation handle");
- }
-
- mChunkedStreamer = new KeyStoreCryptoOperationChunkedStreamer(
- new KeyStoreCryptoOperationChunkedStreamer.MainDataStream(
- mKeyStore, mOperationToken));
- }
-
- @Override
- protected void engineUpdate(byte input) {
- engineUpdate(new byte[] {input}, 0, 1);
- }
-
- @Override
- protected void engineUpdate(byte[] input, int offset, int len) {
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException e) {
- throw new ProviderException("Failed to reinitialize MAC", e);
- }
-
- byte[] output;
- try {
- output = mChunkedStreamer.update(input, offset, len);
- } catch (KeyStoreException e) {
- throw new ProviderException("Keystore operation failed", e);
- }
- if ((output != null) && (output.length != 0)) {
- throw new ProviderException("Update operation unexpectedly produced output");
- }
- }
-
- @Override
- protected byte[] engineDoFinal() {
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException e) {
- throw new ProviderException("Failed to reinitialize MAC", e);
- }
-
- byte[] result;
- try {
- result = mChunkedStreamer.doFinal(
- null, 0, 0,
- null, // no signature provided -- this invocation will generate one
- null // no additional entropy needed -- HMAC is deterministic
- );
- } catch (KeyStoreException e) {
- throw new ProviderException("Keystore operation failed", e);
- }
-
- resetWhilePreservingInitState();
- return result;
- }
-
- @Override
- public void finalize() throws Throwable {
- try {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mKeyStore.abort(operationToken);
- }
- } finally {
- super.finalize();
- }
- }
-
- @Override
- public long getOperationHandle() {
- return mOperationHandle;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreKey.java
deleted file mode 100644
index e8e6310..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKey.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.Key;
-
-/**
- * {@link Key} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreKey implements Key {
- private final String mAlias;
- private final int mUid;
- private final String mAlgorithm;
-
- public AndroidKeyStoreKey(String alias, int uid, String algorithm) {
- mAlias = alias;
- mUid = uid;
- mAlgorithm = algorithm;
- }
-
- String getAlias() {
- return mAlias;
- }
-
- int getUid() {
- return mUid;
- }
-
- @Override
- public String getAlgorithm() {
- return mAlgorithm;
- }
-
- @Override
- public String getFormat() {
- // This key does not export its key material
- return null;
- }
-
- @Override
- public byte[] getEncoded() {
- // This key does not export its key material
- return null;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mAlgorithm == null) ? 0 : mAlgorithm.hashCode());
- result = prime * result + ((mAlias == null) ? 0 : mAlias.hashCode());
- result = prime * result + mUid;
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- AndroidKeyStoreKey other = (AndroidKeyStoreKey) obj;
- if (mAlgorithm == null) {
- if (other.mAlgorithm != null) {
- return false;
- }
- } else if (!mAlgorithm.equals(other.mAlgorithm)) {
- return false;
- }
- if (mAlias == null) {
- if (other.mAlias != null) {
- return false;
- }
- } else if (!mAlias.equals(other.mAlias)) {
- return false;
- }
- if (mUid != other.mUid) {
- return false;
- }
- return true;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java
deleted file mode 100644
index 303b0f2..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyFactorySpi.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.security.Credentials;
-import android.security.KeyStore;
-
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.KeyFactorySpi;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.spec.ECPublicKeySpec;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.RSAPublicKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-
-/**
- * {@link KeyFactorySpi} backed by Android KeyStore.
- *
- * @hide
- */
-public class AndroidKeyStoreKeyFactorySpi extends KeyFactorySpi {
-
- private final KeyStore mKeyStore = KeyStore.getInstance();
-
- @Override
- protected <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpecClass)
- throws InvalidKeySpecException {
- if (key == null) {
- throw new InvalidKeySpecException("key == null");
- } else if ((!(key instanceof AndroidKeyStorePrivateKey))
- && (!(key instanceof AndroidKeyStorePublicKey))) {
- throw new InvalidKeySpecException(
- "Unsupported key type: " + key.getClass().getName()
- + ". This KeyFactory supports only Android Keystore asymmetric keys");
- }
-
- // key is an Android Keystore private or public key
-
- if (keySpecClass == null) {
- throw new InvalidKeySpecException("keySpecClass == null");
- } else if (KeyInfo.class.equals(keySpecClass)) {
- if (!(key instanceof AndroidKeyStorePrivateKey)) {
- throw new InvalidKeySpecException(
- "Unsupported key type: " + key.getClass().getName()
- + ". KeyInfo can be obtained only for Android Keystore private keys");
- }
- AndroidKeyStorePrivateKey keystorePrivateKey = (AndroidKeyStorePrivateKey) key;
- String keyAliasInKeystore = keystorePrivateKey.getAlias();
- String entryAlias;
- if (keyAliasInKeystore.startsWith(Credentials.USER_PRIVATE_KEY)) {
- entryAlias = keyAliasInKeystore.substring(Credentials.USER_PRIVATE_KEY.length());
- } else {
- throw new InvalidKeySpecException("Invalid key alias: " + keyAliasInKeystore);
- }
- @SuppressWarnings("unchecked")
- T result = (T) AndroidKeyStoreSecretKeyFactorySpi.getKeyInfo(
- mKeyStore, entryAlias, keyAliasInKeystore, keystorePrivateKey.getUid());
- return result;
- } else if (X509EncodedKeySpec.class.equals(keySpecClass)) {
- if (!(key instanceof AndroidKeyStorePublicKey)) {
- throw new InvalidKeySpecException(
- "Unsupported key type: " + key.getClass().getName()
- + ". X509EncodedKeySpec can be obtained only for Android Keystore public"
- + " keys");
- }
- @SuppressWarnings("unchecked")
- T result = (T) new X509EncodedKeySpec(((AndroidKeyStorePublicKey) key).getEncoded());
- return result;
- } else if (PKCS8EncodedKeySpec.class.equals(keySpecClass)) {
- if (key instanceof AndroidKeyStorePrivateKey) {
- throw new InvalidKeySpecException(
- "Key material export of Android Keystore private keys is not supported");
- } else {
- throw new InvalidKeySpecException(
- "Cannot export key material of public key in PKCS#8 format."
- + " Only X.509 format (X509EncodedKeySpec) supported for public keys.");
- }
- } else if (RSAPublicKeySpec.class.equals(keySpecClass)) {
- if (key instanceof AndroidKeyStoreRSAPublicKey) {
- AndroidKeyStoreRSAPublicKey rsaKey = (AndroidKeyStoreRSAPublicKey) key;
- @SuppressWarnings("unchecked")
- T result =
- (T) new RSAPublicKeySpec(rsaKey.getModulus(), rsaKey.getPublicExponent());
- return result;
- } else {
- throw new InvalidKeySpecException(
- "Obtaining RSAPublicKeySpec not supported for " + key.getAlgorithm() + " "
- + ((key instanceof AndroidKeyStorePrivateKey) ? "private" : "public")
- + " key");
- }
- } else if (ECPublicKeySpec.class.equals(keySpecClass)) {
- if (key instanceof AndroidKeyStoreECPublicKey) {
- AndroidKeyStoreECPublicKey ecKey = (AndroidKeyStoreECPublicKey) key;
- @SuppressWarnings("unchecked")
- T result = (T) new ECPublicKeySpec(ecKey.getW(), ecKey.getParams());
- return result;
- } else {
- throw new InvalidKeySpecException(
- "Obtaining ECPublicKeySpec not supported for " + key.getAlgorithm() + " "
- + ((key instanceof AndroidKeyStorePrivateKey) ? "private" : "public")
- + " key");
- }
- } else {
- throw new InvalidKeySpecException("Unsupported key spec: " + keySpecClass.getName());
- }
- }
-
- @Override
- protected PrivateKey engineGeneratePrivate(KeySpec spec) throws InvalidKeySpecException {
- throw new InvalidKeySpecException(
- "To generate a key pair in Android Keystore, use KeyPairGenerator initialized with"
- + " " + KeyGenParameterSpec.class.getName());
- }
-
- @Override
- protected PublicKey engineGeneratePublic(KeySpec spec) throws InvalidKeySpecException {
- throw new InvalidKeySpecException(
- "To generate a key pair in Android Keystore, use KeyPairGenerator initialized with"
- + " " + KeyGenParameterSpec.class.getName());
- }
-
- @Override
- protected Key engineTranslateKey(Key key) throws InvalidKeyException {
- if (key == null) {
- throw new InvalidKeyException("key == null");
- } else if ((!(key instanceof AndroidKeyStorePrivateKey))
- && (!(key instanceof AndroidKeyStorePublicKey))) {
- throw new InvalidKeyException(
- "To import a key into Android Keystore, use KeyStore.setEntry");
- }
- return key;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
deleted file mode 100644
index fedde42..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.security.Credentials;
-import android.security.KeyStore;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyProperties;
-
-import libcore.util.EmptyArray;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.ProviderException;
-import java.security.SecureRandom;
-import java.security.spec.AlgorithmParameterSpec;
-import java.util.Arrays;
-
-import javax.crypto.KeyGeneratorSpi;
-import javax.crypto.SecretKey;
-
-/**
- * {@link KeyGeneratorSpi} backed by Android KeyStore.
- *
- * @hide
- */
-public abstract class AndroidKeyStoreKeyGeneratorSpi extends KeyGeneratorSpi {
-
- public static class AES extends AndroidKeyStoreKeyGeneratorSpi {
- public AES() {
- super(KeymasterDefs.KM_ALGORITHM_AES, 128);
- }
-
- @Override
- protected void engineInit(AlgorithmParameterSpec params, SecureRandom random)
- throws InvalidAlgorithmParameterException {
- super.engineInit(params, random);
- if ((mKeySizeBits != 128) && (mKeySizeBits != 192) && (mKeySizeBits != 256)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported key size: " + mKeySizeBits
- + ". Supported: 128, 192, 256.");
- }
- }
- }
-
- public static class DESede extends AndroidKeyStoreKeyGeneratorSpi {
- public DESede() {
- super(KeymasterDefs.KM_ALGORITHM_3DES, 168);
- }
- }
-
- protected static abstract class HmacBase extends AndroidKeyStoreKeyGeneratorSpi {
- protected HmacBase(int keymasterDigest) {
- super(KeymasterDefs.KM_ALGORITHM_HMAC,
- keymasterDigest,
- KeymasterUtils.getDigestOutputSizeBits(keymasterDigest));
- }
- }
-
- public static class HmacSHA1 extends HmacBase {
- public HmacSHA1() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public static class HmacSHA224 extends HmacBase {
- public HmacSHA224() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public static class HmacSHA256 extends HmacBase {
- public HmacSHA256() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public static class HmacSHA384 extends HmacBase {
- public HmacSHA384() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public static class HmacSHA512 extends HmacBase {
- public HmacSHA512() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- private final KeyStore mKeyStore = KeyStore.getInstance();
- private final int mKeymasterAlgorithm;
- private final int mKeymasterDigest;
- private final int mDefaultKeySizeBits;
-
- private KeyGenParameterSpec mSpec;
- private SecureRandom mRng;
-
- protected int mKeySizeBits;
- private int[] mKeymasterPurposes;
- private int[] mKeymasterBlockModes;
- private int[] mKeymasterPaddings;
- private int[] mKeymasterDigests;
-
- protected AndroidKeyStoreKeyGeneratorSpi(
- int keymasterAlgorithm,
- int defaultKeySizeBits) {
- this(keymasterAlgorithm, -1, defaultKeySizeBits);
- }
-
- protected AndroidKeyStoreKeyGeneratorSpi(
- int keymasterAlgorithm,
- int keymasterDigest,
- int defaultKeySizeBits) {
- mKeymasterAlgorithm = keymasterAlgorithm;
- mKeymasterDigest = keymasterDigest;
- mDefaultKeySizeBits = defaultKeySizeBits;
- if (mDefaultKeySizeBits <= 0) {
- throw new IllegalArgumentException("Default key size must be positive");
- }
-
- if ((mKeymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC) && (mKeymasterDigest == -1)) {
- throw new IllegalArgumentException(
- "Digest algorithm must be specified for HMAC key");
- }
- }
-
- @Override
- protected void engineInit(SecureRandom random) {
- throw new UnsupportedOperationException("Cannot initialize without a "
- + KeyGenParameterSpec.class.getName() + " parameter");
- }
-
- @Override
- protected void engineInit(int keySize, SecureRandom random) {
- throw new UnsupportedOperationException("Cannot initialize without a "
- + KeyGenParameterSpec.class.getName() + " parameter");
- }
-
- @Override
- protected void engineInit(AlgorithmParameterSpec params, SecureRandom random)
- throws InvalidAlgorithmParameterException {
- resetAll();
-
- boolean success = false;
- try {
- if ((params == null) || (!(params instanceof KeyGenParameterSpec))) {
- throw new InvalidAlgorithmParameterException("Cannot initialize without a "
- + KeyGenParameterSpec.class.getName() + " parameter");
- }
- KeyGenParameterSpec spec = (KeyGenParameterSpec) params;
- if (spec.getKeystoreAlias() == null) {
- throw new InvalidAlgorithmParameterException("KeyStore entry alias not provided");
- }
-
- mRng = random;
- mSpec = spec;
-
- mKeySizeBits = (spec.getKeySize() != -1) ? spec.getKeySize() : mDefaultKeySizeBits;
- if (mKeySizeBits <= 0) {
- throw new InvalidAlgorithmParameterException(
- "Key size must be positive: " + mKeySizeBits);
- } else if ((mKeySizeBits % 8) != 0) {
- throw new InvalidAlgorithmParameterException(
- "Key size must be a multiple of 8: " + mKeySizeBits);
- }
-
- try {
- mKeymasterPurposes = KeyProperties.Purpose.allToKeymaster(spec.getPurposes());
- mKeymasterPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
- spec.getEncryptionPaddings());
- if (spec.getSignaturePaddings().length > 0) {
- throw new InvalidAlgorithmParameterException(
- "Signature paddings not supported for symmetric key algorithms");
- }
- mKeymasterBlockModes = KeyProperties.BlockMode.allToKeymaster(spec.getBlockModes());
- if (((spec.getPurposes() & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (spec.isRandomizedEncryptionRequired())) {
- for (int keymasterBlockMode : mKeymasterBlockModes) {
- if (!KeymasterUtils.isKeymasterBlockModeIndCpaCompatibleWithSymmetricCrypto(
- keymasterBlockMode)) {
- throw new InvalidAlgorithmParameterException(
- "Randomized encryption (IND-CPA) required but may be violated"
- + " by block mode: "
- + KeyProperties.BlockMode.fromKeymaster(keymasterBlockMode)
- + ". See " + KeyGenParameterSpec.class.getName()
- + " documentation.");
- }
- }
- }
- if (mKeymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_3DES) {
- if (mKeySizeBits != 168) {
- throw new InvalidAlgorithmParameterException(
- "3DES key size must be 168 bits.");
- }
- }
- if (mKeymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC) {
- if (mKeySizeBits < 64 || mKeySizeBits > 512) {
- throw new InvalidAlgorithmParameterException(
- "HMAC key sizes must be within 64-512 bits, inclusive.");
- }
-
- // JCA HMAC key algorithm implies a digest (e.g., HmacSHA256 key algorithm
- // implies SHA-256 digest). Because keymaster HMAC key is authorized only for
- // one digest, we don't let algorithm parameter spec override the digest implied
- // by the key. If the spec specifies digests at all, it must specify only one
- // digest, the only implied by key algorithm.
- mKeymasterDigests = new int[] {mKeymasterDigest};
- if (spec.isDigestsSpecified()) {
- // Digest(s) explicitly specified in the spec. Check that the list
- // consists of exactly one digest, the one implied by key algorithm.
- int[] keymasterDigestsFromSpec =
- KeyProperties.Digest.allToKeymaster(spec.getDigests());
- if ((keymasterDigestsFromSpec.length != 1)
- || (keymasterDigestsFromSpec[0] != mKeymasterDigest)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported digests specification: "
- + Arrays.asList(spec.getDigests()) + ". Only "
- + KeyProperties.Digest.fromKeymaster(mKeymasterDigest)
- + " supported for this HMAC key algorithm");
- }
- }
- } else {
- // Key algorithm does not imply a digest.
- if (spec.isDigestsSpecified()) {
- mKeymasterDigests = KeyProperties.Digest.allToKeymaster(spec.getDigests());
- } else {
- mKeymasterDigests = EmptyArray.INT;
- }
- }
-
- // Check that user authentication related parameters are acceptable. This method
- // will throw an IllegalStateException if there are issues (e.g., secure lock screen
- // not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), spec);
- } catch (IllegalStateException | IllegalArgumentException e) {
- throw new InvalidAlgorithmParameterException(e);
- }
-
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- private void resetAll() {
- mSpec = null;
- mRng = null;
- mKeySizeBits = -1;
- mKeymasterPurposes = null;
- mKeymasterPaddings = null;
- mKeymasterBlockModes = null;
- }
-
- @Override
- protected SecretKey engineGenerateKey() {
- KeyGenParameterSpec spec = mSpec;
- if (spec == null) {
- throw new IllegalStateException("Not initialized");
- }
-
- KeymasterArguments args = new KeymasterArguments();
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, mKeySizeBits);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, mKeymasterAlgorithm);
- args.addEnums(KeymasterDefs.KM_TAG_PURPOSE, mKeymasterPurposes);
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes);
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterPaddings);
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
- KeymasterUtils.addUserAuthArgs(args, spec);
- KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
- args,
- mKeymasterAlgorithm,
- mKeymasterBlockModes,
- mKeymasterDigests);
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, spec.getKeyValidityStart());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
- spec.getKeyValidityForOriginationEnd());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
- spec.getKeyValidityForConsumptionEnd());
-
- if (((spec.getPurposes() & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (!spec.isRandomizedEncryptionRequired())) {
- // Permit caller-provided IV when encrypting with this key
- args.addBoolean(KeymasterDefs.KM_TAG_CALLER_NONCE);
- }
-
- byte[] additionalEntropy =
- KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng(
- mRng, (mKeySizeBits + 7) / 8);
- int flags = 0;
- if (spec.isStrongBoxBacked()) {
- flags |= KeyStore.FLAG_STRONGBOX;
- }
- if (spec.isCriticalToDeviceEncryption()) {
- flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
- }
- String keyAliasInKeystore = Credentials.USER_PRIVATE_KEY + spec.getKeystoreAlias();
- KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics();
- boolean success = false;
- try {
- Credentials.deleteAllTypesForAlias(mKeyStore, spec.getKeystoreAlias(), spec.getUid());
- int errorCode = mKeyStore.generateKey(
- keyAliasInKeystore,
- args,
- additionalEntropy,
- spec.getUid(),
- flags,
- resultingKeyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- if (errorCode == KeyStore.HARDWARE_TYPE_UNAVAILABLE) {
- throw new StrongBoxUnavailableException("Failed to generate key");
- } else {
- throw new ProviderException(
- "Keystore operation failed", KeyStore.getKeyStoreException(errorCode));
- }
- }
- @KeyProperties.KeyAlgorithmEnum String keyAlgorithmJCA;
- try {
- keyAlgorithmJCA = KeyProperties.KeyAlgorithm.fromKeymasterSecretKeyAlgorithm(
- mKeymasterAlgorithm, mKeymasterDigest);
- } catch (IllegalArgumentException e) {
- throw new ProviderException("Failed to obtain JCA secret key algorithm name", e);
- }
- SecretKey result = new AndroidKeyStoreSecretKey(
- keyAliasInKeystore, spec.getUid(), keyAlgorithmJCA);
- success = true;
- return result;
- } finally {
- if (!success) {
- Credentials.deleteAllTypesForAlias(
- mKeyStore, spec.getKeystoreAlias(), spec.getUid());
- }
- }
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
deleted file mode 100644
index 988838b..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
- * Copyright (C) 2012 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.security.keystore;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.os.Build;
-import android.security.Credentials;
-import android.security.KeyPairGeneratorSpec;
-import android.security.KeyStore;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterCertificateChain;
-import android.security.keymaster.KeymasterDefs;
-import android.telephony.TelephonyManager;
-import android.util.ArraySet;
-
-import com.android.internal.org.bouncycastle.asn1.ASN1EncodableVector;
-import com.android.internal.org.bouncycastle.asn1.ASN1InputStream;
-import com.android.internal.org.bouncycastle.asn1.ASN1Integer;
-import com.android.internal.org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import com.android.internal.org.bouncycastle.asn1.DERBitString;
-import com.android.internal.org.bouncycastle.asn1.DERNull;
-import com.android.internal.org.bouncycastle.asn1.DERSequence;
-import com.android.internal.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
-import com.android.internal.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
-import com.android.internal.org.bouncycastle.asn1.x509.Certificate;
-import com.android.internal.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
-import com.android.internal.org.bouncycastle.asn1.x509.TBSCertificate;
-import com.android.internal.org.bouncycastle.asn1.x509.Time;
-import com.android.internal.org.bouncycastle.asn1.x509.V3TBSCertificateGenerator;
-import com.android.internal.org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
-import com.android.internal.org.bouncycastle.jce.X509Principal;
-import com.android.internal.org.bouncycastle.jce.provider.X509CertificateObject;
-import com.android.internal.org.bouncycastle.x509.X509V3CertificateGenerator;
-
-import libcore.util.EmptyArray;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.nio.charset.StandardCharsets;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyPairGeneratorSpi;
-import java.security.PrivateKey;
-import java.security.ProviderException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateParsingException;
-import java.security.cert.X509Certificate;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.ECGenParameterSpec;
-import java.security.spec.RSAKeyGenParameterSpec;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Provides a way to create instances of a KeyPair which will be placed in the
- * Android keystore service usable only by the application that called it. This
- * can be used in conjunction with
- * {@link java.security.KeyStore#getInstance(String)} using the
- * {@code "AndroidKeyStore"} type.
- * <p>
- * This class can not be directly instantiated and must instead be used via the
- * {@link KeyPairGenerator#getInstance(String)
- * KeyPairGenerator.getInstance("AndroidKeyStore")} API.
- *
- * @hide
- */
-public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
-
- public static class RSA extends AndroidKeyStoreKeyPairGeneratorSpi {
- public RSA() {
- super(KeymasterDefs.KM_ALGORITHM_RSA);
- }
- }
-
- public static class EC extends AndroidKeyStoreKeyPairGeneratorSpi {
- public EC() {
- super(KeymasterDefs.KM_ALGORITHM_EC);
- }
- }
-
- /*
- * These must be kept in sync with system/security/keystore/defaults.h
- */
-
- /* EC */
- private static final int EC_DEFAULT_KEY_SIZE = 256;
-
- /* RSA */
- private static final int RSA_DEFAULT_KEY_SIZE = 2048;
- private static final int RSA_MIN_KEY_SIZE = 512;
- private static final int RSA_MAX_KEY_SIZE = 8192;
-
- private static final Map<String, Integer> SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE =
- new HashMap<String, Integer>();
- private static final List<String> SUPPORTED_EC_NIST_CURVE_NAMES = new ArrayList<String>();
- private static final List<Integer> SUPPORTED_EC_NIST_CURVE_SIZES = new ArrayList<Integer>();
- static {
- // Aliases for NIST P-224
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("p-224", 224);
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("secp224r1", 224);
-
-
- // Aliases for NIST P-256
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("p-256", 256);
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("secp256r1", 256);
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("prime256v1", 256);
-
- // Aliases for NIST P-384
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("p-384", 384);
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("secp384r1", 384);
-
- // Aliases for NIST P-521
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("p-521", 521);
- SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.put("secp521r1", 521);
-
- SUPPORTED_EC_NIST_CURVE_NAMES.addAll(SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.keySet());
- Collections.sort(SUPPORTED_EC_NIST_CURVE_NAMES);
-
- SUPPORTED_EC_NIST_CURVE_SIZES.addAll(
- new HashSet<Integer>(SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.values()));
- Collections.sort(SUPPORTED_EC_NIST_CURVE_SIZES);
- }
-
- private final int mOriginalKeymasterAlgorithm;
-
- private KeyStore mKeyStore;
-
- private KeyGenParameterSpec mSpec;
-
- private String mEntryAlias;
- private int mEntryUid;
- private boolean mEncryptionAtRestRequired;
- private @KeyProperties.KeyAlgorithmEnum String mJcaKeyAlgorithm;
- private int mKeymasterAlgorithm = -1;
- private int mKeySizeBits;
- private SecureRandom mRng;
-
- private int[] mKeymasterPurposes;
- private int[] mKeymasterBlockModes;
- private int[] mKeymasterEncryptionPaddings;
- private int[] mKeymasterSignaturePaddings;
- private int[] mKeymasterDigests;
-
- private BigInteger mRSAPublicExponent;
-
- protected AndroidKeyStoreKeyPairGeneratorSpi(int keymasterAlgorithm) {
- mOriginalKeymasterAlgorithm = keymasterAlgorithm;
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public void initialize(int keysize, SecureRandom random) {
- throw new IllegalArgumentException(
- KeyGenParameterSpec.class.getName() + " or " + KeyPairGeneratorSpec.class.getName()
- + " required to initialize this KeyPairGenerator");
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public void initialize(AlgorithmParameterSpec params, SecureRandom random)
- throws InvalidAlgorithmParameterException {
- resetAll();
-
- boolean success = false;
- try {
- if (params == null) {
- throw new InvalidAlgorithmParameterException(
- "Must supply params of type " + KeyGenParameterSpec.class.getName()
- + " or " + KeyPairGeneratorSpec.class.getName());
- }
-
- KeyGenParameterSpec spec;
- boolean encryptionAtRestRequired = false;
- int keymasterAlgorithm = mOriginalKeymasterAlgorithm;
- if (params instanceof KeyGenParameterSpec) {
- spec = (KeyGenParameterSpec) params;
- } else if (params instanceof KeyPairGeneratorSpec) {
- // Legacy/deprecated spec
- KeyPairGeneratorSpec legacySpec = (KeyPairGeneratorSpec) params;
- try {
- KeyGenParameterSpec.Builder specBuilder;
- String specKeyAlgorithm = legacySpec.getKeyType();
- if (specKeyAlgorithm != null) {
- // Spec overrides the generator's default key algorithm
- try {
- keymasterAlgorithm =
- KeyProperties.KeyAlgorithm.toKeymasterAsymmetricKeyAlgorithm(
- specKeyAlgorithm);
- } catch (IllegalArgumentException e) {
- throw new InvalidAlgorithmParameterException(
- "Invalid key type in parameters", e);
- }
- }
- switch (keymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_EC:
- specBuilder = new KeyGenParameterSpec.Builder(
- legacySpec.getKeystoreAlias(),
- KeyProperties.PURPOSE_SIGN
- | KeyProperties.PURPOSE_VERIFY);
- // Authorized to be used with any digest (including no digest).
- // MD5 was never offered for Android Keystore for ECDSA.
- specBuilder.setDigests(
- KeyProperties.DIGEST_NONE,
- KeyProperties.DIGEST_SHA1,
- KeyProperties.DIGEST_SHA224,
- KeyProperties.DIGEST_SHA256,
- KeyProperties.DIGEST_SHA384,
- KeyProperties.DIGEST_SHA512);
- break;
- case KeymasterDefs.KM_ALGORITHM_RSA:
- specBuilder = new KeyGenParameterSpec.Builder(
- legacySpec.getKeystoreAlias(),
- KeyProperties.PURPOSE_ENCRYPT
- | KeyProperties.PURPOSE_DECRYPT
- | KeyProperties.PURPOSE_SIGN
- | KeyProperties.PURPOSE_VERIFY);
- // Authorized to be used with any digest (including no digest).
- specBuilder.setDigests(
- KeyProperties.DIGEST_NONE,
- KeyProperties.DIGEST_MD5,
- KeyProperties.DIGEST_SHA1,
- KeyProperties.DIGEST_SHA224,
- KeyProperties.DIGEST_SHA256,
- KeyProperties.DIGEST_SHA384,
- KeyProperties.DIGEST_SHA512);
- // Authorized to be used with any encryption and signature padding
- // schemes (including no padding).
- specBuilder.setEncryptionPaddings(
- KeyProperties.ENCRYPTION_PADDING_NONE,
- KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
- KeyProperties.ENCRYPTION_PADDING_RSA_OAEP);
- specBuilder.setSignaturePaddings(
- KeyProperties.SIGNATURE_PADDING_RSA_PKCS1,
- KeyProperties.SIGNATURE_PADDING_RSA_PSS);
- // Disable randomized encryption requirement to support encryption
- // padding NONE above.
- specBuilder.setRandomizedEncryptionRequired(false);
- break;
- default:
- throw new ProviderException(
- "Unsupported algorithm: " + mKeymasterAlgorithm);
- }
-
- if (legacySpec.getKeySize() != -1) {
- specBuilder.setKeySize(legacySpec.getKeySize());
- }
- if (legacySpec.getAlgorithmParameterSpec() != null) {
- specBuilder.setAlgorithmParameterSpec(
- legacySpec.getAlgorithmParameterSpec());
- }
- specBuilder.setCertificateSubject(legacySpec.getSubjectDN());
- specBuilder.setCertificateSerialNumber(legacySpec.getSerialNumber());
- specBuilder.setCertificateNotBefore(legacySpec.getStartDate());
- specBuilder.setCertificateNotAfter(legacySpec.getEndDate());
- encryptionAtRestRequired = legacySpec.isEncryptionRequired();
- specBuilder.setUserAuthenticationRequired(false);
-
- spec = specBuilder.build();
- } catch (NullPointerException | IllegalArgumentException e) {
- throw new InvalidAlgorithmParameterException(e);
- }
- } else {
- throw new InvalidAlgorithmParameterException(
- "Unsupported params class: " + params.getClass().getName()
- + ". Supported: " + KeyGenParameterSpec.class.getName()
- + ", " + KeyPairGeneratorSpec.class.getName());
- }
-
- mEntryAlias = spec.getKeystoreAlias();
- mEntryUid = spec.getUid();
- mSpec = spec;
- mKeymasterAlgorithm = keymasterAlgorithm;
- mEncryptionAtRestRequired = encryptionAtRestRequired;
- mKeySizeBits = spec.getKeySize();
- initAlgorithmSpecificParameters();
- if (mKeySizeBits == -1) {
- mKeySizeBits = getDefaultKeySize(keymasterAlgorithm);
- }
- checkValidKeySize(keymasterAlgorithm, mKeySizeBits, mSpec.isStrongBoxBacked());
-
- if (spec.getKeystoreAlias() == null) {
- throw new InvalidAlgorithmParameterException("KeyStore entry alias not provided");
- }
-
- String jcaKeyAlgorithm;
- try {
- jcaKeyAlgorithm = KeyProperties.KeyAlgorithm.fromKeymasterAsymmetricKeyAlgorithm(
- keymasterAlgorithm);
- mKeymasterPurposes = KeyProperties.Purpose.allToKeymaster(spec.getPurposes());
- mKeymasterBlockModes = KeyProperties.BlockMode.allToKeymaster(spec.getBlockModes());
- mKeymasterEncryptionPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
- spec.getEncryptionPaddings());
- if (((spec.getPurposes() & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (spec.isRandomizedEncryptionRequired())) {
- for (int keymasterPadding : mKeymasterEncryptionPaddings) {
- if (!KeymasterUtils
- .isKeymasterPaddingSchemeIndCpaCompatibleWithAsymmetricCrypto(
- keymasterPadding)) {
- throw new InvalidAlgorithmParameterException(
- "Randomized encryption (IND-CPA) required but may be violated"
- + " by padding scheme: "
- + KeyProperties.EncryptionPadding.fromKeymaster(
- keymasterPadding)
- + ". See " + KeyGenParameterSpec.class.getName()
- + " documentation.");
- }
- }
- }
- mKeymasterSignaturePaddings = KeyProperties.SignaturePadding.allToKeymaster(
- spec.getSignaturePaddings());
- if (spec.isDigestsSpecified()) {
- mKeymasterDigests = KeyProperties.Digest.allToKeymaster(spec.getDigests());
- } else {
- mKeymasterDigests = EmptyArray.INT;
- }
-
- // Check that user authentication related parameters are acceptable. This method
- // will throw an IllegalStateException if there are issues (e.g., secure lock screen
- // not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), mSpec);
- } catch (IllegalArgumentException | IllegalStateException e) {
- throw new InvalidAlgorithmParameterException(e);
- }
-
- mJcaKeyAlgorithm = jcaKeyAlgorithm;
- mRng = random;
- mKeyStore = KeyStore.getInstance();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- private void resetAll() {
- mEntryAlias = null;
- mEntryUid = KeyStore.UID_SELF;
- mJcaKeyAlgorithm = null;
- mKeymasterAlgorithm = -1;
- mKeymasterPurposes = null;
- mKeymasterBlockModes = null;
- mKeymasterEncryptionPaddings = null;
- mKeymasterSignaturePaddings = null;
- mKeymasterDigests = null;
- mKeySizeBits = 0;
- mSpec = null;
- mRSAPublicExponent = null;
- mEncryptionAtRestRequired = false;
- mRng = null;
- mKeyStore = null;
- }
-
- private void initAlgorithmSpecificParameters() throws InvalidAlgorithmParameterException {
- AlgorithmParameterSpec algSpecificSpec = mSpec.getAlgorithmParameterSpec();
- switch (mKeymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_RSA:
- {
- BigInteger publicExponent = null;
- if (algSpecificSpec instanceof RSAKeyGenParameterSpec) {
- RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec) algSpecificSpec;
- if (mKeySizeBits == -1) {
- mKeySizeBits = rsaSpec.getKeysize();
- } else if (mKeySizeBits != rsaSpec.getKeysize()) {
- throw new InvalidAlgorithmParameterException("RSA key size must match "
- + " between " + mSpec + " and " + algSpecificSpec
- + ": " + mKeySizeBits + " vs " + rsaSpec.getKeysize());
- }
- publicExponent = rsaSpec.getPublicExponent();
- } else if (algSpecificSpec != null) {
- throw new InvalidAlgorithmParameterException(
- "RSA may only use RSAKeyGenParameterSpec");
- }
- if (publicExponent == null) {
- publicExponent = RSAKeyGenParameterSpec.F4;
- }
- if (publicExponent.compareTo(BigInteger.ZERO) < 1) {
- throw new InvalidAlgorithmParameterException(
- "RSA public exponent must be positive: " + publicExponent);
- }
- if (publicExponent.compareTo(KeymasterArguments.UINT64_MAX_VALUE) > 0) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported RSA public exponent: " + publicExponent
- + ". Maximum supported value: " + KeymasterArguments.UINT64_MAX_VALUE);
- }
- mRSAPublicExponent = publicExponent;
- break;
- }
- case KeymasterDefs.KM_ALGORITHM_EC:
- if (algSpecificSpec instanceof ECGenParameterSpec) {
- ECGenParameterSpec ecSpec = (ECGenParameterSpec) algSpecificSpec;
- String curveName = ecSpec.getName();
- Integer ecSpecKeySizeBits = SUPPORTED_EC_NIST_CURVE_NAME_TO_SIZE.get(
- curveName.toLowerCase(Locale.US));
- if (ecSpecKeySizeBits == null) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported EC curve name: " + curveName
- + ". Supported: " + SUPPORTED_EC_NIST_CURVE_NAMES);
- }
- if (mKeySizeBits == -1) {
- mKeySizeBits = ecSpecKeySizeBits;
- } else if (mKeySizeBits != ecSpecKeySizeBits) {
- throw new InvalidAlgorithmParameterException("EC key size must match "
- + " between " + mSpec + " and " + algSpecificSpec
- + ": " + mKeySizeBits + " vs " + ecSpecKeySizeBits);
- }
- } else if (algSpecificSpec != null) {
- throw new InvalidAlgorithmParameterException(
- "EC may only use ECGenParameterSpec");
- }
- break;
- default:
- throw new ProviderException("Unsupported algorithm: " + mKeymasterAlgorithm);
- }
- }
-
- @Override
- public KeyPair generateKeyPair() {
- if (mKeyStore == null || mSpec == null) {
- throw new IllegalStateException("Not initialized");
- }
-
- int flags = (mEncryptionAtRestRequired) ? KeyStore.FLAG_ENCRYPTED : 0;
- if (((flags & KeyStore.FLAG_ENCRYPTED) != 0)
- && (mKeyStore.state() != KeyStore.State.UNLOCKED)) {
- throw new IllegalStateException(
- "Encryption at rest using secure lock screen credential requested for key pair"
- + ", but the user has not yet entered the credential");
- }
-
- if (mSpec.isStrongBoxBacked()) {
- flags |= KeyStore.FLAG_STRONGBOX;
- }
- if (mSpec.isCriticalToDeviceEncryption()) {
- flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
- }
-
- byte[] additionalEntropy =
- KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng(
- mRng, (mKeySizeBits + 7) / 8);
-
- Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid);
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + mEntryAlias;
- boolean success = false;
- try {
- generateKeystoreKeyPair(
- privateKeyAlias, constructKeyGenerationArguments(), additionalEntropy, flags);
- KeyPair keyPair = loadKeystoreKeyPair(privateKeyAlias);
-
- storeCertificateChain(flags, createCertificateChain(privateKeyAlias, keyPair));
-
- success = true;
- return keyPair;
- } catch (ProviderException | IllegalArgumentException | DeviceIdAttestationException e) {
- if ((mSpec.getPurposes() & KeyProperties.PURPOSE_WRAP_KEY) != 0) {
- throw new SecureKeyImportUnavailableException(e);
- } else {
- throw new ProviderException(e);
- }
- } finally {
- if (!success) {
- Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid);
- }
- }
- }
-
- private Iterable<byte[]> createCertificateChain(final String privateKeyAlias, KeyPair keyPair)
- throws ProviderException, DeviceIdAttestationException {
- byte[] challenge = mSpec.getAttestationChallenge();
- if (challenge != null) {
- KeymasterArguments args = new KeymasterArguments();
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_CHALLENGE, challenge);
-
- if (mSpec.isDevicePropertiesAttestationIncluded()) {
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_BRAND,
- Build.BRAND.getBytes(StandardCharsets.UTF_8));
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_DEVICE,
- Build.DEVICE.getBytes(StandardCharsets.UTF_8));
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_PRODUCT,
- Build.PRODUCT.getBytes(StandardCharsets.UTF_8));
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_MANUFACTURER,
- Build.MANUFACTURER.getBytes(StandardCharsets.UTF_8));
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_MODEL,
- Build.MODEL.getBytes(StandardCharsets.UTF_8));
- }
-
- int[] idTypes = mSpec.getAttestationIds();
- if (idTypes != null) {
- final Set<Integer> idTypesSet = new ArraySet<>(idTypes.length);
- for (int idType : idTypes) {
- idTypesSet.add(idType);
- }
- TelephonyManager telephonyService = null;
- if (idTypesSet.contains(AttestationUtils.ID_TYPE_IMEI)
- || idTypesSet.contains(AttestationUtils.ID_TYPE_MEID)) {
- telephonyService =
- (TelephonyManager) KeyStore.getApplicationContext().getSystemService(
- Context.TELEPHONY_SERVICE);
- if (telephonyService == null) {
- throw new DeviceIdAttestationException(
- "Unable to access telephony service");
- }
- }
- for (final Integer idType : idTypesSet) {
- switch (idType) {
- case AttestationUtils.ID_TYPE_SERIAL:
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_SERIAL,
- Build.getSerial().getBytes(StandardCharsets.UTF_8)
- );
- break;
- case AttestationUtils.ID_TYPE_IMEI: {
- final String imei = telephonyService.getImei(0);
- if (imei == null) {
- throw new DeviceIdAttestationException("Unable to retrieve IMEI");
- }
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_IMEI,
- imei.getBytes(StandardCharsets.UTF_8)
- );
- break;
- }
- case AttestationUtils.ID_TYPE_MEID: {
- final String meid = telephonyService.getMeid(0);
- if (meid == null) {
- throw new DeviceIdAttestationException("Unable to retrieve MEID");
- }
- args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_MEID,
- meid.getBytes(StandardCharsets.UTF_8)
- );
- break;
- }
- case AttestationUtils.USE_INDIVIDUAL_ATTESTATION: {
- args.addBoolean(KeymasterDefs.KM_TAG_DEVICE_UNIQUE_ATTESTATION);
- break;
- }
- default:
- throw new IllegalArgumentException("Unknown device ID type " + idType);
- }
- }
- }
-
- return getAttestationChain(privateKeyAlias, keyPair, args);
- }
-
- // Very short certificate chain in the non-attestation case.
- return Collections.singleton(generateSelfSignedCertificateBytes(keyPair));
- }
-
- private void generateKeystoreKeyPair(final String privateKeyAlias, KeymasterArguments args,
- byte[] additionalEntropy, final int flags) throws ProviderException {
- KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics();
- int errorCode = mKeyStore.generateKey(privateKeyAlias, args, additionalEntropy,
- mEntryUid, flags, resultingKeyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- if (errorCode == KeyStore.HARDWARE_TYPE_UNAVAILABLE) {
- throw new StrongBoxUnavailableException("Failed to generate key pair");
- } else {
- throw new ProviderException(
- "Failed to generate key pair", KeyStore.getKeyStoreException(errorCode));
- }
- }
- }
-
- private KeyPair loadKeystoreKeyPair(final String privateKeyAlias) throws ProviderException {
- try {
- KeyPair result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(
- mKeyStore, privateKeyAlias, mEntryUid);
- if (!mJcaKeyAlgorithm.equalsIgnoreCase(result.getPrivate().getAlgorithm())) {
- throw new ProviderException(
- "Generated key pair algorithm does not match requested algorithm: "
- + result.getPrivate().getAlgorithm() + " vs " + mJcaKeyAlgorithm);
- }
- return result;
- } catch (UnrecoverableKeyException | KeyPermanentlyInvalidatedException e) {
- throw new ProviderException("Failed to load generated key pair from keystore", e);
- }
- }
-
- private KeymasterArguments constructKeyGenerationArguments()
- throws IllegalArgumentException, DeviceIdAttestationException {
- KeymasterArguments args = new KeymasterArguments();
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, mKeySizeBits);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, mKeymasterAlgorithm);
- args.addEnums(KeymasterDefs.KM_TAG_PURPOSE, mKeymasterPurposes);
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes);
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterEncryptionPaddings);
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterSignaturePaddings);
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
-
- KeymasterUtils.addUserAuthArgs(args, mSpec);
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, mSpec.getKeyValidityStart());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
- mSpec.getKeyValidityForOriginationEnd());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
- mSpec.getKeyValidityForConsumptionEnd());
- addAlgorithmSpecificParameters(args);
-
- if (mSpec.isUniqueIdIncluded()) {
- args.addBoolean(KeymasterDefs.KM_TAG_INCLUDE_UNIQUE_ID);
- }
- return args;
- }
-
- private void storeCertificateChain(final int flags, Iterable<byte[]> iterable)
- throws ProviderException {
- Iterator<byte[]> iter = iterable.iterator();
- storeCertificate(
- Credentials.USER_CERTIFICATE, iter.next(), flags, "Failed to store certificate");
-
- if (!iter.hasNext()) {
- return;
- }
-
- ByteArrayOutputStream certificateConcatenationStream = new ByteArrayOutputStream();
- while (iter.hasNext()) {
- byte[] data = iter.next();
- certificateConcatenationStream.write(data, 0, data.length);
- }
-
- storeCertificate(Credentials.CA_CERTIFICATE, certificateConcatenationStream.toByteArray(),
- flags, "Failed to store attestation CA certificate");
- }
-
- private void storeCertificate(String prefix, byte[] certificateBytes, final int flags,
- String failureMessage) throws ProviderException {
- int insertErrorCode = mKeyStore.insert(
- prefix + mEntryAlias,
- certificateBytes,
- mEntryUid,
- flags);
- if (insertErrorCode != KeyStore.NO_ERROR) {
- throw new ProviderException(failureMessage,
- KeyStore.getKeyStoreException(insertErrorCode));
- }
- }
-
- private byte[] generateSelfSignedCertificateBytes(KeyPair keyPair) throws ProviderException {
- try {
- return generateSelfSignedCertificate(keyPair.getPrivate(), keyPair.getPublic())
- .getEncoded();
- } catch (IOException | CertificateParsingException e) {
- throw new ProviderException("Failed to generate self-signed certificate", e);
- } catch (CertificateEncodingException e) {
- throw new ProviderException(
- "Failed to obtain encoded form of self-signed certificate", e);
- }
- }
-
- private Iterable<byte[]> getAttestationChain(String privateKeyAlias,
- KeyPair keyPair, KeymasterArguments args)
- throws ProviderException {
- final KeymasterCertificateChain outChain = new KeymasterCertificateChain();
- final int errorCode;
- if (mSpec.isDevicePropertiesAttestationIncluded()
- && mSpec.getAttestationChallenge() == null) {
- throw new ProviderException("An attestation challenge must be provided when requesting "
- + "device properties attestation.");
- }
- errorCode = mKeyStore.attestKey(privateKeyAlias, args, outChain);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new ProviderException("Failed to generate attestation certificate chain",
- KeyStore.getKeyStoreException(errorCode));
- }
- Collection<byte[]> chain = outChain.getCertificates();
- if (chain.size() < 2) {
- throw new ProviderException("Attestation certificate chain contained "
- + chain.size() + " entries. At least two are required.");
- }
- return chain;
- }
-
- private void addAlgorithmSpecificParameters(KeymasterArguments keymasterArgs) {
- switch (mKeymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_RSA:
- keymasterArgs.addUnsignedLong(
- KeymasterDefs.KM_TAG_RSA_PUBLIC_EXPONENT, mRSAPublicExponent);
- break;
- case KeymasterDefs.KM_ALGORITHM_EC:
- break;
- default:
- throw new ProviderException("Unsupported algorithm: " + mKeymasterAlgorithm);
- }
- }
-
- private X509Certificate generateSelfSignedCertificate(PrivateKey privateKey,
- PublicKey publicKey) throws CertificateParsingException, IOException {
- String signatureAlgorithm =
- getCertificateSignatureAlgorithm(mKeymasterAlgorithm, mKeySizeBits, mSpec);
- if (signatureAlgorithm == null) {
- // Key cannot be used to sign a certificate
- return generateSelfSignedCertificateWithFakeSignature(publicKey);
- } else {
- // Key can be used to sign a certificate
- try {
- return generateSelfSignedCertificateWithValidSignature(
- privateKey, publicKey, signatureAlgorithm);
- } catch (Exception e) {
- // Failed to generate the self-signed certificate with valid signature. Fall back
- // to generating a self-signed certificate with a fake signature. This is done for
- // all exception types because we prefer key pair generation to succeed and end up
- // producing a self-signed certificate with an invalid signature to key pair
- // generation failing.
- return generateSelfSignedCertificateWithFakeSignature(publicKey);
- }
- }
- }
-
- @SuppressWarnings("deprecation")
- private X509Certificate generateSelfSignedCertificateWithValidSignature(
- PrivateKey privateKey, PublicKey publicKey, String signatureAlgorithm) throws Exception {
- final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
- certGen.setPublicKey(publicKey);
- certGen.setSerialNumber(mSpec.getCertificateSerialNumber());
- certGen.setSubjectDN(mSpec.getCertificateSubject());
- certGen.setIssuerDN(mSpec.getCertificateSubject());
- certGen.setNotBefore(mSpec.getCertificateNotBefore());
- certGen.setNotAfter(mSpec.getCertificateNotAfter());
- certGen.setSignatureAlgorithm(signatureAlgorithm);
- return certGen.generate(privateKey);
- }
-
- @SuppressWarnings("deprecation")
- private X509Certificate generateSelfSignedCertificateWithFakeSignature(
- PublicKey publicKey) throws IOException, CertificateParsingException {
- V3TBSCertificateGenerator tbsGenerator = new V3TBSCertificateGenerator();
- ASN1ObjectIdentifier sigAlgOid;
- AlgorithmIdentifier sigAlgId;
- byte[] signature;
- switch (mKeymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_EC:
- sigAlgOid = X9ObjectIdentifiers.ecdsa_with_SHA256;
- sigAlgId = new AlgorithmIdentifier(sigAlgOid);
- ASN1EncodableVector v = new ASN1EncodableVector();
- v.add(new ASN1Integer(BigInteger.valueOf(0)));
- v.add(new ASN1Integer(BigInteger.valueOf(0)));
- signature = new DERSequence().getEncoded();
- break;
- case KeymasterDefs.KM_ALGORITHM_RSA:
- sigAlgOid = PKCSObjectIdentifiers.sha256WithRSAEncryption;
- sigAlgId = new AlgorithmIdentifier(sigAlgOid, DERNull.INSTANCE);
- signature = new byte[1];
- break;
- default:
- throw new ProviderException("Unsupported key algorithm: " + mKeymasterAlgorithm);
- }
-
- try (ASN1InputStream publicKeyInfoIn = new ASN1InputStream(publicKey.getEncoded())) {
- tbsGenerator.setSubjectPublicKeyInfo(
- SubjectPublicKeyInfo.getInstance(publicKeyInfoIn.readObject()));
- }
- tbsGenerator.setSerialNumber(new ASN1Integer(mSpec.getCertificateSerialNumber()));
- X509Principal subject =
- new X509Principal(mSpec.getCertificateSubject().getEncoded());
- tbsGenerator.setSubject(subject);
- tbsGenerator.setIssuer(subject);
- tbsGenerator.setStartDate(new Time(mSpec.getCertificateNotBefore()));
- tbsGenerator.setEndDate(new Time(mSpec.getCertificateNotAfter()));
- tbsGenerator.setSignature(sigAlgId);
- TBSCertificate tbsCertificate = tbsGenerator.generateTBSCertificate();
-
- ASN1EncodableVector result = new ASN1EncodableVector();
- result.add(tbsCertificate);
- result.add(sigAlgId);
- result.add(new DERBitString(signature));
- return new X509CertificateObject(Certificate.getInstance(new DERSequence(result)));
- }
-
- private static int getDefaultKeySize(int keymasterAlgorithm) {
- switch (keymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_EC:
- return EC_DEFAULT_KEY_SIZE;
- case KeymasterDefs.KM_ALGORITHM_RSA:
- return RSA_DEFAULT_KEY_SIZE;
- default:
- throw new ProviderException("Unsupported algorithm: " + keymasterAlgorithm);
- }
- }
-
- private static void checkValidKeySize(
- int keymasterAlgorithm,
- int keySize,
- boolean isStrongBoxBacked)
- throws InvalidAlgorithmParameterException {
- switch (keymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_EC:
- if (isStrongBoxBacked && keySize != 256) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported StrongBox EC key size: "
- + keySize + " bits. Supported: 256");
- }
- if (!SUPPORTED_EC_NIST_CURVE_SIZES.contains(keySize)) {
- throw new InvalidAlgorithmParameterException("Unsupported EC key size: "
- + keySize + " bits. Supported: " + SUPPORTED_EC_NIST_CURVE_SIZES);
- }
- break;
- case KeymasterDefs.KM_ALGORITHM_RSA:
- if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
- throw new InvalidAlgorithmParameterException("RSA key size must be >= "
- + RSA_MIN_KEY_SIZE + " and <= " + RSA_MAX_KEY_SIZE);
- }
- break;
- default:
- throw new ProviderException("Unsupported algorithm: " + keymasterAlgorithm);
- }
- }
-
- /**
- * Returns the {@code Signature} algorithm to be used for signing a certificate using the
- * specified key or {@code null} if the key cannot be used for signing a certificate.
- */
- @Nullable
- private static String getCertificateSignatureAlgorithm(
- int keymasterAlgorithm,
- int keySizeBits,
- KeyGenParameterSpec spec) {
- // Constraints:
- // 1. Key must be authorized for signing without user authentication.
- // 2. Signature digest must be one of key's authorized digests.
- // 3. For RSA keys, the digest output size must not exceed modulus size minus space overhead
- // of RSA PKCS#1 signature padding scheme (about 30 bytes).
- // 4. For EC keys, the there is no point in using a digest whose output size is longer than
- // key/field size because the digest will be truncated to that size.
-
- if ((spec.getPurposes() & KeyProperties.PURPOSE_SIGN) == 0) {
- // Key not authorized for signing
- return null;
- }
- if (spec.isUserAuthenticationRequired()) {
- // Key not authorized for use without user authentication
- return null;
- }
- if (!spec.isDigestsSpecified()) {
- // Key not authorized for any digests -- can't sign
- return null;
- }
- switch (keymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_EC:
- {
- Set<Integer> availableKeymasterDigests = getAvailableKeymasterSignatureDigests(
- spec.getDigests(),
- AndroidKeyStoreBCWorkaroundProvider.getSupportedEcdsaSignatureDigests());
-
- int bestKeymasterDigest = -1;
- int bestDigestOutputSizeBits = -1;
- for (int keymasterDigest : availableKeymasterDigests) {
- int outputSizeBits = KeymasterUtils.getDigestOutputSizeBits(keymasterDigest);
- if (outputSizeBits == keySizeBits) {
- // Perfect match -- use this digest
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- break;
- }
- // Not a perfect match -- check against the best digest so far
- if (bestKeymasterDigest == -1) {
- // First digest tested -- definitely the best so far
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- } else {
- // Prefer output size to be as close to key size as possible, with output
- // sizes larger than key size preferred to those smaller than key size.
- if (bestDigestOutputSizeBits < keySizeBits) {
- // Output size of the best digest so far is smaller than key size.
- // Anything larger is a win.
- if (outputSizeBits > bestDigestOutputSizeBits) {
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- }
- } else {
- // Output size of the best digest so far is larger than key size.
- // Anything smaller is a win, as long as it's not smaller than key size.
- if ((outputSizeBits < bestDigestOutputSizeBits)
- && (outputSizeBits >= keySizeBits)) {
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- }
- }
- }
- }
- if (bestKeymasterDigest == -1) {
- return null;
- }
- return KeyProperties.Digest.fromKeymasterToSignatureAlgorithmDigest(
- bestKeymasterDigest) + "WithECDSA";
- }
- case KeymasterDefs.KM_ALGORITHM_RSA:
- {
- // Check whether this key is authorized for PKCS#1 signature padding.
- // We use Bouncy Castle to generate self-signed RSA certificates. Bouncy Castle
- // only supports RSA certificates signed using PKCS#1 padding scheme. The key needs
- // to be authorized for PKCS#1 padding or padding NONE which means any padding.
- boolean pkcs1SignaturePaddingSupported =
- com.android.internal.util.ArrayUtils.contains(
- KeyProperties.SignaturePadding.allToKeymaster(
- spec.getSignaturePaddings()),
- KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN);
- if (!pkcs1SignaturePaddingSupported) {
- // Key not authorized for PKCS#1 signature padding -- can't sign
- return null;
- }
-
- Set<Integer> availableKeymasterDigests = getAvailableKeymasterSignatureDigests(
- spec.getDigests(),
- AndroidKeyStoreBCWorkaroundProvider.getSupportedEcdsaSignatureDigests());
-
- // The amount of space available for the digest is less than modulus size by about
- // 30 bytes because padding must be at least 11 bytes long (00 || 01 || PS || 00,
- // where PS must be at least 8 bytes long), and then there's also the 15--19 bytes
- // overhead (depending the on chosen digest) for encoding digest OID and digest
- // value in DER.
- int maxDigestOutputSizeBits = keySizeBits - 30 * 8;
- int bestKeymasterDigest = -1;
- int bestDigestOutputSizeBits = -1;
- for (int keymasterDigest : availableKeymasterDigests) {
- int outputSizeBits = KeymasterUtils.getDigestOutputSizeBits(keymasterDigest);
- if (outputSizeBits > maxDigestOutputSizeBits) {
- // Digest too long (signature generation will fail) -- skip
- continue;
- }
- if (bestKeymasterDigest == -1) {
- // First digest tested -- definitely the best so far
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- } else {
- // The longer the better
- if (outputSizeBits > bestDigestOutputSizeBits) {
- bestKeymasterDigest = keymasterDigest;
- bestDigestOutputSizeBits = outputSizeBits;
- }
- }
- }
- if (bestKeymasterDigest == -1) {
- return null;
- }
- return KeyProperties.Digest.fromKeymasterToSignatureAlgorithmDigest(
- bestKeymasterDigest) + "WithRSA";
- }
- default:
- throw new ProviderException("Unsupported algorithm: " + keymasterAlgorithm);
- }
- }
-
- private static Set<Integer> getAvailableKeymasterSignatureDigests(
- @KeyProperties.DigestEnum String[] authorizedKeyDigests,
- @KeyProperties.DigestEnum String[] supportedSignatureDigests) {
- Set<Integer> authorizedKeymasterKeyDigests = new HashSet<Integer>();
- for (int keymasterDigest : KeyProperties.Digest.allToKeymaster(authorizedKeyDigests)) {
- authorizedKeymasterKeyDigests.add(keymasterDigest);
- }
- Set<Integer> supportedKeymasterSignatureDigests = new HashSet<Integer>();
- for (int keymasterDigest
- : KeyProperties.Digest.allToKeymaster(supportedSignatureDigests)) {
- supportedKeymasterSignatureDigests.add(keymasterDigest);
- }
- Set<Integer> result = new HashSet<Integer>(supportedKeymasterSignatureDigests);
- result.retainAll(authorizedKeymasterKeyDigests);
- return result;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreLoadStoreParameter.java b/keystore/java/android/security/keystore/AndroidKeyStoreLoadStoreParameter.java
deleted file mode 100644
index 45d579e..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreLoadStoreParameter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.KeyStore;
-import java.security.KeyStore.ProtectionParameter;
-
-class AndroidKeyStoreLoadStoreParameter implements KeyStore.LoadStoreParameter {
-
- private final int mUid;
-
- AndroidKeyStoreLoadStoreParameter(int uid) {
- mUid = uid;
- }
-
- @Override
- public ProtectionParameter getProtectionParameter() {
- return null;
- }
-
- int getUid() {
- return mUid;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStorePrivateKey.java b/keystore/java/android/security/keystore/AndroidKeyStorePrivateKey.java
deleted file mode 100644
index 06e4c88..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStorePrivateKey.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.PrivateKey;
-
-/**
- * {@link PrivateKey} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStorePrivateKey extends AndroidKeyStoreKey implements PrivateKey {
-
- public AndroidKeyStorePrivateKey(String alias, int uid, String algorithm) {
- super(alias, uid, algorithm);
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
index 0871517..ecb082e 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
@@ -20,30 +20,13 @@
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.security.KeyStore;
-import android.security.keymaster.ExportResult;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterDefs;
import java.io.IOException;
-import java.security.KeyFactory;
-import java.security.KeyPair;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
-import java.security.ProviderException;
-import java.security.PublicKey;
-import java.security.Security;
-import java.security.Signature;
-import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
-import java.security.interfaces.ECKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.List;
import javax.crypto.Cipher;
import javax.crypto.Mac;
@@ -57,117 +40,10 @@
public class AndroidKeyStoreProvider extends Provider {
private static final String PROVIDER_NAME = "AndroidKeyStore";
- // IMPLEMENTATION NOTE: Class names are hard-coded in this provider to avoid loading these
- // classes when this provider is instantiated and installed early on during each app's
- // initialization process.
- //
- // Crypto operations operating on the AndroidKeyStore keys must not be offered by this provider.
- // Instead, they need to be offered by AndroidKeyStoreBCWorkaroundProvider. See its Javadoc
- // for details.
-
- private static final String PACKAGE_NAME = "android.security.keystore";
-
- private static final String DESEDE_SYSTEM_PROPERTY =
- "ro.hardware.keystore_desede";
-
/** @hide */
- public AndroidKeyStoreProvider() {
- this(PROVIDER_NAME);
- }
-
- /** @hide **/
- public AndroidKeyStoreProvider(String providerName) {
- super(providerName, 1.0, "Android KeyStore security provider");
-
- boolean supports3DES = "true".equals(android.os.SystemProperties.get(DESEDE_SYSTEM_PROPERTY));
-
- // java.security.KeyStore
- put("KeyStore." + providerName, PACKAGE_NAME + ".AndroidKeyStoreSpi");
-
- // java.security.KeyPairGenerator
- put("KeyPairGenerator.EC", PACKAGE_NAME + ".AndroidKeyStoreKeyPairGeneratorSpi$EC");
- put("KeyPairGenerator.RSA", PACKAGE_NAME + ".AndroidKeyStoreKeyPairGeneratorSpi$RSA");
-
- // java.security.KeyFactory
- putKeyFactoryImpl("EC");
- putKeyFactoryImpl("RSA");
-
- // javax.crypto.KeyGenerator
- put("KeyGenerator.AES", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$AES");
- put("KeyGenerator.HmacSHA1", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA1");
- put("KeyGenerator.HmacSHA224", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA224");
- put("KeyGenerator.HmacSHA256", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA256");
- put("KeyGenerator.HmacSHA384", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA384");
- put("KeyGenerator.HmacSHA512", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA512");
-
- if (supports3DES) {
- put("KeyGenerator.DESede", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$DESede");
- }
-
- // java.security.SecretKeyFactory
- putSecretKeyFactoryImpl("AES");
- if (supports3DES) {
- putSecretKeyFactoryImpl("DESede");
- }
- putSecretKeyFactoryImpl("HmacSHA1");
- putSecretKeyFactoryImpl("HmacSHA224");
- putSecretKeyFactoryImpl("HmacSHA256");
- putSecretKeyFactoryImpl("HmacSHA384");
- putSecretKeyFactoryImpl("HmacSHA512");
- }
-
- /**
- * This function indicates whether or not Keystore 2.0 is enabled. Some parts of the
- * Keystore SPI must behave subtly differently when Keystore 2.0 is enabled. However,
- * the platform property that indicates that Keystore 2.0 is enabled is not readable
- * by applications. So we set this value when {@code install()} is called because it
- * is called by zygote, which can access Keystore2Properties.
- *
- * This function can be removed once the transition to Keystore 2.0 is complete.
- * b/171305684
- *
- * @return true if Keystore 2.0 is enabled.
- * @hide
- */
- public static boolean isKeystore2Enabled() {
- return android.security.keystore2.AndroidKeyStoreProvider.isInstalled();
- }
-
- /**
- * Installs a new instance of this provider (and the
- * {@link AndroidKeyStoreBCWorkaroundProvider}).
- * @hide
- */
- public static void install() {
- Provider[] providers = Security.getProviders();
- int bcProviderIndex = -1;
- for (int i = 0; i < providers.length; i++) {
- Provider provider = providers[i];
- if ("BC".equals(provider.getName())) {
- bcProviderIndex = i;
- break;
- }
- }
-
- Security.addProvider(new AndroidKeyStoreProvider());
- Provider workaroundProvider = new AndroidKeyStoreBCWorkaroundProvider();
- if (bcProviderIndex != -1) {
- // Bouncy Castle provider found -- install the workaround provider above it.
- // insertProviderAt uses 1-based positions.
- Security.insertProviderAt(workaroundProvider, bcProviderIndex + 1);
- } else {
- // Bouncy Castle provider not found -- install the workaround provider at lowest
- // priority.
- Security.addProvider(workaroundProvider);
- }
- }
-
- private void putSecretKeyFactoryImpl(String algorithm) {
- put("SecretKeyFactory." + algorithm, PACKAGE_NAME + ".AndroidKeyStoreSecretKeyFactorySpi");
- }
-
- private void putKeyFactoryImpl(String algorithm) {
- put("KeyFactory." + algorithm, PACKAGE_NAME + ".AndroidKeyStoreKeyFactorySpi");
+ public AndroidKeyStoreProvider(@NonNull String name) {
+ super(name, 1.0, "Android KeyStore security provider");
+ throw new IllegalStateException("Should not be instantiated.");
}
/**
@@ -189,229 +65,7 @@
if (cryptoPrimitive == null) {
throw new NullPointerException();
}
- Object spi;
- if (cryptoPrimitive instanceof Signature) {
- spi = ((Signature) cryptoPrimitive).getCurrentSpi();
- } else if (cryptoPrimitive instanceof Mac) {
- spi = ((Mac) cryptoPrimitive).getCurrentSpi();
- } else if (cryptoPrimitive instanceof Cipher) {
- spi = ((Cipher) cryptoPrimitive).getCurrentSpi();
- } else {
- throw new IllegalArgumentException("Unsupported crypto primitive: " + cryptoPrimitive
- + ". Supported: Signature, Mac, Cipher");
- }
- if (spi == null) {
- throw new IllegalStateException("Crypto primitive not initialized");
- } else if (!(spi instanceof KeyStoreCryptoOperation)) {
- throw new IllegalArgumentException(
- "Crypto primitive not backed by AndroidKeyStore provider: " + cryptoPrimitive
- + ", spi: " + spi);
- }
- return ((KeyStoreCryptoOperation) spi).getOperationHandle();
- }
-
- /** @hide **/
- @NonNull
- public static AndroidKeyStorePublicKey getAndroidKeyStorePublicKey(
- @NonNull String alias,
- int uid,
- @NonNull @KeyProperties.KeyAlgorithmEnum String keyAlgorithm,
- @NonNull byte[] x509EncodedForm) {
- PublicKey publicKey;
- try {
- KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
- publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(x509EncodedForm));
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain " + keyAlgorithm + " KeyFactory", e);
- } catch (InvalidKeySpecException e) {
- throw new ProviderException("Invalid X.509 encoding of public key", e);
- }
- if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
- return new AndroidKeyStoreECPublicKey(alias, uid, (ECPublicKey) publicKey);
- } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
- return new AndroidKeyStoreRSAPublicKey(alias, uid, (RSAPublicKey) publicKey);
- } else {
- throw new ProviderException("Unsupported Android Keystore public key algorithm: "
- + keyAlgorithm);
- }
- }
-
- @NonNull
- private static AndroidKeyStorePrivateKey getAndroidKeyStorePrivateKey(
- @NonNull AndroidKeyStorePublicKey publicKey) {
- String keyAlgorithm = publicKey.getAlgorithm();
- if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
- return new AndroidKeyStoreECPrivateKey(
- publicKey.getAlias(), publicKey.getUid(), ((ECKey) publicKey).getParams());
- } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
- return new AndroidKeyStoreRSAPrivateKey(
- publicKey.getAlias(), publicKey.getUid(), ((RSAKey) publicKey).getModulus());
- } else {
- throw new ProviderException("Unsupported Android Keystore public key algorithm: "
- + keyAlgorithm);
- }
- }
-
- @NonNull
- private static KeyCharacteristics getKeyCharacteristics(@NonNull KeyStore keyStore,
- @NonNull String alias, int uid)
- throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
- int errorCode = keyStore.getKeyCharacteristics(
- alias, null, null, uid, keyCharacteristics);
- if (errorCode == KeyStore.KEY_PERMANENTLY_INVALIDATED) {
- throw (KeyPermanentlyInvalidatedException)
- new KeyPermanentlyInvalidatedException(
- "User changed or deleted their auth credentials",
- KeyStore.getKeyStoreException(errorCode));
- }
- if (errorCode != KeyStore.NO_ERROR) {
- throw (UnrecoverableKeyException)
- new UnrecoverableKeyException("Failed to obtain information about key")
- .initCause(KeyStore.getKeyStoreException(errorCode));
- }
- return keyCharacteristics;
- }
-
- @NonNull
- private static AndroidKeyStorePublicKey loadAndroidKeyStorePublicKeyFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid,
- KeyCharacteristics keyCharacteristics)
- throws UnrecoverableKeyException {
- ExportResult exportResult = keyStore.exportKey(
- privateKeyAlias, KeymasterDefs.KM_KEY_FORMAT_X509, null, null, uid);
- if (exportResult.resultCode != KeyStore.NO_ERROR) {
- throw (UnrecoverableKeyException)
- new UnrecoverableKeyException("Failed to obtain X.509 form of public key")
- .initCause(KeyStore.getKeyStoreException(exportResult.resultCode));
- }
- final byte[] x509EncodedPublicKey = exportResult.exportData;
-
- Integer keymasterAlgorithm = keyCharacteristics.getEnum(KeymasterDefs.KM_TAG_ALGORITHM);
- if (keymasterAlgorithm == null) {
- throw new UnrecoverableKeyException("Key algorithm unknown");
- }
-
- String jcaKeyAlgorithm;
- try {
- jcaKeyAlgorithm = KeyProperties.KeyAlgorithm.fromKeymasterAsymmetricKeyAlgorithm(
- keymasterAlgorithm);
- } catch (IllegalArgumentException e) {
- throw (UnrecoverableKeyException)
- new UnrecoverableKeyException("Failed to load private key")
- .initCause(e);
- }
-
- return AndroidKeyStoreProvider.getAndroidKeyStorePublicKey(
- privateKeyAlias, uid, jcaKeyAlgorithm, x509EncodedPublicKey);
- }
-
- /** @hide **/
- @NonNull
- public static AndroidKeyStorePublicKey loadAndroidKeyStorePublicKeyFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid)
- throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- return loadAndroidKeyStorePublicKeyFromKeystore(keyStore, privateKeyAlias, uid,
- getKeyCharacteristics(keyStore, privateKeyAlias, uid));
- }
-
- @NonNull
- private static KeyPair loadAndroidKeyStoreKeyPairFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid,
- @NonNull KeyCharacteristics keyCharacteristics)
- throws UnrecoverableKeyException {
- AndroidKeyStorePublicKey publicKey =
- loadAndroidKeyStorePublicKeyFromKeystore(keyStore, privateKeyAlias, uid,
- keyCharacteristics);
- AndroidKeyStorePrivateKey privateKey =
- AndroidKeyStoreProvider.getAndroidKeyStorePrivateKey(publicKey);
- return new KeyPair(publicKey, privateKey);
- }
-
- /** @hide **/
- @NonNull
- public static KeyPair loadAndroidKeyStoreKeyPairFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid)
- throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- return loadAndroidKeyStoreKeyPairFromKeystore(keyStore, privateKeyAlias, uid,
- getKeyCharacteristics(keyStore, privateKeyAlias, uid));
- }
-
- @NonNull
- private static AndroidKeyStorePrivateKey loadAndroidKeyStorePrivateKeyFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid,
- @NonNull KeyCharacteristics keyCharacteristics)
- throws UnrecoverableKeyException {
- KeyPair keyPair = loadAndroidKeyStoreKeyPairFromKeystore(keyStore, privateKeyAlias, uid,
- keyCharacteristics);
- return (AndroidKeyStorePrivateKey) keyPair.getPrivate();
- }
-
- /** @hide **/
- @NonNull
- public static AndroidKeyStorePrivateKey loadAndroidKeyStorePrivateKeyFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String privateKeyAlias, int uid)
- throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- return loadAndroidKeyStorePrivateKeyFromKeystore(keyStore, privateKeyAlias, uid,
- getKeyCharacteristics(keyStore, privateKeyAlias, uid));
- }
-
- @NonNull
- private static AndroidKeyStoreSecretKey loadAndroidKeyStoreSecretKeyFromKeystore(
- @NonNull String secretKeyAlias, int uid, @NonNull KeyCharacteristics keyCharacteristics)
- throws UnrecoverableKeyException {
- Integer keymasterAlgorithm = keyCharacteristics.getEnum(KeymasterDefs.KM_TAG_ALGORITHM);
- if (keymasterAlgorithm == null) {
- throw new UnrecoverableKeyException("Key algorithm unknown");
- }
-
- List<Integer> keymasterDigests = keyCharacteristics.getEnums(KeymasterDefs.KM_TAG_DIGEST);
- int keymasterDigest;
- if (keymasterDigests.isEmpty()) {
- keymasterDigest = -1;
- } else {
- // More than one digest can be permitted for this key. Use the first one to form the
- // JCA key algorithm name.
- keymasterDigest = keymasterDigests.get(0);
- }
-
- @KeyProperties.KeyAlgorithmEnum String keyAlgorithmString;
- try {
- keyAlgorithmString = KeyProperties.KeyAlgorithm.fromKeymasterSecretKeyAlgorithm(
- keymasterAlgorithm, keymasterDigest);
- } catch (IllegalArgumentException e) {
- throw (UnrecoverableKeyException)
- new UnrecoverableKeyException("Unsupported secret key type").initCause(e);
- }
-
- return new AndroidKeyStoreSecretKey(secretKeyAlias, uid, keyAlgorithmString);
- }
-
- /** @hide **/
- @NonNull
- public static AndroidKeyStoreKey loadAndroidKeyStoreKeyFromKeystore(
- @NonNull KeyStore keyStore, @NonNull String userKeyAlias, int uid)
- throws UnrecoverableKeyException, KeyPermanentlyInvalidatedException {
- KeyCharacteristics keyCharacteristics = getKeyCharacteristics(keyStore, userKeyAlias, uid);
-
- Integer keymasterAlgorithm = keyCharacteristics.getEnum(KeymasterDefs.KM_TAG_ALGORITHM);
- if (keymasterAlgorithm == null) {
- throw new UnrecoverableKeyException("Key algorithm unknown");
- }
-
- if (keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC ||
- keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_AES ||
- keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_3DES) {
- return loadAndroidKeyStoreSecretKeyFromKeystore(userKeyAlias, uid,
- keyCharacteristics);
- } else if (keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_RSA ||
- keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_EC) {
- return loadAndroidKeyStorePrivateKeyFromKeystore(keyStore, userKeyAlias, uid,
- keyCharacteristics);
- } else {
- throw new UnrecoverableKeyException("Key algorithm unknown");
- }
+ return 0;
}
/**
@@ -434,13 +88,9 @@
@NonNull
public static java.security.KeyStore getKeyStoreForUid(int uid)
throws KeyStoreException, NoSuchProviderException {
- final java.security.KeyStore.LoadStoreParameter loadParameter;
- if (android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) {
- loadParameter = new android.security.keystore2.AndroidKeyStoreLoadStoreParameter(
- KeyProperties.legacyUidToNamespace(uid));
- } else {
- loadParameter = new AndroidKeyStoreLoadStoreParameter(uid);
- }
+ final java.security.KeyStore.LoadStoreParameter loadParameter =
+ new android.security.keystore2.AndroidKeyStoreLoadStoreParameter(
+ KeyProperties.legacyUidToNamespace(uid));
java.security.KeyStore result = java.security.KeyStore.getInstance(PROVIDER_NAME);
try {
result.load(loadParameter);
diff --git a/keystore/java/android/security/keystore/AndroidKeyStorePublicKey.java b/keystore/java/android/security/keystore/AndroidKeyStorePublicKey.java
deleted file mode 100644
index 4194780..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStorePublicKey.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.security.PublicKey;
-import java.util.Arrays;
-
-/**
- * {@link PublicKey} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStorePublicKey extends AndroidKeyStoreKey implements PublicKey {
-
- private final byte[] mEncoded;
-
- public AndroidKeyStorePublicKey(String alias, int uid, String algorithm, byte[] x509EncodedForm) {
- super(alias, uid, algorithm);
- mEncoded = ArrayUtils.cloneIfNotEmpty(x509EncodedForm);
- }
-
- @Override
- public String getFormat() {
- return "X.509";
- }
-
- @Override
- public byte[] getEncoded() {
- return ArrayUtils.cloneIfNotEmpty(mEncoded);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + Arrays.hashCode(mEncoded);
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- AndroidKeyStorePublicKey other = (AndroidKeyStorePublicKey) obj;
- if (!Arrays.equals(mEncoded, other.mEncoded)) {
- return false;
- }
- return true;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java
deleted file mode 100644
index 2ae68fa..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.security.KeyStore;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.ProviderException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
-import java.security.spec.MGF1ParameterSpec;
-
-import javax.crypto.Cipher;
-import javax.crypto.CipherSpi;
-import javax.crypto.spec.OAEPParameterSpec;
-import javax.crypto.spec.PSource;
-
-/**
- * Base class for {@link CipherSpi} providing Android KeyStore backed RSA encryption/decryption.
- *
- * @hide
- */
-abstract class AndroidKeyStoreRSACipherSpi extends AndroidKeyStoreCipherSpiBase {
-
- /**
- * Raw RSA cipher without any padding.
- */
- public static final class NoPadding extends AndroidKeyStoreRSACipherSpi {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
-
- @Override
- protected boolean adjustConfigForEncryptingWithPrivateKey() {
- // RSA encryption with no padding using private key is a way to implement raw RSA
- // signatures which JCA does not expose via Signature. We thus have to support this.
- setKeymasterPurposeOverride(KeymasterDefs.KM_PURPOSE_SIGN);
- return true;
- }
-
- @Override
- protected void initAlgorithmSpecificParameters() throws InvalidKeyException {}
-
- @Override
- protected void initAlgorithmSpecificParameters(@Nullable AlgorithmParameterSpec params)
- throws InvalidAlgorithmParameterException {
- if (params != null) {
- throw new InvalidAlgorithmParameterException(
- "Unexpected parameters: " + params + ". No parameters supported");
- }
- }
-
- @Override
- protected void initAlgorithmSpecificParameters(@Nullable AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
-
- if (params != null) {
- throw new InvalidAlgorithmParameterException(
- "Unexpected parameters: " + params + ". No parameters supported");
- }
- }
-
- @Override
- protected AlgorithmParameters engineGetParameters() {
- return null;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- return 0;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForFinish() {
- return 0;
- }
- }
-
- /**
- * RSA cipher with PKCS#1 v1.5 encryption padding.
- */
- public static final class PKCS1Padding extends AndroidKeyStoreRSACipherSpi {
- public PKCS1Padding() {
- super(KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
- }
-
- @Override
- protected boolean adjustConfigForEncryptingWithPrivateKey() {
- // RSA encryption with PCKS#1 padding using private key is a way to implement RSA
- // signatures with PKCS#1 padding. We have to support this for legacy reasons.
- setKeymasterPurposeOverride(KeymasterDefs.KM_PURPOSE_SIGN);
- setKeymasterPaddingOverride(KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN);
- return true;
- }
-
- @Override
- protected void initAlgorithmSpecificParameters() throws InvalidKeyException {}
-
- @Override
- protected void initAlgorithmSpecificParameters(@Nullable AlgorithmParameterSpec params)
- throws InvalidAlgorithmParameterException {
- if (params != null) {
- throw new InvalidAlgorithmParameterException(
- "Unexpected parameters: " + params + ". No parameters supported");
- }
- }
-
- @Override
- protected void initAlgorithmSpecificParameters(@Nullable AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
-
- if (params != null) {
- throw new InvalidAlgorithmParameterException(
- "Unexpected parameters: " + params + ". No parameters supported");
- }
- }
-
- @Override
- protected AlgorithmParameters engineGetParameters() {
- return null;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- return 0;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForFinish() {
- return (isEncrypting()) ? getModulusSizeBytes() : 0;
- }
- }
-
- /**
- * RSA cipher with OAEP encryption padding. Only SHA-1 based MGF1 is supported as MGF.
- */
- abstract static class OAEPWithMGF1Padding extends AndroidKeyStoreRSACipherSpi {
-
- private static final String MGF_ALGORITGM_MGF1 = "MGF1";
-
- private int mKeymasterDigest = -1;
- private int mDigestOutputSizeBytes;
-
- OAEPWithMGF1Padding(int keymasterDigest) {
- super(KeymasterDefs.KM_PAD_RSA_OAEP);
- mKeymasterDigest = keymasterDigest;
- mDigestOutputSizeBytes =
- (KeymasterUtils.getDigestOutputSizeBits(keymasterDigest) + 7) / 8;
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters() throws InvalidKeyException {}
-
- @Override
- protected final void initAlgorithmSpecificParameters(
- @Nullable AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException {
- if (params == null) {
- return;
- }
-
- if (!(params instanceof OAEPParameterSpec)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported parameter spec: " + params
- + ". Only OAEPParameterSpec supported");
- }
- OAEPParameterSpec spec = (OAEPParameterSpec) params;
- if (!MGF_ALGORITGM_MGF1.equalsIgnoreCase(spec.getMGFAlgorithm())) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported MGF: " + spec.getMGFAlgorithm()
- + ". Only " + MGF_ALGORITGM_MGF1 + " supported");
- }
- String jcaDigest = spec.getDigestAlgorithm();
- int keymasterDigest;
- try {
- keymasterDigest = KeyProperties.Digest.toKeymaster(jcaDigest);
- } catch (IllegalArgumentException e) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported digest: " + jcaDigest, e);
- }
- switch (keymasterDigest) {
- case KeymasterDefs.KM_DIGEST_SHA1:
- case KeymasterDefs.KM_DIGEST_SHA_2_224:
- case KeymasterDefs.KM_DIGEST_SHA_2_256:
- case KeymasterDefs.KM_DIGEST_SHA_2_384:
- case KeymasterDefs.KM_DIGEST_SHA_2_512:
- // Permitted.
- break;
- default:
- throw new InvalidAlgorithmParameterException(
- "Unsupported digest: " + jcaDigest);
- }
- AlgorithmParameterSpec mgfParams = spec.getMGFParameters();
- if (mgfParams == null) {
- throw new InvalidAlgorithmParameterException("MGF parameters must be provided");
- }
- // Check whether MGF parameters match the OAEPParameterSpec
- if (!(mgfParams instanceof MGF1ParameterSpec)) {
- throw new InvalidAlgorithmParameterException("Unsupported MGF parameters"
- + ": " + mgfParams + ". Only MGF1ParameterSpec supported");
- }
- MGF1ParameterSpec mgfSpec = (MGF1ParameterSpec) mgfParams;
- String mgf1JcaDigest = mgfSpec.getDigestAlgorithm();
- if (!KeyProperties.DIGEST_SHA1.equalsIgnoreCase(mgf1JcaDigest)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported MGF1 digest: " + mgf1JcaDigest
- + ". Only " + KeyProperties.DIGEST_SHA1 + " supported");
- }
- PSource pSource = spec.getPSource();
- if (!(pSource instanceof PSource.PSpecified)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported source of encoding input P: " + pSource
- + ". Only pSpecifiedEmpty (PSource.PSpecified.DEFAULT) supported");
- }
- PSource.PSpecified pSourceSpecified = (PSource.PSpecified) pSource;
- byte[] pSourceValue = pSourceSpecified.getValue();
- if ((pSourceValue != null) && (pSourceValue.length > 0)) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported source of encoding input P: " + pSource
- + ". Only pSpecifiedEmpty (PSource.PSpecified.DEFAULT) supported");
- }
- mKeymasterDigest = keymasterDigest;
- mDigestOutputSizeBytes =
- (KeymasterUtils.getDigestOutputSizeBits(keymasterDigest) + 7) / 8;
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters(@Nullable AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
- if (params == null) {
- return;
- }
-
- OAEPParameterSpec spec;
- try {
- spec = params.getParameterSpec(OAEPParameterSpec.class);
- } catch (InvalidParameterSpecException e) {
- throw new InvalidAlgorithmParameterException("OAEP parameters required"
- + ", but not found in parameters: " + params, e);
- }
- if (spec == null) {
- throw new InvalidAlgorithmParameterException("OAEP parameters required"
- + ", but not provided in parameters: " + params);
- }
- initAlgorithmSpecificParameters(spec);
- }
-
- @Override
- protected final AlgorithmParameters engineGetParameters() {
- OAEPParameterSpec spec =
- new OAEPParameterSpec(
- KeyProperties.Digest.fromKeymaster(mKeymasterDigest),
- MGF_ALGORITGM_MGF1,
- MGF1ParameterSpec.SHA1,
- PSource.PSpecified.DEFAULT);
- try {
- AlgorithmParameters params = AlgorithmParameters.getInstance("OAEP");
- params.init(spec);
- return params;
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain OAEP AlgorithmParameters", e);
- } catch (InvalidParameterSpecException e) {
- throw new ProviderException(
- "Failed to initialize OAEP AlgorithmParameters with an IV",
- e);
- }
- }
-
- @Override
- protected final void addAlgorithmSpecificParametersToBegin(
- KeymasterArguments keymasterArgs) {
- super.addAlgorithmSpecificParametersToBegin(keymasterArgs);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigest);
- }
-
- @Override
- protected final void loadAlgorithmSpecificParametersFromBeginResult(
- @NonNull KeymasterArguments keymasterArgs) {
- super.loadAlgorithmSpecificParametersFromBeginResult(keymasterArgs);
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- return 0;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForFinish() {
- return (isEncrypting()) ? mDigestOutputSizeBytes : 0;
- }
- }
-
- public static class OAEPWithSHA1AndMGF1Padding extends OAEPWithMGF1Padding {
- public OAEPWithSHA1AndMGF1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public static class OAEPWithSHA224AndMGF1Padding extends OAEPWithMGF1Padding {
- public OAEPWithSHA224AndMGF1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public static class OAEPWithSHA256AndMGF1Padding extends OAEPWithMGF1Padding {
- public OAEPWithSHA256AndMGF1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public static class OAEPWithSHA384AndMGF1Padding extends OAEPWithMGF1Padding {
- public OAEPWithSHA384AndMGF1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public static class OAEPWithSHA512AndMGF1Padding extends OAEPWithMGF1Padding {
- public OAEPWithSHA512AndMGF1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- private final int mKeymasterPadding;
- private int mKeymasterPaddingOverride;
-
- private int mModulusSizeBytes = -1;
-
- AndroidKeyStoreRSACipherSpi(int keymasterPadding) {
- mKeymasterPadding = keymasterPadding;
- }
-
- @Override
- protected final void initKey(int opmode, Key key) throws InvalidKeyException {
- if (key == null) {
- throw new InvalidKeyException("Unsupported key: null");
- }
- if (!KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException("Unsupported key algorithm: " + key.getAlgorithm()
- + ". Only " + KeyProperties.KEY_ALGORITHM_RSA + " supported");
- }
- AndroidKeyStoreKey keystoreKey;
- if (key instanceof AndroidKeyStorePrivateKey) {
- keystoreKey = (AndroidKeyStoreKey) key;
- } else if (key instanceof AndroidKeyStorePublicKey) {
- keystoreKey = (AndroidKeyStoreKey) key;
- } else {
- throw new InvalidKeyException("Unsupported key type: " + key);
- }
-
- if (keystoreKey instanceof PrivateKey) {
- // Private key
- switch (opmode) {
- case Cipher.DECRYPT_MODE:
- case Cipher.UNWRAP_MODE:
- // Permitted
- break;
- case Cipher.ENCRYPT_MODE:
- case Cipher.WRAP_MODE:
- if (!adjustConfigForEncryptingWithPrivateKey()) {
- throw new InvalidKeyException(
- "RSA private keys cannot be used with " + opmodeToString(opmode)
- + " and padding "
- + KeyProperties.EncryptionPadding.fromKeymaster(mKeymasterPadding)
- + ". Only RSA public keys supported for this mode");
- }
- break;
- default:
- throw new InvalidKeyException(
- "RSA private keys cannot be used with opmode: " + opmode);
- }
- } else {
- // Public key
- switch (opmode) {
- case Cipher.ENCRYPT_MODE:
- case Cipher.WRAP_MODE:
- // Permitted
- break;
- case Cipher.DECRYPT_MODE:
- case Cipher.UNWRAP_MODE:
- throw new InvalidKeyException(
- "RSA public keys cannot be used with " + opmodeToString(opmode)
- + " and padding "
- + KeyProperties.EncryptionPadding.fromKeymaster(mKeymasterPadding)
- + ". Only RSA private keys supported for this opmode.");
- // break;
- default:
- throw new InvalidKeyException(
- "RSA public keys cannot be used with " + opmodeToString(opmode));
- }
- }
-
- KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
- int errorCode = getKeyStore().getKeyCharacteristics(
- keystoreKey.getAlias(), null, null, keystoreKey.getUid(), keyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- throw getKeyStore().getInvalidKeyException(
- keystoreKey.getAlias(), keystoreKey.getUid(), errorCode);
- }
- long keySizeBits = keyCharacteristics.getUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, -1);
- if (keySizeBits == -1) {
- throw new InvalidKeyException("Size of key not known");
- } else if (keySizeBits > Integer.MAX_VALUE) {
- throw new InvalidKeyException("Key too large: " + keySizeBits + " bits");
- }
- mModulusSizeBytes = (int) ((keySizeBits + 7) / 8);
-
- setKey(keystoreKey);
- }
-
- /**
- * Adjusts the configuration of this cipher for encrypting using the private key.
- *
- * <p>The default implementation does nothing and refuses to adjust the configuration.
- *
- * @return {@code true} if the configuration has been adjusted, {@code false} if encrypting
- * using private key is not permitted for this cipher.
- */
- protected boolean adjustConfigForEncryptingWithPrivateKey() {
- return false;
- }
-
- @Override
- protected final void resetAll() {
- mModulusSizeBytes = -1;
- mKeymasterPaddingOverride = -1;
- super.resetAll();
- }
-
- @Override
- protected final void resetWhilePreservingInitState() {
- super.resetWhilePreservingInitState();
- }
-
- @Override
- protected void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- int keymasterPadding = getKeymasterPaddingOverride();
- if (keymasterPadding == -1) {
- keymasterPadding = mKeymasterPadding;
- }
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, keymasterPadding);
- int purposeOverride = getKeymasterPurposeOverride();
- if ((purposeOverride != -1)
- && ((purposeOverride == KeymasterDefs.KM_PURPOSE_SIGN)
- || (purposeOverride == KeymasterDefs.KM_PURPOSE_VERIFY))) {
- // Keymaster sign/verify requires digest to be specified. For raw sign/verify it's NONE.
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_NONE);
- }
- }
-
- @Override
- protected void loadAlgorithmSpecificParametersFromBeginResult(
- @NonNull KeymasterArguments keymasterArgs) {
- }
-
- @Override
- protected final int engineGetBlockSize() {
- // Not a block cipher, according to the RI
- return 0;
- }
-
- @Override
- protected final byte[] engineGetIV() {
- // IV never used
- return null;
- }
-
- @Override
- protected final int engineGetOutputSize(int inputLen) {
- return getModulusSizeBytes();
- }
-
- protected final int getModulusSizeBytes() {
- if (mModulusSizeBytes == -1) {
- throw new IllegalStateException("Not initialized");
- }
- return mModulusSizeBytes;
- }
-
- /**
- * Overrides the default padding of the crypto operation.
- */
- protected final void setKeymasterPaddingOverride(int keymasterPadding) {
- mKeymasterPaddingOverride = keymasterPadding;
- }
-
- protected final int getKeymasterPaddingOverride() {
- return mKeymasterPaddingOverride;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreRSAPrivateKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreRSAPrivateKey.java
deleted file mode 100644
index adb3922..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreRSAPrivateKey.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.math.BigInteger;
-import java.security.PrivateKey;
-import java.security.interfaces.RSAKey;
-
-/**
- * RSA private key (instance of {@link PrivateKey} and {@link RSAKey}) backed by keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreRSAPrivateKey extends AndroidKeyStorePrivateKey implements RSAKey {
-
- private final BigInteger mModulus;
-
- public AndroidKeyStoreRSAPrivateKey(String alias, int uid, BigInteger modulus) {
- super(alias, uid, KeyProperties.KEY_ALGORITHM_RSA);
- mModulus = modulus;
- }
-
- @Override
- public BigInteger getModulus() {
- return mModulus;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreRSAPublicKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreRSAPublicKey.java
deleted file mode 100644
index d85aace..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreRSAPublicKey.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import java.math.BigInteger;
-import java.security.interfaces.RSAPublicKey;
-
-/**
- * {@link RSAPublicKey} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreRSAPublicKey extends AndroidKeyStorePublicKey implements RSAPublicKey {
- private final BigInteger mModulus;
- private final BigInteger mPublicExponent;
-
- public AndroidKeyStoreRSAPublicKey(String alias, int uid, byte[] x509EncodedForm, BigInteger modulus,
- BigInteger publicExponent) {
- super(alias, uid, KeyProperties.KEY_ALGORITHM_RSA, x509EncodedForm);
- mModulus = modulus;
- mPublicExponent = publicExponent;
- }
-
- public AndroidKeyStoreRSAPublicKey(String alias, int uid, RSAPublicKey info) {
- this(alias, uid, info.getEncoded(), info.getModulus(), info.getPublicExponent());
- if (!"X.509".equalsIgnoreCase(info.getFormat())) {
- throw new IllegalArgumentException(
- "Unsupported key export format: " + info.getFormat());
- }
- }
-
- @Override
- public BigInteger getModulus() {
- return mModulus;
- }
-
- @Override
- public BigInteger getPublicExponent() {
- return mPublicExponent;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreRSASignatureSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreRSASignatureSpi.java
deleted file mode 100644
index ecfc97e..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreRSASignatureSpi.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.NonNull;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import java.security.InvalidKeyException;
-import java.security.SignatureSpi;
-
-/**
- * Base class for {@link SignatureSpi} providing Android KeyStore backed RSA signatures.
- *
- * @hide
- */
-abstract class AndroidKeyStoreRSASignatureSpi extends AndroidKeyStoreSignatureSpiBase {
-
- abstract static class PKCS1Padding extends AndroidKeyStoreRSASignatureSpi {
- PKCS1Padding(int keymasterDigest) {
- super(keymasterDigest, KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN);
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForSign() {
- // No entropy required for this deterministic signature scheme.
- return 0;
- }
- }
-
- public static final class NONEWithPKCS1Padding extends PKCS1Padding {
- public NONEWithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_NONE);
- }
- }
-
- public static final class MD5WithPKCS1Padding extends PKCS1Padding {
- public MD5WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_MD5);
- }
- }
-
- public static final class SHA1WithPKCS1Padding extends PKCS1Padding {
- public SHA1WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public static final class SHA224WithPKCS1Padding extends PKCS1Padding {
- public SHA224WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public static final class SHA256WithPKCS1Padding extends PKCS1Padding {
- public SHA256WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public static final class SHA384WithPKCS1Padding extends PKCS1Padding {
- public SHA384WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public static final class SHA512WithPKCS1Padding extends PKCS1Padding {
- public SHA512WithPKCS1Padding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- abstract static class PSSPadding extends AndroidKeyStoreRSASignatureSpi {
- private static final int SALT_LENGTH_BYTES = 20;
-
- PSSPadding(int keymasterDigest) {
- super(keymasterDigest, KeymasterDefs.KM_PAD_RSA_PSS);
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForSign() {
- return SALT_LENGTH_BYTES;
- }
- }
-
- public static final class SHA1WithPSSPadding extends PSSPadding {
- public SHA1WithPSSPadding() {
- super(KeymasterDefs.KM_DIGEST_SHA1);
- }
- }
-
- public static final class SHA224WithPSSPadding extends PSSPadding {
- public SHA224WithPSSPadding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_224);
- }
- }
-
- public static final class SHA256WithPSSPadding extends PSSPadding {
- public SHA256WithPSSPadding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_256);
- }
- }
-
- public static final class SHA384WithPSSPadding extends PSSPadding {
- public SHA384WithPSSPadding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_384);
- }
- }
-
- public static final class SHA512WithPSSPadding extends PSSPadding {
- public SHA512WithPSSPadding() {
- super(KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- private final int mKeymasterDigest;
- private final int mKeymasterPadding;
-
- AndroidKeyStoreRSASignatureSpi(int keymasterDigest, int keymasterPadding) {
- mKeymasterDigest = keymasterDigest;
- mKeymasterPadding = keymasterPadding;
- }
-
- @Override
- protected final void initKey(AndroidKeyStoreKey key) throws InvalidKeyException {
- if (!KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException("Unsupported key algorithm: " + key.getAlgorithm()
- + ". Only" + KeyProperties.KEY_ALGORITHM_RSA + " supported");
- }
- super.initKey(key);
- }
-
- @Override
- protected final void resetAll() {
- super.resetAll();
- }
-
- @Override
- protected final void resetWhilePreservingInitState() {
- super.resetWhilePreservingInitState();
- }
-
- @Override
- protected final void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigest);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, mKeymasterPadding);
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKey.java b/keystore/java/android/security/keystore/AndroidKeyStoreSecretKey.java
deleted file mode 100644
index b8e6af7..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKey.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import javax.crypto.SecretKey;
-
-/**
- * {@link SecretKey} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreSecretKey extends AndroidKeyStoreKey implements SecretKey {
-
- public AndroidKeyStoreSecretKey(String alias, int uid, String algorithm) {
- super(alias, uid, algorithm);
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java
deleted file mode 100644
index d2678c7..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.security.Credentials;
-import android.security.GateKeeper;
-import android.security.KeyStore;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterDefs;
-
-import java.math.BigInteger;
-import java.security.InvalidKeyException;
-import java.security.ProviderException;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactorySpi;
-import javax.crypto.spec.SecretKeySpec;
-
-/**
- * {@link SecretKeyFactorySpi} backed by Android Keystore.
- *
- * @hide
- */
-public class AndroidKeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi {
-
- private final KeyStore mKeyStore = KeyStore.getInstance();
-
- @Override
- protected KeySpec engineGetKeySpec(SecretKey key,
- @SuppressWarnings("rawtypes") Class keySpecClass) throws InvalidKeySpecException {
- if (keySpecClass == null) {
- throw new InvalidKeySpecException("keySpecClass == null");
- }
- if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeySpecException("Only Android KeyStore secret keys supported: " +
- ((key != null) ? key.getClass().getName() : "null"));
- }
- if (SecretKeySpec.class.isAssignableFrom(keySpecClass)) {
- throw new InvalidKeySpecException(
- "Key material export of Android KeyStore keys is not supported");
- }
- if (!KeyInfo.class.equals(keySpecClass)) {
- throw new InvalidKeySpecException("Unsupported key spec: " + keySpecClass.getName());
- }
- AndroidKeyStoreKey keystoreKey = (AndroidKeyStoreKey) key;
- String keyAliasInKeystore = keystoreKey.getAlias();
- String entryAlias;
- if (keyAliasInKeystore.startsWith(Credentials.USER_PRIVATE_KEY)) {
- entryAlias = keyAliasInKeystore.substring(Credentials.USER_PRIVATE_KEY.length());
- } else if (keyAliasInKeystore.startsWith(Credentials.USER_SECRET_KEY)){
- // key has legacy prefix
- entryAlias = keyAliasInKeystore.substring(Credentials.USER_SECRET_KEY.length());
- } else {
- throw new InvalidKeySpecException("Invalid key alias: " + keyAliasInKeystore);
- }
-
- return getKeyInfo(mKeyStore, entryAlias, keyAliasInKeystore, keystoreKey.getUid());
- }
-
- static KeyInfo getKeyInfo(KeyStore keyStore, String entryAlias, String keyAliasInKeystore,
- int keyUid) {
- KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
- int errorCode = keyStore.getKeyCharacteristics(
- keyAliasInKeystore, null, null, keyUid, keyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new ProviderException("Failed to obtain information about key."
- + " Keystore error: " + errorCode);
- }
-
- boolean insideSecureHardware;
- @KeyProperties.OriginEnum int origin;
- int keySize;
- @KeyProperties.PurposeEnum int purposes;
- String[] encryptionPaddings;
- String[] signaturePaddings;
- @KeyProperties.DigestEnum String[] digests;
- @KeyProperties.BlockModeEnum String[] blockModes;
- int keymasterSwEnforcedUserAuthenticators;
- int keymasterHwEnforcedUserAuthenticators;
- List<BigInteger> keymasterSecureUserIds;
- try {
- if (keyCharacteristics.hwEnforced.containsTag(KeymasterDefs.KM_TAG_ORIGIN)) {
- insideSecureHardware = true;
- origin = KeyProperties.Origin.fromKeymaster(
- keyCharacteristics.hwEnforced.getEnum(KeymasterDefs.KM_TAG_ORIGIN, -1));
- } else if (keyCharacteristics.swEnforced.containsTag(KeymasterDefs.KM_TAG_ORIGIN)) {
- insideSecureHardware = false;
- origin = KeyProperties.Origin.fromKeymaster(
- keyCharacteristics.swEnforced.getEnum(KeymasterDefs.KM_TAG_ORIGIN, -1));
- } else {
- throw new ProviderException("Key origin not available");
- }
- long keySizeUnsigned =
- keyCharacteristics.getUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, -1);
- if (keySizeUnsigned == -1) {
- throw new ProviderException("Key size not available");
- } else if (keySizeUnsigned > Integer.MAX_VALUE) {
- throw new ProviderException("Key too large: " + keySizeUnsigned + " bits");
- }
- keySize = (int) keySizeUnsigned;
- purposes = KeyProperties.Purpose.allFromKeymaster(
- keyCharacteristics.getEnums(KeymasterDefs.KM_TAG_PURPOSE));
-
- List<String> encryptionPaddingsList = new ArrayList<String>();
- List<String> signaturePaddingsList = new ArrayList<String>();
- // Keymaster stores both types of paddings in the same array -- we split it into two.
- for (int keymasterPadding : keyCharacteristics.getEnums(KeymasterDefs.KM_TAG_PADDING)) {
- try {
- @KeyProperties.EncryptionPaddingEnum String jcaPadding =
- KeyProperties.EncryptionPadding.fromKeymaster(keymasterPadding);
- encryptionPaddingsList.add(jcaPadding);
- } catch (IllegalArgumentException e) {
- try {
- @KeyProperties.SignaturePaddingEnum String padding =
- KeyProperties.SignaturePadding.fromKeymaster(keymasterPadding);
- signaturePaddingsList.add(padding);
- } catch (IllegalArgumentException e2) {
- throw new ProviderException(
- "Unsupported encryption padding: " + keymasterPadding);
- }
- }
-
- }
- encryptionPaddings =
- encryptionPaddingsList.toArray(new String[encryptionPaddingsList.size()]);
- signaturePaddings =
- signaturePaddingsList.toArray(new String[signaturePaddingsList.size()]);
-
- digests = KeyProperties.Digest.allFromKeymaster(
- keyCharacteristics.getEnums(KeymasterDefs.KM_TAG_DIGEST));
- blockModes = KeyProperties.BlockMode.allFromKeymaster(
- keyCharacteristics.getEnums(KeymasterDefs.KM_TAG_BLOCK_MODE));
- keymasterSwEnforcedUserAuthenticators =
- keyCharacteristics.swEnforced.getEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 0);
- keymasterHwEnforcedUserAuthenticators =
- keyCharacteristics.hwEnforced.getEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 0);
- keymasterSecureUserIds =
- keyCharacteristics.getUnsignedLongs(KeymasterDefs.KM_TAG_USER_SECURE_ID);
- } catch (IllegalArgumentException e) {
- throw new ProviderException("Unsupported key characteristic", e);
- }
-
- Date keyValidityStart = keyCharacteristics.getDate(KeymasterDefs.KM_TAG_ACTIVE_DATETIME);
- Date keyValidityForOriginationEnd =
- keyCharacteristics.getDate(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME);
- Date keyValidityForConsumptionEnd =
- keyCharacteristics.getDate(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME);
- boolean userAuthenticationRequired =
- !keyCharacteristics.getBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- long userAuthenticationValidityDurationSeconds =
- keyCharacteristics.getUnsignedInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT, 0);
- if (userAuthenticationValidityDurationSeconds > Integer.MAX_VALUE) {
- throw new ProviderException("User authentication timeout validity too long: "
- + userAuthenticationValidityDurationSeconds + " seconds");
- }
- boolean userAuthenticationRequirementEnforcedBySecureHardware = (userAuthenticationRequired)
- && (keymasterHwEnforcedUserAuthenticators != 0)
- && (keymasterSwEnforcedUserAuthenticators == 0);
- boolean userAuthenticationValidWhileOnBody =
- keyCharacteristics.hwEnforced.getBoolean(KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY);
- boolean trustedUserPresenceRequired =
- keyCharacteristics.hwEnforced.getBoolean(
- KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
-
- boolean invalidatedByBiometricEnrollment = false;
- if (keymasterSwEnforcedUserAuthenticators == KeymasterDefs.HW_AUTH_BIOMETRIC
- || keymasterHwEnforcedUserAuthenticators == KeymasterDefs.HW_AUTH_BIOMETRIC) {
- // Fingerprint-only key; will be invalidated if the root SID isn't in the SID list.
- invalidatedByBiometricEnrollment = keymasterSecureUserIds != null
- && !keymasterSecureUserIds.isEmpty()
- && !keymasterSecureUserIds.contains(getGateKeeperSecureUserId());
- }
-
- boolean userConfirmationRequired = keyCharacteristics.hwEnforced.getBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
-
- return new KeyInfo(entryAlias,
- insideSecureHardware,
- origin,
- keySize,
- keyValidityStart,
- keyValidityForOriginationEnd,
- keyValidityForConsumptionEnd,
- purposes,
- encryptionPaddings,
- signaturePaddings,
- digests,
- blockModes,
- userAuthenticationRequired,
- (int) userAuthenticationValidityDurationSeconds,
- keymasterHwEnforcedUserAuthenticators,
- userAuthenticationRequirementEnforcedBySecureHardware,
- userAuthenticationValidWhileOnBody,
- trustedUserPresenceRequired,
- invalidatedByBiometricEnrollment,
- userConfirmationRequired,
- // Keystore 1.0 does not tell us the exact security level of the key
- // so we report an unknown but secure security level.
- insideSecureHardware ? KeyProperties.SECURITY_LEVEL_UNKNOWN_SECURE
- : KeyProperties.SECURITY_LEVEL_SOFTWARE,
- KeyProperties.UNRESTRICTED_USAGE_COUNT);
- }
-
- private static BigInteger getGateKeeperSecureUserId() throws ProviderException {
- try {
- return BigInteger.valueOf(GateKeeper.getSecureUserId());
- } catch (IllegalStateException e) {
- throw new ProviderException("Failed to get GateKeeper secure user ID", e);
- }
- }
-
- @Override
- protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException {
- throw new InvalidKeySpecException(
- "To generate secret key in Android Keystore, use KeyGenerator initialized with "
- + KeyGenParameterSpec.class.getName());
- }
-
- @Override
- protected SecretKey engineTranslateKey(SecretKey key) throws InvalidKeyException {
- if (key == null) {
- throw new InvalidKeyException("key == null");
- } else if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeyException(
- "To import a secret key into Android Keystore, use KeyStore.setEntry");
- }
-
- return key;
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSignatureSpiBase.java b/keystore/java/android/security/keystore/AndroidKeyStoreSignatureSpiBase.java
deleted file mode 100644
index da47b6b..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSignatureSpiBase.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.CallSuper;
-import android.annotation.NonNull;
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-
-import libcore.util.EmptyArray;
-
-import java.nio.ByteBuffer;
-import java.security.InvalidKeyException;
-import java.security.InvalidParameterException;
-import java.security.PrivateKey;
-import java.security.ProviderException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.SignatureException;
-import java.security.SignatureSpi;
-
-/**
- * Base class for {@link SignatureSpi} implementations of Android KeyStore backed ciphers.
- *
- * @hide
- */
-abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
- implements KeyStoreCryptoOperation {
- private final KeyStore mKeyStore;
-
- // Fields below are populated by SignatureSpi.engineInitSign/engineInitVerify and KeyStore.begin
- // and should be preserved after SignatureSpi.engineSign/engineVerify finishes.
- private boolean mSigning;
- private AndroidKeyStoreKey mKey;
-
- /**
- * Token referencing this operation inside keystore service. It is initialized by
- * {@code engineInitSign}/{@code engineInitVerify} and is invalidated when
- * {@code engineSign}/{@code engineVerify} succeeds and on some error conditions in between.
- */
- private IBinder mOperationToken;
- private long mOperationHandle;
- private KeyStoreCryptoOperationStreamer mMessageStreamer;
-
- /**
- * Encountered exception which could not be immediately thrown because it was encountered inside
- * a method that does not throw checked exception. This exception will be thrown from
- * {@code engineSign} or {@code engineVerify}. Once such an exception is encountered,
- * {@code engineUpdate} starts ignoring input data.
- */
- private Exception mCachedException;
-
- AndroidKeyStoreSignatureSpiBase() {
- mKeyStore = KeyStore.getInstance();
- }
-
- @Override
- protected final void engineInitSign(PrivateKey key) throws InvalidKeyException {
- engineInitSign(key, null);
- }
-
- @Override
- protected final void engineInitSign(PrivateKey privateKey, SecureRandom random)
- throws InvalidKeyException {
- resetAll();
-
- boolean success = false;
- try {
- if (privateKey == null) {
- throw new InvalidKeyException("Unsupported key: null");
- }
- AndroidKeyStoreKey keystoreKey;
- if (privateKey instanceof AndroidKeyStorePrivateKey) {
- keystoreKey = (AndroidKeyStoreKey) privateKey;
- } else {
- throw new InvalidKeyException("Unsupported private key type: " + privateKey);
- }
- mSigning = true;
- initKey(keystoreKey);
- appRandom = random;
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- @Override
- protected final void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
- resetAll();
-
- boolean success = false;
- try {
- if (publicKey == null) {
- throw new InvalidKeyException("Unsupported key: null");
- }
- AndroidKeyStoreKey keystoreKey;
- if (publicKey instanceof AndroidKeyStorePublicKey) {
- keystoreKey = (AndroidKeyStorePublicKey) publicKey;
- } else {
- throw new InvalidKeyException("Unsupported public key type: " + publicKey);
- }
- mSigning = false;
- initKey(keystoreKey);
- appRandom = null;
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
- }
- }
-
- /**
- * Configures this signature instance to use the provided key.
- *
- * @throws InvalidKeyException if the {@code key} is not suitable.
- */
- @CallSuper
- protected void initKey(AndroidKeyStoreKey key) throws InvalidKeyException {
- mKey = key;
- }
-
- /**
- * Resets this cipher to its pristine pre-init state. This must be equivalent to obtaining a new
- * cipher instance.
- *
- * <p>Subclasses storing additional state should override this method, reset the additional
- * state, and then chain to superclass.
- */
- @CallSuper
- protected void resetAll() {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mOperationToken = null;
- mKeyStore.abort(operationToken);
- }
- mSigning = false;
- mKey = null;
- appRandom = null;
- mOperationToken = null;
- mOperationHandle = 0;
- mMessageStreamer = null;
- mCachedException = null;
- }
-
- /**
- * Resets this cipher while preserving the initialized state. This must be equivalent to
- * rolling back the cipher's state to just after the most recent {@code engineInit} completed
- * successfully.
- *
- * <p>Subclasses storing additional post-init state should override this method, reset the
- * additional state, and then chain to superclass.
- */
- @CallSuper
- protected void resetWhilePreservingInitState() {
- IBinder operationToken = mOperationToken;
- if (operationToken != null) {
- mOperationToken = null;
- mKeyStore.abort(operationToken);
- }
- mOperationHandle = 0;
- mMessageStreamer = null;
- mCachedException = null;
- }
-
- private void ensureKeystoreOperationInitialized() throws InvalidKeyException {
- if (mMessageStreamer != null) {
- return;
- }
- if (mCachedException != null) {
- return;
- }
- if (mKey == null) {
- throw new IllegalStateException("Not initialized");
- }
-
- KeymasterArguments keymasterInputArgs = new KeymasterArguments();
- addAlgorithmSpecificParametersToBegin(keymasterInputArgs);
-
- OperationResult opResult = mKeyStore.begin(
- mKey.getAlias(),
- mSigning ? KeymasterDefs.KM_PURPOSE_SIGN : KeymasterDefs.KM_PURPOSE_VERIFY,
- true, // permit aborting this operation if keystore runs out of resources
- keymasterInputArgs,
- null, // no additional entropy for begin -- only finish might need some
- mKey.getUid());
- if (opResult == null) {
- throw new KeyStoreConnectException();
- }
-
- // Store operation token and handle regardless of the error code returned by KeyStore to
- // ensure that the operation gets aborted immediately if the code below throws an exception.
- mOperationToken = opResult.token;
- mOperationHandle = opResult.operationHandle;
-
- // If necessary, throw an exception due to KeyStore operation having failed.
- InvalidKeyException e = KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(
- mKeyStore, mKey, opResult.resultCode);
- if (e != null) {
- throw e;
- }
-
- if (mOperationToken == null) {
- throw new ProviderException("Keystore returned null operation token");
- }
- if (mOperationHandle == 0) {
- throw new ProviderException("Keystore returned invalid operation handle");
- }
-
- mMessageStreamer = createMainDataStreamer(mKeyStore, opResult.token);
- }
-
- /**
- * Creates a streamer which sends the message to be signed/verified into the provided KeyStore
- *
- * <p>This implementation returns a working streamer.
- */
- @NonNull
- protected KeyStoreCryptoOperationStreamer createMainDataStreamer(
- KeyStore keyStore, IBinder operationToken) {
- return new KeyStoreCryptoOperationChunkedStreamer(
- new KeyStoreCryptoOperationChunkedStreamer.MainDataStream(
- keyStore, operationToken));
- }
-
- @Override
- public final long getOperationHandle() {
- return mOperationHandle;
- }
-
- @Override
- protected final void engineUpdate(byte[] b, int off, int len) throws SignatureException {
- if (mCachedException != null) {
- throw new SignatureException(mCachedException);
- }
-
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException e) {
- throw new SignatureException(e);
- }
-
- if (len == 0) {
- return;
- }
-
- byte[] output;
- try {
- output = mMessageStreamer.update(b, off, len);
- } catch (KeyStoreException e) {
- throw new SignatureException(e);
- }
-
- if (output.length != 0) {
- throw new ProviderException(
- "Update operation unexpectedly produced output: " + output.length + " bytes");
- }
- }
-
- @Override
- protected final void engineUpdate(byte b) throws SignatureException {
- engineUpdate(new byte[] {b}, 0, 1);
- }
-
- @Override
- protected final void engineUpdate(ByteBuffer input) {
- byte[] b;
- int off;
- int len = input.remaining();
- if (input.hasArray()) {
- b = input.array();
- off = input.arrayOffset() + input.position();
- input.position(input.limit());
- } else {
- b = new byte[len];
- off = 0;
- input.get(b);
- }
-
- try {
- engineUpdate(b, off, len);
- } catch (SignatureException e) {
- mCachedException = e;
- }
- }
-
- @Override
- protected final int engineSign(byte[] out, int outOffset, int outLen)
- throws SignatureException {
- return super.engineSign(out, outOffset, outLen);
- }
-
- @Override
- protected final byte[] engineSign() throws SignatureException {
- if (mCachedException != null) {
- throw new SignatureException(mCachedException);
- }
-
- byte[] signature;
- try {
- ensureKeystoreOperationInitialized();
-
- byte[] additionalEntropy =
- KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng(
- appRandom, getAdditionalEntropyAmountForSign());
- signature = mMessageStreamer.doFinal(
- EmptyArray.BYTE, 0, 0,
- null, // no signature provided -- it'll be generated by this invocation
- additionalEntropy);
- } catch (InvalidKeyException | KeyStoreException e) {
- throw new SignatureException(e);
- }
-
- resetWhilePreservingInitState();
- return signature;
- }
-
- @Override
- protected final boolean engineVerify(byte[] signature) throws SignatureException {
- if (mCachedException != null) {
- throw new SignatureException(mCachedException);
- }
-
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException e) {
- throw new SignatureException(e);
- }
-
- boolean verified;
- try {
- byte[] output = mMessageStreamer.doFinal(
- EmptyArray.BYTE, 0, 0,
- signature,
- null // no additional entropy needed -- verification is deterministic
- );
- if (output.length != 0) {
- throw new ProviderException(
- "Signature verification unexpected produced output: " + output.length
- + " bytes");
- }
- verified = true;
- } catch (KeyStoreException e) {
- switch (e.getErrorCode()) {
- case KeymasterDefs.KM_ERROR_VERIFICATION_FAILED:
- verified = false;
- break;
- default:
- throw new SignatureException(e);
- }
- }
-
- resetWhilePreservingInitState();
- return verified;
- }
-
- @Override
- protected final boolean engineVerify(byte[] sigBytes, int offset, int len)
- throws SignatureException {
- return engineVerify(ArrayUtils.subarray(sigBytes, offset, len));
- }
-
- @Deprecated
- @Override
- protected final Object engineGetParameter(String param) throws InvalidParameterException {
- throw new InvalidParameterException();
- }
-
- @Deprecated
- @Override
- protected final void engineSetParameter(String param, Object value)
- throws InvalidParameterException {
- throw new InvalidParameterException();
- }
-
- protected final KeyStore getKeyStore() {
- return mKeyStore;
- }
-
- /**
- * Returns {@code true} if this signature is initialized for signing, {@code false} if this
- * signature is initialized for verification.
- */
- protected final boolean isSigning() {
- return mSigning;
- }
-
- // The methods below need to be implemented by subclasses.
-
- /**
- * Returns the amount of additional entropy (in bytes) to be provided to the KeyStore's
- * {@code finish} operation when generating a signature.
- *
- * <p>This value should match (or exceed) the amount of Shannon entropy of the produced
- * signature assuming the key and the message are known. For example, for ECDSA signature this
- * should be the size of {@code R}, whereas for the RSA signature with PKCS#1 padding this
- * should be {@code 0}.
- */
- protected abstract int getAdditionalEntropyAmountForSign();
-
- /**
- * Invoked to add algorithm-specific parameters for the KeyStore's {@code begin} operation.
- *
- * @param keymasterArgs keystore/keymaster arguments to be populated with algorithm-specific
- * parameters.
- */
- protected abstract void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs);
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
deleted file mode 100644
index 51c4252..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ /dev/null
@@ -1,1112 +0,0 @@
-/*
- * Copyright (C) 2012 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.security.keystore;
-
-import android.security.Credentials;
-import android.security.GateKeeper;
-import android.security.KeyStore;
-import android.security.KeyStoreParameter;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keystore.KeyPermanentlyInvalidatedException;
-import android.security.keystore.KeyProperties;
-import android.security.keystore.KeyProtection;
-import android.security.keystore.SecureKeyImportUnavailableException;
-import android.security.keystore.WrappedKeyEntry;
-import android.util.Log;
-
-import libcore.util.EmptyArray;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.security.Key;
-import java.security.KeyStore.Entry;
-import java.security.KeyStore.LoadStoreParameter;
-import java.security.KeyStore.PrivateKeyEntry;
-import java.security.KeyStore.ProtectionParameter;
-import java.security.KeyStore.SecretKeyEntry;
-import java.security.KeyStoreException;
-import java.security.KeyStoreSpi;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.ProviderException;
-import java.security.PublicKey;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import javax.crypto.SecretKey;
-
-/**
- * A java.security.KeyStore interface for the Android KeyStore. An instance of
- * it can be created via the {@link java.security.KeyStore#getInstance(String)
- * KeyStore.getInstance("AndroidKeyStore")} interface. This returns a
- * java.security.KeyStore backed by this "AndroidKeyStore" implementation.
- * <p>
- * This is built on top of Android's keystore daemon. The convention of alias
- * use is:
- * <p>
- * PrivateKeyEntry will have a Credentials.USER_PRIVATE_KEY as the private key,
- * Credentials.USER_CERTIFICATE as the first certificate in the chain (the one
- * that corresponds to the private key), and then a Credentials.CA_CERTIFICATE
- * entry which will have the rest of the chain concatenated in BER format.
- * <p>
- * TrustedCertificateEntry will just have a Credentials.CA_CERTIFICATE entry
- * with a single certificate.
- *
- * @hide
- */
-public class AndroidKeyStoreSpi extends KeyStoreSpi {
- public static final String NAME = "AndroidKeyStore";
-
- private KeyStore mKeyStore;
- private int mUid = KeyStore.UID_SELF;
-
- @Override
- public Key engineGetKey(String alias, char[] password) throws NoSuchAlgorithmException,
- UnrecoverableKeyException {
- String userKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
- AndroidKeyStoreKey key;
- if (!mKeyStore.contains(userKeyAlias, mUid)) {
- // try legacy prefix for backward compatibility
- userKeyAlias = Credentials.USER_SECRET_KEY + alias;
- if (!mKeyStore.contains(userKeyAlias, mUid)) return null;
- }
- try {
- key = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(mKeyStore,
- userKeyAlias,
- mUid);
- } catch (KeyPermanentlyInvalidatedException e) {
- throw new UnrecoverableKeyException(e.getMessage());
- }
- return key;
- }
-
- @Override
- public Certificate[] engineGetCertificateChain(String alias) {
- if (alias == null) {
- throw new NullPointerException("alias == null");
- }
-
- final X509Certificate leaf = (X509Certificate) engineGetCertificate(alias);
- if (leaf == null) {
- return null;
- }
-
- final Certificate[] caList;
-
- // Suppress the key not found warning for this call. It seems that this error is exclusively
- // being thrown when there is a self signed certificate chain, so when the keystore service
- // attempts to query for the CA details, it obviously fails to find them and returns a
- // key not found exception. This is WAI, and throwing a stack trace here can be very
- // misleading since the trace is not clear.
- final byte[] caBytes = mKeyStore.get(Credentials.CA_CERTIFICATE + alias,
- mUid,
- true /* suppressKeyNotFoundWarning */);
- if (caBytes != null) {
- final Collection<X509Certificate> caChain = toCertificates(caBytes);
-
- caList = new Certificate[caChain.size() + 1];
-
- final Iterator<X509Certificate> it = caChain.iterator();
- int i = 1;
- while (it.hasNext()) {
- caList[i++] = it.next();
- }
- } else {
- caList = new Certificate[1];
- }
-
- caList[0] = leaf;
-
- return caList;
- }
-
- @Override
- public Certificate engineGetCertificate(String alias) {
- if (alias == null) {
- throw new NullPointerException("alias == null");
- }
-
- byte[] encodedCert = mKeyStore.get(Credentials.USER_CERTIFICATE + alias, mUid);
- if (encodedCert != null) {
- return getCertificateForPrivateKeyEntry(alias, encodedCert);
- }
-
- encodedCert = mKeyStore.get(Credentials.CA_CERTIFICATE + alias, mUid);
- if (encodedCert != null) {
- return getCertificateForTrustedCertificateEntry(encodedCert);
- }
-
- // This entry/alias does not contain a certificate.
- return null;
- }
-
- private Certificate getCertificateForTrustedCertificateEntry(byte[] encodedCert) {
- // For this certificate there shouldn't be a private key in this KeyStore entry. Thus,
- // there's no need to wrap this certificate as opposed to the certificate associated with
- // a private key entry.
- return toCertificate(encodedCert);
- }
-
- private Certificate getCertificateForPrivateKeyEntry(String alias, byte[] encodedCert) {
- // All crypto algorithms offered by Android Keystore for its private keys must also
- // be offered for the corresponding public keys stored in the Android Keystore. The
- // complication is that the underlying keystore service operates only on full key pairs,
- // rather than just public keys or private keys. As a result, Android Keystore-backed
- // crypto can only be offered for public keys for which keystore contains the
- // corresponding private key. This is not the case for certificate-only entries (e.g.,
- // trusted certificates).
- //
- // getCertificate().getPublicKey() is the only way to obtain the public key
- // corresponding to the private key stored in the KeyStore. Thus, we need to make sure
- // that the returned public key points to the underlying key pair / private key
- // when available.
-
- X509Certificate cert = toCertificate(encodedCert);
- if (cert == null) {
- // Failed to parse the certificate.
- return null;
- }
-
- String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
- if (mKeyStore.contains(privateKeyAlias, mUid)) {
- // As expected, keystore contains the private key corresponding to this public key. Wrap
- // the certificate so that its getPublicKey method returns an Android Keystore
- // PublicKey. This key will delegate crypto operations involving this public key to
- // Android Keystore when higher-priority providers do not offer these crypto
- // operations for this key.
- return wrapIntoKeyStoreCertificate(privateKeyAlias, mUid, cert);
- } else {
- // This KeyStore entry/alias is supposed to contain the private key corresponding to
- // the public key in this certificate, but it does not for some reason. It's probably a
- // bug. Let other providers handle crypto operations involving the public key returned
- // by this certificate's getPublicKey.
- return cert;
- }
- }
-
- /**
- * Wraps the provided cerificate into {@link KeyStoreX509Certificate} so that the public key
- * returned by the certificate contains information about the alias of the private key in
- * keystore. This is needed so that Android Keystore crypto operations using public keys can
- * find out which key alias to use. These operations cannot work without an alias.
- */
- private static KeyStoreX509Certificate wrapIntoKeyStoreCertificate(
- String privateKeyAlias, int uid, X509Certificate certificate) {
- return (certificate != null)
- ? new KeyStoreX509Certificate(privateKeyAlias, uid, certificate) : null;
- }
-
- private static X509Certificate toCertificate(byte[] bytes) {
- try {
- final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
- return (X509Certificate) certFactory.generateCertificate(
- new ByteArrayInputStream(bytes));
- } catch (CertificateException e) {
- Log.w(NAME, "Couldn't parse certificate in keystore", e);
- return null;
- }
- }
-
- @SuppressWarnings("unchecked")
- private static Collection<X509Certificate> toCertificates(byte[] bytes) {
- try {
- final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
- return (Collection<X509Certificate>) certFactory.generateCertificates(
- new ByteArrayInputStream(bytes));
- } catch (CertificateException e) {
- Log.w(NAME, "Couldn't parse certificates in keystore", e);
- return new ArrayList<X509Certificate>();
- }
- }
-
- private Date getModificationDate(String alias) {
- final long epochMillis = mKeyStore.getmtime(alias, mUid);
- if (epochMillis == -1L) {
- return null;
- }
-
- return new Date(epochMillis);
- }
-
- @Override
- public Date engineGetCreationDate(String alias) {
- if (alias == null) {
- throw new NullPointerException("alias == null");
- }
-
- Date d = getModificationDate(Credentials.USER_PRIVATE_KEY + alias);
- if (d != null) {
- return d;
- }
-
- d = getModificationDate(Credentials.USER_SECRET_KEY + alias);
- if (d != null) {
- return d;
- }
-
- d = getModificationDate(Credentials.USER_CERTIFICATE + alias);
- if (d != null) {
- return d;
- }
-
- return getModificationDate(Credentials.CA_CERTIFICATE + alias);
- }
-
- @Override
- public void engineSetKeyEntry(String alias, Key key, char[] password, Certificate[] chain)
- throws KeyStoreException {
- if ((password != null) && (password.length > 0)) {
- throw new KeyStoreException("entries cannot be protected with passwords");
- }
-
- if (key instanceof PrivateKey) {
- setPrivateKeyEntry(alias, (PrivateKey) key, chain, null);
- } else if (key instanceof SecretKey) {
- setSecretKeyEntry(alias, (SecretKey) key, null);
- } else {
- throw new KeyStoreException("Only PrivateKey and SecretKey are supported");
- }
- }
-
- private static KeyProtection getLegacyKeyProtectionParameter(PrivateKey key)
- throws KeyStoreException {
- String keyAlgorithm = key.getAlgorithm();
- KeyProtection.Builder specBuilder;
- if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
- specBuilder =
- new KeyProtection.Builder(
- KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY);
- // Authorized to be used with any digest (including no digest).
- // MD5 was never offered for Android Keystore for ECDSA.
- specBuilder.setDigests(
- KeyProperties.DIGEST_NONE,
- KeyProperties.DIGEST_SHA1,
- KeyProperties.DIGEST_SHA224,
- KeyProperties.DIGEST_SHA256,
- KeyProperties.DIGEST_SHA384,
- KeyProperties.DIGEST_SHA512);
- } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
- specBuilder =
- new KeyProtection.Builder(
- KeyProperties.PURPOSE_ENCRYPT
- | KeyProperties.PURPOSE_DECRYPT
- | KeyProperties.PURPOSE_SIGN
- | KeyProperties.PURPOSE_VERIFY);
- // Authorized to be used with any digest (including no digest).
- specBuilder.setDigests(
- KeyProperties.DIGEST_NONE,
- KeyProperties.DIGEST_MD5,
- KeyProperties.DIGEST_SHA1,
- KeyProperties.DIGEST_SHA224,
- KeyProperties.DIGEST_SHA256,
- KeyProperties.DIGEST_SHA384,
- KeyProperties.DIGEST_SHA512);
- // Authorized to be used with any encryption and signature padding
- // schemes (including no padding).
- specBuilder.setEncryptionPaddings(
- KeyProperties.ENCRYPTION_PADDING_NONE,
- KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
- KeyProperties.ENCRYPTION_PADDING_RSA_OAEP);
- specBuilder.setSignaturePaddings(
- KeyProperties.SIGNATURE_PADDING_RSA_PKCS1,
- KeyProperties.SIGNATURE_PADDING_RSA_PSS);
- // Disable randomized encryption requirement to support encryption
- // padding NONE above.
- specBuilder.setRandomizedEncryptionRequired(false);
- } else {
- throw new KeyStoreException("Unsupported key algorithm: " + keyAlgorithm);
- }
- specBuilder.setUserAuthenticationRequired(false);
-
- return specBuilder.build();
- }
-
- private void setPrivateKeyEntry(String alias, PrivateKey key, Certificate[] chain,
- java.security.KeyStore.ProtectionParameter param) throws KeyStoreException {
- int flags = 0;
- KeyProtection spec;
- if (param == null) {
- spec = getLegacyKeyProtectionParameter(key);
- } else if (param instanceof KeyStoreParameter) {
- spec = getLegacyKeyProtectionParameter(key);
- KeyStoreParameter legacySpec = (KeyStoreParameter) param;
- if (legacySpec.isEncryptionRequired()) {
- flags = KeyStore.FLAG_ENCRYPTED;
- }
- } else if (param instanceof KeyProtection) {
- spec = (KeyProtection) param;
- if (spec.isCriticalToDeviceEncryption()) {
- flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
- }
-
- if (spec.isStrongBoxBacked()) {
- flags |= KeyStore.FLAG_STRONGBOX;
- }
- } else {
- throw new KeyStoreException(
- "Unsupported protection parameter class:" + param.getClass().getName()
- + ". Supported: " + KeyProtection.class.getName() + ", "
- + KeyStoreParameter.class.getName());
- }
-
- // Make sure the chain exists since this is a PrivateKey
- if ((chain == null) || (chain.length == 0)) {
- throw new KeyStoreException("Must supply at least one Certificate with PrivateKey");
- }
-
- // Do chain type checking.
- X509Certificate[] x509chain = new X509Certificate[chain.length];
- for (int i = 0; i < chain.length; i++) {
- if (!"X.509".equals(chain[i].getType())) {
- throw new KeyStoreException("Certificates must be in X.509 format: invalid cert #"
- + i);
- }
-
- if (!(chain[i] instanceof X509Certificate)) {
- throw new KeyStoreException("Certificates must be in X.509 format: invalid cert #"
- + i);
- }
-
- x509chain[i] = (X509Certificate) chain[i];
- }
-
- final byte[] userCertBytes;
- try {
- userCertBytes = x509chain[0].getEncoded();
- } catch (CertificateEncodingException e) {
- throw new KeyStoreException("Failed to encode certificate #0", e);
- }
-
- /*
- * If we have a chain, store it in the CA certificate slot for this
- * alias as concatenated DER-encoded certificates. These can be
- * deserialized by {@link CertificateFactory#generateCertificates}.
- */
- final byte[] chainBytes;
- if (chain.length > 1) {
- /*
- * The chain is passed in as {user_cert, ca_cert_1, ca_cert_2, ...}
- * so we only need the certificates starting at index 1.
- */
- final byte[][] certsBytes = new byte[x509chain.length - 1][];
- int totalCertLength = 0;
- for (int i = 0; i < certsBytes.length; i++) {
- try {
- certsBytes[i] = x509chain[i + 1].getEncoded();
- totalCertLength += certsBytes[i].length;
- } catch (CertificateEncodingException e) {
- throw new KeyStoreException("Failed to encode certificate #" + i, e);
- }
- }
-
- /*
- * Serialize this into one byte array so we can later call
- * CertificateFactory#generateCertificates to recover them.
- */
- chainBytes = new byte[totalCertLength];
- int outputOffset = 0;
- for (int i = 0; i < certsBytes.length; i++) {
- final int certLength = certsBytes[i].length;
- System.arraycopy(certsBytes[i], 0, chainBytes, outputOffset, certLength);
- outputOffset += certLength;
- certsBytes[i] = null;
- }
- } else {
- chainBytes = null;
- }
-
- final String pkeyAlias;
- if (key instanceof AndroidKeyStorePrivateKey) {
- pkeyAlias = ((AndroidKeyStoreKey) key).getAlias();
- } else {
- pkeyAlias = null;
- }
-
- byte[] pkcs8EncodedPrivateKeyBytes;
- KeymasterArguments importArgs;
- final boolean shouldReplacePrivateKey;
- if (pkeyAlias != null && pkeyAlias.startsWith(Credentials.USER_PRIVATE_KEY)) {
- final String keySubalias = pkeyAlias.substring(Credentials.USER_PRIVATE_KEY.length());
- if (!alias.equals(keySubalias)) {
- throw new KeyStoreException("Can only replace keys with same alias: " + alias
- + " != " + keySubalias);
- }
- shouldReplacePrivateKey = false;
- importArgs = null;
- pkcs8EncodedPrivateKeyBytes = null;
- } else {
- shouldReplacePrivateKey = true;
- // Make sure the PrivateKey format is the one we support.
- final String keyFormat = key.getFormat();
- if ((keyFormat == null) || (!"PKCS#8".equals(keyFormat))) {
- throw new KeyStoreException(
- "Unsupported private key export format: " + keyFormat
- + ". Only private keys which export their key material in PKCS#8 format are"
- + " supported.");
- }
-
- // Make sure we can actually encode the key.
- pkcs8EncodedPrivateKeyBytes = key.getEncoded();
- if (pkcs8EncodedPrivateKeyBytes == null) {
- throw new KeyStoreException("Private key did not export any key material");
- }
-
- importArgs = new KeymasterArguments();
- try {
- importArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM,
- KeyProperties.KeyAlgorithm.toKeymasterAsymmetricKeyAlgorithm(
- key.getAlgorithm()));
- @KeyProperties.PurposeEnum int purposes = spec.getPurposes();
- importArgs.addEnums(KeymasterDefs.KM_TAG_PURPOSE,
- KeyProperties.Purpose.allToKeymaster(purposes));
- if (spec.isDigestsSpecified()) {
- importArgs.addEnums(KeymasterDefs.KM_TAG_DIGEST,
- KeyProperties.Digest.allToKeymaster(spec.getDigests()));
- }
-
- importArgs.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE,
- KeyProperties.BlockMode.allToKeymaster(spec.getBlockModes()));
- int[] keymasterEncryptionPaddings =
- KeyProperties.EncryptionPadding.allToKeymaster(
- spec.getEncryptionPaddings());
- if (((purposes & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (spec.isRandomizedEncryptionRequired())) {
- for (int keymasterPadding : keymasterEncryptionPaddings) {
- if (!KeymasterUtils
- .isKeymasterPaddingSchemeIndCpaCompatibleWithAsymmetricCrypto(
- keymasterPadding)) {
- throw new KeyStoreException(
- "Randomized encryption (IND-CPA) required but is violated by"
- + " encryption padding mode: "
- + KeyProperties.EncryptionPadding.fromKeymaster(
- keymasterPadding)
- + ". See KeyProtection documentation.");
- }
- }
- }
- importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterEncryptionPaddings);
- importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING,
- KeyProperties.SignaturePadding.allToKeymaster(spec.getSignaturePaddings()));
- KeymasterUtils.addUserAuthArgs(importArgs, spec);
- importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
- spec.getKeyValidityStart());
- importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
- spec.getKeyValidityForOriginationEnd());
- importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
- spec.getKeyValidityForConsumptionEnd());
- } catch (IllegalArgumentException | IllegalStateException e) {
- throw new KeyStoreException(e);
- }
- }
-
-
- boolean success = false;
- try {
- // Store the private key, if necessary
- if (shouldReplacePrivateKey) {
- // Delete the stored private key and any related entries before importing the
- // provided key
- Credentials.deleteAllTypesForAlias(mKeyStore, alias, mUid);
- KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics();
- int errorCode = mKeyStore.importKey(
- Credentials.USER_PRIVATE_KEY + alias,
- importArgs,
- KeymasterDefs.KM_KEY_FORMAT_PKCS8,
- pkcs8EncodedPrivateKeyBytes,
- mUid,
- flags,
- resultingKeyCharacteristics);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new KeyStoreException("Failed to store private key",
- KeyStore.getKeyStoreException(errorCode));
- }
- } else {
- // Keep the stored private key around -- delete all other entry types
- Credentials.deleteCertificateTypesForAlias(mKeyStore, alias, mUid);
- Credentials.deleteLegacyKeyForAlias(mKeyStore, alias, mUid);
- }
-
- // Store the leaf certificate
- int errorCode = mKeyStore.insert(Credentials.USER_CERTIFICATE + alias, userCertBytes,
- mUid, flags);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new KeyStoreException("Failed to store certificate #0",
- KeyStore.getKeyStoreException(errorCode));
- }
-
- // Store the certificate chain
- errorCode = mKeyStore.insert(Credentials.CA_CERTIFICATE + alias, chainBytes,
- mUid, flags);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new KeyStoreException("Failed to store certificate chain",
- KeyStore.getKeyStoreException(errorCode));
- }
- success = true;
- } finally {
- if (!success) {
- if (shouldReplacePrivateKey) {
- Credentials.deleteAllTypesForAlias(mKeyStore, alias, mUid);
- } else {
- Credentials.deleteCertificateTypesForAlias(mKeyStore, alias, mUid);
- Credentials.deleteLegacyKeyForAlias(mKeyStore, alias, mUid);
- }
- }
- }
- }
-
- private void setSecretKeyEntry(String entryAlias, SecretKey key,
- java.security.KeyStore.ProtectionParameter param)
- throws KeyStoreException {
- if ((param != null) && (!(param instanceof KeyProtection))) {
- throw new KeyStoreException(
- "Unsupported protection parameter class: " + param.getClass().getName()
- + ". Supported: " + KeyProtection.class.getName());
- }
- KeyProtection params = (KeyProtection) param;
-
- if (key instanceof AndroidKeyStoreSecretKey) {
- // KeyStore-backed secret key. It cannot be duplicated into another entry and cannot
- // overwrite its own entry.
- String keyAliasInKeystore = ((AndroidKeyStoreSecretKey) key).getAlias();
- if (keyAliasInKeystore == null) {
- throw new KeyStoreException("KeyStore-backed secret key does not have an alias");
- }
- String keyAliasPrefix = Credentials.USER_PRIVATE_KEY;
- if (!keyAliasInKeystore.startsWith(keyAliasPrefix)) {
- // try legacy prefix
- keyAliasPrefix = Credentials.USER_SECRET_KEY;
- if (!keyAliasInKeystore.startsWith(keyAliasPrefix)) {
- throw new KeyStoreException("KeyStore-backed secret key has invalid alias: "
- + keyAliasInKeystore);
- }
- }
- String keyEntryAlias =
- keyAliasInKeystore.substring(keyAliasPrefix.length());
- if (!entryAlias.equals(keyEntryAlias)) {
- throw new KeyStoreException("Can only replace KeyStore-backed keys with same"
- + " alias: " + entryAlias + " != " + keyEntryAlias);
- }
- // This is the entry where this key is already stored. No need to do anything.
- if (params != null) {
- throw new KeyStoreException("Modifying KeyStore-backed key using protection"
- + " parameters not supported");
- }
- return;
- }
-
- if (params == null) {
- throw new KeyStoreException(
- "Protection parameters must be specified when importing a symmetric key");
- }
-
- // Not a KeyStore-backed secret key -- import its key material into keystore.
- String keyExportFormat = key.getFormat();
- if (keyExportFormat == null) {
- throw new KeyStoreException(
- "Only secret keys that export their key material are supported");
- } else if (!"RAW".equals(keyExportFormat)) {
- throw new KeyStoreException(
- "Unsupported secret key material export format: " + keyExportFormat);
- }
- byte[] keyMaterial = key.getEncoded();
- if (keyMaterial == null) {
- throw new KeyStoreException("Key did not export its key material despite supporting"
- + " RAW format export");
- }
-
- KeymasterArguments args = new KeymasterArguments();
- try {
- int keymasterAlgorithm =
- KeyProperties.KeyAlgorithm.toKeymasterSecretKeyAlgorithm(key.getAlgorithm());
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, keymasterAlgorithm);
-
- int[] keymasterDigests;
- if (keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC) {
- // JCA HMAC key algorithm implies a digest (e.g., HmacSHA256 key algorithm
- // implies SHA-256 digest). Because keymaster HMAC key is authorized only for one
- // digest, we don't let import parameters override the digest implied by the key.
- // If the parameters specify digests at all, they must specify only one digest, the
- // only implied by key algorithm.
- int keymasterImpliedDigest =
- KeyProperties.KeyAlgorithm.toKeymasterDigest(key.getAlgorithm());
- if (keymasterImpliedDigest == -1) {
- throw new ProviderException(
- "HMAC key algorithm digest unknown for key algorithm "
- + key.getAlgorithm());
- }
- keymasterDigests = new int[] {keymasterImpliedDigest};
- if (params.isDigestsSpecified()) {
- // Digest(s) explicitly specified in params -- check that the list consists of
- // exactly one digest, the one implied by key algorithm.
- int[] keymasterDigestsFromParams =
- KeyProperties.Digest.allToKeymaster(params.getDigests());
- if ((keymasterDigestsFromParams.length != 1)
- || (keymasterDigestsFromParams[0] != keymasterImpliedDigest)) {
- throw new KeyStoreException(
- "Unsupported digests specification: "
- + Arrays.asList(params.getDigests()) + ". Only "
- + KeyProperties.Digest.fromKeymaster(keymasterImpliedDigest)
- + " supported for HMAC key algorithm " + key.getAlgorithm());
- }
- }
- } else {
- // Key algorithm does not imply a digest.
- if (params.isDigestsSpecified()) {
- keymasterDigests = KeyProperties.Digest.allToKeymaster(params.getDigests());
- } else {
- keymasterDigests = EmptyArray.INT;
- }
- }
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, keymasterDigests);
-
- @KeyProperties.PurposeEnum int purposes = params.getPurposes();
- int[] keymasterBlockModes =
- KeyProperties.BlockMode.allToKeymaster(params.getBlockModes());
- if (((purposes & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (params.isRandomizedEncryptionRequired())) {
- for (int keymasterBlockMode : keymasterBlockModes) {
- if (!KeymasterUtils.isKeymasterBlockModeIndCpaCompatibleWithSymmetricCrypto(
- keymasterBlockMode)) {
- throw new KeyStoreException(
- "Randomized encryption (IND-CPA) required but may be violated by"
- + " block mode: "
- + KeyProperties.BlockMode.fromKeymaster(keymasterBlockMode)
- + ". See KeyProtection documentation.");
- }
- }
- }
- args.addEnums(KeymasterDefs.KM_TAG_PURPOSE,
- KeyProperties.Purpose.allToKeymaster(purposes));
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, keymasterBlockModes);
- if (params.getSignaturePaddings().length > 0) {
- throw new KeyStoreException("Signature paddings not supported for symmetric keys");
- }
- int[] keymasterPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
- params.getEncryptionPaddings());
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterPaddings);
- KeymasterUtils.addUserAuthArgs(args, params);
- KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
- args,
- keymasterAlgorithm,
- keymasterBlockModes,
- keymasterDigests);
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
- params.getKeyValidityStart());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
- params.getKeyValidityForOriginationEnd());
- args.addDateIfNotNull(KeymasterDefs.KM_TAG_USAGE_EXPIRE_DATETIME,
- params.getKeyValidityForConsumptionEnd());
-
- if (((purposes & KeyProperties.PURPOSE_ENCRYPT) != 0)
- && (!params.isRandomizedEncryptionRequired())) {
- // Permit caller-provided IV when encrypting with this key
- args.addBoolean(KeymasterDefs.KM_TAG_CALLER_NONCE);
- }
- } catch (IllegalArgumentException | IllegalStateException e) {
- throw new KeyStoreException(e);
- }
- int flags = 0;
- if (params.isCriticalToDeviceEncryption()) {
- flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
- }
- if (params.isStrongBoxBacked()) {
- flags |= KeyStore.FLAG_STRONGBOX;
- }
-
- Credentials.deleteAllTypesForAlias(mKeyStore, entryAlias, mUid);
- String keyAliasInKeystore = Credentials.USER_PRIVATE_KEY + entryAlias;
- int errorCode = mKeyStore.importKey(
- keyAliasInKeystore,
- args,
- KeymasterDefs.KM_KEY_FORMAT_RAW,
- keyMaterial,
- mUid,
- flags,
- new KeyCharacteristics());
- if (errorCode != KeyStore.NO_ERROR) {
- throw new KeyStoreException("Failed to import secret key. Keystore error code: "
- + errorCode);
- }
- }
-
- private void setWrappedKeyEntry(String alias, WrappedKeyEntry entry,
- java.security.KeyStore.ProtectionParameter param) throws KeyStoreException {
- if (param != null) {
- throw new KeyStoreException("Protection parameters are specified inside wrapped keys");
- }
-
- byte[] maskingKey = new byte[32];
-
-
- KeymasterArguments args = new KeymasterArguments();
- String[] parts = entry.getTransformation().split("/");
-
- String algorithm = parts[0];
- if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(algorithm)) {
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- } else if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(algorithm)) {
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- }
-
- if (parts.length > 1) {
- String mode = parts[1];
- if (KeyProperties.BLOCK_MODE_ECB.equalsIgnoreCase(mode)) {
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_ECB);
- } else if (KeyProperties.BLOCK_MODE_CBC.equalsIgnoreCase(mode)) {
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_CBC);
- } else if (KeyProperties.BLOCK_MODE_CTR.equalsIgnoreCase(mode)) {
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_CTR);
- } else if (KeyProperties.BLOCK_MODE_GCM.equalsIgnoreCase(mode)) {
- args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_GCM);
- }
- }
-
- if (parts.length > 2) {
- String padding = parts[2];
- if (KeyProperties.ENCRYPTION_PADDING_NONE.equalsIgnoreCase(padding)) {
- // Noop
- } else if (KeyProperties.ENCRYPTION_PADDING_PKCS7.equalsIgnoreCase(padding)) {
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_PKCS7);
- } else if (KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.equalsIgnoreCase(padding)) {
- args.addEnums(KeymasterDefs.KM_TAG_PADDING,
- KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
- } else if (KeyProperties.ENCRYPTION_PADDING_RSA_OAEP.equalsIgnoreCase(padding)) {
- args.addEnums(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_RSA_OAEP);
- }
- }
-
- KeyGenParameterSpec spec = (KeyGenParameterSpec) entry.getAlgorithmParameterSpec();
- if (spec.isDigestsSpecified()) {
- String digest = spec.getDigests()[0];
- if (KeyProperties.DIGEST_NONE.equalsIgnoreCase(digest)) {
- // Noop
- } else if (KeyProperties.DIGEST_MD5.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_MD5);
- } else if (KeyProperties.DIGEST_SHA1.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA1);
- } else if (KeyProperties.DIGEST_SHA224.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_224);
- } else if (KeyProperties.DIGEST_SHA256.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_256);
- } else if (KeyProperties.DIGEST_SHA384.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_384);
- } else if (KeyProperties.DIGEST_SHA512.equalsIgnoreCase(digest)) {
- args.addEnums(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_SHA_2_512);
- }
- }
-
- int errorCode = mKeyStore.importWrappedKey(
- Credentials.USER_PRIVATE_KEY + alias,
- entry.getWrappedKeyBytes(),
- Credentials.USER_PRIVATE_KEY + entry.getWrappingKeyAlias(),
- maskingKey,
- args,
- GateKeeper.getSecureUserId(),
- 0, // FIXME fingerprint id?
- mUid,
- new KeyCharacteristics());
- if (errorCode == KeymasterDefs.KM_ERROR_UNIMPLEMENTED) {
- throw new SecureKeyImportUnavailableException("Could not import wrapped key");
- } else if (errorCode != KeyStore.NO_ERROR) {
- throw new KeyStoreException("Failed to import wrapped key. Keystore error code: "
- + errorCode);
- }
- }
-
- @Override
- public void engineSetKeyEntry(String alias, byte[] userKey, Certificate[] chain)
- throws KeyStoreException {
- throw new KeyStoreException("Operation not supported because key encoding is unknown");
- }
-
- @Override
- public void engineSetCertificateEntry(String alias, Certificate cert) throws KeyStoreException {
- if (isKeyEntry(alias)) {
- throw new KeyStoreException("Entry exists and is not a trusted certificate");
- }
-
- // We can't set something to null.
- if (cert == null) {
- throw new NullPointerException("cert == null");
- }
-
- final byte[] encoded;
- try {
- encoded = cert.getEncoded();
- } catch (CertificateEncodingException e) {
- throw new KeyStoreException(e);
- }
-
- if (!mKeyStore.put(Credentials.CA_CERTIFICATE + alias, encoded, mUid, KeyStore.FLAG_NONE)) {
- throw new KeyStoreException("Couldn't insert certificate; is KeyStore initialized?");
- }
- }
-
- @Override
- public void engineDeleteEntry(String alias) throws KeyStoreException {
- if (!Credentials.deleteAllTypesForAlias(mKeyStore, alias, mUid)) {
- throw new KeyStoreException("Failed to delete entry: " + alias);
- }
- }
-
- private Set<String> getUniqueAliases() {
- final String[] rawAliases = mKeyStore.list("", mUid);
- if (rawAliases == null) {
- return new HashSet<String>();
- }
-
- final Set<String> aliases = new HashSet<String>(rawAliases.length);
- for (String alias : rawAliases) {
- final int idx = alias.indexOf('_');
- if ((idx == -1) || (alias.length() <= idx)) {
- Log.e(NAME, "invalid alias: " + alias);
- continue;
- }
-
- aliases.add(new String(alias.substring(idx + 1)));
- }
-
- return aliases;
- }
-
- @Override
- public Enumeration<String> engineAliases() {
- return Collections.enumeration(getUniqueAliases());
- }
-
- @Override
- public boolean engineContainsAlias(String alias) {
- if (alias == null) {
- throw new NullPointerException("alias == null");
- }
-
- return mKeyStore.contains(Credentials.USER_PRIVATE_KEY + alias, mUid)
- || mKeyStore.contains(Credentials.USER_SECRET_KEY + alias, mUid)
- || mKeyStore.contains(Credentials.USER_CERTIFICATE + alias, mUid)
- || mKeyStore.contains(Credentials.CA_CERTIFICATE + alias, mUid);
- }
-
- @Override
- public int engineSize() {
- return getUniqueAliases().size();
- }
-
- @Override
- public boolean engineIsKeyEntry(String alias) {
- return isKeyEntry(alias);
- }
-
- private boolean isKeyEntry(String alias) {
- return mKeyStore.contains(Credentials.USER_PRIVATE_KEY + alias, mUid) ||
- mKeyStore.contains(Credentials.USER_SECRET_KEY + alias, mUid);
- }
-
-
- private boolean isCertificateEntry(String alias) {
- if (alias == null) {
- throw new NullPointerException("alias == null");
- }
-
- return mKeyStore.contains(Credentials.CA_CERTIFICATE + alias, mUid);
- }
-
- @Override
- public boolean engineIsCertificateEntry(String alias) {
- return !isKeyEntry(alias) && isCertificateEntry(alias);
- }
-
- @Override
- public String engineGetCertificateAlias(Certificate cert) {
- if (cert == null) {
- return null;
- }
- if (!"X.509".equalsIgnoreCase(cert.getType())) {
- // Only X.509 certificates supported
- return null;
- }
- byte[] targetCertBytes;
- try {
- targetCertBytes = cert.getEncoded();
- } catch (CertificateEncodingException e) {
- return null;
- }
- if (targetCertBytes == null) {
- return null;
- }
-
- final Set<String> nonCaEntries = new HashSet<String>();
-
- /*
- * First scan the PrivateKeyEntry types. The KeyStoreSpi documentation
- * says to only compare the first certificate in the chain which is
- * equivalent to the USER_CERTIFICATE prefix for the Android keystore
- * convention.
- */
- final String[] certAliases = mKeyStore.list(Credentials.USER_CERTIFICATE, mUid);
- if (certAliases != null) {
- for (String alias : certAliases) {
- final byte[] certBytes = mKeyStore.get(Credentials.USER_CERTIFICATE + alias, mUid);
- if (certBytes == null) {
- continue;
- }
-
- nonCaEntries.add(alias);
-
- if (Arrays.equals(certBytes, targetCertBytes)) {
- return alias;
- }
- }
- }
-
- /*
- * Look at all the TrustedCertificateEntry types. Skip all the
- * PrivateKeyEntry we looked at above.
- */
- final String[] caAliases = mKeyStore.list(Credentials.CA_CERTIFICATE, mUid);
- if (certAliases != null) {
- for (String alias : caAliases) {
- if (nonCaEntries.contains(alias)) {
- continue;
- }
-
- final byte[] certBytes = mKeyStore.get(Credentials.CA_CERTIFICATE + alias, mUid);
- if (certBytes == null) {
- continue;
- }
-
- if (Arrays.equals(certBytes, targetCertBytes)) {
- return alias;
- }
- }
- }
-
- return null;
- }
-
- @Override
- public void engineStore(OutputStream stream, char[] password) throws IOException,
- NoSuchAlgorithmException, CertificateException {
- throw new UnsupportedOperationException("Can not serialize AndroidKeyStore to OutputStream");
- }
-
- @Override
- public void engineLoad(InputStream stream, char[] password) throws IOException,
- NoSuchAlgorithmException, CertificateException {
- if (stream != null) {
- throw new IllegalArgumentException("InputStream not supported");
- }
-
- if (password != null) {
- throw new IllegalArgumentException("password not supported");
- }
-
- // Unfortunate name collision.
- mKeyStore = KeyStore.getInstance();
- mUid = KeyStore.UID_SELF;
- }
-
- @Override
- public void engineLoad(LoadStoreParameter param) throws IOException,
- NoSuchAlgorithmException, CertificateException {
- int uid = KeyStore.UID_SELF;
- if (param != null) {
- if (param instanceof AndroidKeyStoreLoadStoreParameter) {
- uid = ((AndroidKeyStoreLoadStoreParameter) param).getUid();
- } else {
- throw new IllegalArgumentException(
- "Unsupported param type: " + param.getClass());
- }
- }
- mKeyStore = KeyStore.getInstance();
- mUid = uid;
- }
-
- @Override
- public void engineSetEntry(String alias, Entry entry, ProtectionParameter param)
- throws KeyStoreException {
- if (entry == null) {
- throw new KeyStoreException("entry == null");
- }
-
- Credentials.deleteAllTypesForAlias(mKeyStore, alias, mUid);
-
- if (entry instanceof java.security.KeyStore.TrustedCertificateEntry) {
- java.security.KeyStore.TrustedCertificateEntry trE =
- (java.security.KeyStore.TrustedCertificateEntry) entry;
- engineSetCertificateEntry(alias, trE.getTrustedCertificate());
- return;
- }
-
- if (entry instanceof PrivateKeyEntry) {
- PrivateKeyEntry prE = (PrivateKeyEntry) entry;
- setPrivateKeyEntry(alias, prE.getPrivateKey(), prE.getCertificateChain(), param);
- } else if (entry instanceof SecretKeyEntry) {
- SecretKeyEntry secE = (SecretKeyEntry) entry;
- setSecretKeyEntry(alias, secE.getSecretKey(), param);
- } else if (entry instanceof WrappedKeyEntry) {
- WrappedKeyEntry wke = (WrappedKeyEntry) entry;
- setWrappedKeyEntry(alias, wke, param);
- } else {
- throw new KeyStoreException(
- "Entry must be a PrivateKeyEntry, SecretKeyEntry or TrustedCertificateEntry"
- + "; was " + entry);
- }
- }
-
- /**
- * {@link X509Certificate} which returns {@link AndroidKeyStorePublicKey} from
- * {@link #getPublicKey()}. This is so that crypto operations on these public keys contain
- * can find out which keystore private key entry to use. This is needed so that Android Keystore
- * crypto operations using public keys can find out which key alias to use. These operations
- * require an alias.
- */
- static class KeyStoreX509Certificate extends DelegatingX509Certificate {
- private final String mPrivateKeyAlias;
- private final int mPrivateKeyUid;
- KeyStoreX509Certificate(String privateKeyAlias, int privateKeyUid,
- X509Certificate delegate) {
- super(delegate);
- mPrivateKeyAlias = privateKeyAlias;
- mPrivateKeyUid = privateKeyUid;
- }
-
- @Override
- public PublicKey getPublicKey() {
- PublicKey original = super.getPublicKey();
- return AndroidKeyStoreProvider.getAndroidKeyStorePublicKey(
- mPrivateKeyAlias, mPrivateKeyUid,
- original.getAlgorithm(), original.getEncoded());
- }
- }
-}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
deleted file mode 100644
index 1f1d36f..0000000
--- a/keystore/java/android/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.ProviderException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
-import java.util.Arrays;
-
-import javax.crypto.CipherSpi;
-import javax.crypto.spec.IvParameterSpec;
-
-/**
- * Base class for Android Keystore unauthenticated AES {@link CipherSpi} implementations.
- *
- * @hide
- */
-class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSpiBase {
-
- abstract static class ECB extends AndroidKeyStoreUnauthenticatedAESCipherSpi {
- protected ECB(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_ECB, keymasterPadding, false);
- }
-
- public static class NoPadding extends ECB {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
- }
-
- public static class PKCS7Padding extends ECB {
- public PKCS7Padding() {
- super(KeymasterDefs.KM_PAD_PKCS7);
- }
- }
- }
-
- abstract static class CBC extends AndroidKeyStoreUnauthenticatedAESCipherSpi {
- protected CBC(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_CBC, keymasterPadding, true);
- }
-
- public static class NoPadding extends CBC {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
- }
-
- public static class PKCS7Padding extends CBC {
- public PKCS7Padding() {
- super(KeymasterDefs.KM_PAD_PKCS7);
- }
- }
- }
-
- abstract static class CTR extends AndroidKeyStoreUnauthenticatedAESCipherSpi {
- protected CTR(int keymasterPadding) {
- super(KeymasterDefs.KM_MODE_CTR, keymasterPadding, true);
- }
-
- public static class NoPadding extends CTR {
- public NoPadding() {
- super(KeymasterDefs.KM_PAD_NONE);
- }
- }
- }
-
- private static final int BLOCK_SIZE_BYTES = 16;
-
- private final int mKeymasterBlockMode;
- private final int mKeymasterPadding;
- /** Whether this transformation requires an IV. */
- private final boolean mIvRequired;
-
- private byte[] mIv;
-
- /** Whether the current {@code #mIv} has been used by the underlying crypto operation. */
- private boolean mIvHasBeenUsed;
-
- AndroidKeyStoreUnauthenticatedAESCipherSpi(
- int keymasterBlockMode,
- int keymasterPadding,
- boolean ivRequired) {
- mKeymasterBlockMode = keymasterBlockMode;
- mKeymasterPadding = keymasterPadding;
- mIvRequired = ivRequired;
- }
-
- @Override
- protected final void resetAll() {
- mIv = null;
- mIvHasBeenUsed = false;
- super.resetAll();
- }
-
- @Override
- protected final void resetWhilePreservingInitState() {
- super.resetWhilePreservingInitState();
- }
-
- @Override
- protected final void initKey(int opmode, Key key) throws InvalidKeyException {
- if (!(key instanceof AndroidKeyStoreSecretKey)) {
- throw new InvalidKeyException(
- "Unsupported key: " + ((key != null) ? key.getClass().getName() : "null"));
- }
- if (!KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(key.getAlgorithm())) {
- throw new InvalidKeyException(
- "Unsupported key algorithm: " + key.getAlgorithm() + ". Only " +
- KeyProperties.KEY_ALGORITHM_AES + " supported");
- }
- setKey((AndroidKeyStoreSecretKey) key);
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters() throws InvalidKeyException {
- if (!mIvRequired) {
- return;
- }
-
- // IV is used
- if (!isEncrypting()) {
- throw new InvalidKeyException("IV required when decrypting"
- + ". Use IvParameterSpec or AlgorithmParameters to provide it.");
- }
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters(AlgorithmParameterSpec params)
- throws InvalidAlgorithmParameterException {
- if (!mIvRequired) {
- if (params != null) {
- throw new InvalidAlgorithmParameterException("Unsupported parameters: " + params);
- }
- return;
- }
-
- // IV is used
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException(
- "IvParameterSpec must be provided when decrypting");
- }
- return;
- }
- if (!(params instanceof IvParameterSpec)) {
- throw new InvalidAlgorithmParameterException("Only IvParameterSpec supported");
- }
- mIv = ((IvParameterSpec) params).getIV();
- if (mIv == null) {
- throw new InvalidAlgorithmParameterException("Null IV in IvParameterSpec");
- }
- }
-
- @Override
- protected final void initAlgorithmSpecificParameters(AlgorithmParameters params)
- throws InvalidAlgorithmParameterException {
- if (!mIvRequired) {
- if (params != null) {
- throw new InvalidAlgorithmParameterException("Unsupported parameters: " + params);
- }
- return;
- }
-
- // IV is used
- if (params == null) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV required when decrypting"
- + ". Use IvParameterSpec or AlgorithmParameters to provide it.");
- }
- return;
- }
-
- if (!"AES".equalsIgnoreCase(params.getAlgorithm())) {
- throw new InvalidAlgorithmParameterException(
- "Unsupported AlgorithmParameters algorithm: " + params.getAlgorithm()
- + ". Supported: AES");
- }
-
- IvParameterSpec ivSpec;
- try {
- ivSpec = params.getParameterSpec(IvParameterSpec.class);
- } catch (InvalidParameterSpecException e) {
- if (!isEncrypting()) {
- // IV must be provided by the caller
- throw new InvalidAlgorithmParameterException("IV required when decrypting"
- + ", but not found in parameters: " + params, e);
- }
- mIv = null;
- return;
- }
- mIv = ivSpec.getIV();
- if (mIv == null) {
- throw new InvalidAlgorithmParameterException("Null IV in AlgorithmParameters");
- }
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForBegin() {
- if ((mIvRequired) && (mIv == null) && (isEncrypting())) {
- // IV will need to be generated
- return BLOCK_SIZE_BYTES;
- }
-
- return 0;
- }
-
- @Override
- protected final int getAdditionalEntropyAmountForFinish() {
- return 0;
- }
-
- @Override
- protected final void addAlgorithmSpecificParametersToBegin(
- @NonNull KeymasterArguments keymasterArgs) {
- if ((isEncrypting()) && (mIvRequired) && (mIvHasBeenUsed)) {
- // IV is being reused for encryption: this violates security best practices.
- throw new IllegalStateException(
- "IV has already been used. Reusing IV in encryption mode violates security best"
- + " practices.");
- }
-
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockMode);
- keymasterArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, mKeymasterPadding);
- if ((mIvRequired) && (mIv != null)) {
- keymasterArgs.addBytes(KeymasterDefs.KM_TAG_NONCE, mIv);
- }
- }
-
- @Override
- protected final void loadAlgorithmSpecificParametersFromBeginResult(
- @NonNull KeymasterArguments keymasterArgs) {
- mIvHasBeenUsed = true;
-
- // NOTE: Keymaster doesn't always return an IV, even if it's used.
- byte[] returnedIv = keymasterArgs.getBytes(KeymasterDefs.KM_TAG_NONCE, null);
- if ((returnedIv != null) && (returnedIv.length == 0)) {
- returnedIv = null;
- }
-
- if (mIvRequired) {
- if (mIv == null) {
- mIv = returnedIv;
- } else if ((returnedIv != null) && (!Arrays.equals(returnedIv, mIv))) {
- throw new ProviderException("IV in use differs from provided IV");
- }
- } else {
- if (returnedIv != null) {
- throw new ProviderException(
- "IV in use despite IV not being used by this transformation");
- }
- }
- }
-
- @Override
- protected final int engineGetBlockSize() {
- return BLOCK_SIZE_BYTES;
- }
-
- @Override
- protected final int engineGetOutputSize(int inputLen) {
- return inputLen + 3 * BLOCK_SIZE_BYTES;
- }
-
- @Override
- protected final byte[] engineGetIV() {
- return ArrayUtils.cloneIfNotEmpty(mIv);
- }
-
- @Nullable
- @Override
- protected final AlgorithmParameters engineGetParameters() {
- if (!mIvRequired) {
- return null;
- }
- if ((mIv != null) && (mIv.length > 0)) {
- try {
- AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
- params.init(new IvParameterSpec(mIv));
- return params;
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain AES AlgorithmParameters", e);
- } catch (InvalidParameterSpecException e) {
- throw new ProviderException(
- "Failed to initialize AES AlgorithmParameters with an IV",
- e);
- }
- }
- return null;
- }
-}
diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java
index ec3b102..66d842e 100644
--- a/keystore/java/android/security/keystore/AttestationUtils.java
+++ b/keystore/java/android/security/keystore/AttestationUtils.java
@@ -34,9 +34,11 @@
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.SecureRandom;
+import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.ECGenParameterSpec;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Random;
import java.util.Set;
@@ -248,8 +250,9 @@
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
+ Certificate[] certs = keyStore.getCertificateChain(keystoreAlias);
X509Certificate[] certificateChain =
- (X509Certificate[]) keyStore.getCertificateChain(keystoreAlias);
+ Arrays.copyOf(certs, certs.length, X509Certificate[].class);
keyStore.deleteEntry(keystoreAlias);
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index 9ca551b..1f9022b 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -446,13 +446,6 @@
@UnsupportedAppUsage
@Deprecated
public int getUid() {
- if (!AndroidKeyStoreProvider.isKeystore2Enabled()) {
- // If Keystore2 has not been enabled we have to behave as if mNamespace is actually
- // a UID, because we are still being used with the old Keystore SPI.
- // TODO This if statement and body can be removed when the Keystore 2 migration is
- // complete. b/171563717
- return mNamespace;
- }
try {
return KeyProperties.namespaceToLegacyUid(mNamespace);
} catch (IllegalArgumentException e) {
@@ -1021,14 +1014,6 @@
@NonNull
@Deprecated
public Builder setUid(int uid) {
- if (!AndroidKeyStoreProvider.isKeystore2Enabled()) {
- // If Keystore2 has not been enabled we have to behave as if mNamespace is actually
- // a UID, because we are still being used with the old Keystore SPI.
- // TODO This if statement and body can be removed when the Keystore 2 migration is
- // complete. b/171563717
- mNamespace = uid;
- return this;
- }
mNamespace = KeyProperties.legacyUidToNamespace(uid);
return this;
}
@@ -1666,9 +1651,10 @@
* Set whether this key is critical to the device encryption flow
*
* This is a special flag only available to system servers to indicate the current key
- * is part of the device encryption flow.
+ * is part of the device encryption flow. Setting this flag causes the key to not
+ * be cryptographically bound to the LSKF even if the key is otherwise authentication
+ * bound.
*
- * @see android.security.KeyStore#FLAG_CRITICAL_TO_DEVICE_ENCRYPTION
* @hide
*/
public Builder setCriticalToDeviceEncryption(boolean critical) {
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index fe92270..c14c3c5 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -24,6 +24,7 @@
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.security.GateKeeper;
+import android.security.keystore2.KeymasterUtils;
import java.security.Key;
import java.security.KeyStore.ProtectionParameter;
diff --git a/keystore/java/android/security/keystore/KeyStoreCryptoOperationChunkedStreamer.java b/keystore/java/android/security/keystore/KeyStoreCryptoOperationChunkedStreamer.java
deleted file mode 100644
index 2c0f40d..0000000
--- a/keystore/java/android/security/keystore/KeyStoreCryptoOperationChunkedStreamer.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.os.IBinder;
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-
-import libcore.util.EmptyArray;
-
-/**
- * Helper for streaming a crypto operation's input and output via {@link KeyStore} service's
- * {@code update} and {@code finish} operations.
- *
- * <p>The helper abstracts away issues that need to be solved in most code that uses KeyStore's
- * update and finish operations. Firstly, KeyStore's update operation can consume only a limited
- * amount of data in one go because the operations are marshalled via Binder. Secondly, the update
- * operation may consume less data than provided, in which case the caller has to buffer the
- * remainder for next time. Thirdly, when the input is smaller than a threshold, skipping update
- * and passing input data directly to final improves performance. This threshold is configurable;
- * using a threshold <= 1 causes the helper act eagerly, which may be required for some types of
- * operations (e.g. ciphers).
- *
- * <p>The helper exposes {@link #update(byte[], int, int) update} and
- * {@link #doFinal(byte[], int, int, byte[], byte[]) doFinal} operations which can be used to
- * conveniently implement various JCA crypto primitives.
- *
- * <p>Bidirectional chunked streaming of data via a KeyStore crypto operation is abstracted away as
- * a {@link Stream} to avoid having this class deal with operation tokens and occasional additional
- * parameters to {@code update} and {@code final} operations.
- *
- * @hide
- */
-class KeyStoreCryptoOperationChunkedStreamer implements KeyStoreCryptoOperationStreamer {
-
- /**
- * Bidirectional chunked data stream over a KeyStore crypto operation.
- */
- interface Stream {
- /**
- * Returns the result of the KeyStore {@code update} operation or null if keystore couldn't
- * be reached.
- */
- OperationResult update(byte[] input);
-
- /**
- * Returns the result of the KeyStore {@code finish} operation or null if keystore couldn't
- * be reached.
- */
- OperationResult finish(byte[] input, byte[] siganture, byte[] additionalEntropy);
- }
-
- // Binder buffer is about 1MB, but it's shared between all active transactions of the process.
- // Thus, it's safer to use a much smaller upper bound.
- private static final int DEFAULT_CHUNK_SIZE_MAX = 64 * 1024;
- // The chunk buffer will be sent to update until its size under this threshold.
- // This threshold should be <= the max input allowed for finish.
- // Setting this threshold <= 1 will effectivley disable buffering between updates.
- private static final int DEFAULT_CHUNK_SIZE_THRESHOLD = 2 * 1024;
-
- private final Stream mKeyStoreStream;
- private final int mChunkSizeMax;
- private final int mChunkSizeThreshold;
- private final byte[] mChunk;
- private int mChunkLength = 0;
- private long mConsumedInputSizeBytes;
- private long mProducedOutputSizeBytes;
-
- KeyStoreCryptoOperationChunkedStreamer(Stream operation) {
- this(operation, DEFAULT_CHUNK_SIZE_THRESHOLD, DEFAULT_CHUNK_SIZE_MAX);
- }
-
- KeyStoreCryptoOperationChunkedStreamer(Stream operation, int chunkSizeThreshold) {
- this(operation, chunkSizeThreshold, DEFAULT_CHUNK_SIZE_MAX);
- }
-
- KeyStoreCryptoOperationChunkedStreamer(Stream operation, int chunkSizeThreshold,
- int chunkSizeMax) {
- mKeyStoreStream = operation;
- mChunkSizeMax = chunkSizeMax;
- if (chunkSizeThreshold <= 0) {
- mChunkSizeThreshold = 1;
- } else if (chunkSizeThreshold > chunkSizeMax) {
- mChunkSizeThreshold = chunkSizeMax;
- } else {
- mChunkSizeThreshold = chunkSizeThreshold;
- }
- mChunk = new byte[mChunkSizeMax];
- }
-
- public byte[] update(byte[] input, int inputOffset, int inputLength) throws KeyStoreException {
- if (inputLength == 0 || input == null) {
- // No input provided
- return EmptyArray.BYTE;
- }
- if (inputLength < 0 || inputOffset < 0 || (inputOffset + inputLength) > input.length) {
- throw new KeyStoreException(KeymasterDefs.KM_ERROR_UNKNOWN_ERROR,
- "Input offset and length out of bounds of input array");
- }
-
- byte[] output = EmptyArray.BYTE;
-
- while (inputLength > 0 || mChunkLength >= mChunkSizeThreshold) {
- int inputConsumed = ArrayUtils.copy(input, inputOffset, mChunk, mChunkLength,
- inputLength);
- inputLength -= inputConsumed;
- inputOffset += inputConsumed;
- mChunkLength += inputConsumed;
- mConsumedInputSizeBytes += inputConsumed;
-
- if (mChunkLength > mChunkSizeMax) {
- throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH,
- "Chunk size exceeded max chunk size. Max: " + mChunkSizeMax
- + " Actual: " + mChunkLength);
- }
-
- if (mChunkLength >= mChunkSizeThreshold) {
- OperationResult opResult = mKeyStoreStream.update(
- ArrayUtils.subarray(mChunk, 0, mChunkLength));
-
- if (opResult == null) {
- throw new KeyStoreConnectException();
- } else if (opResult.resultCode != KeyStore.NO_ERROR) {
- throw KeyStore.getKeyStoreException(opResult.resultCode);
- }
- if (opResult.inputConsumed <= 0) {
- throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_INPUT_LENGTH,
- "Keystore consumed 0 of " + mChunkLength + " bytes provided.");
- } else if (opResult.inputConsumed > mChunkLength) {
- throw new KeyStoreException(KeymasterDefs.KM_ERROR_UNKNOWN_ERROR,
- "Keystore consumed more input than provided. Provided: "
- + mChunkLength + ", consumed: " + opResult.inputConsumed);
- }
- mChunkLength -= opResult.inputConsumed;
-
- if (mChunkLength > 0) {
- // Partialy consumed, shift chunk contents
- ArrayUtils.copy(mChunk, opResult.inputConsumed, mChunk, 0, mChunkLength);
- }
-
- if ((opResult.output != null) && (opResult.output.length > 0)) {
- // Output was produced
- mProducedOutputSizeBytes += opResult.output.length;
- output = ArrayUtils.concat(output, opResult.output);
- }
- }
- }
- return output;
- }
-
- public byte[] doFinal(byte[] input, int inputOffset, int inputLength,
- byte[] signature, byte[] additionalEntropy) throws KeyStoreException {
- byte[] output = update(input, inputOffset, inputLength);
- byte[] finalChunk = ArrayUtils.subarray(mChunk, 0, mChunkLength);
- OperationResult opResult = mKeyStoreStream.finish(finalChunk, signature, additionalEntropy);
-
- if (opResult == null) {
- throw new KeyStoreConnectException();
- } else if (opResult.resultCode != KeyStore.NO_ERROR) {
- throw KeyStore.getKeyStoreException(opResult.resultCode);
- }
- // If no error, assume all input consumed
- mConsumedInputSizeBytes += finalChunk.length;
-
- if ((opResult.output != null) && (opResult.output.length > 0)) {
- mProducedOutputSizeBytes += opResult.output.length;
- output = ArrayUtils.concat(output, opResult.output);
- }
-
- return output;
- }
-
- @Override
- public long getConsumedInputSizeBytes() {
- return mConsumedInputSizeBytes;
- }
-
- @Override
- public long getProducedOutputSizeBytes() {
- return mProducedOutputSizeBytes;
- }
-
- /**
- * Main data stream via a KeyStore streaming operation.
- *
- * <p>For example, for an encryption operation, this is the stream through which plaintext is
- * provided and ciphertext is obtained.
- */
- public static class MainDataStream implements Stream {
-
- private final KeyStore mKeyStore;
- private final IBinder mOperationToken;
-
- public MainDataStream(KeyStore keyStore, IBinder operationToken) {
- mKeyStore = keyStore;
- mOperationToken = operationToken;
- }
-
- @Override
- public OperationResult update(byte[] input) {
- return mKeyStore.update(mOperationToken, null, input);
- }
-
- @Override
- public OperationResult finish(byte[] input, byte[] signature, byte[] additionalEntropy) {
- return mKeyStore.finish(mOperationToken, null, input, signature, additionalEntropy);
- }
- }
-}
diff --git a/keystore/java/android/security/keystore/KeyStoreCryptoOperationStreamer.java b/keystore/java/android/security/keystore/KeyStoreCryptoOperationStreamer.java
deleted file mode 100644
index 062c2d4..0000000
--- a/keystore/java/android/security/keystore/KeyStoreCryptoOperationStreamer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.security.KeyStore;
-import android.security.KeyStoreException;
-
-/**
- * Helper for streaming a crypto operation's input and output via {@link KeyStore} service's
- * {@code update} and {@code finish} operations.
- *
- * <p>The helper abstracts away to issues that need to be solved in most code that uses KeyStore's
- * update and finish operations. Firstly, KeyStore's update operation can consume only a limited
- * amount of data in one go because the operations are marshalled via Binder. Secondly, the update
- * operation may consume less data than provided, in which case the caller has to buffer the
- * remainder for next time. The helper exposes {@link #update(byte[], int, int) update} and
- * {@link #doFinal(byte[], int, int, byte[], byte[]) doFinal} operations which can be used to
- * conveniently implement various JCA crypto primitives.
- *
- * @hide
- */
-interface KeyStoreCryptoOperationStreamer {
- byte[] update(byte[] input, int inputOffset, int inputLength) throws KeyStoreException;
- byte[] doFinal(byte[] input, int inputOffset, int inputLength, byte[] signature,
- byte[] additionalEntropy) throws KeyStoreException;
- long getConsumedInputSizeBytes();
- long getProducedOutputSizeBytes();
-}
diff --git a/keystore/java/android/security/keystore/KeyStoreCryptoOperationUtils.java b/keystore/java/android/security/keystore/KeyStoreCryptoOperationUtils.java
deleted file mode 100644
index c82b6e6b..0000000
--- a/keystore/java/android/security/keystore/KeyStoreCryptoOperationUtils.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.security.KeyStore;
-import android.security.keymaster.KeymasterDefs;
-
-import libcore.util.EmptyArray;
-
-import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.SecureRandom;
-
-/**
- * Assorted utility methods for implementing crypto operations on top of KeyStore.
- *
- * @hide
- */
-abstract class KeyStoreCryptoOperationUtils {
-
- private static volatile SecureRandom sRng;
-
- private KeyStoreCryptoOperationUtils() {}
-
- /**
- * Returns the {@link InvalidKeyException} to be thrown by the {@code init} method of
- * the crypto operation in response to {@code KeyStore.begin} operation or {@code null} if
- * the {@code init} method should succeed.
- */
- static InvalidKeyException getInvalidKeyExceptionForInit(
- KeyStore keyStore, AndroidKeyStoreKey key, int beginOpResultCode) {
- if (beginOpResultCode == KeyStore.NO_ERROR) {
- return null;
- }
-
- // An error occurred. However, some errors should not lead to init throwing an exception.
- // See below.
- InvalidKeyException e =
- keyStore.getInvalidKeyException(key.getAlias(), key.getUid(), beginOpResultCode);
- switch (beginOpResultCode) {
- case KeyStore.OP_AUTH_NEEDED:
- // Operation needs to be authorized by authenticating the user. Don't throw an
- // exception is such authentication is possible for this key
- // (UserNotAuthenticatedException). An example of when it's not possible is where
- // the key is permanently invalidated (KeyPermanentlyInvalidatedException).
- if (e instanceof UserNotAuthenticatedException) {
- return null;
- }
- break;
- }
- return e;
- }
-
- /**
- * Returns the exception to be thrown by the {@code Cipher.init} method of the crypto operation
- * in response to {@code KeyStore.begin} operation or {@code null} if the {@code init} method
- * should succeed.
- */
- public static GeneralSecurityException getExceptionForCipherInit(
- KeyStore keyStore, AndroidKeyStoreKey key, int beginOpResultCode) {
- if (beginOpResultCode == KeyStore.NO_ERROR) {
- return null;
- }
-
- // Cipher-specific cases
- switch (beginOpResultCode) {
- case KeymasterDefs.KM_ERROR_INVALID_NONCE:
- return new InvalidAlgorithmParameterException("Invalid IV");
- case KeymasterDefs.KM_ERROR_CALLER_NONCE_PROHIBITED:
- return new InvalidAlgorithmParameterException("Caller-provided IV not permitted");
- }
-
- // General cases
- return getInvalidKeyExceptionForInit(keyStore, key, beginOpResultCode);
- }
-
- /**
- * Returns the requested number of random bytes to mix into keystore/keymaster RNG.
- *
- * @param rng RNG from which to obtain the random bytes or {@code null} for the platform-default
- * RNG.
- */
- static byte[] getRandomBytesToMixIntoKeystoreRng(SecureRandom rng, int sizeBytes) {
- if (sizeBytes <= 0) {
- return EmptyArray.BYTE;
- }
- if (rng == null) {
- rng = getRng();
- }
- byte[] result = new byte[sizeBytes];
- rng.nextBytes(result);
- return result;
- }
-
- private static SecureRandom getRng() {
- // IMPLEMENTATION NOTE: It's OK to share a SecureRandom instance because SecureRandom is
- // required to be thread-safe.
- if (sRng == null) {
- sRng = new SecureRandom();
- }
- return sRng;
- }
-}
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
deleted file mode 100644
index 670ef5e..0000000
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (C) 2015 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.security.keystore;
-
-import android.hardware.biometrics.BiometricManager;
-import android.security.GateKeeper;
-import android.security.KeyStore;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterDefs;
-
-import java.security.ProviderException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @hide
- */
-public abstract class KeymasterUtils {
-
- private KeymasterUtils() {}
-
- public static int getDigestOutputSizeBits(int keymasterDigest) {
- switch (keymasterDigest) {
- case KeymasterDefs.KM_DIGEST_NONE:
- return -1;
- case KeymasterDefs.KM_DIGEST_MD5:
- return 128;
- case KeymasterDefs.KM_DIGEST_SHA1:
- return 160;
- case KeymasterDefs.KM_DIGEST_SHA_2_224:
- return 224;
- case KeymasterDefs.KM_DIGEST_SHA_2_256:
- return 256;
- case KeymasterDefs.KM_DIGEST_SHA_2_384:
- return 384;
- case KeymasterDefs.KM_DIGEST_SHA_2_512:
- return 512;
- default:
- throw new IllegalArgumentException("Unknown digest: " + keymasterDigest);
- }
- }
-
- public static boolean isKeymasterBlockModeIndCpaCompatibleWithSymmetricCrypto(
- int keymasterBlockMode) {
- switch (keymasterBlockMode) {
- case KeymasterDefs.KM_MODE_ECB:
- return false;
- case KeymasterDefs.KM_MODE_CBC:
- case KeymasterDefs.KM_MODE_CTR:
- case KeymasterDefs.KM_MODE_GCM:
- return true;
- default:
- throw new IllegalArgumentException("Unsupported block mode: " + keymasterBlockMode);
- }
- }
-
- public static boolean isKeymasterPaddingSchemeIndCpaCompatibleWithAsymmetricCrypto(
- int keymasterPadding) {
- switch (keymasterPadding) {
- case KeymasterDefs.KM_PAD_NONE:
- return false;
- case KeymasterDefs.KM_PAD_RSA_OAEP:
- case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT:
- return true;
- default:
- throw new IllegalArgumentException(
- "Unsupported asymmetric encryption padding scheme: " + keymasterPadding);
- }
- }
-
- private static void addSids(KeymasterArguments args, UserAuthArgs spec) {
- // If both biometric and credential are accepted, then just use the root sid from gatekeeper
- if (spec.getUserAuthenticationType() == (KeyProperties.AUTH_BIOMETRIC_STRONG
- | KeyProperties.AUTH_DEVICE_CREDENTIAL)) {
- if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
- args.addUnsignedLong(KeymasterDefs.KM_TAG_USER_SECURE_ID,
- KeymasterArguments.toUint64(spec.getBoundToSpecificSecureUserId()));
- } else {
- // The key is authorized for use for the specified amount of time after the user has
- // authenticated. Whatever unlocks the secure lock screen should authorize this key.
- args.addUnsignedLong(KeymasterDefs.KM_TAG_USER_SECURE_ID,
- KeymasterArguments.toUint64(getRootSid()));
- }
- } else {
- List<Long> sids = new ArrayList<>();
- if ((spec.getUserAuthenticationType() & KeyProperties.AUTH_BIOMETRIC_STRONG) != 0) {
- final BiometricManager bm = KeyStore.getApplicationContext()
- .getSystemService(BiometricManager.class);
-
- // TODO: Restore permission check in getAuthenticatorIds once the ID is no longer
- // needed here.
-
- final long[] biometricSids = bm.getAuthenticatorIds();
-
- if (biometricSids.length == 0) {
- throw new IllegalStateException(
- "At least one biometric must be enrolled to create keys requiring user"
- + " authentication for every use");
- }
-
- if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
- sids.add(spec.getBoundToSpecificSecureUserId());
- } else if (spec.isInvalidatedByBiometricEnrollment()) {
- // The biometric-only SIDs will change on biometric enrollment or removal of all
- // enrolled templates, invalidating the key.
- for (long sid : biometricSids) {
- sids.add(sid);
- }
- } else {
- // The root SID will *not* change on fingerprint enrollment, or removal of all
- // enrolled fingerprints, allowing the key to remain valid.
- sids.add(getRootSid());
- }
- } else if ((spec.getUserAuthenticationType() & KeyProperties.AUTH_DEVICE_CREDENTIAL)
- != 0) {
- sids.add(getRootSid());
- } else {
- throw new IllegalStateException("Invalid or no authentication type specified.");
- }
-
- for (int i = 0; i < sids.size(); i++) {
- args.addUnsignedLong(KeymasterDefs.KM_TAG_USER_SECURE_ID,
- KeymasterArguments.toUint64(sids.get(i)));
- }
- }
- }
-
- /**
- * Adds keymaster arguments to express the key's authorization policy supported by user
- * authentication.
- *
- * @param args The arguments sent to keymaster that need to be populated from the spec
- * @param spec The user authentication relevant portions of the spec passed in from the caller.
- * This spec will be translated into the relevant keymaster tags to be loaded into args.
- * @throws IllegalStateException if user authentication is required but the system is in a wrong
- * state (e.g., secure lock screen not set up) for generating or importing keys that
- * require user authentication.
- */
- public static void addUserAuthArgs(KeymasterArguments args, UserAuthArgs spec) {
-
- if (spec.isUserConfirmationRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
- }
-
- if (spec.isUserPresenceRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
- }
-
- if (spec.isUnlockedDeviceRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_UNLOCKED_DEVICE_REQUIRED);
- }
-
- if (!spec.isUserAuthenticationRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- return;
- }
-
- if (spec.getUserAuthenticationValidityDurationSeconds() == 0) {
- // Every use of this key needs to be authorized by the user.
- addSids(args, spec);
- args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType());
-
- if (spec.isUserAuthenticationValidWhileOnBody()) {
- throw new ProviderException("Key validity extension while device is on-body is not "
- + "supported for keys requiring fingerprint authentication");
- }
- } else {
- addSids(args, spec);
- args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType());
- args.addUnsignedInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
- spec.getUserAuthenticationValidityDurationSeconds());
- if (spec.isUserAuthenticationValidWhileOnBody()) {
- args.addBoolean(KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY);
- }
- }
- }
-
- /**
- * Adds {@code KM_TAG_MIN_MAC_LENGTH} tag, if necessary, to the keymaster arguments for
- * generating or importing a key. This tag may only be needed for symmetric keys (e.g., HMAC,
- * AES-GCM).
- */
- public static void addMinMacLengthAuthorizationIfNecessary(KeymasterArguments args,
- int keymasterAlgorithm,
- int[] keymasterBlockModes,
- int[] keymasterDigests) {
- switch (keymasterAlgorithm) {
- case KeymasterDefs.KM_ALGORITHM_AES:
- if (com.android.internal.util.ArrayUtils.contains(
- keymasterBlockModes, KeymasterDefs.KM_MODE_GCM)) {
- // AES GCM key needs the minimum length of AEAD tag specified.
- args.addUnsignedInt(KeymasterDefs.KM_TAG_MIN_MAC_LENGTH,
- AndroidKeyStoreAuthenticatedAESCipherSpi.GCM
- .MIN_SUPPORTED_TAG_LENGTH_BITS);
- }
- break;
- case KeymasterDefs.KM_ALGORITHM_HMAC:
- // HMAC key needs the minimum length of MAC set to the output size of the associated
- // digest. This is because we do not offer a way to generate shorter MACs and
- // don't offer a way to verify MACs (other than by generating them).
- if (keymasterDigests.length != 1) {
- throw new ProviderException(
- "Unsupported number of authorized digests for HMAC key: "
- + keymasterDigests.length
- + ". Exactly one digest must be authorized");
- }
- int keymasterDigest = keymasterDigests[0];
- int digestOutputSizeBits = getDigestOutputSizeBits(keymasterDigest);
- if (digestOutputSizeBits == -1) {
- throw new ProviderException(
- "HMAC key authorized for unsupported digest: "
- + KeyProperties.Digest.fromKeymaster(keymasterDigest));
- }
- args.addUnsignedInt(KeymasterDefs.KM_TAG_MIN_MAC_LENGTH, digestOutputSizeBits);
- break;
- }
- }
-
- private static long getRootSid() {
- long rootSid = GateKeeper.getSecureUserId();
- if (rootSid == 0) {
- throw new IllegalStateException("Secure lock screen must be enabled"
- + " to create keys requiring user authentication");
- }
- return rootSid;
- }
-}
diff --git a/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
index d1cc572..c1842b4 100644
--- a/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
+++ b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
@@ -16,8 +16,8 @@
package android.security.keystore;
-import android.security.KeyStore;
import android.security.KeyStoreException;
+import android.security.keymaster.KeymasterDefs;
import java.security.ProviderException;
@@ -31,7 +31,7 @@
}
public SecureKeyImportUnavailableException(String message) {
- super(message, new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE,
+ super(message, new KeyStoreException(KeymasterDefs.KM_ERROR_HARDWARE_TYPE_UNAVAILABLE,
"Secure Key Import not available"));
}
diff --git a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
index 6c7e9a9..1f4e12e 100644
--- a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
+++ b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
@@ -16,8 +16,8 @@
package android.security.keystore;
-import android.security.KeyStore;
import android.security.KeyStoreException;
+import android.security.keymaster.KeymasterDefs;
import java.security.ProviderException;
@@ -33,7 +33,8 @@
public StrongBoxUnavailableException(String message) {
super(message,
- new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE, "No StrongBox available")
+ new KeyStoreException(KeymasterDefs.KM_ERROR_HARDWARE_TYPE_UNAVAILABLE,
+ "No StrongBox available")
);
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
index 0f77749..268b15bf 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
@@ -21,7 +21,6 @@
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyStoreCryptoOperation;
-import android.security.keystore.KeymasterUtils;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
index 1575bb4..f1681ec 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
@@ -20,12 +20,10 @@
import android.hardware.security.keymint.SecurityLevel;
import android.security.KeyStore2;
import android.security.KeyStoreSecurityLevel;
-import android.security.keymaster.KeymasterArguments;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.ArrayUtils;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.security.keystore.KeymasterUtils;
import android.security.keystore.StrongBoxUnavailableException;
import android.system.keystore2.Domain;
import android.system.keystore2.IKeystoreSecurityLevel;
@@ -259,7 +257,7 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), spec);
+ KeyStore2ParameterUtils.addUserAuthArgs(new ArrayList<>(), spec);
} catch (IllegalStateException | IllegalArgumentException e) {
throw new InvalidAlgorithmParameterException(e);
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
index 2d8901a..c26d9f583 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityThread;
import android.content.Context;
import android.hardware.security.keymint.KeyParameter;
import android.hardware.security.keymint.KeyPurpose;
@@ -28,7 +29,6 @@
import android.security.GenerateRkpKey;
import android.security.GenerateRkpKeyException;
import android.security.KeyPairGeneratorSpec;
-import android.security.KeyStore;
import android.security.KeyStore2;
import android.security.KeyStoreException;
import android.security.KeyStoreSecurityLevel;
@@ -39,7 +39,6 @@
import android.security.keystore.DeviceIdAttestationException;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.security.keystore.KeymasterUtils;
import android.security.keystore.SecureKeyImportUnavailableException;
import android.security.keystore.StrongBoxUnavailableException;
import android.system.keystore2.Authorization;
@@ -270,7 +269,7 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), mSpec);
+ KeyStore2ParameterUtils.addUserAuthArgs(new ArrayList<>(), mSpec);
} catch (IllegalArgumentException | IllegalStateException e) {
throw new InvalidAlgorithmParameterException(e);
}
@@ -572,7 +571,8 @@
AndroidKeyStorePublicKey publicKey =
AndroidKeyStoreProvider.makeAndroidKeyStorePublicKeyFromKeyEntryResponse(
descriptor, metadata, iSecurityLevel, mKeymasterAlgorithm);
- GenerateRkpKey keyGen = new GenerateRkpKey(KeyStore.getApplicationContext());
+ GenerateRkpKey keyGen = new GenerateRkpKey(ActivityThread
+ .currentApplication());
try {
if (mSpec.getAttestationChallenge() != null) {
keyGen.notifyKeyGenerated(securityLevel);
@@ -589,7 +589,8 @@
case KeymasterDefs.KM_ERROR_HARDWARE_TYPE_UNAVAILABLE:
throw new StrongBoxUnavailableException("Failed to generated key pair.", e);
case ResponseCode.OUT_OF_KEYS:
- GenerateRkpKey keyGen = new GenerateRkpKey(KeyStore.getApplicationContext());
+ GenerateRkpKey keyGen = new GenerateRkpKey(ActivityThread
+ .currentApplication());
try {
keyGen.notifyEmpty(securityLevel);
} catch (RemoteException f) {
@@ -665,8 +666,8 @@
if (idTypesSet.contains(AttestationUtils.ID_TYPE_IMEI)
|| idTypesSet.contains(AttestationUtils.ID_TYPE_MEID)) {
telephonyService =
- (TelephonyManager) KeyStore.getApplicationContext().getSystemService(
- Context.TELEPHONY_SERVICE);
+ (TelephonyManager) android.app.AppGlobals.getInitialApplication()
+ .getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyService == null) {
throw new DeviceIdAttestationException("Unable to access telephony service");
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
index ba6d22f..89d2b74 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
@@ -110,23 +110,6 @@
putSecretKeyFactoryImpl("HmacSHA512");
}
- private static boolean sInstalled = false;
-
- /**
- * This function indicates whether or not this provider was installed. This is manly used
- * as indicator for
- * {@link android.security.keystore.AndroidKeyStoreProvider#getKeyStoreForUid(int)}
- * to whether or not to retrieve the Keystore provider by "AndroidKeyStoreLegacy".
- * This function can be removed once the transition to Keystore 2.0 is complete.
- * b/171305684
- *
- * @return true if this provider was installed.
- * @hide
- */
- public static boolean isInstalled() {
- return sInstalled;
- }
-
/**
* Installs a new instance of this provider (and the
* {@link AndroidKeyStoreBCWorkaroundProvider}).
@@ -142,7 +125,6 @@
break;
}
}
- sInstalled = true;
Security.addProvider(new AndroidKeyStoreProvider());
Provider workaroundProvider = new AndroidKeyStoreBCWorkaroundProvider();
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
index 6ff9432..5848247 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
@@ -21,7 +21,6 @@
import android.hardware.security.keymint.KeyParameter;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
-import android.security.keystore.KeymasterUtils;
import android.system.keystore2.Authorization;
import java.security.AlgorithmParameters;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index 32f98a2..3e2fb94 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -30,7 +30,6 @@
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
-import android.security.keystore.KeymasterUtils;
import android.security.keystore.SecureKeyImportUnavailableException;
import android.security.keystore.WrappedKeyEntry;
import android.system.keystore2.AuthenticatorSpec;
diff --git a/keystore/java/android/security/keystore2/KeymasterUtils.java b/keystore/java/android/security/keystore2/KeymasterUtils.java
new file mode 100644
index 0000000..de4696c
--- /dev/null
+++ b/keystore/java/android/security/keystore2/KeymasterUtils.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2021 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.security.keystore2;
+
+import android.security.keymaster.KeymasterArguments;
+import android.security.keymaster.KeymasterDefs;
+import android.security.keystore.KeyProperties;
+
+import java.security.ProviderException;
+
+/**
+ * @hide
+ */
+public abstract class KeymasterUtils {
+
+ private KeymasterUtils() {}
+
+ /** @hide */
+ static int getDigestOutputSizeBits(int keymasterDigest) {
+ switch (keymasterDigest) {
+ case KeymasterDefs.KM_DIGEST_NONE:
+ return -1;
+ case KeymasterDefs.KM_DIGEST_MD5:
+ return 128;
+ case KeymasterDefs.KM_DIGEST_SHA1:
+ return 160;
+ case KeymasterDefs.KM_DIGEST_SHA_2_224:
+ return 224;
+ case KeymasterDefs.KM_DIGEST_SHA_2_256:
+ return 256;
+ case KeymasterDefs.KM_DIGEST_SHA_2_384:
+ return 384;
+ case KeymasterDefs.KM_DIGEST_SHA_2_512:
+ return 512;
+ default:
+ throw new IllegalArgumentException("Unknown digest: " + keymasterDigest);
+ }
+ }
+
+ /** @hide */
+ static boolean isKeymasterBlockModeIndCpaCompatibleWithSymmetricCrypto(
+ int keymasterBlockMode) {
+ switch (keymasterBlockMode) {
+ case KeymasterDefs.KM_MODE_ECB:
+ return false;
+ case KeymasterDefs.KM_MODE_CBC:
+ case KeymasterDefs.KM_MODE_CTR:
+ case KeymasterDefs.KM_MODE_GCM:
+ return true;
+ default:
+ throw new IllegalArgumentException("Unsupported block mode: " + keymasterBlockMode);
+ }
+ }
+
+ /** @hide */
+ static boolean isKeymasterPaddingSchemeIndCpaCompatibleWithAsymmetricCrypto(
+ int keymasterPadding) {
+ switch (keymasterPadding) {
+ case KeymasterDefs.KM_PAD_NONE:
+ return false;
+ case KeymasterDefs.KM_PAD_RSA_OAEP:
+ case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT:
+ return true;
+ default:
+ throw new IllegalArgumentException(
+ "Unsupported asymmetric encryption padding scheme: " + keymasterPadding);
+ }
+ }
+
+ /**
+ * Adds {@code KM_TAG_MIN_MAC_LENGTH} tag, if necessary, to the keymaster arguments for
+ * generating or importing a key. This tag may only be needed for symmetric keys (e.g., HMAC,
+ * AES-GCM).
+ */
+ public static void addMinMacLengthAuthorizationIfNecessary(KeymasterArguments args,
+ int keymasterAlgorithm,
+ int[] keymasterBlockModes,
+ int[] keymasterDigests) {
+ switch (keymasterAlgorithm) {
+ case KeymasterDefs.KM_ALGORITHM_AES:
+ if (com.android.internal.util.ArrayUtils.contains(
+ keymasterBlockModes, KeymasterDefs.KM_MODE_GCM)) {
+ // AES GCM key needs the minimum length of AEAD tag specified.
+ args.addUnsignedInt(KeymasterDefs.KM_TAG_MIN_MAC_LENGTH,
+ AndroidKeyStoreAuthenticatedAESCipherSpi.GCM
+ .MIN_SUPPORTED_TAG_LENGTH_BITS);
+ }
+ break;
+ case KeymasterDefs.KM_ALGORITHM_HMAC:
+ // HMAC key needs the minimum length of MAC set to the output size of the associated
+ // digest. This is because we do not offer a way to generate shorter MACs and
+ // don't offer a way to verify MACs (other than by generating them).
+ if (keymasterDigests.length != 1) {
+ throw new ProviderException(
+ "Unsupported number of authorized digests for HMAC key: "
+ + keymasterDigests.length
+ + ". Exactly one digest must be authorized");
+ }
+ int keymasterDigest = keymasterDigests[0];
+ int digestOutputSizeBits = getDigestOutputSizeBits(keymasterDigest);
+ if (digestOutputSizeBits == -1) {
+ throw new ProviderException(
+ "HMAC key authorized for unsupported digest: "
+ + KeyProperties.Digest.fromKeymaster(keymasterDigest));
+ }
+ args.addUnsignedInt(KeymasterDefs.KM_TAG_MIN_MAC_LENGTH, digestOutputSizeBits);
+ break;
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 6edaf6f..4b43102 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.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="pip_phone_close" msgid="5783752637260411309">"סגירה"</string>
- <string name="pip_phone_expand" msgid="2579292903468287504">"הרחב"</string>
+ <string name="pip_phone_expand" msgid="2579292903468287504">"הרחבה"</string>
<string name="pip_phone_settings" msgid="5468987116750491918">"הגדרות"</string>
<string name="pip_menu_title" msgid="5393619322111827096">"תפריט"</string>
<string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> במצב תמונה בתוך תמונה"</string>
@@ -43,12 +43,12 @@
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"עליון 50%"</string>
<string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"למעלה 30%"</string>
<string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"מסך תחתון מלא"</string>
- <string name="one_handed_tutorial_title" msgid="4583241688067426350">"איך להשתמש במצב שימוש ביד אחת"</string>
+ <string name="one_handed_tutorial_title" msgid="4583241688067426350">"איך להשתמש בתכונה \'מצב שימוש ביד אחת\'"</string>
<string name="one_handed_tutorial_description" msgid="3486582858591353067">"כדי לצאת, יש להחליק למעלה מתחתית המסך או להקיש במקום כלשהו במסך מעל האפליקציה"</string>
<string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"הפעלה של מצב שימוש ביד אחת"</string>
<string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"יציאה ממצב שימוש ביד אחת"</string>
<string name="bubbles_settings_button_description" msgid="1301286017420516912">"הגדרות לבועות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"גלישה"</string>
+ <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"אפשרויות נוספות"</string>
<string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"הוספה בחזרה לערימה"</string>
<string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מהאפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מ-<xliff:g id="APP_NAME">%2$s</xliff:g> ועוד <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index fcd706f..0601f15 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -22,7 +22,7 @@
<string name="pip_phone_settings" msgid="5468987116750491918">"Instellingen"</string>
<string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
<string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in scherm-in-scherm"</string>
- <string name="pip_notification_message" msgid="8854051911700302620">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
+ <string name="pip_notification_message" msgid="8854051911700302620">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en zet je de functie uit."</string>
<string name="pip_play" msgid="3496151081459417097">"Afspelen"</string>
<string name="pip_pause" msgid="690688849510295232">"Onderbreken"</string>
<string name="pip_skip_to_next" msgid="8403429188794867653">"Doorgaan naar volgende"</string>
@@ -62,7 +62,7 @@
<string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatten met bubbels"</string>
<string name="bubbles_user_education_description" msgid="4215862563054175407">"Nieuwe gesprekken worden als zwevende iconen of bubbels getoond. Tik om een bubbel te openen. Sleep om een bubbel te verplaatsen."</string>
<string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Beheer bubbels wanneer je wilt"</string>
- <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Beheren om bubbels van deze app uit te schakelen"</string>
+ <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Beheren om bubbels van deze app uit te zetten"</string>
<string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
<string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Geen recente bubbels"</string>
<string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recente bubbels en gesloten bubbels zie je hier"</string>
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index 0e78377..6698a01 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -30,6 +30,9 @@
<!-- Allow PIP to resize to a slightly bigger state upon touch/showing the menu -->
<bool name="config_pipEnableResizeForMenu">true</bool>
+ <!-- Allow PIP to resize via dragging the corner of PiP. -->
+ <bool name="config_pipEnableDragCornerResize">false</bool>
+
<!-- Allow PIP to enable round corner, see also R.dimen.pip_corner_radius -->
<bool name="config_pipEnableRoundCorner">false</bool>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 9eec48c..64bd245 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -268,7 +268,7 @@
private boolean mIsDraggingStack = false;
/** Whether the expanded view has been hidden, because we are dragging out a bubble. */
- private boolean mExpandedViewHidden = false;
+ private boolean mExpandedViewTemporarilyHidden = false;
/** Animator for animating the expanded view's alpha (including the TaskView inside it). */
private final ValueAnimator mExpandedViewAlphaAnimator = ValueAnimator.ofFloat(0f, 1f);
@@ -968,7 +968,13 @@
@Override
public void onAnimationEnd(Animator animation) {
- if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) {
+ if (mExpandedBubble != null
+ && mExpandedBubble.getExpandedView() != null
+ // The surface needs to be Z ordered on top for alpha values to work on the
+ // TaskView, and if we're temporarily hidden, we are still on the screen
+ // with alpha = 0f until we animate back. Stay Z ordered on top so the alpha
+ // = 0f remains in effect.
+ && !mExpandedViewTemporarilyHidden) {
mExpandedBubble.getExpandedView().setSurfaceZOrderedOnTop(false);
mExpandedBubble.getExpandedView().setAlphaAnimating(false);
}
@@ -983,7 +989,7 @@
mAnimatingOutSurfaceAlphaAnimator.setDuration(EXPANDED_VIEW_ALPHA_ANIMATION_DURATION);
mAnimatingOutSurfaceAlphaAnimator.setInterpolator(Interpolators.PANEL_CLOSE_ACCELERATED);
mAnimatingOutSurfaceAlphaAnimator.addUpdateListener(valueAnimator -> {
- if (!mExpandedViewHidden) {
+ if (!mExpandedViewTemporarilyHidden) {
mAnimatingOutSurfaceView.setAlpha((float) valueAnimator.getAnimatedValue());
}
});
@@ -1596,7 +1602,7 @@
// If we're expanded, screenshot the currently expanded bubble (before expanding the newly
// selected bubble) so we can animate it out.
if (mIsExpanded && mExpandedBubble != null && mExpandedBubble.getExpandedView() != null
- && !mExpandedViewHidden) {
+ && !mExpandedViewTemporarilyHidden) {
if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) {
// Before screenshotting, have the real ActivityView show on top of other surfaces
// so that the screenshot doesn't flicker on top of it.
@@ -1722,13 +1728,13 @@
/** Animate the expanded view hidden. This is done while we're dragging out a bubble. */
private void hideExpandedViewIfNeeded() {
- if (mExpandedViewHidden
+ if (mExpandedViewTemporarilyHidden
|| mExpandedBubble == null
|| mExpandedBubble.getExpandedView() == null) {
return;
}
- mExpandedViewHidden = true;
+ mExpandedViewTemporarilyHidden = true;
// Scale down.
PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
@@ -1752,11 +1758,11 @@
* Animate the expanded view visible again. This is done when we're done dragging out a bubble.
*/
private void showExpandedViewIfNeeded() {
- if (!mExpandedViewHidden) {
+ if (!mExpandedViewTemporarilyHidden) {
return;
}
- mExpandedViewHidden = false;
+ mExpandedViewTemporarilyHidden = false;
PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
.spring(AnimatableScaleMatrix.SCALE_X,
@@ -2085,7 +2091,7 @@
mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);
})
.withEndActions(() -> {
- mExpandedViewHidden = false;
+ mExpandedViewTemporarilyHidden = false;
mIsBubbleSwitchAnimating = false;
})
.start();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
index af4ccad..5c3af3e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
@@ -42,7 +42,7 @@
* Controller class of PiP animations (both from and to PiP mode).
*/
public class PipAnimationController {
- private static final float FRACTION_START = 0f;
+ static final float FRACTION_START = 0f;
private static final float FRACTION_END = 1f;
public static final int ANIM_TYPE_BOUNDS = 0;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
index 702385e..7b834b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
@@ -57,9 +57,10 @@
private int mOverridableMinSize;
private Point mScreenEdgeInsets;
- public PipBoundsAlgorithm(Context context, @NonNull PipBoundsState pipBoundsState) {
+ public PipBoundsAlgorithm(Context context, @NonNull PipBoundsState pipBoundsState,
+ @NonNull PipSnapAlgorithm pipSnapAlgorithm) {
mPipBoundsState = pipBoundsState;
- mSnapAlgorithm = new PipSnapAlgorithm();
+ mSnapAlgorithm = pipSnapAlgorithm;
reloadResources(context);
// Initialize the aspect ratio to the default aspect ratio. Don't do this in reload
// resources as it would clobber mAspectRatio when entering PiP from fullscreen which
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
index 6afcc06..3af0ff0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
@@ -19,6 +19,8 @@
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
+import android.annotation.DrawableRes;
+import android.annotation.StringRes;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.BroadcastReceiver;
@@ -49,6 +51,7 @@
* when there is a media session from the top PiP activity.
*/
public class PipMediaController {
+ private static final String SYSTEMUI_PERMISSION = "com.android.systemui.permission.SELF";
private static final String ACTION_PLAY = "com.android.wm.shell.pip.PLAY";
private static final String ACTION_PAUSE = "com.android.wm.shell.pip.PAUSE";
@@ -87,18 +90,26 @@
private RemoteAction mNextAction;
private RemoteAction mPrevAction;
- private BroadcastReceiver mPlayPauseActionReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mMediaActionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (action.equals(ACTION_PLAY)) {
- mMediaController.getTransportControls().play();
- } else if (action.equals(ACTION_PAUSE)) {
- mMediaController.getTransportControls().pause();
- } else if (action.equals(ACTION_NEXT)) {
- mMediaController.getTransportControls().skipToNext();
- } else if (action.equals(ACTION_PREV)) {
- mMediaController.getTransportControls().skipToPrevious();
+ if (mMediaController == null || mMediaController.getTransportControls() == null) {
+ // no active media session, bail early.
+ return;
+ }
+ switch (intent.getAction()) {
+ case ACTION_PLAY:
+ mMediaController.getTransportControls().play();
+ break;
+ case ACTION_PAUSE:
+ mMediaController.getTransportControls().pause();
+ break;
+ case ACTION_NEXT:
+ mMediaController.getTransportControls().skipToNext();
+ break;
+ case ACTION_PREV:
+ mMediaController.getTransportControls().skipToPrevious();
+ break;
}
}
};
@@ -131,10 +142,19 @@
mediaControlFilter.addAction(ACTION_PAUSE);
mediaControlFilter.addAction(ACTION_NEXT);
mediaControlFilter.addAction(ACTION_PREV);
- mContext.registerReceiverForAllUsers(mPlayPauseActionReceiver, mediaControlFilter,
- null /* permission */, mainHandler);
+ mContext.registerReceiverForAllUsers(mMediaActionReceiver, mediaControlFilter,
+ SYSTEMUI_PERMISSION, mainHandler);
- createMediaActions();
+ // Creates the standard media buttons that we may show.
+ mPauseAction = getDefaultRemoteAction(R.string.pip_pause,
+ R.drawable.pip_ic_pause_white, ACTION_PAUSE);
+ mPlayAction = getDefaultRemoteAction(R.string.pip_play,
+ R.drawable.pip_ic_play_arrow_white, ACTION_PLAY);
+ mNextAction = getDefaultRemoteAction(R.string.pip_skip_to_next,
+ R.drawable.pip_ic_skip_next_white, ACTION_NEXT);
+ mPrevAction = getDefaultRemoteAction(R.string.pip_skip_to_prev,
+ R.drawable.pip_ic_skip_previous_white, ACTION_PREV);
+
mMediaSessionManager = context.getSystemService(MediaSessionManager.class);
}
@@ -216,32 +236,15 @@
return mediaActions;
}
- /**
- * Creates the standard media buttons that we may show.
- */
- private void createMediaActions() {
- String pauseDescription = mContext.getString(R.string.pip_pause);
- mPauseAction = new RemoteAction(Icon.createWithResource(mContext,
- R.drawable.pip_ic_pause_white), pauseDescription, pauseDescription,
- PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PAUSE),
- FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE));
-
- String playDescription = mContext.getString(R.string.pip_play);
- mPlayAction = new RemoteAction(Icon.createWithResource(mContext,
- R.drawable.pip_ic_play_arrow_white), playDescription, playDescription,
- PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PLAY),
- FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE));
-
- String nextDescription = mContext.getString(R.string.pip_skip_to_next);
- mNextAction = new RemoteAction(Icon.createWithResource(mContext,
- R.drawable.pip_ic_skip_next_white), nextDescription, nextDescription,
- PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_NEXT),
- FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE));
-
- String prevDescription = mContext.getString(R.string.pip_skip_to_prev);
- mPrevAction = new RemoteAction(Icon.createWithResource(mContext,
- R.drawable.pip_ic_skip_previous_white), prevDescription, prevDescription,
- PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PREV),
+ /** @return Default {@link RemoteAction} sends broadcast back to SysUI. */
+ private RemoteAction getDefaultRemoteAction(@StringRes int titleAndDescription,
+ @DrawableRes int icon, String action) {
+ final String titleAndDescriptionStr = mContext.getString(titleAndDescription);
+ final Intent intent = new Intent(action);
+ intent.setPackage(mContext.getPackageName());
+ return new RemoteAction(Icon.createWithResource(mContext, icon),
+ titleAndDescriptionStr, titleAndDescriptionStr,
+ PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE));
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index 99ec100..f6b63eb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -25,6 +25,7 @@
import static com.android.wm.shell.ShellTaskOrganizer.taskListenerTypeToString;
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_ALPHA;
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_BOUNDS;
+import static com.android.wm.shell.pip.PipAnimationController.FRACTION_START;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_EXPAND_OR_UNEXPAND;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN;
@@ -352,9 +353,19 @@
// updated right after applying the windowing mode change.
final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
mPictureInPictureParams, destinationBounds);
- scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds,
+ final PipAnimationController.PipTransitionAnimator<?> animator =
+ scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds,
0 /* startingAngle */, sourceHintRect, direction,
animationDurationMs, null /* updateBoundsCallback */);
+ if (animator != null) {
+ // Even though the animation was started above, re-apply the transaction for the
+ // first frame using the SurfaceControl.Transaction supplied by the
+ // SyncTransactionQueue. This is necessary because the initial surface transform
+ // may not be applied until the next frame if a different Transaction than the one
+ // supplied is used, resulting in 1 frame not being cropped to the source rect
+ // hint during expansion that causes a visible jank/flash. See b/184166183.
+ animator.applySurfaceControlTransaction(mLeash, t, FRACTION_START);
+ }
mState = State.EXITING_PIP;
});
}
@@ -768,22 +779,24 @@
* Animates resizing of the pinned stack given the duration and start bounds.
* This always animates the angle to zero from the starting angle.
*/
- private void scheduleAnimateResizePip(Rect currentBounds, Rect destinationBounds,
- float startingAngle, Rect sourceHintRect,
+ private @Nullable PipAnimationController.PipTransitionAnimator<?> scheduleAnimateResizePip(
+ Rect currentBounds, Rect destinationBounds, float startingAngle, Rect sourceHintRect,
@PipAnimationController.TransitionDirection int direction, int durationMs,
Consumer<Rect> updateBoundsCallback) {
if (!mState.isInPip()) {
// TODO: tend to use shouldBlockResizeRequest here as well but need to consider
// the fact that when in exitPip, scheduleAnimateResizePip is executed in the window
// container transaction callback and we want to set the mState immediately.
- return;
+ return null;
}
- animateResizePip(currentBounds, destinationBounds, sourceHintRect, direction, durationMs,
+ final PipAnimationController.PipTransitionAnimator<?> animator = animateResizePip(
+ currentBounds, destinationBounds, sourceHintRect, direction, durationMs,
startingAngle);
if (updateBoundsCallback != null) {
updateBoundsCallback.accept(destinationBounds);
}
+ return animator;
}
/**
@@ -968,28 +981,26 @@
destinationBounds.height());
mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest);
- mMainExecutor.execute(() -> {
- // Start animation to fade out the snapshot.
- final ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f);
- animator.setDuration(mEnterAnimationDuration);
- animator.addUpdateListener(animation -> {
- final float alpha = (float) animation.getAnimatedValue();
- final SurfaceControl.Transaction transaction =
- mSurfaceControlTransactionFactory.getTransaction();
- transaction.setAlpha(snapshotSurface, alpha);
- transaction.apply();
- });
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- final SurfaceControl.Transaction tx =
- mSurfaceControlTransactionFactory.getTransaction();
- tx.remove(snapshotSurface);
- tx.apply();
- }
- });
- animator.start();
+ // Start animation to fade out the snapshot.
+ final ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f);
+ animator.setDuration(mEnterAnimationDuration);
+ animator.addUpdateListener(animation -> {
+ final float alpha = (float) animation.getAnimatedValue();
+ final SurfaceControl.Transaction transaction =
+ mSurfaceControlTransactionFactory.getTransaction();
+ transaction.setAlpha(snapshotSurface, alpha);
+ transaction.apply();
});
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ final SurfaceControl.Transaction tx =
+ mSurfaceControlTransactionFactory.getTransaction();
+ tx.remove(snapshotSurface);
+ tx.apply();
+ }
+ });
+ animator.start();
});
} else {
applyFinishBoundsResize(wct, direction);
@@ -1050,26 +1061,28 @@
return WINDOWING_MODE_UNDEFINED;
}
- private void animateResizePip(Rect currentBounds, Rect destinationBounds, Rect sourceHintRect,
+ private @Nullable PipAnimationController.PipTransitionAnimator<?> animateResizePip(
+ Rect currentBounds, Rect destinationBounds, Rect sourceHintRect,
@PipAnimationController.TransitionDirection int direction, int durationMs,
float startingAngle) {
// Could happen when exitPip
if (mToken == null || mLeash == null) {
Log.w(TAG, "Abort animation, invalid leash");
- return;
+ return null;
}
final int rotationDelta = mWaitForFixedRotation
? ((mNextRotation - mPipBoundsState.getDisplayLayout().rotation()) + 4) % 4
: Surface.ROTATION_0;
Rect baseBounds = direction == TRANSITION_DIRECTION_SNAP_AFTER_RESIZE
? mPipBoundsState.getBounds() : currentBounds;
- mPipAnimationController
+ final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController
.getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds,
- sourceHintRect, direction, startingAngle, rotationDelta)
- .setTransitionDirection(direction)
+ sourceHintRect, direction, startingAngle, rotationDelta);
+ animator.setTransitionDirection(direction)
.setPipAnimationCallback(mPipAnimationCallback)
.setDuration(durationMs)
.start();
+ return animator;
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java
index 65f3d3a..4cf8ab4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java
@@ -526,6 +526,10 @@
* Handles a pointer event sent from pip input consumer.
*/
void handlePointerEvent(MotionEvent ev) {
+ if (mPipMenuView == null) {
+ return;
+ }
+
if (ev.isTouchEvent()) {
mPipMenuView.dispatchTouchEvent(ev);
} else {
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 d75c1d6..62ae1d5 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
@@ -95,6 +95,7 @@
private PipBoundsState mPipBoundsState;
private PipTouchHandler mTouchHandler;
private PipTransitionController mPipTransitionController;
+ private TaskStackListenerImpl mTaskStackListener;
private Optional<OneHandedController> mOneHandedController;
protected final PipImpl mImpl;
@@ -291,12 +292,18 @@
mAppOpsListener = pipAppOpsListener;
mOneHandedController = oneHandedController;
mPipTransitionController = pipTransitionController;
+ mTaskStackListener = taskStackListener;
mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(),
INPUT_CONSUMER_PIP, mainExecutor);
+ //TODO: move this to ShellInit when PipController can be injected
+ mMainExecutor.execute(this::init);
+ }
+
+ public void init() {
mPipTransitionController.registerPipTransitionCallback(this);
mPipTaskOrganizer.registerOnDisplayIdChangeCallback((int displayId) -> {
mPipBoundsState.setDisplayId(displayId);
- onDisplayChanged(displayController.getDisplayLayout(displayId),
+ onDisplayChanged(mDisplayController.getDisplayLayout(displayId),
false /* saveRestoreSnapFraction */);
});
mPipBoundsState.setOnMinimalSizeChangeCallback(
@@ -321,13 +328,13 @@
mPipInputConsumer.setInputListener(mTouchHandler::handleTouchEvent);
mPipInputConsumer.setRegistrationListener(mTouchHandler::onRegistrationChanged);
}
- displayController.addDisplayChangingController(mRotationController);
- displayController.addDisplayWindowListener(mDisplaysChangedListener);
+ mDisplayController.addDisplayChangingController(mRotationController);
+ mDisplayController.addDisplayWindowListener(mDisplaysChangedListener);
// Ensure that we have the display info in case we get calls to update the bounds before the
// listener calls back
- mPipBoundsState.setDisplayId(context.getDisplayId());
- mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));
+ mPipBoundsState.setDisplayId(mContext.getDisplayId());
+ mPipBoundsState.setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));
try {
mWindowManagerShellWrapper.addPinnedStackListener(mPinnedTaskListener);
@@ -349,7 +356,7 @@
}
// Handle for system task stack changes.
- taskStackListener.addListener(
+ mTaskStackListener.addListener(
new TaskStackListenerCallback() {
@Override
public void onActivityPinned(String packageName, int userId, int taskId,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
index 588571f..0a148c4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
@@ -103,6 +103,7 @@
private boolean mIsAttached;
private boolean mIsEnabled;
private boolean mEnablePinchResize;
+ private boolean mEnableDragCornerResize;
private boolean mIsSysUiStateValid;
private boolean mThresholdCrossed;
private boolean mOngoingPinchToResize = false;
@@ -174,6 +175,7 @@
private void reloadResources() {
final Resources res = mContext.getResources();
mDelta = res.getDimensionPixelSize(R.dimen.pip_resize_edge_size);
+ mEnableDragCornerResize = res.getBoolean(R.bool.config_pipEnableDragCornerResize);
mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
}
@@ -267,6 +269,10 @@
* |_|_| |_|_|
*/
public boolean isWithinDragResizeRegion(int x, int y) {
+ if (!mEnableDragCornerResize) {
+ return false;
+ }
+
final Rect currentPipBounds = mPipBoundsState.getBounds();
if (currentPipBounds == null) {
return false;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index d474b66..f29d4f5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -53,7 +53,6 @@
import com.android.wm.shell.pip.PipBoundsAlgorithm;
import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipTaskOrganizer;
-import com.android.wm.shell.pip.PipTransitionController;
import com.android.wm.shell.pip.PipUiEventLogger;
import java.io.PrintWriter;
@@ -158,7 +157,7 @@
PipBoundsAlgorithm pipBoundsAlgorithm,
@NonNull PipBoundsState pipBoundsState,
PipTaskOrganizer pipTaskOrganizer,
- PipTransitionController pipTransitionController,
+ PipMotionHelper pipMotionHelper,
FloatingContentCoordinator floatingContentCoordinator,
PipUiEventLogger pipUiEventLogger,
ShellExecutor mainExecutor) {
@@ -173,9 +172,7 @@
mFloatingContentCoordinator = floatingContentCoordinator;
mMenuController.addListener(new PipMenuListener());
mGesture = new DefaultPipTouchGesture();
- mMotionHelper = new PipMotionHelper(mContext, pipBoundsState, pipTaskOrganizer,
- mMenuController, mPipBoundsAlgorithm.getSnapAlgorithm(), pipTransitionController,
- floatingContentCoordinator);
+ mMotionHelper = pipMotionHelper;
mPipDismissTargetHandler = new PipDismissTargetHandler(context, pipUiEventLogger,
mMotionHelper, mainExecutor);
mPipResizeGestureHandler =
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipMovesInAllApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipShelfHeightTest.kt
similarity index 86%
rename from libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipMovesInAllApps.kt
rename to libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipShelfHeightTest.kt
index 5713822b..84f66fc 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipMovesInAllApps.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipShelfHeightTest.kt
@@ -18,13 +18,13 @@
import android.platform.test.annotations.Presubmit
import android.view.Surface
-import androidx.test.filters.FlakyTest
import androidx.test.filters.RequiresDevice
import com.android.launcher3.tapl.LauncherInstrumentation
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.wm.shell.flicker.helpers.FixedAppHelper
import com.google.common.truth.Truth
import org.junit.FixMethodOrder
import org.junit.Test
@@ -33,15 +33,16 @@
import org.junit.runners.Parameterized
/**
- * Test Pip launch.
- * To run this test: `atest WMShellFlickerTests:PipMovesInAllApps`
+ * Test Pip movement with Launcher shelf height change.
+ * To run this test: `atest WMShellFlickerTests:PipShelfHeightTest`
*/
@RequiresDevice
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-class PipMovesInAllApps(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
+class PipShelfHeightTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
private val taplInstrumentation = LauncherInstrumentation()
+ private val testApp = FixedAppHelper(instrumentation)
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = buildTransition(eachRun = false) {
@@ -49,10 +50,12 @@
eachRun {
taplInstrumentation.pressHome()
}
+ test {
+ testApp.exit(wmHelper)
+ }
}
transitions {
- taplInstrumentation.pressHome().switchToAllApps()
- wmHelper.waitForAppTransitionIdle()
+ testApp.launchViaIntent(wmHelper)
}
}
@@ -68,7 +71,7 @@
}
}
- @FlakyTest(bugId = 184050344)
+ @Presubmit
@Test
fun pipWindowMovesUp() = testSpec.assertWmEnd {
val initialState = this.trace?.first()?.wmState
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
index babfc5c..a0c6d11 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
@@ -24,7 +24,6 @@
import android.testing.TestableLooper;
import android.testing.TestableResources;
import android.util.Size;
-import android.view.Display;
import android.view.DisplayInfo;
import android.view.Gravity;
@@ -58,11 +57,13 @@
private DisplayInfo mDefaultDisplayInfo;
private PipBoundsState mPipBoundsState;
+
@Before
public void setUp() throws Exception {
initializeMockResources();
mPipBoundsState = new PipBoundsState(mContext);
- mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
+ mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState,
+ new PipSnapAlgorithm());
mPipBoundsState.setDisplayLayout(
new DisplayLayout(mDefaultDisplayInfo, mContext.getResources(), true, true));
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
index d687e8d..5df391f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
@@ -88,7 +88,8 @@
mComponent1 = new ComponentName(mContext, "component1");
mComponent2 = new ComponentName(mContext, "component2");
mPipBoundsState = new PipBoundsState(mContext);
- mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
+ mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState,
+ new PipSnapAlgorithm());
mMainExecutor = new TestShellExecutor();
mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext,
mMockSyncTransactionQueue, mPipBoundsState,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
index 700bf78..c61302b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
@@ -83,15 +83,15 @@
@Before
public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this);
+ doAnswer(invocation -> {
+ ((Runnable) invocation.getArgument(0)).run();
+ return null;
+ }).when(mMockExecutor).execute(any());
mPipController = new PipController(mContext, mMockDisplayController,
mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer,
mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
mMockTaskStackListener, mMockOneHandedController, mMockExecutor);
- doAnswer(invocation -> {
- ((Runnable) invocation.getArgument(0)).run();
- return null;
- }).when(mMockExecutor).execute(any());
}
@Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
index 75ea4ac..74519ea 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
@@ -99,12 +99,14 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mPipBoundsState = new PipBoundsState(mContext);
- mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
- mPipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
mPipSnapAlgorithm = new PipSnapAlgorithm();
+ mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState, mPipSnapAlgorithm);
+ PipMotionHelper pipMotionHelper = new PipMotionHelper(mContext, mPipBoundsState,
+ mPipTaskOrganizer, mPhonePipMenuController, mPipSnapAlgorithm,
+ mMockPipTransitionController, mFloatingContentCoordinator);
mPipTouchHandler = new PipTouchHandler(mContext, mPhonePipMenuController,
mPipBoundsAlgorithm, mPipBoundsState, mPipTaskOrganizer,
- mMockPipTransitionController, mFloatingContentCoordinator, mPipUiEventLogger,
+ pipMotionHelper, mFloatingContentCoordinator, mPipUiEventLogger,
mMainExecutor);
mPipTouchHandler.init();
mMotionHelper = Mockito.spy(mPipTouchHandler.getMotionHelper());
diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp
index 0804e0ae..d7162b9 100644
--- a/libs/hwui/effects/StretchEffect.cpp
+++ b/libs/hwui/effects/StretchEffect.cpp
@@ -40,6 +40,8 @@
// scale intensity
uniform float uDistanceStretchedX;
uniform float uDistanceStretchedY;
+ uniform float uInverseDistanceStretchedX;
+ uniform float uInverseDistanceStretchedY;
uniform float uDistDiffX;
// Difference between the peak stretch amount and overscroll amount normalized
@@ -58,14 +60,20 @@
uniform float viewportWidth; // target height in pixels
uniform float viewportHeight; // target width in pixels
+ float easeInCubic(float t, float d) {
+ float tmp = t * d;
+ return tmp * tmp * tmp;
+ }
+
float computeOverscrollStart(
float inPos,
float overscroll,
float uStretchAffectedDist,
+ float uInverseStretchAffectedDist,
float distanceStretched
) {
float offsetPos = uStretchAffectedDist - inPos;
- float posBasedVariation = smoothstep(0., uStretchAffectedDist, offsetPos);
+ float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist);
float stretchIntensity = overscroll * posBasedVariation;
return distanceStretched - (offsetPos / (1. + stretchIntensity));
}
@@ -75,10 +83,11 @@
float overscroll,
float reverseStretchDist,
float uStretchAffectedDist,
+ float uInverseStretchAffectedDist,
float distanceStretched
) {
float offsetPos = inPos - reverseStretchDist;
- float posBasedVariation = (smoothstep(0., uStretchAffectedDist, offsetPos));
+ float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist);
float stretchIntensity = (-overscroll) * posBasedVariation;
return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity)));
}
@@ -90,6 +99,7 @@
float inPos,
float overscroll,
float uStretchAffectedDist,
+ float uInverseStretchAffectedDist,
float distanceStretched,
float distanceDiff
) {
@@ -100,6 +110,7 @@
inPos,
overscroll,
uStretchAffectedDist,
+ uInverseStretchAffectedDist,
distanceStretched
);
} else if (inPos >= distanceStretched) {
@@ -114,6 +125,7 @@
overscroll,
stretchAffectedDist,
uStretchAffectedDist,
+ uInverseStretchAffectedDist,
distanceStretched
);
} else if (inPos < stretchAffectedDist) {
@@ -139,6 +151,7 @@
inU,
uOverscrollX,
uStretchAffectedDistX,
+ uInverseDistanceStretchedX,
uDistanceStretchedX,
uDistDiffX
);
@@ -146,6 +159,7 @@
inV,
uOverscrollY,
uStretchAffectedDistY,
+ uInverseDistanceStretchedY,
uDistanceStretchedY,
uDistDiffY
);
@@ -155,6 +169,7 @@
})");
static const float ZERO = 0.f;
+static const float CONTENT_DISTANCE_STRETCHED = 1.f;
sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapshotImage) const {
if (isEmpty()) {
@@ -169,10 +184,12 @@
float viewportHeight = stretchArea.height();
float normOverScrollDistX = mStretchDirection.x();
float normOverScrollDistY = mStretchDirection.y();
- float distanceStretchedX = maxStretchAmountX / (1 + abs(normOverScrollDistX));
- float distanceStretchedY = maxStretchAmountY / (1 + abs(normOverScrollDistY));
- float diffX = distanceStretchedX;
- float diffY = distanceStretchedY;
+ float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX));
+ float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY));
+ float inverseDistanceStretchedX = 1.f / CONTENT_DISTANCE_STRETCHED;
+ float inverseDistanceStretchedY = 1.f / CONTENT_DISTANCE_STRETCHED;
+ float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED;
+ float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED;
if (mBuilder == nullptr) {
mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect());
@@ -180,10 +197,12 @@
mBuilder->child("uContentTexture") = snapshotImage->makeShader(
SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear));
- mBuilder->uniform("uStretchAffectedDistX").set(&maxStretchAmountX, 1);
- mBuilder->uniform("uStretchAffectedDistY").set(&maxStretchAmountY, 1);
+ mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1);
+ mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1);
mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1);
mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1);
+ mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1);
+ mBuilder->uniform("uInverseDistanceStretchedY").set(&inverseDistanceStretchedY, 1);
mBuilder->uniform("uDistDiffX").set(&diffX, 1);
mBuilder->uniform("uDistDiffY").set(&diffY, 1);
mBuilder->uniform("uOverscrollX").set(&normOverScrollDistX, 1);
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index adf4aee..79b9388 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -153,10 +153,11 @@
}
RenderThread& RenderThread::getInstance() {
- // This is a pointer because otherwise __cxa_finalize
- // will try to delete it like a Good Citizen but that causes us to crash
- // because we don't want to delete the RenderThread normally.
- static RenderThread* sInstance = new RenderThread();
+ [[clang::no_destroy]] static sp<RenderThread> sInstance = []() {
+ sp<RenderThread> thread = sp<RenderThread>::make();
+ thread->start("RenderThread");
+ return thread;
+ }();
gHasRenderThreadInstance = true;
return *sInstance;
}
@@ -171,7 +172,6 @@
, mFunctorManager(WebViewFunctorManager::instance())
, mGlobalProfileData(mJankDataMutex) {
Properties::load();
- start("RenderThread");
}
RenderThread::~RenderThread() {
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index a7d1ba8..9e5bce7 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -171,6 +171,7 @@
friend class android::uirenderer::WebViewFunctor;
friend class android::uirenderer::skiapipeline::VkFunctorDrawHandler;
friend class android::uirenderer::VectorDrawable::Tree;
+ friend class sp<RenderThread>;
RenderThread();
virtual ~RenderThread();
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index acf4931..474d2cc 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -194,24 +194,25 @@
outWindowInfo->bufferCount = static_cast<uint32_t>(query_value);
}
- outWindowInfo->dataspace = HAL_DATASPACE_V0_SRGB;
- if (colorMode == ColorMode::WideColorGamut) {
- skcms_Matrix3x3 surfaceGamut;
- LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&surfaceGamut),
- "Could not get gamut matrix from color space");
- if (memcmp(&surfaceGamut, &SkNamedGamut::kSRGB, sizeof(surfaceGamut)) == 0) {
- outWindowInfo->dataspace = HAL_DATASPACE_V0_SCRGB;
- } else if (memcmp(&surfaceGamut, &SkNamedGamut::kDisplayP3, sizeof(surfaceGamut)) == 0) {
- outWindowInfo->dataspace = HAL_DATASPACE_DISPLAY_P3;
- } else {
- LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
- }
- }
-
outWindowInfo->bufferFormat = ColorTypeToBufferFormat(colorType);
- VkFormat vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM;
- if (outWindowInfo->bufferFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) {
- vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
+ outWindowInfo->colorspace = colorSpace;
+ outWindowInfo->dataspace = ColorSpaceToADataSpace(colorSpace.get(), colorType);
+ LOG_ALWAYS_FATAL_IF(outWindowInfo->dataspace == HAL_DATASPACE_UNKNOWN,
+ "Unsupported colorspace");
+
+ VkFormat vkPixelFormat;
+ switch (colorType) {
+ case kRGBA_8888_SkColorType:
+ vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ break;
+ case kRGBA_F16_SkColorType:
+ vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
+ break;
+ case kRGBA_1010102_SkColorType:
+ vkPixelFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
+ break;
+ default:
+ LOG_ALWAYS_FATAL("Unsupported colorType: %d", (int)colorType);
}
LOG_ALWAYS_FATAL_IF(nullptr == vkManager.mGetPhysicalDeviceImageFormatProperties2,
@@ -425,7 +426,7 @@
if (bufferInfo->skSurface.get() == nullptr) {
bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer(
mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()),
- kTopLeft_GrSurfaceOrigin, DataSpaceToColorSpace(mWindowInfo.dataspace), nullptr);
+ kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr);
if (bufferInfo->skSurface.get() == nullptr) {
ALOGE("SkSurface::MakeFromAHardwareBuffer failed");
mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h
index 409921b..7c25545 100644
--- a/libs/hwui/renderthread/VulkanSurface.h
+++ b/libs/hwui/renderthread/VulkanSurface.h
@@ -91,6 +91,7 @@
SkISize size;
uint32_t bufferFormat;
android_dataspace dataspace;
+ sk_sp<SkColorSpace> colorspace;
int transform;
size_t bufferCount;
uint64_t windowUsageFlags;
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp
index 87512f0..5d9f229 100644
--- a/libs/hwui/utils/Color.cpp
+++ b/libs/hwui/utils/Color.cpp
@@ -148,7 +148,19 @@
}
skcms_TransferFunction fn;
- LOG_ALWAYS_FATAL_IF(!colorSpace->isNumericalTransferFn(&fn));
+ if (!colorSpace->isNumericalTransferFn(&fn)) {
+ // pq with the default white point
+ auto rec2020PQ = SkColorSpace::MakeRGB(GetPQSkTransferFunction(), SkNamedGamut::kRec2020);
+ if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) {
+ return HAL_DATASPACE_BT2020_PQ;
+ }
+ // standard PQ
+ rec2020PQ = SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, SkNamedGamut::kRec2020);
+ if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) {
+ return HAL_DATASPACE_BT2020_PQ;
+ }
+ LOG_ALWAYS_FATAL("Only select non-numerical transfer functions are supported");
+ }
skcms_Matrix3x3 gamut;
LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&gamut));
diff --git a/location/java/Android.bp b/location/java/Android.bp
index 996a7ea..543f2b1 100644
--- a/location/java/Android.bp
+++ b/location/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-location-sources",
srcs: [
diff --git a/lowpan/java/Android.bp b/lowpan/java/Android.bp
index b95b0da..58513d7 100644
--- a/lowpan/java/Android.bp
+++ b/lowpan/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-lowpan-sources",
srcs: [
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 8134d6f..7220379 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -27,6 +27,7 @@
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
import android.os.Build;
+import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.Pair;
@@ -1937,6 +1938,14 @@
public static native int getDevicesForRoleAndCapturePreset(
int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices);
+ /**
+ * @hide
+ * Set the vibrators' information. The value will be used to initialize HapticGenerator.
+ * @param vibrators a list of all available vibrators
+ * @return command completion status
+ */
+ public static native int setVibratorInfos(@NonNull List<Vibrator> vibrators);
+
// Items shared with audio service
/**
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 21f8623..d746c85 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -32,6 +32,7 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.FileUtils;
+import android.os.ParcelFileDescriptor;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -1531,16 +1532,24 @@
if (fileDescriptor == null) {
throw new NullPointerException("fileDescriptor cannot be null");
}
- FileDescriptor modernFd = FileUtils.convertToModernFd(fileDescriptor);
+ // If a file descriptor has a modern file descriptor, this means that the file can be
+ // transcoded and not using the modern file descriptor will trigger the transcoding
+ // operation. Thus, to avoid unnecessary transcoding, need to convert to modern file
+ // descriptor if it exists. As of Android S, transcoding is not supported for image files,
+ // so this is for protecting against non-image files sent to ExifInterface, but support may
+ // be added in the future.
+ ParcelFileDescriptor modernFd = FileUtils.convertToModernFd(fileDescriptor);
if (modernFd != null) {
- fileDescriptor = modernFd;
+ fileDescriptor = modernFd.getFileDescriptor();
}
mAssetInputStream = null;
mFilename = null;
boolean isFdDuped = false;
- if (isSeekableFD(fileDescriptor)) {
+ // Can't save attributes to files with transcoding because apps get a different copy of
+ // that file when they're not using it through framework libraries like ExifInterface.
+ if (isSeekableFD(fileDescriptor) && modernFd == null) {
mSeekableFileDescriptor = fileDescriptor;
// Keep the original file descriptor in order to save attributes when it's seekable.
// Otherwise, just close the given file descriptor after reading it because the save
@@ -2545,27 +2554,22 @@
private void initForFilename(String filename) throws IOException {
FileInputStream in = null;
- FileInputStream legacyInputStream = null;
mAssetInputStream = null;
mFilename = filename;
mIsInputStream = false;
try {
in = new FileInputStream(filename);
- FileDescriptor modernFd = FileUtils.convertToModernFd(in.getFD());
+ ParcelFileDescriptor modernFd = FileUtils.convertToModernFd(in.getFD());
if (modernFd != null) {
- legacyInputStream = in;
- in = new FileInputStream(modernFd);
- }
-
- if (isSeekableFD(in.getFD())) {
- mSeekableFileDescriptor = in.getFD();
- } else {
+ closeQuietly(in);
+ in = new FileInputStream(modernFd.getFileDescriptor());
mSeekableFileDescriptor = null;
+ } else if (isSeekableFD(in.getFD())) {
+ mSeekableFileDescriptor = in.getFD();
}
loadAttributes(in);
} finally {
closeQuietly(in);
- closeQuietly(legacyInputStream);
}
}
diff --git a/media/java/android/media/IMediaRouterClient.aidl b/media/java/android/media/IMediaRouterClient.aidl
index 53122bb..6b754e1 100644
--- a/media/java/android/media/IMediaRouterClient.aidl
+++ b/media/java/android/media/IMediaRouterClient.aidl
@@ -22,6 +22,6 @@
oneway interface IMediaRouterClient {
void onStateChanged();
void onRestoreRoute();
- void onSelectedRouteChanged(String routeId);
+ void onGroupRouteSelected(String routeId);
void onGlobalA2dpChanged(boolean a2dpOn);
}
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl
index 4b8a8ad..f817a3c 100644
--- a/media/java/android/media/IMediaRouterService.aidl
+++ b/media/java/android/media/IMediaRouterService.aidl
@@ -48,6 +48,7 @@
// MediaRouterService.java for readability.
// Methods for MediaRouter2
+ void checkModifyAudioRoutingPermission();
List<MediaRoute2Info> getSystemRoutes();
RoutingSessionInfo getSystemSessionInfo();
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 822d22b..4968bd1 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -1684,7 +1684,6 @@
private MediaCodecInfo mCodecInfo;
private final Object mCodecInfoLock = new Object();
private MediaCrypto mCrypto;
- private String mPlaybackId;
private static final int EVENT_CALLBACK = 1;
private static final int EVENT_SET_CALLBACK = 2;
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index 2448d48..50a326e 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -219,6 +219,15 @@
private Map<String, Object> mMap;
/**
+ * A key describing the log session ID for MediaCodec. The log session ID is a random 32-byte
+ * hexadecimal string that is used to associate metrics from multiple media codec instances
+ * to the same playback or recording session.
+ * The associated value is a string.
+ * @hide
+ */
+ public static final String LOG_SESSION_ID = "log-session-id";
+
+ /**
* A key describing the mime type of the MediaFormat.
* The associated value is a string.
*/
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index c13f610..2943eee 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -33,6 +33,7 @@
import android.os.Bundle;
import android.os.FileUtils;
import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
import android.os.SystemProperties;
import android.text.TextUtils;
@@ -300,11 +301,11 @@
*/
public void setDataSource(FileDescriptor fd, long offset, long length)
throws IllegalArgumentException {
- FileDescriptor modernFd = FileUtils.convertToModernFd(fd);
+ ParcelFileDescriptor modernFd = FileUtils.convertToModernFd(fd);
if (modernFd == null) {
_setDataSource(fd, offset, length);
} else {
- _setDataSource(modernFd, offset, length);
+ _setDataSource(modernFd.getFileDescriptor(), offset, length);
}
}
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 644afb7..2d8babd 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -46,6 +46,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.PowerManager;
@@ -97,7 +98,6 @@
import java.util.Vector;
import java.util.concurrent.Executor;
-
/**
* MediaPlayer class can be used to control playback of audio/video files and streams.
*
@@ -1268,11 +1268,11 @@
*/
public void setDataSource(FileDescriptor fd, long offset, long length)
throws IOException, IllegalArgumentException, IllegalStateException {
- FileDescriptor modernFd = FileUtils.convertToModernFd(fd);
+ ParcelFileDescriptor modernFd = FileUtils.convertToModernFd(fd);
if (modernFd == null) {
_setDataSource(fd, offset, length);
} else {
- _setDataSource(modernFd, offset, length);
+ _setDataSource(modernFd.getFileDescriptor(), offset, length);
}
}
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index dc43ad3..480e2ea 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -122,6 +122,8 @@
mIsBluetoothA2dpOn = mAudioService.isBluetoothA2dpOn();
} catch (RemoteException e) {
Log.e(TAG, "Error querying Bluetooth A2DP state", e);
+ //TODO: When we reach here, mIsBluetoothA2dpOn may not be synced with
+ // mBluetoothA2dpRoute.
}
mHandler.post(new Runnable() {
@Override public void run() {
@@ -403,18 +405,18 @@
}
}
- void updateSelectedRouteForId(String routeId) {
- RouteInfo selectedRoute = isBluetoothA2dpOn()
+ void handleGroupRouteSelected(String routeId) {
+ RouteInfo routeToSelect = isBluetoothA2dpOn()
? mBluetoothA2dpRoute : mDefaultAudioVideo;
final int count = mRoutes.size();
for (int i = 0; i < count; i++) {
final RouteInfo route = mRoutes.get(i);
if (TextUtils.equals(route.mGlobalRouteId, routeId)) {
- selectedRoute = route;
+ routeToSelect = route;
}
}
- if (selectedRoute != mSelectedRoute) {
- selectRouteStatic(selectedRoute.mSupportedTypes, selectedRoute, false);
+ if (routeToSelect != mSelectedRoute) {
+ selectRouteStatic(routeToSelect.mSupportedTypes, routeToSelect, /*explicit=*/false);
}
}
@@ -675,10 +677,10 @@
}
@Override
- public void onSelectedRouteChanged(String routeId) {
+ public void onGroupRouteSelected(String groupRouteId) {
mHandler.post(() -> {
if (Client.this == mClient) {
- updateSelectedRouteForId(routeId);
+ handleGroupRouteSelected(groupRouteId);
}
});
}
@@ -689,9 +691,9 @@
public void onGlobalA2dpChanged(boolean a2dpOn) {
mHandler.post(() -> {
if (mSelectedRoute == mDefaultAudioVideo && a2dpOn) {
- setSelectedRoute(mBluetoothA2dpRoute, false);
+ setSelectedRoute(mBluetoothA2dpRoute, /*explicit=*/false);
} else if (mSelectedRoute == mBluetoothA2dpRoute && !a2dpOn) {
- setSelectedRoute(mDefaultAudioVideo, false);
+ setSelectedRoute(mDefaultAudioVideo, /*explicit=*/false);
}
});
}
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 1f6855a..90fa9a5 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -21,6 +21,7 @@
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.content.Context;
@@ -159,9 +160,11 @@
* Finally, it will have no effect to call {@link #setOnGetControllerHintsListener}.
*
* @param clientPackageName the package name of the app to control
+ * @throws SecurityException if the caller doesn't have MODIFY_AUDIO_ROUTING permission.
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
@Nullable
public static MediaRouter2 getInstance(@NonNull Context context,
@NonNull String clientPackageName) {
@@ -179,13 +182,20 @@
synchronized (sSystemRouterLock) {
MediaRouter2 instance = sSystemMediaRouter2Map.get(clientPackageName);
if (instance == null) {
- // TODO: Add permission check here using MODIFY_AUDIO_ROUTING.
if (sManager == null) {
+ IMediaRouterService serviceBinder = IMediaRouterService.Stub.asInterface(
+ ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
+ try {
+ // MediaRouterService will throw a SecurityException if the caller
+ // doesn't have MODIFY_AUDIO_ROUTING permission.
+ serviceBinder.checkModifyAudioRoutingPermission();
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
sManager = MediaRouter2Manager.getInstance(context.getApplicationContext());
}
instance = new MediaRouter2(context, clientPackageName);
sSystemMediaRouter2Map.put(clientPackageName, instance);
- // TODO: Remove router instance once it is not needed.
instance.registerManagerCallbackForSystemRouter();
}
return instance;
@@ -281,9 +291,9 @@
mDiscoveryPreference = new RouteDiscoveryPreference.Builder(
sManager.getPreferredFeatures(clientPackageName), true).build();
updateAllRoutesFromManager();
- mMediaRouterService = null; // TODO: Make this non-null and check permission.
// Only used by non-system MediaRouter2.
+ mMediaRouterService = null;
mPackageName = null;
}
diff --git a/media/mca/effect/java/Android.bp b/media/mca/effect/java/Android.bp
index 708167c..70d999f 100644
--- a/media/mca/effect/java/Android.bp
+++ b/media/mca/effect/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-mca-effect-sources",
srcs: ["**/*.java"],
diff --git a/media/mca/filterfw/java/Android.bp b/media/mca/filterfw/java/Android.bp
index 51be85b..77afcff 100644
--- a/media/mca/filterfw/java/Android.bp
+++ b/media/mca/filterfw/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-mca-filterfw-sources",
srcs: ["**/*.java"],
diff --git a/media/mca/filterpacks/java/Android.bp b/media/mca/filterpacks/java/Android.bp
index d9271b9..f370b21 100644
--- a/media/mca/filterpacks/java/Android.bp
+++ b/media/mca/filterpacks/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-mca-filterpacks-sources",
srcs: ["**/*.java"],
diff --git a/mime/java/Android.bp b/mime/java/Android.bp
index 7e56263..07cada8e 100644
--- a/mime/java/Android.bp
+++ b/mime/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-mime-sources",
srcs: ["**/*.java"],
diff --git a/mms/java/Android.bp b/mms/java/Android.bp
index 367d8c3..4d51439 100644
--- a/mms/java/Android.bp
+++ b/mms/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-mms-sources",
srcs: [
diff --git a/native/android/OWNERS b/native/android/OWNERS
index d414ed4..6f7def8 100644
--- a/native/android/OWNERS
+++ b/native/android/OWNERS
@@ -2,3 +2,7 @@
per-file libandroid_net.map.txt, net.c = codewiz@google.com, jchalard@google.com, junyulai@google.com
per-file libandroid_net.map.txt, net.c = lorenzo@google.com, reminv@google.com, satk@google.com
per-file system_fonts.cpp = file:/graphics/java/android/graphics/fonts/OWNERS
+
+per-file native_window_jni.cpp = file:/services/core/java/com/android/server/wm/OWNERS
+per-file native_activity.cpp = file:/services/core/java/com/android/server/wm/OWNERS
+per-file surface_control.cpp = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index a2fde4e..4d137e0 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -252,6 +252,7 @@
ASurfaceTransaction_setColor; # introduced=29
ASurfaceTransaction_setDamageRegion; # introduced=29
ASurfaceTransaction_setDesiredPresentTime; # introduced=29
+ ASurfaceTransaction_setEnableBackPressure; # introduced=31
ASurfaceTransaction_setFrameRate; # introduced=30
ASurfaceTransaction_setFrameRateWithChangeStrategy; # introduced=31
ASurfaceTransaction_setGeometry; # introduced=29
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 80cf663..e0f6379 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -656,3 +656,17 @@
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy);
}
+
+void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl,
+ bool enableBackpressure) {
+ CHECK_NOT_NULL(aSurfaceControl);
+ CHECK_NOT_NULL(aSurfaceTransaction);
+
+ sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+ Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+ const uint32_t flags = enableBackpressure ?
+ layer_state_t::eEnableBackpressure : 0;
+ transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
+}
diff --git a/opengl/java/Android.bp b/opengl/java/Android.bp
index 8ed4161..6dbae42 100644
--- a/opengl/java/Android.bp
+++ b/opengl/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-opengl-sources",
srcs: ["**/*.java"],
diff --git a/packages/Connectivity/framework/Android.bp b/packages/Connectivity/framework/Android.bp
index 609455f..5f5ebf4 100644
--- a/packages/Connectivity/framework/Android.bp
+++ b/packages/Connectivity/framework/Android.bp
@@ -23,26 +23,6 @@
default_applicable_licenses: ["frameworks_base_license"],
}
-java_library {
- name: "framework-connectivity-protos",
- sdk_version: "module_current",
- min_sdk_version: "30",
- proto: {
- type: "nano",
- },
- srcs: [
- // TODO: consider moving relevant .proto files directly to the module directory
- ":framework-javastream-protos",
- ],
- apex_available: [
- "com.android.tethering",
- ],
- jarjar_rules: "jarjar-rules-proto.txt",
- visibility: [
- "//visibility:private",
- ],
-}
-
filegroup {
name: "framework-connectivity-internal-sources",
srcs: [
@@ -109,9 +89,6 @@
libs: [
"unsupportedappusage",
],
- static_libs: [
- "framework-connectivity-protos",
- ],
jarjar_rules: "jarjar-rules.txt",
permitted_packages: ["android.net"],
impl_library_visibility: [
@@ -131,14 +108,16 @@
"//packages/modules/Connectivity/Tethering/tests:__subpackages__",
"//packages/modules/Connectivity/tests:__subpackages__",
"//packages/modules/NetworkStack/tests:__subpackages__",
+ "//packages/modules/Wifi/service/tests/wifitests",
],
apex_available: [
"com.android.tethering",
],
}
-cc_defaults {
- name: "libframework-connectivity-defaults",
+cc_library_shared {
+ name: "libframework-connectivity-jni",
+ min_sdk_version: "30",
cflags: [
"-Wall",
"-Werror",
@@ -149,38 +128,19 @@
"-Wno-unguarded-availability",
"-Wthread-safety",
],
+ srcs: [
+ "jni/android_net_NetworkUtils.cpp",
+ "jni/onload.cpp",
+ ],
shared_libs: [
+ "libandroid",
"liblog",
"libnativehelper",
],
header_libs: [
"dnsproxyd_protocol_headers",
],
-}
-
-cc_library_static {
- name: "libconnectivityframeworkutils",
- defaults: ["libframework-connectivity-defaults"],
- srcs: [
- "jni/android_net_NetworkUtils.cpp",
- ],
- shared_libs: ["libandroid_net"],
- apex_available: [
- "//apex_available:platform",
- "com.android.tethering",
- ],
-}
-
-cc_library_shared {
- name: "libframework-connectivity-jni",
- min_sdk_version: "30",
- defaults: ["libframework-connectivity-defaults"],
- srcs: [
- "jni/android_net_NetworkUtils.cpp",
- "jni/onload.cpp",
- ],
- shared_libs: ["libandroid"],
- stl: "libc++_static",
+ stl: "none",
apex_available: [
"com.android.tethering",
],
diff --git a/packages/Connectivity/framework/aidl-export/android/net/IpPrefix.aidl b/packages/Connectivity/framework/aidl-export/android/net/IpPrefix.aidl
index 0d70f2a..3495efc 100644
--- a/packages/Connectivity/framework/aidl-export/android/net/IpPrefix.aidl
+++ b/packages/Connectivity/framework/aidl-export/android/net/IpPrefix.aidl
@@ -18,5 +18,5 @@
package android.net;
// @JavaOnlyStableParcelable only affects the parcelable when built as stable aidl (aidl_interface
-// build rule). IpPrefix is also used in cpp but only as non-stable aidl.
-@JavaOnlyStableParcelable parcelable IpPrefix cpp_header "binder/IpPrefix.h";
+// build rule).
+@JavaOnlyStableParcelable parcelable IpPrefix;
diff --git a/packages/Connectivity/framework/api/current.txt b/packages/Connectivity/framework/api/current.txt
index 7428c6e..9c77c85 100644
--- a/packages/Connectivity/framework/api/current.txt
+++ b/packages/Connectivity/framework/api/current.txt
@@ -298,7 +298,6 @@
method @Nullable public android.net.NetworkSpecifier getNetworkSpecifier();
method public int getOwnerUid();
method public int getSignalStrength();
- method @NonNull public java.util.Set<java.lang.Integer> getSubIds();
method @Nullable public android.net.TransportInfo getTransportInfo();
method public boolean hasCapability(int);
method public boolean hasTransport(int);
@@ -410,7 +409,6 @@
method public android.net.NetworkRequest.Builder removeTransportType(int);
method @Deprecated public android.net.NetworkRequest.Builder setNetworkSpecifier(String);
method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier);
- method @NonNull public android.net.NetworkRequest.Builder setSubIds(@NonNull java.util.Set<java.lang.Integer>);
}
public class ParseException extends java.lang.RuntimeException {
diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt
index 5613ca1..847bcbc 100644
--- a/packages/Connectivity/framework/api/system-current.txt
+++ b/packages/Connectivity/framework/api/system-current.txt
@@ -276,6 +276,7 @@
method @NonNull public int[] getAdministratorUids();
method @Nullable public static String getCapabilityCarrierName(int);
method @Nullable public String getSsid();
+ method @NonNull public java.util.Set<java.lang.Integer> getSubIds();
method @NonNull public int[] getTransportTypes();
method public boolean isPrivateDnsBroken();
method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities);
@@ -336,6 +337,7 @@
public static class NetworkRequest.Builder {
method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkRequest.Builder setSignalStrength(int);
+ method @NonNull public android.net.NetworkRequest.Builder setSubIds(@NonNull java.util.Set<java.lang.Integer>);
}
public final class NetworkScore implements android.os.Parcelable {
diff --git a/packages/Connectivity/framework/jarjar-rules-proto.txt b/packages/Connectivity/framework/jarjar-rules-proto.txt
deleted file mode 100644
index 37b4dec1..0000000
--- a/packages/Connectivity/framework/jarjar-rules-proto.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-keep android.net.NetworkCapabilitiesProto
-keep android.net.NetworkProto
-keep android.net.NetworkRequestProto
diff --git a/packages/Connectivity/framework/jarjar-rules.txt b/packages/Connectivity/framework/jarjar-rules.txt
index 7474c24..2e5848c 100644
--- a/packages/Connectivity/framework/jarjar-rules.txt
+++ b/packages/Connectivity/framework/jarjar-rules.txt
@@ -1,11 +1,2 @@
rule com.android.net.module.util.** android.net.connectivity.framework.util.@1
rule android.net.NetworkFactory* android.net.connectivity.framework.NetworkFactory@1
-
-# TODO (b/149403767): remove the annotations from net-utils-device-common instead of here
-zap android.annotation.**
-zap com.android.net.module.annotation.**
-zap com.android.internal.annotations.**
-
-rule android.net.NetworkCapabilitiesProto* android.net.connectivity.proto.NetworkCapabilitiesProto@1
-rule android.net.NetworkProto* android.net.connectivity.proto.NetworkProto@1
-rule android.net.NetworkRequestProto* android.net.connectivity.proto.NetworkRequestProto@1
diff --git a/packages/Connectivity/framework/jni/android_net_NetworkUtils.cpp b/packages/Connectivity/framework/jni/android_net_NetworkUtils.cpp
index e8bb42d..9bf910b 100644
--- a/packages/Connectivity/framework/jni/android_net_NetworkUtils.cpp
+++ b/packages/Connectivity/framework/jni/android_net_NetworkUtils.cpp
@@ -16,34 +16,19 @@
#define LOG_TAG "NetworkUtils"
-#include <vector>
-
#include <android/file_descriptor_jni.h>
#include <android/multinetwork.h>
-#include <arpa/inet.h>
#include <linux/filter.h>
-#include <linux/if_arp.h>
#include <linux/tcp.h>
-#include <net/if.h>
-#include <netinet/ether.h>
-#include <netinet/ip.h>
-#include <netinet/udp.h>
+#include <netinet/in.h>
+#include <string.h>
#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
-#include <cutils/properties.h>
-#include <nativehelper/JNIHelp.h>
#include <nativehelper/JNIPlatformHelp.h>
-#include <nativehelper/ScopedLocalRef.h>
#include <utils/Log.h>
-#include <utils/misc.h>
#include "jni.h"
-extern "C" {
-int ifc_enable(const char *ifname);
-int ifc_disable(const char *ifname);
-}
-
#define NETUTILS_PKG_NAME "android/net/NetworkUtils"
namespace android {
@@ -52,6 +37,9 @@
// FrameworkListener limits the size of commands to 4096 bytes.
constexpr int MAXCMDSIZE = 4096;
+static volatile jclass class_Network = 0;
+static volatile jmethodID method_fromNetworkHandle = 0;
+
static inline jclass FindClassOrDie(JNIEnv* env, const char* class_name) {
jclass clazz = env->FindClass(class_name);
LOG_ALWAYS_FATAL_IF(clazz == NULL, "Unable to find class %s", class_name);
@@ -138,11 +126,11 @@
// Only allow dname which could be simply formatted to UTF8.
// In native layer, res_mkquery would re-format the input char array to packet.
- std::vector<char> queryname(byteCountUTF8 + 1, 0);
+ char queryname[byteCountUTF8 + 1];
+ memset(queryname, 0, (byteCountUTF8 + 1) * sizeof(char));
- env->GetStringUTFRegion(dname, 0, javaCharsCount, queryname.data());
-
- int fd = android_res_nquery(netHandle, queryname.data(), ns_class, ns_type, flags);
+ env->GetStringUTFRegion(dname, 0, javaCharsCount, queryname);
+ int fd = android_res_nquery(netHandle, queryname, ns_class, ns_type, flags);
if (fd < 0) {
jniThrowErrnoException(env, "resNetworkQuery", -fd);
@@ -170,9 +158,9 @@
static jobject android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, jobject javaFd) {
int fd = AFileDescriptor_getFD(env, javaFd);
int rcode;
- std::vector<uint8_t> buf(MAXPACKETSIZE, 0);
+ uint8_t buf[MAXPACKETSIZE] = {0};
- int res = android_res_nresult(fd, &rcode, buf.data(), MAXPACKETSIZE);
+ int res = android_res_nresult(fd, &rcode, buf, MAXPACKETSIZE);
jniSetFileDescriptorOfFD(env, javaFd, -1);
if (res < 0) {
jniThrowErrnoException(env, "resNetworkResult", -res);
@@ -184,8 +172,7 @@
jniThrowErrnoException(env, "resNetworkResult", ENOMEM);
return nullptr;
} else {
- env->SetByteArrayRegion(answer, 0, res,
- reinterpret_cast<jbyte*>(buf.data()));
+ env->SetByteArrayRegion(answer, 0, res, reinterpret_cast<jbyte*>(buf));
}
jclass class_DnsResponse = env->FindClass("android/net/DnsResolver$DnsResponse");
@@ -207,11 +194,14 @@
return nullptr;
}
- static jclass class_Network = MakeGlobalRefOrDie(
- env, FindClassOrDie(env, "android/net/Network"));
- static jmethodID method = env->GetStaticMethodID(class_Network, "fromNetworkHandle",
- "(J)Landroid/net/Network;");
- return env->CallStaticObjectMethod(class_Network, method, static_cast<jlong>(dnsNetHandle));
+ if (method_fromNetworkHandle == 0) {
+ // This may be called multiple times concurrently but that is fine
+ class_Network = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/net/Network"));
+ method_fromNetworkHandle = env->GetStaticMethodID(class_Network, "fromNetworkHandle",
+ "(J)Landroid/net/Network;");
+ }
+ return env->CallStaticObjectMethod(class_Network, method_fromNetworkHandle,
+ static_cast<jlong>(dnsNetHandle));
}
static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) {
diff --git a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
index 350b47f..b77d821 100644
--- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
+++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
@@ -3143,18 +3143,27 @@
}
/**
- * Set a network-independent global http proxy. This is not normally what you want
- * for typical HTTP proxies - they are general network dependent. However if you're
- * doing something unusual like general internal filtering this may be useful. On
- * a private network where the proxy is not accessible, you may break HTTP using this.
+ * Set a network-independent global HTTP proxy.
*
- * @param p A {@link ProxyInfo} object defining the new global
- * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
+ * This sets an HTTP proxy that applies to all networks and overrides any network-specific
+ * proxy. If set, HTTP libraries that are proxy-aware will use this global proxy when
+ * accessing any network, regardless of what the settings for that network are.
+ *
+ * Note that HTTP proxies are by nature typically network-dependent, and setting a global
+ * proxy is likely to break networking on multiple networks. This method is only meant
+ * for device policy clients looking to do general internal filtering or similar use cases.
+ *
+ * {@see #getGlobalProxy}
+ * {@see LinkProperties#getHttpProxy}
+ *
+ * @param p A {@link ProxyInfo} object defining the new global HTTP proxy. Calling this
+ * method with a {@code null} value will clear the global HTTP proxy.
* @hide
*/
+ // Used by Device Policy Manager to set the global proxy.
@SystemApi(client = MODULE_LIBRARIES)
@RequiresPermission(android.Manifest.permission.NETWORK_STACK)
- public void setGlobalProxy(@Nullable ProxyInfo p) {
+ public void setGlobalProxy(@Nullable final ProxyInfo p) {
try {
mService.setGlobalProxy(p);
} catch (RemoteException e) {
diff --git a/packages/Connectivity/framework/src/android/net/DnsResolver.java b/packages/Connectivity/framework/src/android/net/DnsResolver.java
index 3f7660f..dac88ad 100644
--- a/packages/Connectivity/framework/src/android/net/DnsResolver.java
+++ b/packages/Connectivity/framework/src/android/net/DnsResolver.java
@@ -500,7 +500,7 @@
try {
resp = resNetworkResult(fd); // Closes fd, marks it invalid.
} catch (ErrnoException e) {
- Log.e(TAG, "resNetworkResult:" + e.toString());
+ Log.w(TAG, "resNetworkResult:" + e.toString());
exception = e;
}
}
diff --git a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java
index 4f95ccc..a54696f 100644
--- a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java
+++ b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java
@@ -2351,9 +2351,15 @@
/**
* Gets the subscription ID set that associated to this network or request.
+ *
+ * <p>Instances of NetworkCapabilities will only have this field populated by the system if the
+ * receiver holds the NETWORK_FACTORY permission. In all other cases, it will be the empty set.
+ *
* @return
+ * @hide
*/
@NonNull
+ @SystemApi
public Set<Integer> getSubIds() {
return new ArraySet<>(mSubIds);
}
@@ -2718,10 +2724,17 @@
/**
* Set the subscription ID set.
*
+ * <p>SubIds are populated in NetworkCapability instances from the system only for callers
+ * that hold the NETWORK_FACTORY permission. Similarly, the system will reject any
+ * NetworkRequests filed with a non-empty set of subIds unless the caller holds the
+ * NETWORK_FACTORY permission.
+ *
* @param subIds a set that represent the subscription IDs. Empty if clean up.
* @return this builder.
+ * @hide
*/
@NonNull
+ @SystemApi
public Builder setSubIds(@NonNull final Set<Integer> subIds) {
mCaps.setSubIds(subIds);
return this;
diff --git a/packages/Connectivity/framework/src/android/net/NetworkRequest.java b/packages/Connectivity/framework/src/android/net/NetworkRequest.java
index 5313f08..78e1011 100644
--- a/packages/Connectivity/framework/src/android/net/NetworkRequest.java
+++ b/packages/Connectivity/framework/src/android/net/NetworkRequest.java
@@ -500,9 +500,14 @@
* A network will satisfy this request only if it matches one of the subIds in this set.
* An empty set matches all networks, including those without a subId.
*
+ * <p>Registering a NetworkRequest with a non-empty set of subIds requires the
+ * NETWORK_FACTORY permission.
+ *
* @param subIds A {@code Set} that represents subscription IDs.
+ * @hide
*/
@NonNull
+ @SystemApi
public Builder setSubIds(@NonNull Set<Integer> subIds) {
mNetworkCapabilities.setSubIds(subIds);
return this;
@@ -655,25 +660,6 @@
", " + networkCapabilities.toString() + " ]";
}
- private int typeToProtoEnum(Type t) {
- switch (t) {
- case NONE:
- return NetworkRequestProto.TYPE_NONE;
- case LISTEN:
- return NetworkRequestProto.TYPE_LISTEN;
- case TRACK_DEFAULT:
- return NetworkRequestProto.TYPE_TRACK_DEFAULT;
- case REQUEST:
- return NetworkRequestProto.TYPE_REQUEST;
- case BACKGROUND_REQUEST:
- return NetworkRequestProto.TYPE_BACKGROUND_REQUEST;
- case TRACK_SYSTEM_DEFAULT:
- return NetworkRequestProto.TYPE_TRACK_SYSTEM_DEFAULT;
- default:
- return NetworkRequestProto.TYPE_UNKNOWN;
- }
- }
-
public boolean equals(@Nullable Object obj) {
if (obj instanceof NetworkRequest == false) return false;
NetworkRequest that = (NetworkRequest)obj;
diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml
index 4f0f0f0..48cf339 100644
--- a/packages/PackageInstaller/res/values-af/strings.xml
+++ b/packages/PackageInstaller/res/values-af/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakketinstalleerder"</string>
<string name="install" msgid="711829760615509273">"Installeer"</string>
+ <string name="update" msgid="3932142540719227615">"Dateer op"</string>
<string name="done" msgid="6632441120016885253">"Klaar"</string>
<string name="cancel" msgid="1018267193425558088">"Kanselleer"</string>
<string name="installing" msgid="4921993079741206516">"Installeer tans …"</string>
<string name="installing_app" msgid="1165095864863849422">"Installeer tans <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string>
<string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Wil jy hierdie program installeer?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Wil jy \'n opdatering vir hierdie bestaande program installeer? Jou bestaande data sal nie verlore gaan nie."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Wil jy \'n opdatering vir hierdie ingeboude program installeer? Jou bestaande data sal nie verlore gaan nie."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string>
<string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Installeer- en deïnstalleerhandelinge word nie in Wear gesteun nie."</string>
<string name="message_staging" msgid="8032722385658438567">"Voer tans program uit …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Onbekend"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Jou tablet word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Jou TV word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Jou foon word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Jou tablet word vir jou veiligheid tans nie toegelaat om onbekende programme van hierdie bron af te installeer nie. Jy kan dit in Instellings verander."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Jou TV word vir jou veiligheid tans nie toegelaat om onbekende programme van hierdie bron af te installeer nie. Jy kan dit in Instellings verander."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Jou foon word vir jou veiligheid tans nie toegelaat om onbekende programme van hierdie bron af te installeer nie. Jy kan dit in Instellings verander."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Jou foon en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou foon of verlies van data wat uit sy gebruik kan spruit."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Jou tablet en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou tablet of verlies van data wat uit sy gebruik kan spruit."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Jou TV en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou TV of verlies van data wat uit sy gebruik kan spruit."</string>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index 0acab9e..cf6e96f 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ጥቅል ጫኚ"</string>
<string name="install" msgid="711829760615509273">"ጫን"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ተከናውኗል"</string>
<string name="cancel" msgid="1018267193425558088">"ይቅር"</string>
<string name="installing" msgid="4921993079741206516">"በመጫን ላይ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ን በመጫን ላይ…"</string>
<string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ለዚህ ነባር መተግበሪያ ዝማኔ መጫን ይፈልጋሉ? ነባሪ ውሂብዎ አይጠፋም።"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ለዚህ አብሮ ለተሠራ መተግበሪያ ዝማኔ መጫን ይፈልጋሉ? ነባር ውሂብዎ አይጠፋም።"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"በWear ላይ የመጫን/ማራገፍ እርምጃዎች አይደገፉም።"</string>
<string name="message_staging" msgid="8032722385658438567">"መተግበሪያን በማዘጋጀት ላይ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ያልታወቀ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ለእርስዎ ደህንነት ሲባል የእርስዎ ጡባዊ ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ለእርስዎ ደህንነት ሲባል የእርስዎ ቴሌቪዥን ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ለእርስዎ ደህንነት ሲባል የእርስዎ ስልክ ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"የእርስዎ ስልክ እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይልበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ስልክ ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"የእርስዎ ጡባዊ እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ጡባዊ ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"የእርስዎ ቴሌቪዥን እና የግል ውሂብ በማይታወቁ መተግበሪያዎች ለሚደርሱ ጥቃቶች በይበልጥ ተጋላጭ ናቸው። ይህን መተግበሪያ በመጫንዎ በእርስዎ ቴሌቪዥን ላይ ለሚደርስ ማናቸውም ጉዳት ወይም መተግበሪያውን በመጠቀም ለሚከሰት የውሂብ መጥፋት ኃላፊነቱን እንደሚወስዱ ተስማምተዋል።"</string>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index c840374..7cfa08a 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"أداة تثبيت الحزم"</string>
<string name="install" msgid="711829760615509273">"تثبيت"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"تم"</string>
<string name="cancel" msgid="1018267193425558088">"إلغاء"</string>
<string name="installing" msgid="4921993079741206516">"جارٍ التثبيت…"</string>
<string name="installing_app" msgid="1165095864863849422">"جارٍ تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"هل تريد تثبيت هذا التطبيق؟"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"هل تريد تثبيت تحديث لهذا التطبيق الحالي؟ لن تفقد بياناتك الحالية."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"هل تريد تثبيت تحديث لهذا التطبيق المضمَّن؟ لن تفقد بياناتك الحالية."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"لا تتوافق إجراءات التثبيت/إلغاء التثبيت مع نظام Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"جارٍ الطرح المرحلي للتطبيق…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"غير معروف"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"لأغراض الأمان، غير مسموح لجهازك اللوحي بتثبيت تطبيقات غير معروفة من هذا المصدر."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"لأغراض الأمان، غير مسموح لجهاز التلفزيون الذي تستخدمه بتثبيت تطبيقات غير معروفة من هذا المصدر."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"لأغراض الأمان، غير مسموح لهاتفك بتثبيت تطبيقات غير معروفة من هذا المصدر."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"يعتبر الهاتف والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث لهاتفك أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"يعتبر الجهاز اللوحي والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث للجهاز اللوحي أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"يعتبر جهاز التلفزيون والبيانات الشخصية أكثر عرضة لهجوم التطبيقات غير المعروفة. من خلال تثبيت هذا التطبيق، توافق على تحمل مسؤولية أي ضرر يحدث لجهاز التلفزيون أو فقدان البيانات الذي قد ينتج عن استخدامه."</string>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
index c900efd..5c902f0 100644
--- a/packages/PackageInstaller/res/values-as/strings.xml
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"পেকেজ ইনষ্টলাৰ"</string>
<string name="install" msgid="711829760615509273">"ইনষ্টল কৰক"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"সম্পন্ন হ’ল"</string>
<string name="cancel" msgid="1018267193425558088">"বাতিল কৰক"</string>
<string name="installing" msgid="4921993079741206516">"ইনষ্টল কৰি থকা হৈছে…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ইনষ্টল কৰি থকা হৈছে…"</string>
<string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"আপুনি এই এপ্লিকেশ্বনটো ইনষ্টল কৰিব বিচাৰেনে?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"আপুনি আগৰে পৰা থকা এপ্লিকেশ্বন আপডে’ট কৰিব বিচাৰেনে? আপোনাৰ আগৰ ডেটা নেহেৰায়।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"আপুনি এই আগৰে পৰা থকা এপ্লিকেশ্বনটো আপডে’ট কৰিব বিচাৰেনে? আপোনাৰ আগৰ ডেটা নেহেৰায়।"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"এপটো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ৱেৰ-ত ইনষ্টল/আনইনষ্টল কৰিব পৰা নাযায়।"</string>
<string name="message_staging" msgid="8032722385658438567">"এপৰ অন্তিম পর্যায়ৰ পৰীক্ষণ চলি আছে…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"অজ্ঞাত"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ টেবলেটত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ টিভিত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ ফ\'নত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"আপোনাৰ ফ\'ন আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"আপোনাৰ টেবলেট আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"আপোনাৰ টিভি আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।"</string>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index bc36123..485dd16 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paket quraşdırıcı"</string>
<string name="install" msgid="711829760615509273">"Quraşdırın"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Hazırdır"</string>
<string name="cancel" msgid="1018267193425558088">"Ləğv edin"</string>
<string name="installing" msgid="4921993079741206516">"Quraşdırılır..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> quraşdırılır…"</string>
<string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu mövcud tətbiqdə güncəllənmə quraşdırmaq istəyirsiniz? Hazırkı datanız silinməyəcək."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu daxili tətbiqdə güncəllənmə quraşdırmaq istəyirsiniz? Hazırkı datanız silinməyəcək."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Yükləmə/Sistemdən silmə fəaliyyətləri Wear\'də dəstəklənmir."</string>
<string name="message_staging" msgid="8032722385658438567">"Tətbiq hazırlanır..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Naməlum"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Təhlükəsizliyiniz üçün planşetə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Təhlükəsizliyiniz üçün TV-yə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Təhlükəsizliyiniz üçün telefona bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla telefona dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planşet və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla planşetə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verə biləcək data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tv və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla Tv-yə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index 44cfef0..9a97dad 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Program za instal. paketa"</string>
<string name="install" msgid="711829760615509273">"Instaliraj"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Gotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Otkaži"</string>
<string name="installing" msgid="4921993079741206516">"Instalira se..."</string>
<string name="installing_app" msgid="1165095864863849422">"Instalira se <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Želite li da instalirate ovu aplikaciju?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li da instalirate ažuriranje za ovu postojeću aplikaciju? Postojeći podaci se neće izgubiti."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li da instalirate ažuriranje za ovu ugrađenu aplikaciju? Postojeći podaci se neće izgubiti."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Radnje Instaliraj/Deinstaliraj nisu podržane u Wear-u."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikacija se priprema…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Tabletu iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Televizoru iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Telefonu iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja telefona ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja tableta ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja TV-a ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index e7cbf06..ceca8a2 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Усталёўшчык пакетаў"</string>
<string name="install" msgid="711829760615509273">"Усталяваць"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Гатова"</string>
<string name="cancel" msgid="1018267193425558088">"Скасаваць"</string>
<string name="installing" msgid="4921993079741206516">"Ідзе ўсталёўка…"</string>
<string name="installing_app" msgid="1165095864863849422">"Усталёўваецца <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Хочаце ўсталяваць гэту праграму?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Хочаце ўсталяваць абнаўленне для гэтай праграмы? Існуючыя даныя не будуць страчаны."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Хочаце ўсталяваць абнаўленне для ўбудаванай праграмы? Існуючыя даныя не будуць страчаны."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дзеянні па ўсталяванні або выдаленні не падтрымліваюцца на Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Праграма падрыхтоўваецца…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Невядома"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"У мэтах бяспекі вашаму планшэту забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"У мэтах бяспекі вашаму тэлевізару забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"У мэтах бяспекі вашаму тэлефону забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваш тэлефон і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні тэлефона ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваш планшэт і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні планшэта ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваш тэлевізар і асабістыя даныя больш прыступныя для атак невядомых праграм. Усталёўваючы гэту праграму, вы згаджаецеся з тым, што несяце адказнасць за любыя пашкоджанні тэлевізара ці страту даных, якія могуць адбыцца ў выніку выкарыстання гэтай праграмы."</string>
diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml
index 12ba3ef..99dfc6d 100644
--- a/packages/PackageInstaller/res/values-bg/strings.xml
+++ b/packages/PackageInstaller/res/values-bg/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Пакети: Инстал. програма"</string>
<string name="install" msgid="711829760615509273">"Инсталиране"</string>
+ <string name="update" msgid="3932142540719227615">"Актуализиране"</string>
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Отказ"</string>
<string name="installing" msgid="4921993079741206516">"Инсталира се..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> се инсталира…"</string>
<string name="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Искате ли да инсталирате това приложение?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Искате ли да инсталирате актуализация за това съществуващо приложение? Съществуващите ви данни няма да бъдат загубени."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Искате ли да инсталирате актуализация за това вградено приложение? Съществуващите ви данни няма да бъдат загубени."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Искате ли да инсталирате това приложение?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Искате ли да актуализирате това приложение?"</string>
<string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Действията инсталиране и деинсталиране не се поддържат на устройства с Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Приложението се подготвя…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Неизвестно"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"От съображения за сигурност на таблета ви не могат да се инсталират неизвестни приложения от този източник."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"От съображения за сигурност на телевизора ви не могат да се инсталират неизвестни приложения от този източник."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"От съображения за сигурност на телефона ви не могат да се инсталират неизвестни приложения от този източник."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"От съображения за сигурност понастоящем на таблета ви не могат да се инсталират неизвестни приложения от този източник. Можете да промените това от „Настройки“."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"От съображения за сигурност понастоящем на телевизора ви не могат да се инсталират неизвестни приложения от този източник. Можете да промените това от „Настройки“."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"От съображения за сигурност понастоящем на телефона ви не могат да се инсталират неизвестни приложения от този източник. Можете да промените това от „Настройки“."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефонът и личните ви данни са по-уязвими към атаки от неизвестни приложения. С инсталирането на това приложение приемате, че носите отговорност при евентуална повреда на телефона или загуба на информация вследствие на използването на приложението."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таблетът и личните ви данни са по-уязвими към атаки от неизвестни приложения. С инсталирането на това приложение приемате, че носите отговорност при евентуална повреда на таблета или загуба на информация вследствие на използването на приложението."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Телевизорът и личните ви данни са по-уязвими към атаки от неизвестни приложения. С инсталирането на това приложение приемате, че носите отговорност при евентуална повреда на телевизора или загуба на информация вследствие на използването на приложението."</string>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index 8025552..54f67c0 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"প্যাকেজ ইনস্টলার"</string>
<string name="install" msgid="711829760615509273">"ইনস্টল করুন"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"হয়ে গেছে"</string>
<string name="cancel" msgid="1018267193425558088">"বাতিল করুন"</string>
<string name="installing" msgid="4921993079741206516">"ইনস্টল করা হচ্ছে…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ইনস্টল করা হচ্ছে…"</string>
<string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"আপনি কি এই অ্যাপ্লিকেশনটি ইনস্টল করতে চান?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"আগে থেকেই থাকা এই অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"এই বিল্ট-ইন অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-এ ইনস্টল/আনইনস্টল করা সমর্থিত নয়।"</string>
<string name="message_staging" msgid="8032722385658438567">"অ্যাপ স্টেজ করা হচ্ছে…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"অজানা"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার ট্যাবলেটের অ্যাপ ইনস্টল করার অনুমতি নেই।"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার টিভির অ্যাপ ইনস্টল করার অনুমতি নেই।"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার ফোনের অ্যাপ ইনস্টল করার অনুমতি নেই।"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"অজানা অ্যাপের দ্বারা আপনার ফোন এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার ফোনের বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"অজানা অ্যাপের দ্বারা আপনার ট্যাবলেট এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার ট্যাবলেটের বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"অজানা অ্যাপের দ্বারা আপনার টিভি এবং ব্যক্তিগত ডেটা আক্রান্ত হওয়ার সম্ভাবনা বেশি থাকে। এই অ্যাপটি ইনস্টল করার মাধ্যমে আপনি সম্মত হচ্ছেন যে এটি ব্যবহারের ফলে আপনার টিভি বা ডেটার কোনও ক্ষতি হলে তার জন্য আপনিই দায়ী থাকবেন।"</string>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index a099147..47bca79 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Alat za instalir. paketa"</string>
<string name="install" msgid="711829760615509273">"Instaliraj"</string>
+ <string name="update" msgid="3932142540719227615">"Ažuriraj"</string>
<string name="done" msgid="6632441120016885253">"Gotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Otkaži"</string>
<string name="installing" msgid="4921993079741206516">"Instaliranje…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instaliranje paketa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Želite li instalirati ovu aplikaciju?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li instalirati ažuriranje za ovu postojeću aplikaciju? Vaši postojeći podaci neće biti izgubljeni."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li instalirati ažuriranje za ovu ugrađenu aplikaciju? Vaš postojeći podaci neće biti izgubljeni."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instaliranje/deinstaliranje nije podržano na Wearu."</string>
<string name="message_staging" msgid="8032722385658438567">"Pripremanje aplikacije…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Vašem tabletu iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Vašem TV-u iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Vašem telefonu iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Iz sigurnosnih razloga tablet trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Iz sigurnosnih razloga televizor trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Iz sigurnosnih razloga telefon trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Vaši podaci na telefonu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na telefonu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Vaši podaci na tabletu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na tabletu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Vaši podaci na TV-u i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na TV-u ili gubitak podataka do kojih može doći korištenjem aplikacije."</string>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index b25b37b..4daf205 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instal·lador de paquets"</string>
<string name="install" msgid="711829760615509273">"Instal·la"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Fet"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel·la"</string>
<string name="installing" msgid="4921993079741206516">"S\'està instal·lant…"</string>
<string name="installing_app" msgid="1165095864863849422">"S\'està instal·lant <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Vols instal·lar aquesta aplicació?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vols instal·lar una actualització en aquesta aplicació? Les teves dades no es perdran."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vols instal·lar una actualització en aquesta aplicació integrada? Les teves dades no es perdran."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"S\'està preparant la instal·lació de l\'aplicació…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconeguda"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Per la teva seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Per la teva seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Per la teva seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"El telèfon i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al telèfon o de la pèrdua de dades que pugui resultar del seu ús."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"La tauleta i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi a la tauleta o de la pèrdua de dades que pugui resultar del seu ús."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"El televisor i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al televisor o de la pèrdua de dades que pugui resultar del seu ús."</string>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index e250c7b..041a375 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalátor balíčků"</string>
<string name="install" msgid="711829760615509273">"Instalovat"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Hotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Zrušit"</string>
<string name="installing" msgid="4921993079741206516">"Instalace…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalace balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Chcete tuto aplikaci nainstalovat?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Chcete nainstalovat aktualizaci této existující aplikace? Stávající data nebudou ztracena."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Chcete nainstalovat aktualizaci této integrované aplikace? Stávající data nebudou ztracena."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Akce instalace/odinstalace nejsou v zařízení Wear podporovány."</string>
<string name="message_staging" msgid="8032722385658438567">"Příprava instalace…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznámé"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Z bezpečnostních důvodů do tabletu není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Z bezpečnostních důvodů do televize není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Z bezpečnostních důvodů do telefonu není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na telefonu nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na tabletu nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televize a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na televizi nebo ztrátu dat, která může být používáním aplikace způsobena."</string>
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index ca9f37e..9b711e4 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakkeinstallationsprogram"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
+ <string name="update" msgid="3932142540719227615">"Opdater"</string>
<string name="done" msgid="6632441120016885253">"Udfør"</string>
<string name="cancel" msgid="1018267193425558088">"Annuller"</string>
<string name="installing" msgid="4921993079741206516">"Installerer…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Vil du installere denne app?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vil du installere en opdatering til denne eksisterende app? Du mister ikke dine eksisterende data."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vil du installere en opdatering til denne indbyggede app? Du mister ikke dine eksisterende data."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du opdatere denne app?"</string>
<string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Det er ikke muligt at installere/afinstallere på Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Forbereder appen…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ukendt"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Din tablet har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Dit fjernsyn har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Din telefon har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Af hensyn til din sikkerhed har din tablet i øjeblikket ikke tilladelse til at installere ukendte apps fra denne kilde. Du kan ændre dette i Indstillinger."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Af hensyn til din sikkerhed har dit fjernsyn i øjeblikket ikke tilladelse til at installere ukendte apps fra denne kilde. Du kan ændre dette i Indstillinger."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Af hensyn til din sikkerhed har din telefon i øjeblikket ikke tilladelse til at installere ukendte apps fra denne kilde. Du kan ændre dette i Indstillinger."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Din telefon og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på din telefon eller tab af data, der kan skyldes brug af appen."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Din tablet og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på din tablet eller tab af data, der kan skyldes brug af appen."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Dit fjernsyn og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på dit fjernsyn eller tab af data, der kan skyldes brug af appen."</string>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index 7826ceb..9a46fb3 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketinstallation"</string>
<string name="install" msgid="711829760615509273">"Installieren"</string>
+ <string name="update" msgid="3932142540719227615">"Aktualisieren"</string>
<string name="done" msgid="6632441120016885253">"Fertig"</string>
<string name="cancel" msgid="1018267193425558088">"Abbrechen"</string>
<string name="installing" msgid="4921993079741206516">"Wird installiert…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> wird installiert…"</string>
<string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Möchtest du diese App installieren?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Möchtest du ein Update dieser vorhandenen App installieren? Deine bisherigen Daten gehen dabei nicht verloren."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Möchtest du ein Update dieser integrierten App installieren? Deine bisherigen Daten gehen dabei nicht verloren."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Möchtest du diese App installieren?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Möchtest du diese App aktualisieren?"</string>
<string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Installations-/Deinstallationsaktion auf Android Wear nicht unterstützt."</string>
<string name="message_staging" msgid="8032722385658438567">"App wird vorbereitet…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unbekannt"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Aus Sicherheitsgründen kannst du auf dem Tablet keine unbekannten Apps aus dieser Quelle installieren."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Aus Sicherheitsgründen kannst du auf dem Fernseher keine unbekannten Apps aus dieser Quelle installieren."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Aus Sicherheitsgründen kannst du auf dem Smartphone keine unbekannten Apps aus dieser Quelle installieren."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Aus Sicherheitsgründen kannst du auf deinem Tablet keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Aus Sicherheitsgründen kannst du auf deinem Fernseher keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Aus Sicherheitsgründen kannst du auf deinem Smartphone keine unbekannten Apps aus dieser Quelle installieren. Das kannst du in den Einstellungen ändern."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Unbekannte Apps können gefährlich für dein Smartphone und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Smartphone und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Unbekannte Apps können gefährlich für dein Tablet und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Tablet und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Unbekannte Apps können gefährlich für deinen Fernseher und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Fernseher und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index 2be6207..fd6bf6a 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Πρόγρ. εγκατάστ. πακέτου"</string>
<string name="install" msgid="711829760615509273">"Εγκατάσταση"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Τέλος"</string>
<string name="cancel" msgid="1018267193425558088">"Ακύρωση"</string>
<string name="installing" msgid="4921993079741206516">"Εγκατάσταση…"</string>
<string name="installing_app" msgid="1165095864863849422">"Εγκατάσταση <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Θέλετε να εγκαταστήσετε μια ενημέρωση σε αυτήν την υπάρχουσα εφαρμογή; Τα υπάρχοντα δεδομένα σας δεν θα χαθούν."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Θέλετε να εγκαταστήσετε μια ενημέρωση σε αυτήν την ενσωματωμένη εφαρμογή; Τα υπάρχοντα δεδομένα σας δεν θα χαθούν."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Οι ενέργειες εγκατάστασης/απεγκατάστασης δεν υποστηρίζονται στο Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Σταδιακή διάθεση εφαρμογής…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Άγνωστη"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο tablet σας."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στην τηλεόρασή σας."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο τηλέφωνό σας."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Το τηλέφωνό σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο τηλέφωνο ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Το tablet σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο tablet ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Η τηλεόρασή σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στην τηλεόρασή ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string>
diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml
index 84cde47..a91c882 100644
--- a/packages/PackageInstaller/res/values-en-rAU/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package installer"</string>
<string name="install" msgid="711829760615509273">"Install"</string>
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Done"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel"</string>
<string name="installing" msgid="4921993079741206516">"Installing…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installed."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Staging app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"For your security, your tablet currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"For your security, your TV currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"For your security, your phone currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string>
diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml
index 84cde47..a91c882 100644
--- a/packages/PackageInstaller/res/values-en-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package installer"</string>
<string name="install" msgid="711829760615509273">"Install"</string>
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Done"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel"</string>
<string name="installing" msgid="4921993079741206516">"Installing…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installed."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Staging app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"For your security, your tablet currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"For your security, your TV currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"For your security, your phone currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string>
diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml
index 84cde47..a91c882 100644
--- a/packages/PackageInstaller/res/values-en-rGB/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package installer"</string>
<string name="install" msgid="711829760615509273">"Install"</string>
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Done"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel"</string>
<string name="installing" msgid="4921993079741206516">"Installing…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installed."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Staging app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"For your security, your tablet currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"For your security, your TV currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"For your security, your phone currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string>
diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml
index 84cde47..a91c882 100644
--- a/packages/PackageInstaller/res/values-en-rIN/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package installer"</string>
<string name="install" msgid="711829760615509273">"Install"</string>
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Done"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel"</string>
<string name="installing" msgid="4921993079741206516">"Installing…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installed."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Staging app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"For your security, your tablet currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"For your security, your TV currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"For your security, your phone currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string>
diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml
index 128cbae..6a7bddc 100644
--- a/packages/PackageInstaller/res/values-en-rXC/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package installer"</string>
<string name="install" msgid="711829760615509273">"Install"</string>
+ <string name="update" msgid="3932142540719227615">"Update"</string>
<string name="done" msgid="6632441120016885253">"Done"</string>
<string name="cancel" msgid="1018267193425558088">"Cancel"</string>
<string name="installing" msgid="4921993079741206516">"Installing…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installed."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/Uninstall actions not supported on Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Staging app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"For your security, your tablet currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"For your security, your TV currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"For your security, your phone currently isn’t allowed to install unknown apps from this source. You can change this in Settings."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string>
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 117c9f6..bdacb64 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador del paquete"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <string name="update" msgid="3932142540719227615">"Actualizar"</string>
<string name="done" msgid="6632441120016885253">"Listo"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"¿Deseas instalar esta aplicación?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"¿Quieres instalar una actualización de esta app? No se perderán los datos."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"¿Quieres instalar una actualización de esta app integrada? No se perderán los datos."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"¿Deseas instalar esta app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Deseas actualizar esta app?"</string>
<string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear no admite las acciones de instalación y desinstalación"</string>
<string name="message_staging" msgid="8032722385658438567">"Preparando app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconocido"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por tu seguridad, la tablet no tiene permitido instalar apps desconocidas de esta fuente."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por tu seguridad, la TV no tiene permitido instalar apps desconocidas de esta fuente."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por tu seguridad, el teléfono no tiene permitido instalar apps desconocidas de esta fuente."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Por tu seguridad, la tablet no tiene permitido actualmente instalar apps desconocidas de esta fuente. Puedes modificar esta opción en Configuración."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Por tu seguridad, la TV no tiene permitido actualmente instalar apps desconocidas de esta fuente. Puedes modificar esta opción en Configuración."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Por tu seguridad, el teléfono no tiene permitido actualmente instalar apps desconocidas de esta fuente. Puedes modificar esta opción en Configuración."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"El teléfono y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra el teléfono y de la pérdida de datos que pueda ocasionar su uso."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"La tablet y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra la tablet y de la pérdida de datos que pueda ocasionar su uso."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"La TV y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra la TV y de la pérdida de datos que pueda ocasionar su uso."</string>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index fa73873..a43b550 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Listo"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Se ha instalado la aplicación."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"¿Quieres instalar esta aplicación?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"¿Quieres instalar una actualización de esta aplicación? Tus datos no se perderán."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"¿Quieres instalar una actualización de esta aplicación integrada? Tus datos no se perderán."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Las acciones de instalar y desinstalar no pueden realizarse en Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconocida"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por motivos de seguridad, tu tablet no puede instalar aplicaciones desconocidas de esta fuente."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por motivos de seguridad, tu TV no puede instalar aplicaciones desconocidas de esta fuente."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por motivos de seguridad, tu teléfono no puede instalar aplicaciones desconocidas de esta fuente."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tu teléfono y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu teléfono o la pérdida de datos que se pueda derivar de su uso."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tu tablet y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu tablet o la pérdida de datos que se pueda derivar de su uso."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tu TV y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu TV o la pérdida de datos que se pueda derivar de su uso."</string>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index b638780..97f1c67 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketi installiprogramm"</string>
<string name="install" msgid="711829760615509273">"Installi"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Valmis"</string>
<string name="cancel" msgid="1018267193425558088">"Tühista"</string>
<string name="installing" msgid="4921993079741206516">"Installimine …"</string>
<string name="installing_app" msgid="1165095864863849422">"Paketi <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installimine …"</string>
<string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Kas soovite selle rakenduse installida?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Kas soovite olemasoleva rakenduse värskenduse installida? Teie olemasolevad andmed jäävad alles."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Kas soovite sisseehitatud rakenduse värskenduse installida? Teie olemasolevad andmed jäävad alles."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei toeta installimist/desinstallimist."</string>
<string name="message_staging" msgid="8032722385658438567">"Rakenduse koondamine …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Teadmata"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Teie turvalisuse huvides ei ole tahvelarvutil lubatud installida sellest allikast tundmatuid rakendusi."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Teie turvalisuse huvides ei ole teleril lubatud installida sellest allikast tundmatuid rakendusi."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Teie turvalisuse huvides ei ole telefonil lubatud installida sellest allikast tundmatuid rakendusi."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Teie telefon ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate telefoni kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Teie tahvelarvuti ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate tahvelarvuti kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Teie teler ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate teleri kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index 65e75cd..a62e9ba 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakete-instalatzailea"</string>
<string name="install" msgid="711829760615509273">"Instalatu"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Eginda"</string>
<string name="cancel" msgid="1018267193425558088">"Utzi"</string>
<string name="installing" msgid="4921993079741206516">"Instalatzen…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalatzen…"</string>
<string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Aplikazio hau instalatu nahi duzu?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Aplikazioaren eguneratzea instalatu nahi duzu? Lehendik dauden datuak ez dira galduko."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Aplikazio integratu honen eguneratzea instalatu nahi duzu? Lehendik dauden datuak ez dira galduko."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ezin dira gauzatu instalatzeko eta desinstalatzeko ekintzak Wear gailuetan."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikazioa prestatzen…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ezezaguna"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml
index d08409e..fbb437e 100644
--- a/packages/PackageInstaller/res/values-fa/strings.xml
+++ b/packages/PackageInstaller/res/values-fa/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"نصبکننده بسته"</string>
<string name="install" msgid="711829760615509273">"نصب"</string>
+ <string name="update" msgid="3932142540719227615">"بهروزرسانی"</string>
<string name="done" msgid="6632441120016885253">"تمام"</string>
<string name="cancel" msgid="1018267193425558088">"لغو"</string>
<string name="installing" msgid="4921993079741206516">"درحال نصب…"</string>
<string name="installing_app" msgid="1165095864863849422">"درحال نصب <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"میخواهید این برنامه را نصب کنید؟"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"آیا میخواهید بهروزرسانی این برنامه کنونی را نصب کنید؟ داده کنونی شما از بین نمیرود."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"آیا میخواهید بهروزرسانی این برنامه داخلی را نصب کنید؟ دادههای کنونی شما از بین نمیرود."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"میخواهید این برنامه را نصب کنید؟"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"میخواهید این برنامه را بهروزرسانی کنید؟"</string>
<string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"کنشهای نصب/حذف نصب در Wear پشتیبانی نمیشود."</string>
<string name="message_staging" msgid="8032722385658438567">"مرحلهبندی برنامه…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"نامشخص"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"برای امنیت شما، رایانه لوحیتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"برای امنیت شما، تلویزیونتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"برای امنیت شما، تلفنتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"برای امنیت شما، درحالحاضر رایانه لوحیتان اجازه ندارد برنامههای ناشناس را از این منبع نصب کنید. میتوانید آن را در «تنظیمات» تغییر دهید."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"برای امنیت شما، درحالحاضر تلویزیونتان اجازه ندارد برنامههای ناشناس را از این منبع نصب کنید. میتوانید آن را در «تنظیمات» تغییر دهید."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"برای امنیت شما، درحالحاضر تلفنتان اجازه ندارد برنامههای ناشناس را از این منبع نصب کنید. میتوانید آن را در «تنظیمات» تغییر دهید."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"تلفن و دادههای شخصیتان دربرابر حمله برنامههای ناشناس آسیبپذیرتر هستند. با نصب این برنامه، موافقت میکنید که مسئول هرگونه آسیب به تلفن یا از دست رفتن دادهای هستید که ممکن است درنتیجه استفاده از آن به وجود آید."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"رایانه لوحی و دادههای شخصیتان دربرابر حمله برنامههای ناشناس آسیبپذیرتر هستند. با نصب این برنامه، موافقت میکنید که مسئول هرگونه آسیب به رایانه لوحی یا از دست رفتن دادهای هستید که ممکن است درنتیجه استفاده از آن به وجود آید."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"تلویزیون و دادههای شخصیتان دربرابر حمله برنامههای ناشناس آسیبپذیرتر هستند. با نصب این برنامه، موافقت میکنید که مسئول هرگونه آسیب به تلویزیون یا از دست رفتن دادهای هستید که ممکن است درنتیجه استفاده از آن به وجود آید."</string>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index d52eddf..e7b3de7 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketin asentaja"</string>
<string name="install" msgid="711829760615509273">"Asenna"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Valmis"</string>
<string name="cancel" msgid="1018267193425558088">"Peruuta"</string>
<string name="installing" msgid="4921993079741206516">"Asennetaan…"</string>
<string name="installing_app" msgid="1165095864863849422">"Asennetaan <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Haluatko asentaa tämän sovelluksen?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Haluatko asentaa päivityksen tähän asennettuun sovellukseen? Aiempi data ei katoa."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Haluatko asentaa päivityksen tähän valmiiksi asennettuun sovellukseen? Aiempi data ei katoa."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei tue asennus- ja poistotoimintoja."</string>
<string name="message_staging" msgid="8032722385658438567">"Valmistellaan sovellusta…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tuntematon"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Turvallisuussyistä tabletti ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Turvallisuussyistä televisiosi ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Turvallisuussyistä puhelin ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tuntemattomat sovellukset voivat helpommin kaapata puhelimesi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa puhelimellesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tuntemattomat sovellukset voivat helpommin kaapata tablettisi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa tabletillesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tuntemattomat sovellukset voivat helpommin kaapata televisiosi ja henkilökohtaiset tietosi. Lataamalla sovelluksen hyväksyt, että olet itse vastuussa mahdollisista televisiolle aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index 365493f..bc9bad9 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Progr. d\'inst. de paquet"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Terminé"</string>
<string name="cancel" msgid="1018267193425558088">"Annuler"</string>
<string name="installing" msgid="4921993079741206516">"Installation en cours…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> en cours…"</string>
<string name="install_done" msgid="5987363587661783896">"Application installée."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Voulez-vous installer cette application?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Voulez-vous installer une mise à jour pour cette application existante? Vos données existantes ne seront pas perdues."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Voulez-vous installer une mise à jour pour cette application intégrée? Vos données existantes ne seront pas perdues."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les actions d\'installation et de désinstallation ne sont pas prises en charge par Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Pré-production de l\'application en cours…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inconnue"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur cette tablette."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléphone."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données personnelles sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index 462c60e..b9fb05d 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Programme installation kit"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"OK"</string>
<string name="cancel" msgid="1018267193425558088">"Annuler"</string>
<string name="installing" msgid="4921993079741206516">"Installation…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installation du package <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Application installée."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Voulez-vous installer cette application ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Voulez-vous mettre à jour cette application ? Vos données actuelles ne seront pas perdues."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Voulez-vous mettre à jour cette application intégrée ? Vos données actuelles ne seront pas perdues."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Opérations d\'installation et de désinstallation impossibles sur Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Préparation de l\'installation de l\'appli…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inconnu"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur cette tablette."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléphone."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de son utilisation."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de son utilisation."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 1ad1174..16ad2a3 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Feito"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Queres instalar esta aplicación?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Queres instalar unha actualización para esta aplicación? Non se perderán os datos que teñas."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Queres instalar unha actualización para esta aplicación integrada? Non se perderán os datos que teñas."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As accións de instalar e desinstalar non son compatibles con Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nome descoñecido"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por cuestións de seguranza, na tableta non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por cuestións de seguranza, na televisión non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por cuestións de seguranza, no teléfono non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O teléfono e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados no teléfono ou da perda dos datos que se poidan derivar do seu uso."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"A tableta e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na tableta ou da perda dos datos que se poidan derivar do seu uso."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A televisión e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na televisión ou da perda dos datos que se poidan derivar do seu uso."</string>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index 20fbafe..8046581 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"પૅકેજ ઇન્સ્ટૉલર"</string>
<string name="install" msgid="711829760615509273">"ઇન્સ્ટૉલ કરો"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"થઈ ગયું"</string>
<string name="cancel" msgid="1018267193425558088">"રદ કરો"</string>
<string name="installing" msgid="4921993079741206516">"ઇન્સ્ટૉલ કરી રહ્યાં છીએ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ને ઇન્સ્ટૉલ કરી રહ્યાં છીએ…"</string>
<string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"શું તમે આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરવા માંગો છો?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"શું તમે આ અસ્તિત્વમાંની ઍપ્લિકેશનના અપડેટને ઇન્સ્ટૉલ કરવા માગો છો? તમારો અસ્તિત્વમાંનો ડેટા ગુમ થશે નહીં."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"શું તમે આ બિલ્ટ-ઇન ઍપ્લિકેશનના અપડેટને ઇન્સ્ટૉલ કરવા માગો છો? તમારો અસ્તિત્વમાંનો ડેટા ગુમ થશે નહીં."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear પર ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ ક્રિયાઓ સમર્થિત નથી."</string>
<string name="message_staging" msgid="8032722385658438567">"ઍપ્લિકેશનની પ્રક્રિયા ચાલુ છે…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"અજાણ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"તમારી સુરક્ષા માટે, તમારા ટૅબ્લેટને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"તમારી સુરક્ષા માટે, તમારા ટીવીને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"તમારી સુરક્ષા માટે, તમારા ફોનને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"તમારો ફોન અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ફોનને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"તમારું ટૅબ્લેટ અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ટૅબ્લેટને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"તમારું ટીવી અને વ્યક્તિગત ડેટા અજાણી ઍપ્લિકેશનો દ્વારા હુમલા માટે વધુ સંવેદનશીલ છે. આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને તમે સંમત થાઓ છો કે આનો ઉપયોગ કરવાથી તમારા ટીવીને થતી કોઈપણ હાનિ અથવા ડેટાના નુકસાન માટે તમે જવાબદાર છો."</string>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index 47f8301..290a211 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"पैकेज इंस्टॉलर"</string>
<string name="install" msgid="711829760615509273">"इंस्टॉल करें"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"हो गया"</string>
<string name="cancel" msgid="1018267193425558088">"रद्द करें"</string>
<string name="installing" msgid="4921993079741206516">"इंस्टॉल हो रहा है..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> इंस्टॉल हो रहा है…"</string>
<string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"क्या आप इस ऐप्लिकेशन को इंस्टॉल करना चाहते हैं?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"क्या आप इस मौजूदा ऐप्लिकेशन को अपडेट करना चाहते हैं? आपका मौजूदा डेटा बचा रहेगा."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"क्या आप इस बिल्ट-इन ऐप्लिकेशन को अपडेट करना चाहते हैं? आपका मौजूदा डेटा बचा रहेगा."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear पर ऐप्लिकेशन इंस्टॉल या अनइंस्टॉल नहीं किए जा सकते."</string>
<string name="message_staging" msgid="8032722385658438567">"ऐप्लिकेशन तैयार किया जा रहा है…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"अनजान"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"आपकी सुरक्षा के लिए, आपके टैबलेट को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"आपकी सुरक्षा के लिए, आपके टीवी को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"आपकी सुरक्षा के लिए, आपके फ़ोन को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"आपका फ़ोन और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके फ़ोन को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"आपका टैबलेट और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके टैबलेट को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"आपका टीवी और निजी डेटा अनजान ऐप्लिकेशन के हमले को लेकर ज़्यादा संवेदनशील हैं. इस ऐप्लिकेशन को इंस्टॉल करके, आप सहमति देते हैं कि इसके इस्तेमाल के चलते आपके टीवी को होने वाले किसी भी नुकसान या डेटा के मिट जाने पर, आप ज़िम्मेदार होंगे."</string>
diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml
index ba5d378..a11cc27 100644
--- a/packages/PackageInstaller/res/values-hr/strings.xml
+++ b/packages/PackageInstaller/res/values-hr/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Alat za inst. paketa"</string>
<string name="install" msgid="711829760615509273">"Instaliraj"</string>
+ <string name="update" msgid="3932142540719227615">"Ažuriraj"</string>
<string name="done" msgid="6632441120016885253">"Gotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Otkaži"</string>
<string name="installing" msgid="4921993079741206516">"Instaliranje…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instaliranje paketa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Želite li instalirati tu aplikaciju?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li instalirati ažuriranje postojeće aplikacije? Vaši postojeći podaci neće se izgubiti."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li instalirati ažuriranje za ovu ugrađenu aplikaciju? Vaši postojeći podaci neće se izgubiti."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string>
<string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Radnje instaliranja i deinstaliranja nisu podržane na Wearu."</string>
<string name="message_staging" msgid="8032722385658438567">"Postavljanje aplikacije…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Iz sigurnosnih razloga tablet nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Iz sigurnosnih razloga televizor nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Iz sigurnosnih razloga telefon nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Iz sigurnosnih razloga tablet trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Iz sigurnosnih razloga televizor trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Iz sigurnosnih razloga telefon trenutačno nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora. To možete promijeniti u Postavkama."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Vaš telefon i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje telefona ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Vaš tablet i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje tableta ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Vaš TV i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje televizora ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index 2b951de..c8517fa 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Csomagtelepítő"</string>
<string name="install" msgid="711829760615509273">"Telepítés"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Kész"</string>
<string name="cancel" msgid="1018267193425558088">"Mégse"</string>
<string name="installing" msgid="4921993079741206516">"Telepítés…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> telepítése…"</string>
<string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Telepíti ezt az alkalmazást?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Telepíti a meglévő alkalmazás frissítését? Meglévő adatai nem vesznek el."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Telepíti a beépített alkalmazás frissítését? Meglévő adatai nem vesznek el."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"A Wear nem támogatja a telepítés/eltávolítás műveletet."</string>
<string name="message_staging" msgid="8032722385658438567">"Alkalmazás fokozatos közzététele…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ismeretlen"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Az Ön biztonsága érdekében táblagépe nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Az Ön biztonsága érdekében tévéje nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Az Ön biztonsága érdekében telefonja nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonja és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a telefont ért károkért."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Táblagépe és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a táblagépet ért károkért."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tévéje és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a tévét ért károkért."</string>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index c05040b..82cd089 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Package Installer"</string>
<string name="install" msgid="711829760615509273">"Տեղադրել"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Պատրաստ է"</string>
<string name="cancel" msgid="1018267193425558088">"Չեղարկել"</string>
<string name="installing" msgid="4921993079741206516">"Տեղադրում…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> հավելվածը տեղադրվում է…"</string>
<string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Տեղադրե՞լ այս հավելվածը:"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Տեղադրե՞լ այս հավելվածի թարմացումը: Ձեր տվյալները կպահպանվեն:"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Տեղադրե՞լ այս ներկառուցված հավելվածի թարմացումը: Ձեր տվյալները կպահպանվեն:"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Տեղադրման/ապատեղադրման գործողությունները Android Wear-ում չեն աջակցվում:"</string>
<string name="message_staging" msgid="8032722385658438567">"Սպասեք…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Անհայտ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Անվտանգության նկատառումներից ելնելով՝ ձեր պլանշետին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռուստացույցին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռախոսին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ձեր հեռախոսը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռախոսին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ձեր պլանշետը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր պլանշետին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ձեր հեռուստացույցը և անձնական տվյալներն առավել խոցելի են անհայտ հավելվածների գրոհների նկատմամբ: Տեղադրելով այս հավելվածը՝ դուք ընդունում եք, որ պատասխանատվություն եք կրում հավելվածի օգտագործման հետևանքով ձեր հեռուստացույցին պատճառած ցանկացած վնասի կամ տվյալների կորստի համար:"</string>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index 52aa3c0..db5954d 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Installer paket"</string>
<string name="install" msgid="711829760615509273">"Instal"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Selesai"</string>
<string name="cancel" msgid="1018267193425558088">"Batal"</string>
<string name="installing" msgid="4921993079741206516">"Menginstal..."</string>
<string name="installing_app" msgid="1165095864863849422">"Menginstal <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Anda ingin menginstal aplikasi ini?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Apakah Anda ingin menginstal update ke aplikasi yang sudah ada? Data Anda yang ada saat ini tidak akan hilang."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Apakah Anda ingin menginstal update ke aplikasi bawaan? Data Anda yang ada saat ini tidak akan hilang."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan Instal/Uninstal tidak didukung di Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Menyiapkan aplikasi..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tidak dikenal"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Demi keamanan, TV Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Demi keamanan, TV Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Demi keamanan, ponsel Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ponsel dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan ponsel atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan tablet atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan TV atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index 82d10d3..9fc4d70 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Uppsetningarforrit pakka"</string>
<string name="install" msgid="711829760615509273">"Setja upp"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Lokið"</string>
<string name="cancel" msgid="1018267193425558088">"Hætta við"</string>
<string name="installing" msgid="4921993079741206516">"Setur upp…"</string>
<string name="installing_app" msgid="1165095864863849422">"Setur <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> upp…"</string>
<string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Viltu setja þetta forrit upp?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Viltu setja upp uppfærslu á þessu uppsetta forriti? Eldri gögn glatast ekki."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Viltu setja upp uppfærslu á þessu innbyggða forriti? Eldri gögn glatast ekki."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Aðgerðir til að setja upp / fjarlægja eru ekki studdar í Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Setur upp forrit…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Óþekkt"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Til að tryggja öryggi þitt er ekki heimild í spjaldtölvunni þinni fyrir uppsetningu óþekktra forrita frá þessari veitu."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Til að tryggja öryggi þitt er ekki heimild í sjónvarpinu þínu fyrir uppsetningu óþekktra forrita frá þessari veitu."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Til að tryggja öryggi þitt er ekki heimild í símanum þínum fyrir uppsetningu óþekktra forrita frá þessari veitu."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Síminn þinn og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á símanum eða gagnatapi sem leiða kann af notkun þess."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Spjaldtölvan þín og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á spjaldtölvunni eða gagnatapi sem leiða kann af notkun þess."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sjónvarpið þitt og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á sjónvarpinu eða gagnatapi sem leiða kann af notkun þess."</string>
diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml
index cee14bc..42c3cfe 100644
--- a/packages/PackageInstaller/res/values-it/strings.xml
+++ b/packages/PackageInstaller/res/values-it/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Installazione pacchetti"</string>
<string name="install" msgid="711829760615509273">"Installa"</string>
+ <string name="update" msgid="3932142540719227615">"Aggiorna"</string>
<string name="done" msgid="6632441120016885253">"Fine"</string>
<string name="cancel" msgid="1018267193425558088">"Annulla"</string>
<string name="installing" msgid="4921993079741206516">"Installazione…"</string>
<string name="installing_app" msgid="1165095864863849422">"Installazione di <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App installata."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Installare questa applicazione?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vuoi installare un aggiornamento a questa applicazione esistente? I tuoi dati non andranno persi."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vuoi installare un aggiornamento per questa applicazione integrata? I tuoi dati non andranno persi."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Vuoi installare questa app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Vuoi aggiornare questa app?"</string>
<string name="install_failed" msgid="5777824004474125469">"App non installata."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Le azioni di installazione/disinstallazione non sono supportate su Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"App in preparazione…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Sconosciuto"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Per sicurezza, il tuo tablet non è autorizzato a installare app sconosciute da questa origine."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Per sicurezza, la tua TV non è autorizzata a installare app sconosciute da questa origine."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Per sicurezza, il tuo telefono non è autorizzato a installare app sconosciute da questa origine."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Per motivi di sicurezza, il tuo tablet non è attualmente autorizzato a installare app sconosciute da questa origine. Puoi modificare questa opzione nelle Impostazioni."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Per motivi di sicurezza, la tua TV non è attualmente autorizzata a installare app sconosciute da questa origine. Puoi modificare questa opzione nelle Impostazioni."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Per motivi di sicurezza, il tuo telefono non è attualmente autorizzato a installare app sconosciute da questa origine. Puoi modificare questa opzione nelle Impostazioni."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"I dati del telefono e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni al telefono o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"I dati del tablet e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni al tablet o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"I dati della TV e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni alla TV o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index e5e2195..868c1a6 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -18,19 +18,22 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"מתקין החבילה"</string>
<string name="install" msgid="711829760615509273">"התקנה"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"סיום"</string>
<string name="cancel" msgid="1018267193425558088">"ביטול"</string>
- <string name="installing" msgid="4921993079741206516">"מתקין…"</string>
+ <string name="installing" msgid="4921993079741206516">"בהתקנה…"</string>
<string name="installing_app" msgid="1165095864863849422">"מתבצעת התקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"להתקין את האפליקציה הזו?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"להתקין עדכון עבור האפליקציה הזו? הנתונים הקיימים שלך לא יאבדו."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"האם ברצונך להתקין עדכון עבור אפליקציה מובנית זו? הנתונים הקיימים שלך לא יאבדו."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string>
- <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטאבלט."</string>
- <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"האפליקציה הזו אינה תואמת לטלוויזיה שלך."</string>
+ <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"האפליקציה לא הותקנה כי היא אינה תואמת לטאבלט."</string>
+ <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"האפליקציה הזו לא תואמת לטלוויזיה שלך."</string>
<string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"האפליקציה לא הותקנה כי היא לא תואמת לטלפון."</string>
<string name="install_failed_invalid_apk" msgid="8581007676422623930">"האפליקציה לא הותקנה כי נראה שהחבילה לא תקפה."</string>
<string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g> בטאבלט שלך."</string>
@@ -42,7 +45,7 @@
<string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"למשתמש הזה אין הרשאה להתקין אפליקציות"</string>
<string name="ok" msgid="7871959885003339302">"אישור"</string>
<string name="manage_applications" msgid="5400164782453975580">"ניהול אפליקציות"</string>
- <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק שטח"</string>
+ <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק מקום"</string>
<string name="out_of_space_dlg_text" msgid="8727714096031856231">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g>. יש לפנות מקום אחסון ולנסות שוב."</string>
<string name="app_not_found_dlg_title" msgid="5107924008597470285">"האפליקציה לא נמצאה"</string>
<string name="app_not_found_dlg_text" msgid="5219983779377811611">"האפליקציה לא נמצאת ברשימת האפליקציות המותקנות."</string>
@@ -53,10 +56,10 @@
<string name="uninstall_application_title" msgid="4045420072401428123">"הסרת התקנה של האפליקציה"</string>
<string name="uninstall_update_title" msgid="824411791011583031">"הסרת התקנה של עדכון"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"הפעילות <xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> היא חלק מהאפליקציה הבאה:"</string>
- <string name="uninstall_application_text" msgid="3816830743706143980">"האם ברצונך להסיר את ההתקנה של אפליקציה זו?"</string>
+ <string name="uninstall_application_text" msgid="3816830743706143980">"להסיר את ההתקנה של האפליקציה הזו?"</string>
<string name="uninstall_application_text_all_users" msgid="575491774380227119">"להסיר את האפליקציה הזו עבור "<b>"כל"</b>" המשתמשים? האפליקציה והנתונים שלה יוסרו עבור "<b>"כל"</b>" המשתמשים במכשיר."</string>
<string name="uninstall_application_text_user" msgid="498072714173920526">"להסיר את ההתקנה של האפליקציה הזו עבור <xliff:g id="USERNAME">%1$s</xliff:g>?"</string>
- <string name="uninstall_update_text" msgid="863648314632448705">"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו."</string>
+ <string name="uninstall_update_text" msgid="863648314632448705">"להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו."</string>
<string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו. הפעולה תשפיע על כל משתמשי המכשיר, כולל משתמשים בעלי פרופיל עבודה."</string>
<string name="uninstall_keep_data" msgid="7002379587465487550">"שמירת <xliff:g id="SIZE">%1$s</xliff:g> מנתוני האפליקציה."</string>
<string name="uninstalling_notification_channel" msgid="840153394325714653">"התקנות בתהליכי הסרה"</string>
@@ -69,27 +72,30 @@
<string name="uninstall_failed_app" msgid="5506028705017601412">"לא ניתן היה להסיר את ההתקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string>
<string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר"</string>
<string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר של <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
- <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"אפליקציה זו נדרשת לחלק מהמשתמשים או מהפרופילים והתקנתה הוסרה למשתמשים אחרים"</string>
+ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"האפליקציה הזו נדרשת עבור חלק מהמשתמשים או הפרופילים, וההתקנה שלה הוסרה עבור משתמשים אחרים"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"האפליקציה הזו נחוצה לפרופיל שלך ולא ניתן להסיר את ההתקנה שלה."</string>
- <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"מנהל המכשיר שלך מחייב את קיומה של אפליקציה זו, ולא ניתן להסירה."</string>
+ <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"מנהל המכשיר שלך מחייב את קיומה של האפליקציה הזו, ולא ניתן להסיר אותה."</string>
<string name="manage_device_administrators" msgid="3092696419363842816">"אפליקציות למנהל המערכת של מכשיר מנוהל"</string>
<string name="manage_users" msgid="1243995386982560813">"ניהול משתמשים"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"לא ניתן להסיר את ההתקנה של <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="Parse_error_dlg_text" msgid="1661404001063076789">"אירעה בעיה בניתוח החבילה."</string>
<string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string>
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"פעולות התקנה/הסרת התקנה אינן נתמכות ב-Wear."</string>
- <string name="message_staging" msgid="8032722385658438567">"מכין אפליקציה להתקנה…"</string>
+ <string name="message_staging" msgid="8032722385658438567">"בתהליך הכנת האפליקציה להתקנה…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"לא ידוע"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"לצורכי אבטחה, הטאבלט שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"לצורכי אבטחה, מכשיר הטלוויזיה שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"לצורכי אבטחה, הטלפון שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלפון שלך בעקבות השימוש באפליקציה."</string>
- <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"נתוני הטאבלט והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטאבלט שלך בעקבות השימוש באפליקציה."</string>
- <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"נתוני הטלוויזיה והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטלוויזיה שלך בעקבות השימוש באפליקציה."</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"נתוני הטאבלט והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטאבלט בעקבות השימוש באפליקציה."</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"נתוני הטלוויזיה והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלוויזיה שלך בעקבות השימוש באפליקציה."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"המשך"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"הגדרות"</string>
- <string name="wear_app_channel" msgid="1960809674709107850">"מתקין/מסיר התקנה של אפליקציות Wear"</string>
+ <string name="wear_app_channel" msgid="1960809674709107850">"תהליך התקנה/הסרת התקנה של אפליקציות Wear"</string>
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"התראה על התקנת האפליקציה"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"הותקנה בהצלחה"</string>
- <string name="notification_installation_success_status" msgid="3172502643504323321">"האפליקציה \"<xliff:g id="APPNAME">%1$s</xliff:g>\" הותקנה בהצלחה"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"האפליקציה \"<xliff:g id="APPNAME">%1$s</xliff:g>\" הותקנה"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 1ba36e7..535c1ae 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"パッケージ インストーラ"</string>
<string name="install" msgid="711829760615509273">"インストール"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"完了"</string>
<string name="cancel" msgid="1018267193425558088">"キャンセル"</string>
<string name="installing" msgid="4921993079741206516">"インストールしています…"</string>
<string name="installing_app" msgid="1165095864863849422">"「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」をインストールしています…"</string>
<string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"このアプリをインストールしますか?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"この既存のアプリへのアップデートをインストールしてもよろしいですか?既存のデータは失われません。"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"この内蔵アプリへのアップデートをインストールしてもよろしいですか?既存のデータは失われません。"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ではインストールやアンインストールはできません。"</string>
<string name="message_staging" msgid="8032722385658438567">"アプリを準備しています…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"セキュリティ上の理由から、お使いのタブレットではこの提供元からの不明なアプリをインストールすることはできません。"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"セキュリティ上の理由から、お使いのテレビではこの提供元からの不明なアプリをインストールすることはできません。"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"セキュリティ上の理由から、お使いのスマートフォンではこの提供元からの不明なアプリをインストールすることはできません。"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"不明なアプリをインストールするとスマートフォンや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるスマートフォンへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"不明なアプリをインストールするとタブレットや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるタブレットへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"不明なアプリをインストールするとテレビや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるテレビへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index 779fa0e..c8b4401 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"პაკეტის ინსტალატორი"</string>
<string name="install" msgid="711829760615509273">"ინსტალაცია"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"მზადაა"</string>
<string name="cancel" msgid="1018267193425558088">"გაუქმება"</string>
<string name="installing" msgid="4921993079741206516">"მიმდინარეობს ინსტალაცია…"</string>
<string name="installing_app" msgid="1165095864863849422">"მიმდინარეობს <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-ის ინსტალაცია…"</string>
<string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"გსურთ ამ აპლიკაციის ინსტალაცია?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"გსურთ ამ არსებული აპლიკაციის განახლების ინსტალაცია? არსებული მონაცემები არ დაიკარგება."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"გსურთ ამ ჩაშენებული აპლიკაციის განახლების ინსტალაცია? არსებული მონაცემები არ დაიკარგება."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ინსტალაცია/დეინსტალაცია მხარდაუჭერელია Wear-ზე."</string>
<string name="message_staging" msgid="8032722385658438567">"მიმდინარეობს აპის შუალედური შენახვა…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"უცნობი"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"თქვენივე უსაფრთხოებისთვის, ტაბლეტს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"თქვენივე უსაფრთხოებისთვის, ტელევიზორს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"თქვენივე უსაფრთხოებისთვის, ტელეფონს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"თქვენი ტელეფონი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტელეფონისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"თქვენი ტაბლეტი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტაბლეტისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"თქვენი ტელევიზორი და პერსონალური მონაცემები მეტად დაუცველია უცნობი აპების მხრიდან შეტევების წინაშე. ამ აპის ინსტალაციის შემთხვევაში, თქვენ თანახმა ხართ, პასუხისმგებელი იყოთ მისი გამოყენების შედეგად ტელევიზორისთვის მიყენებულ ზიანსა თუ მონაცემების დაკარგვაზე."</string>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index 3e6d25d..badfa4e 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Пакет орнатқыш"</string>
<string name="install" msgid="711829760615509273">"Орнату"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Дайын"</string>
<string name="cancel" msgid="1018267193425558088">"Бас тарту"</string>
<string name="installing" msgid="4921993079741206516">"Орнатылуда…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> орнатылуда…"</string>
<string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Осы қолданба орнатылсын ба?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Қолданбаның жаңартылған нұсқасы орнатылсын ба? Бұрыннан бар деректер сақталады."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Орнатылған қолданбаның жаңартылған нұсқасы орнатылсын ба? Бұрыннан бар деректер сақталады."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear жүйесінде \"Орнату/Жою\" әрекеттері қолданылмайды."</string>
<string name="message_staging" msgid="8032722385658438567">"Қолданба дайындалуда…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Белгісіз"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Қауіпсіздік үшін планшетке бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Қауіпсіздік үшін теледидарға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Қауіпсіздік үшін телефонға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефон және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі телефонға келетін залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Планшет және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі планшетке келетін залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Теледидар және жеке деректер белгісіз қолданбалардың шабуылына ұшырауы мүмкін. Бұл қолданбаны орнату арқылы оны пайдалану нәтижесіндегі теледидарға келетін қандай да бір залалға немесе деректердің жоғалуына өзіңіз ғана жауапты болатыныңызға келісесіз."</string>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index af7ef0b..eb13774 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"កម្មវិធីដំឡើងកញ្ចប់"</string>
<string name="install" msgid="711829760615509273">"ដំឡើង"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"រួចរាល់"</string>
<string name="cancel" msgid="1018267193425558088">"បោះបង់"</string>
<string name="installing" msgid="4921993079741206516">"កំពុងដំឡើង…"</string>
<string name="installing_app" msgid="1165095864863849422">"កំពុងដំឡើង <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"តើអ្នកចង់ដំឡើងកំណែថ្មីសម្រាប់កម្មវិធីដែលមានស្រាប់នេះដែរទេ? ទិន្នន័យដែលមានស្រាប់របស់អ្នកនឹងមិនបាត់បង់ទេ។"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"តើអ្នកចង់ដំឡើងកំណែថ្មីសម្រាប់កម្មវិធីដែលភ្ជាប់មកជាមួយនេះដែរទេ? ទិន្នន័យដែលមានស្រាប់របស់អ្នកនឹងមិនបាត់បង់ទេ។"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"សកម្មភាពដំឡើង/លុបចេញមិនអាចប្រើនៅលើ Wear បានទេ។"</string>
<string name="message_staging" msgid="8032722385658438567">"កំពុងសាកល្បងកម្មវិធី…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"មិនស្គាល់"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ថេប្លេតរបស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ទូរទស្សន៍របស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ទូរសព្ទរបស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ទូរសព្ទ និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះទូរសព្ទ ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ថេប្លេត និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះថេប្លេត ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ទូរទស្សន៍ និងទិន្នន័យផ្ទាល់ខ្លួនរបស់អ្នកងាយនឹងរងគ្រោះពីការវាយប្រហារពីកម្មវិធីដែលមិនស្គាល់។ ប្រសិនបើដំឡើងកម្មវិធីនេះ មានន័យថាអ្នកទទួលខុសត្រូវលើការខូចខាតទាំងឡាយចំពោះទូរទស្សន៍ ឬការបាត់បង់ទិន្នន័យរបស់អ្នក ដែលអាចបណ្ដាលមកពីការប្រើប្រាស់កម្មវិធីនេះ។"</string>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index fa93f0d..66df526 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ಪ್ಯಾಕೇಜ್ ಇನ್ಸ್ಟಾಲರ್"</string>
<string name="install" msgid="711829760615509273">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ಮುಗಿದಿದೆ"</string>
<string name="cancel" msgid="1018267193425558088">"ರದ್ದುಮಾಡಿ"</string>
<string name="installing" msgid="4921993079741206516">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
<string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ ಆದ ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ನೀವು ಈ ಅಂತನಿರ್ಮಿತ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ ಆದ ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ನಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್/ಅನ್ಇನ್ಸ್ಟಾಲ್ ಕ್ರಿಯೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
<string name="message_staging" msgid="8032722385658438567">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಿದ್ಧವಿರುವ ಆ್ಯಪ್…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ಅಪರಿಚಿತ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಅಪರಿಚಿತ ಮೂಲಗಳಿಂದ ಪಡೆದುಕೊಳ್ಳುವ ಆ್ಯಪ್ಗಳನ್ನು ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಅನುಮತಿಯಿಲ್ಲ."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ನಿಮ್ಮ ಫೋನ್ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್ಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ನಿಮ್ಮ ಟಿವಿ ಹಾಗೂ ವೈಯಕ್ತಿಕ ಡೇಟಾ, ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳ ದಾಳಿಗೆ ತುತ್ತಾಗುವ ಸಾಧ್ಯತೆ ಹೆಚ್ಚಾಗಿದೆ. ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಟಿವಿಗೆ ಯಾವುದೇ ಹಾನಿ ಉಂಟಾದರೆ ಅಥವಾ ಅದರ ಬಳಕೆಯಿಂದ ಡೇಟಾ ನಷ್ಟವಾದರೆ, ಅದಕ್ಕೆ ನೀವೇ ಜವಾಬ್ದಾರರು ಎನ್ನುವುದನ್ನು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 2f11159..2eada00 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"패키지 설치 프로그램"</string>
<string name="install" msgid="711829760615509273">"설치"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"완료"</string>
<string name="cancel" msgid="1018267193425558088">"취소"</string>
<string name="installing" msgid="4921993079741206516">"설치 중..."</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 설치 중…"</string>
<string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"이 애플리케이션을 설치하시겠습니까?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"이 기존 애플리케이션에 대한 업데이트를 설치하시겠습니까? 기존 데이터는 유지됩니다."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"이 내장 애플리케이션에 대한 업데이트를 설치하시겠습니까? 기존 데이터는 유지됩니다."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear에서 지원되지 않는 설치/제거 작업"</string>
<string name="message_staging" msgid="8032722385658438567">"앱 준비 중…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"알 수 없음"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"보안상의 이유로 이 소스의 알 수 없는 앱을 태블릿에 설치할 수 없습니다."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"보안상의 이유로 이 소스의 알 수 없는 앱을 TV에 설치할 수 없습니다."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"보안상의 이유로 이 소스의 알 수 없는 앱을 휴대전화에 설치할 수 없습니다."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"휴대전화와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 휴대전화 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"태블릿과 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 태블릿 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 TV 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index 822c548..ef65291 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Топтомду орноткуч"</string>
<string name="install" msgid="711829760615509273">"Орнотуу"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Бүттү"</string>
<string name="cancel" msgid="1018267193425558088">"Жокко чыгаруу"</string>
<string name="installing" msgid="4921993079741206516">"Орнотулууда…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> орнотулууда…"</string>
<string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Бул колдонмону орнотоюн деп жатасызбы?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Учурдагы колдонмону жаңыртканы жатасызбы? Буга чейин сакталган дайын-даректериңиз өчүрүлбөйт."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Учурдагы алдын ала орнотулган колдонмону жаңыртканы жатасызбы? Буга чейин сакталган дайын-даректериңиз өчүрүлбөйт."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Орнотуу/чыгарып салуу аракеттери Android Wear\'де колдоого алынбайт."</string>
<string name="message_staging" msgid="8032722385658438567">"Күтө туруңуз…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Белгисиз"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Коопсуздукту сактоо максатында, планшетиңизге бул булактан колдонмолорду орнотууга уруксат жок."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Коопсуздукту сактоо максатында, сыналгыңызга бул булактан колдонмолорду орнотууга уруксат жок."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Коопсуздукту сактоо максатында, телефонуңузга бул булактан колдонмолорду орнотууга уруксат жок."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефонуңуз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам телефонуңузга кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Планшетиңиз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам планшетиңизге кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Сыналгыңыз жана жеке дайын-даректериңиз белгисиз колдонмолордон зыян тартып калышы мүмкүн. Бул колдонмону орнотуп, аны пайдалануудан улам сыналгыңызга кандайдыр бир зыян келтирилсе же дайын-даректериңизды жоготуп алсаңыз, өзүңүз жооптуу болосуз."</string>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index c52f509..78209bf 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ຕົວຕິດຕັ້ງແພັກເກດ"</string>
<string name="install" msgid="711829760615509273">"ຕິດຕັ້ງ"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ແລ້ວໆ"</string>
<string name="cancel" msgid="1018267193425558088">"ຍົກເລີກ"</string>
<string name="installing" msgid="4921993079741206516">"ກຳລັງຕິດຕັ້ງ…"</string>
<string name="installing_app" msgid="1165095864863849422">"ກຳລັງຕິດຕັ້ງ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບພລິເຄຊັນນີ້ບໍ່?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ທ່ານຕ້ອງການຕິດຕັ້ງອັບເດດຫາແອັບພລິເຄຊັນທີ່ມີຢູ່ກ່ອນແລ້ວນີ້ບໍ່? ຂໍ້ມູນເກົ່າຂອງທ່ານຈະບໍ່ເສຍໄປໃສ."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ທ່ານຕ້ອງການຕິດຕັ້ງອັບເດດໃສ່ແອັບພລິເຄຊັນແບບມີມາໃນຕົວນີ້ບໍ່? ຂໍ້ມູນເກົ່າຂອງທ່ານຈະບໍ່ເສຍໄປໃສ."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ຕິດຕັ້ງ/ຖອນການຕິດຕັ້ງ ຄຳສັ່ງທີ່ບໍ່ຮອງຮັບຢູ່ Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"ກຳລັງຮຽງແອັບ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ບໍ່ຮູ້ຈັກ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ແທັບເລັດຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ໂທລະທັດຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ໂທລະສັບຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ໂທລະສັບ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ແທັບເລັດ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ໂທລະທັດ ແລະ ຂໍ້ມູນສ່ວນຕົວຂອງທ່ານອາດຖືກໂຈມຕີໄດ້ໂດຍແອັບທີ່ບໍ່ຮູ້ຈັກ. ໂດຍການຕິດຕັ້ງແອັບນີ້, ແມ່ນທ່ານຍອມຮັບວ່າທ່ານຈະຮັບຜິດຊອບຕໍ່ຄວາມເສຍຫາຍໃດໆກໍຕາມທີ່ເກີດຂຶ້ນຕໍ່ໂທລະທັດຂອງທ່ານ ຫຼື ການສູນເສຍຂໍ້ມູນທີ່ອາດເກີດຈາກການນຳໃຊ້ມັນ."</string>
diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml
index e88bde45..b0bff20 100644
--- a/packages/PackageInstaller/res/values-lt/strings.xml
+++ b/packages/PackageInstaller/res/values-lt/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketo diegimo programa"</string>
<string name="install" msgid="711829760615509273">"Įdiegti"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Atlikta"</string>
<string name="cancel" msgid="1018267193425558088">"Atšaukti"</string>
<string name="installing" msgid="4921993079741206516">"Įdiegiama…"</string>
<string name="installing_app" msgid="1165095864863849422">"Įdiegiamas paketas „<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>“…"</string>
<string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Ar norite įdiegti šią programą?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Ar norite įdiegti šios esamos programos naujinį? Esamų duomenų neprarasite."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Ar norite įdiegti šios įtaisytos programos naujinį? Esamų duomenų neprarasite."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Diegimo / pašalinimo veiksmai nepalaikomi sistemoje „Wear“."</string>
<string name="message_staging" msgid="8032722385658438567">"Programa pateikiama etapais…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nežinoma"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Saugos sumetimais planšetiniame kompiuteryje neleidžiama diegti nežinomų programų iš šio šaltinio."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Saugos sumetimais televizoriuje neleidžiama diegti nežinomų programų iš šio šaltinio."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Saugos sumetimais telefone neleidžiama diegti nežinomų programų iš šio šaltinio."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonas ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą telefonui arba prarastus duomenis dėl šios programos naudojimo."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planšetinis kompiuteris ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą planšetiniam kompiuteriui arba prarastus duomenis dėl šios programos naudojimo."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą TV arba prarastus duomenis dėl šios programos naudojimo."</string>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index fa14527..70ea596 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakotnes instalēš. progr."</string>
<string name="install" msgid="711829760615509273">"Instalēt"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Gatavs"</string>
<string name="cancel" msgid="1018267193425558088">"Atcelt"</string>
<string name="installing" msgid="4921993079741206516">"Notiek instalēšana…"</string>
<string name="installing_app" msgid="1165095864863849422">"Notiek pakotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalēšana…"</string>
<string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Vai vēlaties instalēt šo lietojumprogrammu?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vai vēlaties instalēt šīs lietojumprogrammas atjauninājumu? Esošie dati netiks zaudēti."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vai vēlaties instalēt šīs iebūvētās lietojumprogrammas atjauninājumu? Esošie dati netiks zaudēti."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Operētājsistēmā Wear netiek atbalstīta instalēšana/atinstalēšana."</string>
<string name="message_staging" msgid="8032722385658438567">"Lietotne tiek izstādīta…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Nezināma"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Drošības nolūkos jūsu planšetdatorā ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Drošības nolūkos jūsu televizorā ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Drošības nolūkos jūsu tālrunī ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Jūsu tālrunis un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par tālruņa bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Jūsu planšetdators un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par planšetdatora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Jūsu televizors un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par televizora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index 000e5d8..6152b398 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Инсталатор на пакет"</string>
<string name="install" msgid="711829760615509273">"Инсталирај"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Откажи"</string>
<string name="installing" msgid="4921993079741206516">"Се инсталира…"</string>
<string name="installing_app" msgid="1165095864863849422">"Се инсталира <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Дали сакате да ја инсталирате апликацијава?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Дали сакате да инсталирате ажурирање на оваа постоечка апликација? Постоечките податоци нема да се изгубат."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Дали сакате да инсталирате ажурирање на оваа вградена апликација? Постоечките податоци нема да се изгубат."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дејствата „Инсталирај/деинсталирај“ не се поддржани на Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Апликацијата се поставува…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Непозната"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"За ваша безбедност, таблетот нема дозвола за инсталирање непознати апликации од изворов."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"За ваша безбедност, телевизорот нема дозвола за инсталирање непознати апликации од изворов."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"За ваша безбедност, телефонот нема дозвола за инсталирање непознати апликации од изворов."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефонот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на телефонот или губењето податоци што може да произлезат од нејзиното користење."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таблетот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на таблетот или губењето податоци што може да произлезат од нејзиното користење."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Телевизорот и личните податоци се поподложни на напади од непознати апликации. Ако ја инсталирате апликацијава, се согласувате дека сте одговорни за каква било штета на телевизорот или губењето податоци што може да произлезат од нејзиното користење."</string>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index c22ead4..d66f4d6 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"പാക്കേജ് ഇൻസ്റ്റാളർ"</string>
<string name="install" msgid="711829760615509273">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"പൂർത്തിയായി"</string>
<string name="cancel" msgid="1018267193425558088">"റദ്ദാക്കുക"</string>
<string name="installing" msgid="4921993079741206516">"ഇൻസ്റ്റാൾ ചെയ്യുന്നു…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ഇൻസ്റ്റാൾ ചെയ്യുന്നു…"</string>
<string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"നിലവിലുള്ള ഈ ആപ്പിന്റെ അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യണോ നിലവിലുള്ള ഡാറ്റ നഷ്ടപ്പെടില്ല."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ഈ അടങ്ങിയ ആപ്പിന് ഒരു അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യണോ? നിലവിലുള്ള ഡാറ്റ നഷ്ടപ്പെടില്ല."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ഇൻസ്റ്റാൾ/അൺഇൻസ്റ്റാൾ ചെയ്യുന്നത് Wear പിന്തുണയ്ക്കുന്നില്ല."</string>
<string name="message_staging" msgid="8032722385658438567">"ആപ്പ് തയ്യാറാക്കുന്നു…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"അജ്ഞാതം"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ഡാബ്ലെറ്റിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ടിവിയിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ഫോണിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ഫോണും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ഫോണിന് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ടാബ്ലെറ്റും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ടാബ്ലെറ്റിന് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"അജ്ഞാതമായ ആപ്പുകളാൽ നിങ്ങളുടെ ടിവിയും വ്യക്തിഗത ഡാറ്റയും ആക്രമിക്കപ്പെടാനുള്ള സാധ്യത വളരെ കൂടുതലാണ്. ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ, ഇത് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങളുടെ ടിവിക്ക് സംഭവിച്ചേക്കാവുന്ന ഏത് നാശനഷ്ടത്തിന്റെയും അല്ലെങ്കിൽ ഡാറ്റാ നഷ്ടത്തിന്റെയും ഉത്തരവാദിത്തം നിങ്ങൾക്കായിരിക്കുമെന്ന് അംഗീകരിക്കുന്നു."</string>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index 61aba57..6cc992a 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Багц суулгагч"</string>
<string name="install" msgid="711829760615509273">"Суулгах"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Болсон"</string>
<string name="cancel" msgid="1018267193425558088">"Болих"</string>
<string name="installing" msgid="4921993079741206516">"Суулгаж байна…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-г суулгаж байна…"</string>
<string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Та одоо байгаа аппын шинэчлэлтийг суулгахыг хүсэж байна уу? Таны хуучин өгөгдөл устахгүй."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Та энэ үндсэн аппын шинэчлэлтийг суулгахыг хүсэж байна уу? Таны хуучин өгөгдөл устахгүй."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-д суулгах/устгах үйлдлийг дэмждэггүй."</string>
<string name="message_staging" msgid="8032722385658438567">"Аппыг байршуулж байна…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Тодорхойгүй"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Таны аюулгүй байдлыг хангахын тулд таны таблет энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Таны аюулгүй байдлыг хангахын тулд таны ТВ энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Таны аюулгүй байдлыг хангахын тулд таны утас энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Таны утас болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны утсанд гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таны таблет болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны таблетад гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Таны ТВ болон хувийн өгөгдөл тодорхойгүй апп суулгасан тохиолдолд гэмтэж болзошгүй. Энэ аппыг суулгаснаар үүнийг ашигласнаас үүдэн таны ТВ-д гэмтэл гарах, эсвэл өгөгдөл устах зэрэг эрсдэлийг хариуцна гэдгээ зөвшөөрч байна."</string>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index da1c7a7..844ed81 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"पॅकेज इंस्टॉलर"</string>
<string name="install" msgid="711829760615509273">"इंस्टॉल करा"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"पूर्ण झाले"</string>
<string name="cancel" msgid="1018267193425558088">"रद्द करा"</string>
<string name="installing" msgid="4921993079741206516">"इंस्टॉल होत आहे…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> इंस्टॉल होत आहे…"</string>
<string name="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"तुम्हाला हे ॲप्लिकेशन इंस्टॉल करायचे आहे का?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"तुम्हाच्या विद्यमान ॲप्लिकेशनवर अपडेट इंस्टॉल करायचे आहे का? तुमचा विद्यमान डेटा गमावणार नाही."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तुम्हाला या बिल्ट-इन ॲप्लिकेशनवर अपडेट इंस्टॉल करायचे आहे का? तुमचा विद्यमान डेटा गमावणार नाही."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"इंस्टॉल करा/अनइंस्टॉल करा क्रिया Wear वर सपोर्ट करत नाहीत."</string>
<string name="message_staging" msgid="8032722385658438567">"अॅप सुरुवातीच्या स्थितीत आहे…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तुमच्या सुरक्षिततेसाठी, तुमच्या टॅबलेटला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तुमच्या सुरक्षिततेसाठी, तुमच्या टीव्हीला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तुमच्या सुरक्षिततेसाठी, तुमच्या फोनला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तुमचा फोन आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने होणार्या तुमच्या फोनचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तुमचा टॅबलेट आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने तुमच्या टॅबलेटचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तुमचा टीव्ही आणि वैयक्तिक डेटा अज्ञात अॅप्सकडून होणार्या अटॅकमुळे अधिक असुरक्षित आहे. हे अॅप इंस्टॉल करून, तुम्ही सहमती देता की ते वापरल्याने तुमच्या टीव्हीचे कोणत्याही प्रकारे होणारे नुकसान किंवा डेटा हानीसाठी तुम्ही जबाबदार आहात."</string>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index 17815be..ce251a5 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pemasang pakej"</string>
<string name="install" msgid="711829760615509273">"Pasang"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Selesai"</string>
<string name="cancel" msgid="1018267193425558088">"Batal"</string>
<string name="installing" msgid="4921993079741206516">"Memasang…"</string>
<string name="installing_app" msgid="1165095864863849422">"Memasang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Adakah anda ingin memasang aplikasi ini?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Adakah anda mahu memasang kemas kini pada aplikasi yang sedia ada? Data anda yang sedia ada tidak akan hilang."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Adakah anda mahu memasang kemas kini pada aplikasi terbina dalam ini? Data anda yang sedia ada tidak akan hilang."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan pasang/nyahpasang tidak disokong pada Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Pemeringkatan apl…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Tidak diketahui"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Untuk keselamatan, tablet anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Untuk keselamatan, TV anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Untuk keselamatan, telefon anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada telefon anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada tablet anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada TV anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index 356c370..3c3ed99 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ပက်ကေ့ဂျ်ထည့်သွင်းကိရိယာ"</string>
<string name="install" msgid="711829760615509273">"ထည့်သွင်းရန်"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ပြီးပြီ"</string>
<string name="cancel" msgid="1018267193425558088">"မလုပ်တော့"</string>
<string name="installing" msgid="4921993079741206516">"ထည့်သွင်းနေသည်…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ထည့်သွင်းနေသည်…"</string>
<string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ဤအပလီကေးရှင်းကို ထည့်သွင်းလိုသလား။"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ဤလက်ရှိအပလီကေးရှင်းအတွက် အပ်ဒိတ်ကို ထည့်သွင်းလိုပါသလား။ သင်၏ လက်ရှိဒေတာများ ဆုံးရှုံးသွားမည် မဟုတ်ပါ။"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ဤနဂိုအသင့်ပါ အပလီကေးရှင်းအတွက် အပ်ဒိတ်ကို ထည့်သွင်းလိုပါသလား။ သင်၏ လက်ရှိဒေတာများ ဆုံးရှုံးသွားမည် မဟုတ်ပါ။"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ပေါ်တွင် ထည့်သွင်းခြင်း/ဖယ်ရှားခြင်းများကို ပံ့ပိုးမထားပါ။"</string>
<string name="message_staging" msgid="8032722385658438567">"အက်ပ်ကို ပြင်ဆင်နေသည်…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"အမည်မသိ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏တက်ဘလက်တွင် ထည့်သွင်းခွင့်မရှိပါ။"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏တီဗီတွင် ထည့်သွင်းခွင့်မရှိပါ။"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏ဖုန်းတွင် ထည့်သွင်းခွင့်မရှိပါ။"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"သင်၏ဖုန်းနှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော ဖုန်းပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"သင်၏ တက်ဘလက်နှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော တက်ဘလက်ပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"သင်၏ TV နှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော TV ပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index 6f2f112..e0faa84 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakkeinstallasjon"</string>
<string name="install" msgid="711829760615509273">"Installer"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Ferdig"</string>
<string name="cancel" msgid="1018267193425558088">"Avbryt"</string>
<string name="installing" msgid="4921993079741206516">"Installerer …"</string>
<string name="installing_app" msgid="1165095864863849422">"Installerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string>
<string name="install_done" msgid="5987363587661783896">"Appen er installert."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Ønsker du å installere denne appen?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vil du installere en oppdatering for denne eksisterende appen? Du mister ikke de eksisterende dataene dine."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vil du installere en oppdatering for denne innebygde appen? Du mister ikke de eksisterende dataene dine."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Handlinger for å installere og avinstallere støttes ikke på Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Klargjør appen …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Ukjent"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Nettbrettet ditt har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"TV-en din har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Telefonen din har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonen din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på telefonen eller tap av data som kan skyldes bruk av appen"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Nettbrettet ditt og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på nettbrettet eller tap av data som kan skyldes bruk av appen."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV-en din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på TV-en eller tap av data som kan skyldes bruk av appen."</string>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index 0b73271..4405123 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"प्याकेज स्थापनाकर्ता"</string>
<string name="install" msgid="711829760615509273">"स्थापना गर्नु…"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"सम्पन्न भयो"</string>
<string name="cancel" msgid="1018267193425558088">"रद्द गर्नुहोस्"</string>
<string name="installing" msgid="4921993079741206516">"स्थापना गर्दै…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> स्थापना गर्दै…"</string>
<string name="install_done" msgid="5987363587661783896">"एप स्थापना गरियो।"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"तपाईं यो एप स्थापना गर्न चाहनुहुन्छ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"तपाईं यो पहिलेदेखि नै विद्यमान एपको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तपाईं यो अन्तर्निर्मित एपको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear मा स्थापना/स्थापना रद्द गर्ने कारबाहीहरू समर्थित छैनन्।"</string>
<string name="message_staging" msgid="8032722385658438567">"एप स्थापना गर्न तयारी गर्दै…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तपाईंको सुरक्षाका लागि, तपाईंको ट्याब्लेटलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको टिभी लाई यस स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तपाईंको सुरक्षाका लागि, तपाईंको फोनलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तपाईंको फोन तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको फोनमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तपाईंको ट्याब्लेट तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको ट्याब्लेटमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तपाईंको टिभी तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको टिभी मा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index d3a9589..3c26eec 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Pakket-installatie"</string>
<string name="install" msgid="711829760615509273">"Installeren"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Klaar"</string>
<string name="cancel" msgid="1018267193425558088">"Annuleren"</string>
<string name="installing" msgid="4921993079741206516">"Installeren…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeren…"</string>
<string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Wil je deze app installeren?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Wil je een update voor deze bestaande app installeren? Je huidige gegevens gaan niet verloren."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Wil je een update voor deze ingebouwde app installeren? Je huidige gegevens gaan niet verloren."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acties voor installeren/verwijderen niet ondersteund op Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"App uitvoeren…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Onbekend"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Uit veiligheidsoverwegingen heeft je tablet geen toestemming om onbekende apps van deze bron te installeren."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Uit veiligheidsoverwegingen heeft je tv geen toestemming om onbekende apps van deze bron te installeren."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Uit veiligheidsoverwegingen heeft je telefoon geen toestemming om onbekende apps van deze bron te installeren."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Je telefoon en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je telefoon of gegevensverlies als gevolg van het gebruik van de app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Je tablet en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tablet of gegevensverlies als gevolg van het gebruik van de app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Je tv en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tv of gegevensverlies als gevolg van het gebruik van de app."</string>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
index f3b97a9..e1617f4 100644
--- a/packages/PackageInstaller/res/values-or/strings.xml
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲର୍"</string>
<string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ହୋଇଗଲା"</string>
<string name="cancel" msgid="1018267193425558088">"ବାତିଲ୍ କରନ୍ତୁ"</string>
<string name="installing" msgid="4921993079741206516">"ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string>
<string name="install_done" msgid="5987363587661783896">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ଆପଣ ଏହି ଆପ୍ଲିକେଶନ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ପୂର୍ବରୁ ରହିଥିବା ଏହି ଆପ୍ଲିକେଶନ୍ରେ ଆପଣ ଅପ୍ଡେଟ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ଏହି ବିଲ୍ଟ-ଇନ୍ ଆପ୍ଲିକେଶନ୍ରେ ଆପଣ ଏକ ଅପ୍ଡେଟ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ୱିଅର୍ରେ ଇନଷ୍ଟଲ୍/ଅନଇନଷ୍ଟଲ୍ କାର୍ଯ୍ୟ ସପୋର୍ଟ କରେନାହିଁ।"</string>
<string name="message_staging" msgid="8032722385658438567">"ଆପ୍ ପର୍ଯ୍ୟାୟଭୁକ୍ତ କରାଯାଉଛି…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ଅଜଣା"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟାବ୍ଲେଟ୍କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟିଭିକୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଫୋନ୍କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଫୋନ୍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଫୋନ୍ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟାବଲେଟ୍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟାବ୍ଲେଟ୍ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟିଭି ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟିଭିରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index 5a417af..ce56ab1 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ਪੈਕੇਜ ਸਥਾਪਨਾਕਾਰ"</string>
<string name="install" msgid="711829760615509273">"ਸਥਾਪਤ ਕਰੋ"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ਹੋ ਗਿਆ"</string>
<string name="cancel" msgid="1018267193425558088">"ਰੱਦ ਕਰੋ"</string>
<string name="installing" msgid="4921993079741206516">"ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ਕੀ ਤੁਸੀਂ ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ਕੀ ਤੁਸੀਂ ਇਸ ਮੌਜੂਦਾ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇੱਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਨਸ਼ਟ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ਕੀ ਤੁਸੀਂ ਇਸ ਬਿਲਟ-ਇਨ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇੱਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਨਸ਼ਟ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear \'ਤੇ ਸਥਾਪਤ ਜਾਂ ਅਣਸਥਾਪਤ ਕਰਨ ਦੀਆਂ ਕਾਰਵਾਈਆਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।"</string>
<string name="message_staging" msgid="8032722385658438567">"ਐਪ ਨੂੰ ਸਟੇਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ਅਗਿਆਤ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਟੀਵੀ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ਤੁਹਾਡਾ ਟੀਵੀ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੀਵੀ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index f67cb08..57ee7fe 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalator pakietu"</string>
<string name="install" msgid="711829760615509273">"Zainstaluj"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Gotowe"</string>
<string name="cancel" msgid="1018267193425558088">"Anuluj"</string>
<string name="installing" msgid="4921993079741206516">"Instaluję…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instaluję pakiet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Czy zainstalować tę aplikację?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Czy chcesz zainstalować aktualizację posiadanej aplikacji? Dotychczasowe dane nie zostaną utracone."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Czy chcesz zainstalować aktualizację fabrycznej aplikacji? Dotychczasowe dane nie zostaną utracone."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nie obsługuje instalowania ani odinstalowywania."</string>
<string name="message_staging" msgid="8032722385658438567">"Przygotowuję aplikację…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Inny"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Ze względów bezpieczeństwa na Twoim tablecie nie można instalować nieznanych aplikacji z tego źródła."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Ze względów bezpieczeństwa na Twoim telewizorze nie można instalować nieznanych aplikacji z tego źródła."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Ze względów bezpieczeństwa na Twoim telefonie nie można instalować nieznanych aplikacji z tego źródła."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Dane na telefonie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telefonu lub utratę danych w wyniku jej używania."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Dane na tablecie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie tabletu lub utratę danych w wyniku jej używania."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Dane na telewizorze i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telewizora lub utratę danych w wyniku jej używania."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index abeb72d45..cef7681 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalado."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Quer instalar este aplicativo?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Quer instalar uma atualização para este aplicativo? Seus dados existentes não serão perdidos."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Quer instalar uma atualização para este aplicativo integrado? Seus dados existentes não serão perdidos."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Testando app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, seu tablet não tem permissão para instalar apps desconhecidos dessa fonte."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, sua TV não tem permissão para instalar apps desconhecidos dessa fonte."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, seu smartphone não tem permissão para instalar apps desconhecidos dessa fonte."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index d539f6f6..0710aa3 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"A instalar…"</string>
<string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalada."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Pretende instalar esta app?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Pretende instalar uma atualização para esta app existente? Os seus dados existentes não serão perdidos."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Pretende instalar uma atualização para esta app incorporada? Os seus dados existentes não serão perdidos."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"A preparar a app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecida"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, o tablet não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, a TV não está autorizada a instalar aplicações desconhecidas a partir desta fonte."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, o telemóvel não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O seu telemóvel e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao telemóvel ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"O seu tablet e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao tablet ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A sua TV e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados à TV ou pelas perdas de dados que possam resultar da utilização da mesma."</string>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index abeb72d45..cef7681 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Concluído"</string>
<string name="cancel" msgid="1018267193425558088">"Cancelar"</string>
<string name="installing" msgid="4921993079741206516">"Instalando…"</string>
<string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalado."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Quer instalar este aplicativo?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Quer instalar uma atualização para este aplicativo? Seus dados existentes não serão perdidos."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Quer instalar uma atualização para este aplicativo integrado? Seus dados existentes não serão perdidos."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Testando app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, seu tablet não tem permissão para instalar apps desconhecidos dessa fonte."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, sua TV não tem permissão para instalar apps desconhecidos dessa fonte."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, seu smartphone não tem permissão para instalar apps desconhecidos dessa fonte."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index 9c22fcd..1198601 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Program de instalare a pachetelor"</string>
<string name="install" msgid="711829760615509273">"Instalați"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Gata"</string>
<string name="cancel" msgid="1018267193425558088">"Anulați"</string>
<string name="installing" msgid="4921993079741206516">"Se instalează…"</string>
<string name="installing_app" msgid="1165095864863849422">"Se instalează <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Doriți să instalați această aplicație?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Doriți să instalați o actualizare pentru această aplicație? Datele existente nu se vor pierde."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Doriți să instalați o actualizare pentru această aplicație încorporată? Datele existente nu se vor pierde."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acțiunile de instalare și dezinstalare nu sunt acceptate pe Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Se pregătește aplicația…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Necunoscut"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableta și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați aplicația, acceptați că sunteți singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizorul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index a9ae543..b5477c1 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Установщик пакетов"</string>
<string name="install" msgid="711829760615509273">"Установить"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Отмена"</string>
<string name="installing" msgid="4921993079741206516">"Установка…"</string>
<string name="installing_app" msgid="1165095864863849422">"Установка приложения \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string>
<string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Установить это приложение?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Установить обновление для этого приложения? Вы не потеряете связанные с ним данные."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Установить обновление для этого встроенного приложения? Вы не потеряете связанные с ним данные."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Установка и удаление не поддерживаются в Wear OS."</string>
<string name="message_staging" msgid="8032722385658438567">"Подождите…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Неизвестное приложение"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"В целях безопасности ваш планшет блокирует установку приложений из неизвестных источников."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"В целях безопасности ваш телевизор блокирует установку приложений из неизвестных источников."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"В целях безопасности ваш телефон блокирует установку приложений из неизвестных источников."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваши персональные данные и данные телефона более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный телефону, и возможную потерю данных."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваши персональные данные и данные планшета более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный планшету, и возможную потерю данных."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваши персональные данные и данные телевизора более уязвимы для атак приложений из неизвестных источников. Устанавливая это приложение, вы берете на себя всю ответственность за последствия, связанные с его использованием, то есть за любой ущерб, нанесенный телевизору, и возможную потерю данных."</string>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index 5fad69d..b517efa 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"පැකේජ ස්ථාපනකරු"</string>
<string name="install" msgid="711829760615509273">"ස්ථාපනය කරන්න"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"කළා"</string>
<string name="cancel" msgid="1018267193425558088">"අවලංගු කරන්න"</string>
<string name="installing" msgid="4921993079741206516">"ස්ථාපනය කරමින්…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ස්ථාපනය කරමින්…"</string>
<string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"මෙම යෙදුම සඳහා යාවත්කාලීන ස්ථාපනය කිරීමට ඔබට අවශ්යද? ඔබගේ පවතින දත්ත නැති වනු ඇත."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"මෙම ඇමිණූ යෙදුමට යාවත්කාලීන ස්ථාපනය කිරීමට ඔබට අවශ්යද? ඔබගේ පවතින දත්ත නැති වනු ඇත."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear මත ස්ථාපන/අස්ථාපනය ක්රියා සහාය දක්වන්නේ නැත."</string>
<string name="message_staging" msgid="8032722385658438567">"යෙදුම වේදිකාගත කරමින්..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"නොදනී"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ආරක්ෂාව සඳහා, ඔබගේ ටැබ්ලටය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ආරක්ෂාව සඳහා, ඔබගේ රූපවාහිනිය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ආරක්ෂාව සඳහා, ඔබගේ දුරකථනය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ඔබගේ දුරකථනය සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ දුරකථනය සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ඔබගේ ටැබ්ලට් පරිගණකය සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ ටැබ්ලට් පරිගණකය සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ඔබගේ TV සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ TV සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index ae914bd..aa02eb4 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Nástroj na inštaláciu balíkov"</string>
<string name="install" msgid="711829760615509273">"Inštalovať"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Hotovo"</string>
<string name="cancel" msgid="1018267193425558088">"Zrušiť"</string>
<string name="installing" msgid="4921993079741206516">"Inštaluje sa…"</string>
<string name="installing_app" msgid="1165095864863849422">"Inštaluje sa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Chcete túto aplikáciu nainštalovať?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Chcete nainštalovať aktualizáciu tejto existujúcej aplikácie? Existujúce údaje sa nestratia."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Chcete nainštalovať aktualizáciu tejto integrovanej aplikácie? Existujúce údaje sa nestratia."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nepodporuje akciu inštalácie/odinštalovania."</string>
<string name="message_staging" msgid="8032722385658438567">"Aplikácia je zavádzaná po etapách…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznáma"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Váš tablet nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Váš televízor nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Váš telefón nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Váš telefón a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie telefónu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Váš tablet a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie tabletu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Váš televízor a osobné údaje sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie televízora alebo stratu údajov, ktoré by mohli nastať pri jej používaní."</string>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index c123d69..add57cf 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Namest. program za paket"</string>
<string name="install" msgid="711829760615509273">"Namesti"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Končano"</string>
<string name="cancel" msgid="1018267193425558088">"Prekliči"</string>
<string name="installing" msgid="4921993079741206516">"Nameščanje …"</string>
<string name="installing_app" msgid="1165095864863849422">"Nameščanje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Ali želite namestiti to aplikacijo?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Ali želite namestiti posodobitev te obstoječe aplikacije? Obstoječi podatki ne bodo izgubljeni."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Ali želite namestiti posodobitev te vgrajene aplikacije? Obstoječi podatki ne bodo izgubljeni."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Dejanja namestitve in odstranitve v sistemu Android Wear niso podprta."</string>
<string name="message_staging" msgid="8032722385658438567">"Priprava aplikacije …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Neznano"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Vaš tablični računalnik zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Vaš televizor zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Vaš telefon zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Neznane aplikacije lahko resno ogrozijo varnost telefona in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v telefonu, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Neznane aplikacije lahko resno ogrozijo varnost tabličnega računalnika in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v tabličnem računalniku, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Neznane aplikacije lahko resno ogrozijo varnost televizorja in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v televizorju, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index 0cde28ea..e5b8c01 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Instaluesi i paketës"</string>
<string name="install" msgid="711829760615509273">"Instalo"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"U krye"</string>
<string name="cancel" msgid="1018267193425558088">"Anulo"</string>
<string name="installing" msgid="4921993079741206516">"Po instalohet…"</string>
<string name="installing_app" msgid="1165095864863849422">"Po instalohet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Dëshiron ta instalosh këtë aplikacion?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Dëshiron të instalosh një përditësim të këtij aplikacioni ekzistues? Të dhënat e tua ekzistuese nuk do të humbasin."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Dëshiron të instalosh një përditësim të këtij aplikacioni ekzistues? Të dhënat e tua ekzistuese nuk do të humbasin."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instalo/çinstalo veprimet që nuk mbështeten në Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Po vihet në përdorim aplikacioni..."</string>
<string name="app_name_unknown" msgid="6881210203354323926">"I panjohur"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Për sigurinë tënde, tableti yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Për sigurinë tënde, televizori yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Për sigurinë tënde, telefoni yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoni dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj telefonit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableti dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj tabletit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizori dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj televizorit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 2746284..14ca7a4 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Програм за инстал. пакета"</string>
<string name="install" msgid="711829760615509273">"Инсталирај"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Откажи"</string>
<string name="installing" msgid="4921993079741206516">"Инсталира се..."</string>
<string name="installing_app" msgid="1165095864863849422">"Инсталира се <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Желите ли да инсталирате ову апликацију?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Желите ли да инсталирате ажурирање за ову постојећу апликацију? Постојећи подаци се неће изгубити."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Желите ли да инсталирате ажурирање за ову уграђену апликацију? Постојећи подаци се неће изгубити."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Радње Инсталирај/Деинсталирај нису подржане у Wear-у."</string>
<string name="message_staging" msgid="8032722385658438567">"Апликација се припрема…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Непознато"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Таблету из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Телевизору из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Телефону из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Телефон и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења телефона или губитак података до којих може да дође због њеног коришћења."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Таблет и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења таблета или губитак података до којих може да дође због њеног коришћења."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ТВ и лични подаци су подложнији нападу непознатих апликација. Ако инсталирате ову апликацију, прихватате да сте одговорни за евентуална оштећења ТВ-а или губитак података до којих може да дође због њеног коришћења."</string>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index 28ad6aa..7252651 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paketinstallationsprogram"</string>
<string name="install" msgid="711829760615509273">"Installera"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Klar"</string>
<string name="cancel" msgid="1018267193425558088">"Avbryt"</string>
<string name="installing" msgid="4921993079741206516">"Installerar …"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeras …"</string>
<string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Vill du installera det här programmet?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Vill du installera en uppdatering till den här befintliga appen? Din befintliga data försvinner inte."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vill du installera en uppdatering av den inbyggda appen? Din befintliga data försvinner inte."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Åtgärder för att installera/avinstallera stöds inte på Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Provkör appen …"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Okänd"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Av säkerhetsskäl får okända appar från den här källan inte installeras av surfplattan."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Av säkerhetsskäl får okända appar från den här källan inte installeras av TV:n."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Av säkerhetsskäl får okända appar från den här källan inte installeras av mobilen."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Din mobil och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på mobilen och för dataförlust som kan uppstå vid användning av denna app."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Din surfplatta och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på surfplattan och för dataförlust som kan uppstå vid användning av denna app."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Din tv och personliga data är mer sårbar för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på tv:n och för dataförlust som kan uppstå vid användning av denna app."</string>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index 7c1472b..dd301b0 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Kisakinishaji cha kifurushi"</string>
<string name="install" msgid="711829760615509273">"Sakinisha"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Nimemaliza"</string>
<string name="cancel" msgid="1018267193425558088">"Ghairi"</string>
<string name="installing" msgid="4921993079741206516">"Inasakinisha…"</string>
<string name="installing_app" msgid="1165095864863849422">"Inasakinisha <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Je, ungependa kusakinisha programu hii?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Je, ungependa kusakinisha sasisho la programu iliyopo? Data yako iliyopo haitapotea."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Je, ungependa kusakinisha sasisho la programu hii iliyopakiwa ndani? Data yako iliyopo haitapotea."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Huduma ya Android Wear haiwezi kutekeleza vitendo vya Kusakinisha au Kuondoa vipengee."</string>
<string name="message_staging" msgid="8032722385658438567">"Inatayarisha programu…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Haijulikani"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Kwa sababu ya usalama wako, kompyuta yako kibao haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Kwa sababu ya usalama wako, TV yako haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Kwa sababu ya usalama wako, simu yako haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Data yako ya binafsi na ya simu yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye simu yako au kupotea kwa data kutokana na matumizi yake."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Data yako ya binafsi na ya kompyuta yako kibao inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye kompyuta yako kibao au kupotea kwa data kutokana na matumizi yake."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Data yako ya binafsi na ya televisheni yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye televisheni yako au kupotea kwa data kutokana na matumizi yake."</string>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index a130712..f070b45 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"தொகுப்பு நிறுவி"</string>
<string name="install" msgid="711829760615509273">"நிறுவு"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"முடிந்தது"</string>
<string name="cancel" msgid="1018267193425558088">"ரத்துசெய்"</string>
<string name="installing" msgid="4921993079741206516">"நிறுவுகிறது…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ஐ நிறுவுகிறது…"</string>
<string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"இந்த ஆப்ஸை நிறுவ விரும்புகிறீர்களா?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ஏற்கனவே உள்ள ஆப்ஸில் புதுப்பிப்பை நிறுவ விரும்புகிறீர்களா? ஏற்கனவே உள்ள உங்கள் தரவை இழக்கமாட்டீர்கள்."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"உள்ளமைக்கப்பட்ட ஆப்ஸில் புதுப்பிப்பை நிறுவ விரும்புகிறீர்களா? ஏற்கனவே உள்ள உங்கள் தரவை இழக்கமாட்டீர்கள்."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearரில் நிறுவல்கள்/நிறுவல் நீக்கங்கள் செய்ய இயலாது"</string>
<string name="message_staging" msgid="8032722385658438567">"ஆப்ஸ் தயாராகிறது…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"அறியப்படாதது"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டேப்லெட்டில் நிறுவ அனுமதியில்லை."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டிவியில் நிறுவ அனுமதியில்லை."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை மொபைலில் நிறுவ அனுமதியில்லை."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"அறியப்படாத ஆப்ஸால் உங்கள் மொபைலும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது மொபைலில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"அறியப்படாத ஆப்ஸால் உங்கள் டேப்லெட்டும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டேப்லெட்டில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"அறியப்படாத ஆப்ஸால் உங்கள் டிவியும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டிவியில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index 5cbb268..c4b0fc2 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"ప్యాకేజీ ఇన్స్టాలర్"</string>
<string name="install" msgid="711829760615509273">"ఇన్స్టాల్ చేయి"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"పూర్తయింది"</string>
<string name="cancel" msgid="1018267193425558088">"రద్దు చేయి"</string>
<string name="installing" msgid="4921993079741206516">"ఇన్స్టాల్ చేస్తోంది…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ని ఇన్స్టాల్ చేస్తోంది…"</string>
<string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"మీరు ఈ అప్లికేషన్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"మీరు ఇప్పటికే ఉన్న ఈ అప్లికేషన్కు అప్డేట్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా? ఇప్పటికే ఉన్న మీ డేటాను కోల్పోవడం సంభవించదు."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"మీరు ఈ అంతర్నిర్మిత అప్లికేషన్కు అప్డేట్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా? ఇప్పటికే ఉన్న మీ డేటాను కోల్పోవడం సంభవించదు."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearలో ఇన్స్టాల్/అన్ఇన్స్టాల్ చర్యలకు మద్దతు లేదు."</string>
<string name="message_staging" msgid="8032722385658438567">"యాప్ను సిద్ధం చేస్తుంది…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"తెలియదు"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టాబ్లెట్ అనుమతించబడదు."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టీవీ అనుమతించబడదు."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ ఫోన్ అనుమతించబడదు."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"మీ ఫోన్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ ఫోన్కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index 9c1f028..1a8e3a9 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"โปรแกรมติดตั้งแพ็กเกจ"</string>
<string name="install" msgid="711829760615509273">"ติดตั้ง"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"เสร็จ"</string>
<string name="cancel" msgid="1018267193425558088">"ยกเลิก"</string>
<string name="installing" msgid="4921993079741206516">"กำลังติดตั้ง…"</string>
<string name="installing_app" msgid="1165095864863849422">"กำลังติดตั้ง <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"ต้องการติดตั้งแอปพลิเคชันนี้ไหม"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"ต้องการติดตั้งการอัปเดตของแอปพลิเคชันที่มีอยู่นี้ไหม ข้อมูลของคุณที่มีอยู่จะไม่สูญหาย"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ต้องการติดตั้งการอัปเดตของแอปพลิเคชันที่มีอยู่ในตัวนี้ไหม ข้อมูลของคุณที่มีอยู่จะไม่สูญหาย"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ติดตั้ง/ถอนการติดตั้งใน Wear ไม่ได้"</string>
<string name="message_staging" msgid="8032722385658438567">"กำลังปรับสภาพแวดล้อมของแอป…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"ไม่ทราบ"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในแท็บเล็ต"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในทีวี"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในโทรศัพท์"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"โทรศัพท์และข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับโทรศัพท์หรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"แท็บเล็ตและข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับแท็บเล็ตหรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ทีวีและข้อมูลส่วนตัวของคุณมีความเสี่ยงมากขึ้นที่จะถูกโจมตีจากแอปที่ไม่รู้จัก การติดตั้งแอปนี้แสดงว่าคุณยอมรับว่าจะรับผิดชอบต่อความเสียหายใดๆ ที่จะเกิดขึ้นกับทีวีหรือการสูญเสียข้อมูลที่อาจเกิดจากการใช้งานแอปดังกล่าว"</string>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index 9fcc064..22a565e 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Installer ng package"</string>
<string name="install" msgid="711829760615509273">"I-install"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Tapos na"</string>
<string name="cancel" msgid="1018267193425558088">"Kanselahin"</string>
<string name="installing" msgid="4921993079741206516">"Nag-i-install…"</string>
<string name="installing_app" msgid="1165095864863849422">"Ini-install ang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Gusto mo bang i-install ang application na ito?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Gusto mo bang mag-install ng update sa dati nang application na ito? Hindi mawawala ang iyong dati nang data."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Gusto mo bang mag-install ng update sa built-in na application na ito? Hindi mawawala ang iyong dati nang data."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ang mga pagkilos na I-install/I-uninstall ay hindi sinusuportahan sa Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Inihahanda ang app…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Hindi Kilala"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sa iyong seguridad, hindi pinapayagan ang iyong tablet na mag-install ng mga hindi kilalang app mula sa source na ito."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sa iyong seguridad, hindi pinapayagan ang iyong TV na mag-install ng mga hindi kilalang app mula sa source na ito."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sa iyong seguridad, hindi pinapayagan ang iyong telepono na mag-install ng mga hindi kilalang app mula sa source na ito."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Mas nanganganib ang iyong telepono at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong telepono o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Mas nanganganib ang iyong tablet at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong tablet o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Mas nanganganib ang iyong TV at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong TV o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string>
diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml
index c6e2d44..f86afea 100644
--- a/packages/PackageInstaller/res/values-tr/strings.xml
+++ b/packages/PackageInstaller/res/values-tr/strings.xml
@@ -18,14 +18,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paket yükleyici"</string>
<string name="install" msgid="711829760615509273">"Yükle"</string>
+ <string name="update" msgid="3932142540719227615">"Güncelle"</string>
<string name="done" msgid="6632441120016885253">"Bitti"</string>
<string name="cancel" msgid="1018267193425558088">"İptal"</string>
<string name="installing" msgid="4921993079741206516">"Yükleniyor…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> yükleniyor…"</string>
<string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Bu uygulamayı yüklemek istiyor musunuz?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu mevcut uygulamaya ait güncellemeyi yüklemek istiyor musunuz? Mevcut verileriniz silinmez."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu yerleşik uygulamaya ait güncellemeyi yüklemek istiyor musunuz? Mevcut verileriniz silinmez."</string>
+ <string name="install_confirm_question" msgid="7663733664476363311">"Bu uygulamayı yüklemek istiyor musunuz?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu uygulamayı güncellemek istiyor musunuz?"</string>
<string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string>
@@ -80,9 +80,9 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Yükleme/Yüklemeyi kaldırma işlemleri Wear\'da desteklenmiyor."</string>
<string name="message_staging" msgid="8032722385658438567">"Uygulama hazırlanıyor…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Bilinmiyor"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Güvenlik nedeniyle tabletinizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Güvenlik nedeniyle TV\'nizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Güvenlik nedeniyle telefonunuzun bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Güvenlik nedeniyle şu anda tabletinizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmemektedir. Bunu Ayarlar\'da değiştirebilirsiniz."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Güvenlik nedeniyle şu anda TV\'nizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmemektedir. Bunu Ayarlar\'da değiştirebilirsiniz."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Güvenlik nedeniyle şu anda telefonunuzun bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmemektedir. Bunu Ayarlar\'da değiştirebilirsiniz."</string>
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonunuz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı telefonunuzda oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletiniz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı tabletinizde oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV\'niz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı TV\'nizde oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index 4c49bf4..13fbf0f 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Програма встановлення пакета"</string>
<string name="install" msgid="711829760615509273">"Установити"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Готово"</string>
<string name="cancel" msgid="1018267193425558088">"Скасув."</string>
<string name="installing" msgid="4921993079741206516">"Встановлення…"</string>
<string name="installing_app" msgid="1165095864863849422">"Установлюється <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Установити цю програму?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Установити оновлення для цього додатка? Наявні дані не буде втрачено."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Установити оновлення для цього вбудованого додатка? Наявні дані не буде втрачено."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Встановлення й видалення не підтримуються на пристроях Android Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Підготовка додатка…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Невідомо"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"З міркувань безпеки на вашому планшеті заборонено встановлювати невідомі додатки з цього джерела."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"З міркувань безпеки на вашому телевізорі заборонено встановлювати невідомі додатки з цього джерела."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"З міркувань безпеки на вашому телефоні заборонено встановлювати невідомі додатки з цього джерела."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ваш телефон і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження телефона чи втрату даних унаслідок використання додатка."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ваш планшет і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження планшета чи втрату даних унаслідок використання додатка."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Ваш телевізор і особисті дані більш уразливі до атак невідомих додатків. Установлюючи цей додаток, ви берете на себе відповідальність за пошкодження телевізора чи втрату даних унаслідок використання додатка."</string>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
index d8f2c50..e122f3e 100644
--- a/packages/PackageInstaller/res/values-ur/strings.xml
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"پیکیج انسٹالر"</string>
<string name="install" msgid="711829760615509273">"انسٹال کریں"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"ہو گیا"</string>
<string name="cancel" msgid="1018267193425558088">"منسوخ کریں"</string>
<string name="installing" msgid="4921993079741206516">"انسٹال ہو رہی ہے…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کو انسٹال کیا جا رہا ہے…"</string>
<string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"کیا آپ یہ ایپلیکیشن انسٹال کرنا چاہتے ہیں؟"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"کیا آپ اس موجودہ ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"کیا آپ پہلے سے شامل اس ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"\'انسٹال/اَن انسٹال کی کارروائیاں\' Wear پر تعاون یافتہ نہیں ہیں۔"</string>
<string name="message_staging" msgid="8032722385658438567">"ایپ کی ٹیسٹنگ ہو رہی ہے…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"نامعلوم"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"آپ کی سیکیورٹی کے مدنظر، آپ کے ٹیبلیٹ کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"آپ کی سیکیورٹی کے مدنظر، آپ کے TV کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"آپ کی سیکیورٹی کے مدنظر، آپ کے فون کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"آپ کے فون اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے فون کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"آپ کے ٹیبلیٹ اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے ٹیبلیٹ کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"آپ کے TV اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے TV کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index 0c1871f..e862e7d 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Paket o‘rnatish vositasi"</string>
<string name="install" msgid="711829760615509273">"O‘rnatish"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"OK"</string>
<string name="cancel" msgid="1018267193425558088">"Bekor qilish"</string>
<string name="installing" msgid="4921993079741206516">"O‘rnatilmoqda…"</string>
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> o‘rnatilmoqda…"</string>
<string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Bu ilovani o‘rnatmoqchimisiz?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu ilova uchun yangilanish o‘rnatilsinmi? Mavjud axborotlaringiz o‘chib ketmaydi."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu ichki ilova uchun yangilanish o‘rnatilsinmi? Mavjud axborotlaringiz o‘chib ketmaydi."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear qurilmasi o‘rnatish/o‘chirish amallarini qo‘llab-quvvatlamaydi."</string>
<string name="message_staging" msgid="8032722385658438567">"Kutib turing…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Noaniq"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Xavfsizlik yuzasidan, planshetingizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Xavfsizlik yuzasidan, televizoringizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Xavfsizlik yuzasidan, telefoningizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoningiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan telefoningizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planshetingiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan planshetingizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan televizoringizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index a1d6f89..13ddac5 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Trình cài đặt gói"</string>
<string name="install" msgid="711829760615509273">"Cài đặt"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Xong"</string>
<string name="cancel" msgid="1018267193425558088">"Hủy"</string>
<string name="installing" msgid="4921993079741206516">"Đang cài đặt…"</string>
<string name="installing_app" msgid="1165095864863849422">"Đang cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Bạn có muốn cài đặt ứng dụng này không?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Bạn có muốn cài đặt bản cập nhật cho ứng dụng hiện có này không? Dữ liệu hiện có của bạn sẽ không bị mất."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bạn có muốn cài đặt bản cập nhật cho ứng dụng cài sẵn này không? Dữ liệu hiện có của bạn sẽ không bị mất."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Không hỗ trợ thao tác Cài đặt/Gỡ cài đặt trên ứng dụng Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Đang thử nghiệm ứng dụng…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Không xác định"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Để bảo mật, máy tính bảng của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Để bảo mật, TV của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Để bảo mật, điện thoại của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Điện thoại và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với điện thoại của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Máy tính bảng và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với máy tính bảng của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với TV của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index 6110938..49e0b86 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"软件包安装程序"</string>
<string name="install" msgid="711829760615509273">"安装"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"正在安装…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安装<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"已安装应用。"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"要安装此应用吗?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"要为此应用安装更新吗?您现有的数据将不会丢失。"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"要为此内置应用安装更新吗?您现有的数据将不会丢失。"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支持安装/卸载操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在准备安装应用…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"未知"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"出于安全考虑,已禁止您的平板电脑安装来自此来源的未知应用。"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"出于安全考虑,已禁止您的电视安装来自此来源的未知应用。"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"出于安全考虑,已禁止您的手机安装来自此来源的未知应用。"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"来历不明的应用很可能会损害您的手机和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何手机损坏或数据丢失情况,您负有全部责任。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"来历不明的应用很可能会损害您的平板电脑和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何平板电脑损坏或数据丢失情况,您负有全部责任。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"来历不明的应用很可能会损害您的电视和个人数据。安装该应用即表示,您同意对于因使用该应用可能导致的任何电视损坏或数据丢失情况,您负有全部责任。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index 128f371..7c1cc52 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string>
<string name="install" msgid="711829760615509273">"安裝"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"正在安裝…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string>
<string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"要安裝此應用程式嗎?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"您要為這個現有的應用程式安裝更新嗎?您不會遺失現有的資料。"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"您要為這個內置的應用程式安裝更新嗎?您不會遺失現有的資料。"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝/解除安裝操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在準備安裝應用程式…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"為安全起見,您的平板電腦不得安裝此來源的不明應用程式。"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"為安全起見,您的電視不得安裝此來源的不明應用程式。"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"為安全起見,您的手機不得安裝此來源的不明應用程式。"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"來源不明的應用程式可能會侵害您的手機和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致手機損壞或資料遺失的責任。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"來源不明的應用程式可能會侵害您的平板電腦和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致平板電腦損壞或資料遺失的責任。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"來源不明的應用程式可能會侵害您的電視和個人資料。安裝此應用程式,即表示您同意承擔因使用這個應用程式而導致電視損壞或資料遺失的責任。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 507b5d4..9c089dd 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string>
<string name="install" msgid="711829760615509273">"安裝"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"完成"</string>
<string name="cancel" msgid="1018267193425558088">"取消"</string>
<string name="installing" msgid="4921993079741206516">"安裝中…"</string>
<string name="installing_app" msgid="1165095864863849422">"正在安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string>
<string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"要安裝這個應用程式嗎?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"要為這個現有的應用程式安裝更新嗎?你不會遺失現有的資料。"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"要為這個內建的應用程式安裝更新嗎?你不會遺失現有的資料。"</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝及解除安裝操作。"</string>
<string name="message_staging" msgid="8032722385658438567">"正在準備應用程式安裝程序…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"不明"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"為了安全起見,你的平板電腦禁止安裝這個來源提供的不明應用程式。"</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"為了安全起見,你的電視禁止安裝這個來源提供的不明應用程式。"</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"為了安全起見,你的手機禁止安裝這個來源提供的不明應用程式。"</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"來歷不明的應用程式可能會損害你的手機和個人資料。如因安裝及使用這個應用程式,導致你的手機受損或資料遺失,請自行負責。"</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"來歷不明的應用程式可能會損害你的平板電腦和個人資料。如因安裝及使用這個應用程式,導致你的平板電腦受損或資料遺失,請自行負責。"</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"來歷不明的應用程式可能會損害你的電視和個人資料。如因安裝及使用這個應用程式,導致你的電視受損或資料遺失,請自行負責。"</string>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index bdcb7e1..6f911bf 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -18,14 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="7488448184431507488">"Isifaki sephakheji"</string>
<string name="install" msgid="711829760615509273">"Faka"</string>
+ <!-- no translation found for update (3932142540719227615) -->
+ <skip />
<string name="done" msgid="6632441120016885253">"Kwenziwe"</string>
<string name="cancel" msgid="1018267193425558088">"Khansela"</string>
<string name="installing" msgid="4921993079741206516">"Iyafaka..."</string>
<string name="installing_app" msgid="1165095864863849422">"Ifaka i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string>
- <string name="install_confirm_question" msgid="8176284075816604590">"Ingabe ufuna ukufaka lolu hlelo lokusebenza?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"Ingabe ufuna ukufaka lesi sibuyekezo kulolu hlelo lokusebenza olukhona? Idatha yakho ekhona ngeke ize ilahleke."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Uyafuna ukufaka isibuyekezo kulolu hlelo lokusebenza olwakhelwe ngaphakathi? Idatha yakho ekhona ngeke ize ilahleke."</string>
+ <!-- no translation found for install_confirm_question (7663733664476363311) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (3348888852318388584) -->
+ <skip />
<string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string>
@@ -80,9 +83,12 @@
<string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Izenzo zokufaka/ukukhipha azisekelwe ku-Wear."</string>
<string name="message_staging" msgid="8032722385658438567">"Ifaka kusiteji uhlelo lokusebenza…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"Akwaziwa"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Ukuze uvikelwe, ithebulethi yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza ezingaziwa kusukela kulo mthombo."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Ukuze uvikelwe, i-TV yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza ezingaziwa kusukela kulo mthombo."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Ukuze uvikelwe, ifoni yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza kusukela kulo mthombo."</string>
+ <!-- no translation found for untrusted_external_source_warning (7067510047443133095) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7057271609532508035) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (8444191224459138919) -->
+ <skip />
<string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Idatha yakho yefoni neyohlelo lwakho lokusebenza isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kufoni yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
<string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ithebulethi yakho nedatha yomuntu siqu zisengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kuthebulethi yakho noma ukulahleka kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
<string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Idatha yakho ye-TV neyomuntu siqu isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala ku-TV yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
index 705d3f4..38c06dd 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java
@@ -41,6 +41,15 @@
public class InstallSuccess extends AlertActivity {
private static final String LOG_TAG = InstallSuccess.class.getSimpleName();
+ @Nullable
+ private PackageUtil.AppSnippet mAppSnippet;
+
+ @Nullable
+ private String mAppPackageName;
+
+ @Nullable
+ private Intent mLaunchIntent;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -55,59 +64,73 @@
Intent intent = getIntent();
ApplicationInfo appInfo =
intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+ mAppPackageName = appInfo.packageName;
Uri packageURI = intent.getData();
// Set header icon and title
- PackageUtil.AppSnippet as;
PackageManager pm = getPackageManager();
if ("package".equals(packageURI.getScheme())) {
- as = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
+ mAppSnippet = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
pm.getApplicationIcon(appInfo));
} else {
File sourceFile = new File(packageURI.getPath());
- as = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
+ mAppSnippet = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
}
- mAlert.setIcon(as.icon);
- mAlert.setTitle(as.label);
- mAlert.setView(R.layout.install_content_view);
- mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null,
- null);
- mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done),
- (ignored, ignored2) -> {
- if (appInfo.packageName != null) {
- Log.i(LOG_TAG, "Finished installing " + appInfo.packageName);
- }
- finish();
- }, null);
- setupAlert();
- requireViewById(R.id.install_success).setVisibility(View.VISIBLE);
- // Enable or disable "launch" button
- Intent launchIntent = getPackageManager().getLaunchIntentForPackage(
- appInfo.packageName);
- boolean enabled = false;
- if (launchIntent != null) {
- List<ResolveInfo> list = getPackageManager().queryIntentActivities(launchIntent,
- 0);
- if (list != null && list.size() > 0) {
- enabled = true;
- }
- }
+ mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppPackageName);
- Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- if (enabled) {
- launchButton.setOnClickListener(view -> {
- try {
- startActivity(launchIntent);
- } catch (ActivityNotFoundException | SecurityException e) {
- Log.e(LOG_TAG, "Could not start activity", e);
+ bindUi();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ bindUi();
+ }
+
+ private void bindUi() {
+ if (mAppSnippet == null) {
+ return;
+ }
+
+ mAlert.setIcon(mAppSnippet.icon);
+ mAlert.setTitle(mAppSnippet.label);
+ mAlert.setView(R.layout.install_content_view);
+ mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null,
+ null);
+ mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done),
+ (ignored, ignored2) -> {
+ if (mAppPackageName != null) {
+ Log.i(LOG_TAG, "Finished installing " + mAppPackageName);
}
finish();
- });
- } else {
- launchButton.setEnabled(false);
+ }, null);
+ setupAlert();
+ requireViewById(R.id.install_success).setVisibility(View.VISIBLE);
+ // Enable or disable "launch" button
+ boolean enabled = false;
+ if (mLaunchIntent != null) {
+ List<ResolveInfo> list = getPackageManager().queryIntentActivities(mLaunchIntent,
+ 0);
+ if (list != null && list.size() > 0) {
+ enabled = true;
}
}
+
+ Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
+ if (enabled) {
+ launchButton.setOnClickListener(view -> {
+ try {
+ startActivity(mLaunchIntent);
+ } catch (ActivityNotFoundException | SecurityException e) {
+ Log.e(LOG_TAG, "Could not start activity", e);
+ }
+ finish();
+ });
+ } else {
+ launchButton.setEnabled(false);
+ }
}
}
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 1850233..2ed8b7f 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -28,13 +28,13 @@
<string name="label_orientation" msgid="2853142581990496477">"כיוון"</string>
<string name="label_pages" msgid="7768589729282182230">"עמודים"</string>
<string name="destination_default_text" msgid="5422708056807065710">"בחירת מדפסת"</string>
- <string name="template_all_pages" msgid="3322235982020148762">"הכל <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
+ <string name="template_all_pages" msgid="3322235982020148762">"כל <xliff:g id="PAGE_COUNT">%1$s</xliff:g> הדפים"</string>
<string name="template_page_range" msgid="428638530038286328">"טווח של <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="pages_range_example" msgid="8558694453556945172">"למשל 1–5,8,11–13"</string>
<string name="print_preview" msgid="8010217796057763343">"תצוגה מקדימה של הדפסה"</string>
<string name="install_for_print_preview" msgid="6366303997385509332">"התקנה של PDF viewer ליצירת תצוגה מקדימה"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"אפליקציית ההדפסה קרסה"</string>
- <string name="generating_print_job" msgid="3119608742651698916">"יוצר עבודת הדפסה"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"בתהליך יצירה של עבודת הדפסה"</string>
<string name="save_as_pdf" msgid="5718454119847596853">"שמירה כ-PDF"</string>
<string name="all_printers" msgid="5018829726861876202">"כל המדפסות…"</string>
<string name="print_dialog" msgid="32628687461331979">"תיבת דו שיח של מדפסת"</string>
@@ -42,8 +42,8 @@
<string name="page_description_template" msgid="6831239682256197161">"עמוד <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> מתוך <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="summary_template" msgid="8899734908625669193">"סיכום, עותקים <xliff:g id="COPIES">%1$s</xliff:g>, גודל נייר <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"נקודת אחיזה להרחבה"</string>
- <string name="collapse_handle" msgid="6886637989442507451">"ידית כיווץ"</string>
- <string name="print_button" msgid="645164566271246268">"הדפס"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"נקודת אחיזה לכיווץ"</string>
+ <string name="print_button" msgid="645164566271246268">"הדפסה"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"שמירה כ-PDF"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"אפשרויות ההדפסה הורחבו"</string>
<string name="print_options_collapsed" msgid="7455930445670414332">"אפשרויות ההדפסה כווצו"</string>
@@ -52,9 +52,9 @@
<string name="add_print_service_label" msgid="5356702546188981940">"הוספת שירות"</string>
<string name="print_search_box_shown_utterance" msgid="7967404953901376090">"תיבת החיפוש מוצגת"</string>
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"תיבת החיפוש מוסתרת"</string>
- <string name="print_add_printer" msgid="1088656468360653455">"הוסף מדפסת"</string>
- <string name="print_select_printer" msgid="7388760939873368698">"בחר מדפסת"</string>
- <string name="print_forget_printer" msgid="5035287497291910766">"שכח את המדפסת"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"הוספת מדפסת"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"בחירת מדפסת"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"לשכוח את המדפסת"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="two">נמצאו <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
<item quantity="many">נמצאו <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
@@ -62,28 +62,28 @@
<item quantity="one">נמצאה מדפסת <xliff:g id="COUNT_0">%1$s</xliff:g></item>
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
- <string name="printer_info_desc" msgid="7181988788991581654">"מידע נוסף על מדפסת זו"</string>
+ <string name="printer_info_desc" msgid="7181988788991581654">"מידע נוסף על המדפסת הזו"</string>
<string name="notification_channel_progress" msgid="872788690775721436">"עבודות הדפסה פועלות"</string>
<string name="notification_channel_failure" msgid="9042250774797916414">"עבודות הדפסה שנכשלו"</string>
<string name="could_not_create_file" msgid="3425025039427448443">"לא ניתן היה ליצור קובץ"</string>
<string name="print_services_disabled_toast" msgid="9089060734685174685">"שירותי הדפסה מסוימים מושבתים"</string>
- <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"המערכת מחפשת מדפסות"</string>
<string name="print_no_print_services" msgid="8561247706423327966">"לא הופעלו שירותי הדפסה"</string>
<string name="print_no_printers" msgid="4869403323900054866">"לא נמצאו מדפסות"</string>
<string name="cannot_add_printer" msgid="7840348733668023106">"לא ניתן להוסיף מדפסות"</string>
- <string name="select_to_add_printers" msgid="3800709038689830974">"בחר כדי להוסיף מדפסת"</string>
+ <string name="select_to_add_printers" msgid="3800709038689830974">"יש להקיש כדי להוסיף מדפסת"</string>
<string name="enable_print_service" msgid="3482815747043533842">"צריך לבחור כדי להפעיל"</string>
<string name="enabled_services_title" msgid="7036986099096582296">"שירותים מופעלים"</string>
<string name="recommended_services_title" msgid="3799434882937956924">"שירותים מומלצים"</string>
<string name="disabled_services_title" msgid="7313253167968363211">"שירותים מושבתים"</string>
<string name="all_services_title" msgid="5578662754874906455">"כל השירותים"</string>
<plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
- <item quantity="two">התקן כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
- <item quantity="many">התקן כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
- <item quantity="other">התקן כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
- <item quantity="one">התקן כדי לגלות מדפסת <xliff:g id="COUNT_0">%1$s</xliff:g></item>
+ <item quantity="two">יש להתקין כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
+ <item quantity="many">יש להתקין כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
+ <item quantity="other">יש להתקין כדי לגלות <xliff:g id="COUNT_1">%1$s</xliff:g> מדפסות</item>
+ <item quantity="one">יש להתקין כדי לגלות מדפסת אחת (<xliff:g id="COUNT_0">%1$s</xliff:g>)</item>
</plurals>
- <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"בתהליך הדפסה של <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="cancelling_notification_title_template" msgid="1821759594704703197">"המערכת מבטלת את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="failed_notification_title_template" msgid="2256217208186530973">"שגיאת מדפסת ב-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="blocked_notification_title_template" msgid="1175435827331588646">"המדפסת חסמה את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
@@ -108,8 +108,8 @@
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"לא ניתן היה לכתוב לקובץ"</string>
<string name="print_error_default_message" msgid="8602678405502922346">"מצטערים, הפעולה לא בוצעה. אפשר לנסות שוב."</string>
- <string name="print_error_retry" msgid="1426421728784259538">"כדאי לנסות שוב"</string>
- <string name="print_error_printer_unavailable" msgid="8985614415253203381">"המדפסת הזו אינה זמינה כעת."</string>
+ <string name="print_error_retry" msgid="1426421728784259538">"ניסיון נוסף"</string>
+ <string name="print_error_printer_unavailable" msgid="8985614415253203381">"המדפסת הזו לא זמינה כרגע."</string>
<string name="print_cannot_load_page" msgid="6179560924492912009">"לא ניתן להציג תצוגה מקדימה"</string>
<string name="print_preparing_preview" msgid="3939930735671364712">"בתהליך יצירת תצוגה מקדימה…"</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-ml/strings.xml b/packages/PrintSpooler/res/values-ml/strings.xml
new file mode 100644
index 0000000..73af95d
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ml/strings.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="more_options_button" msgid="2243228396432556771">"കൂടുതൽ ഓപ്ഷനുകൾ"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ലക്ഷ്യസ്ഥാനം"</string>
+ <string name="label_copies" msgid="3634531042822968308">"പകർപ്പുകൾ"</string>
+ <string name="label_copies_summary" msgid="3861966063536529540">"പകർപ്പുകൾ:"</string>
+ <string name="label_paper_size" msgid="908654383827777759">"പേപ്പർ വലുപ്പം"</string>
+ <string name="label_paper_size_summary" msgid="5668204981332138168">"പേപ്പർ വലുപ്പം:"</string>
+ <string name="label_color" msgid="1108690305218188969">"നിറം"</string>
+ <string name="label_duplex" msgid="5370037254347072243">"രണ്ട് വശങ്ങളുള്ളത്"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ഓറിയന്റേഷന്"</string>
+ <string name="label_pages" msgid="7768589729282182230">"പേജുകൾ"</string>
+ <string name="destination_default_text" msgid="5422708056807065710">"ഒരു പ്രിന്റർ തിരഞ്ഞെടുക്കുക"</string>
+ <string name="template_all_pages" msgid="3322235982020148762">"എല്ലാ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
+ <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> എന്നതിന്റെ പരിധി"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ഉദാ. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"പ്രിന്റ് പ്രിവ്യൂ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"പ്രിവ്യൂ കാണിക്കുന്നതിന് PDF വ്യൂവർ ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"പ്രിന്റുചെയ്യൽ അപ്ലിക്കേഷൻ ക്രാഷായി"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"പ്രിന്റ് ജോലി സൃഷ്ടിക്കുന്നു"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF-ആയി സംരക്ഷിക്കൂ"</string>
+ <string name="all_printers" msgid="5018829726861876202">"എല്ലാ പ്രിന്ററുകളും..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"പ്രിന്റ് സംഭാഷണം"</string>
+ <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
+ <string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> / <xliff:g id="PAGE_COUNT">%2$d</xliff:g> പേജ്"</string>
+ <string name="summary_template" msgid="8899734908625669193">"സംഗ്രഹം, പകർപ്പുകൾ <xliff:g id="COPIES">%1$s</xliff:g>, പേപ്പർ വലുപ്പം <xliff:g id="PAPER_SIZE">%2$s</xliff:g> എന്നിവ"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"വിപുലീകരണം കൈകാര്യം ചെയ്യുക"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"ചുരുക്കുന്നത് കൈകാര്യം ചെയ്യുക"</string>
+ <string name="print_button" msgid="645164566271246268">"പ്രിന്റുചെയ്യുക"</string>
+ <string name="savetopdf_button" msgid="2976186791686924743">"PDF-ൽ സംരക്ഷിക്കുക"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്ഷനുകൾ വിപുലീകരിച്ചു"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്ഷനുകൾ ചുരുക്കി"</string>
+ <string name="search" msgid="5421724265322228497">"Search"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"എല്ലാ പ്രിന്ററുകളും"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"സേവനം ചേർക്കുക"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"തിരയൽ ബോക്സ് ദൃശ്യമാക്കിയിരിക്കുന്നു"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"തിരയൽ ബോക്സ് മറച്ചിരിക്കുന്നു"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"പ്രിന്റർ ചേർക്കുക"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"പ്രിന്റർ തിരഞ്ഞെടുക്കുക"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"പ്രിന്റർ മറന്നു"</string>
+ <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> പ്രിന്ററുകൾ കണ്ടെത്തി</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> പ്രിന്റർ കണ്ടെത്തി</item>
+ </plurals>
+ <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="printer_info_desc" msgid="7181988788991581654">"ഈ പ്രിന്ററിനെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ"</string>
+ <string name="notification_channel_progress" msgid="872788690775721436">"നടന്നുകൊണ്ടിരിക്കുന്ന പ്രിന്റ് ജോലികൾ"</string>
+ <string name="notification_channel_failure" msgid="9042250774797916414">"പരാജയപ്പെട്ട പ്രിന്റ് ജോലികൾ"</string>
+ <string name="could_not_create_file" msgid="3425025039427448443">"ഫയൽ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല"</string>
+ <string name="print_services_disabled_toast" msgid="9089060734685174685">"ചില പ്രിന്റ് സേവനങ്ങൾ പ്രവർത്തനരഹിതമാക്കി"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"പ്രിന്ററുകൾക്കായി തിരയുന്നു"</string>
+ <string name="print_no_print_services" msgid="8561247706423327966">"പ്രിന്റ് സേവനങ്ങളൊന്നും പ്രവർത്തനക്ഷമാക്കിയിട്ടില്ല"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"പ്രിന്ററുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
+ <string name="cannot_add_printer" msgid="7840348733668023106">"പ്രിന്ററുകൾ ചേർക്കാൻ കഴിയില്ല"</string>
+ <string name="select_to_add_printers" msgid="3800709038689830974">"പ്രിന്റർ ചേർക്കാൻ തിരഞ്ഞെടുക്കുക"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"പ്രവർത്തനക്ഷമമാക്കാൻ തിരഞ്ഞെടുക്കുക"</string>
+ <string name="enabled_services_title" msgid="7036986099096582296">"പ്രവർത്തനക്ഷമമാക്കിയ സേവനങ്ങൾ"</string>
+ <string name="recommended_services_title" msgid="3799434882937956924">"ശുപാർശ ചെയ്യപ്പെടുന്ന സേവനങ്ങൾ"</string>
+ <string name="disabled_services_title" msgid="7313253167968363211">"പ്രവർത്തനരഹിതമാക്കിയ സേവനങ്ങൾ"</string>
+ <string name="all_services_title" msgid="5578662754874906455">"എല്ലാ സേവനങ്ങളും"</string>
+ <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> പ്രിന്ററുകൾ കണ്ടെത്തുന്നതിന് ഇൻസ്റ്റാൾ ചെയ്യുക</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> പ്രിന്റർ കണ്ടെത്തുന്നതിന് ഇൻസ്റ്റാൾ ചെയ്യുക</item>
+ </plurals>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> പ്രിന്റുചെയ്യുന്നു"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> റദ്ദാക്കുന്നു"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"പ്രിന്റർ പിശക് <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"പ്രിന്റർ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> തടഞ്ഞു"</string>
+ <string name="cancel" msgid="4373674107267141885">"റദ്ദാക്കുക"</string>
+ <string name="restart" msgid="2472034227037808749">"പുനരാരംഭിക്കുക"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"പ്രിന്ററിൽ കണക്ഷനൊന്നുമില്ല"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"അജ്ഞാതം"</string>
+ <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ഉപയോഗിക്കണോ?"</string>
+ <string name="print_service_security_warning_summary" msgid="1427434625361692006">"നിങ്ങളുടെ പ്രമാണം പ്രിന്ററിലേക്ക് പോകുന്നതിനിടെ അത് ഒന്നോ അതിലധികമോ സെർവറുകളിലൂടെ കടന്നുപോകാനിടയുണ്ട്."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"കറുപ്പ് & വെള്ള"</item>
+ <item msgid="2762241247228983754">"നിറം"</item>
+ </string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"ഒന്നുമില്ല"</item>
+ <item msgid="7296563835355641719">"നീളമുള്ള അരിക്"</item>
+ <item msgid="79513688117503758">"ഹ്രസ്വ അരിക്"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"പോർട്രെയ്റ്റ്"</item>
+ <item msgid="3199660090246166812">"ലാൻഡ്സ്കേപ്പ്"</item>
+ </string-array>
+ <string name="print_write_error_message" msgid="5787642615179572543">"ഫയലിൽ റൈറ്റുചെയ്യാനായില്ല"</string>
+ <string name="print_error_default_message" msgid="8602678405502922346">"ക്ഷമിക്കണം, അത് പ്രവർത്തിച്ചില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="print_error_retry" msgid="1426421728784259538">"വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="print_error_printer_unavailable" msgid="8985614415253203381">"ഈ പ്രിന്ററർ ഇപ്പോൾ ലഭ്യമല്ല."</string>
+ <string name="print_cannot_load_page" msgid="6179560924492912009">"പ്രിവ്യൂ കാണിക്കാൻ കഴിയില്ല"</string>
+ <string name="print_preparing_preview" msgid="3939930735671364712">"പ്രിവ്യൂ തയ്യാറാക്കുന്നു…"</string>
+</resources>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 79cb1ae..7b526bb 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -70,10 +70,10 @@
<string name="print_no_printers" msgid="4869403323900054866">"Geen printers gevonden"</string>
<string name="cannot_add_printer" msgid="7840348733668023106">"Kan geen printers toevoegen"</string>
<string name="select_to_add_printers" msgid="3800709038689830974">"Selecteer om printer toe te voegen"</string>
- <string name="enable_print_service" msgid="3482815747043533842">"Selecteer om in te schakelen"</string>
- <string name="enabled_services_title" msgid="7036986099096582296">"Ingeschakelde services"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"Selecteer om aan te zetten"</string>
+ <string name="enabled_services_title" msgid="7036986099096582296">"Aangezette services"</string>
<string name="recommended_services_title" msgid="3799434882937956924">"Aanbevolen services"</string>
- <string name="disabled_services_title" msgid="7313253167968363211">"Uitgeschakelde services"</string>
+ <string name="disabled_services_title" msgid="7313253167968363211">"Uitgezette services"</string>
<string name="all_services_title" msgid="5578662754874906455">"Alle services"</string>
<plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
<item quantity="other">Installeren om <xliff:g id="COUNT_1">%1$s</xliff:g> printers te vinden</item>
diff --git a/packages/SettingsLib/SettingsTheme/res/layout/image_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout/settings_icon.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/layout/image_frame.xml
rename to packages/SettingsLib/SettingsTheme/res/layout/settings_icon.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout/settings_preference.xml b/packages/SettingsLib/SettingsTheme/res/layout/settings_preference.xml
index 3a289a7..d2b3169 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout/settings_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout/settings_preference.xml
@@ -29,7 +29,7 @@
android:clipToPadding="false"
android:baselineAligned="false">
- <include layout="@layout/image_frame"/>
+ <include layout="@layout/settings_icon"/>
<RelativeLayout
android:layout_width="0dp"
diff --git a/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml
index 0c942bd..413a387 100644
--- a/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml
+++ b/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml
@@ -14,17 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="12.35dp"
- android:height="15dp"
- android:viewportWidth="14"
- android:viewportHeight="17">
-
+ android:width="21dp"
+ android:height="16dp"
+ android:viewportWidth="21.0"
+ android:viewportHeight="16.0">
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M1.9,7.88h0.77c0.5,0,0.88-0.15,1.15-0.46s0.4-0.72,0.4-1.25c0-1.17-0.45-1.75-1.35-1.75c-0.43,0-0.77,0.16-1.02,0.47 S1.49,5.62,1.49,6.13h-1.2c0-0.8,0.24-1.46,0.73-1.97s1.11-0.78,1.86-0.78c0.78,0,1.41,0.25,1.87,0.73S5.43,5.31,5.43,6.2 c0,0.46-0.12,0.89-0.36,1.29S4.52,8.18,4.14,8.37c0.94,0.35,1.41,1.12,1.41,2.33c0,0.89-0.25,1.6-0.74,2.12 c-0.49,0.53-1.14,0.79-1.94,0.79c-0.79,0-1.43-0.25-1.91-0.75c-0.49-0.5-0.73-1.17-0.73-2.01h1.21c0,0.53,0.13,0.95,0.38,1.26 c0.26,0.31,0.6,0.47,1.05,0.47c0.45,0,0.81-0.15,1.08-0.46s0.4-0.77,0.4-1.39c0-1.21-0.57-1.81-1.72-1.81H1.9V7.88z" />
+ android:fillColor="#FF000000"
+ android:pathData="M5.29,13.22c-0.57,0 -1.09,-0.11 -1.57,-0.34c-0.47,-0.22 -0.85,-0.54 -1.16,-0.95C2.25,11.52 2.07,11.01 2,10.42l1.47,-0.34c0.07,0.51 0.27,0.92 0.59,1.23c0.32,0.31 0.73,0.46 1.23,0.46c0.52,0 0.94,-0.15 1.26,-0.46c0.33,-0.31 0.49,-0.71 0.49,-1.22c0,-0.51 -0.18,-0.92 -0.53,-1.22c-0.35,-0.31 -0.8,-0.46 -1.36,-0.46H4.37V7.06h0.73c0.47,0 0.86,-0.13 1.18,-0.38c0.32,-0.26 0.48,-0.63 0.48,-1.11c0,-0.42 -0.14,-0.77 -0.41,-1.04C6.08,4.27 5.7,4.14 5.21,4.14c-0.43,0 -0.79,0.13 -1.08,0.38C3.85,4.76 3.67,5.08 3.6,5.48L2.17,5.3C2.23,4.81 2.4,4.38 2.67,4c0.27,-0.38 0.62,-0.69 1.05,-0.91c0.44,-0.22 0.94,-0.34 1.5,-0.34c0.62,0 1.15,0.12 1.6,0.35c0.45,0.23 0.79,0.55 1.04,0.95C8.1,4.46 8.23,4.9 8.23,5.4C8.23,6 8.1,6.48 7.84,6.81C7.58,7.14 7.29,7.4 6.97,7.6v0.08c0.46,0.2 0.84,0.5 1.13,0.91c0.3,0.4 0.45,0.93 0.45,1.58c0,0.58 -0.14,1.1 -0.42,1.55c-0.27,0.46 -0.65,0.82 -1.15,1.09C6.5,13.09 5.93,13.22 5.29,13.22z"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M13.77,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 C12.47,5.82,12.3,5.33,12,4.98s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.59,6.37,8.58,7.4v2.03c0,1,0.19,1.77,0.57,2.31 c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59H10.7V8.52h3.07V12.24z" />
- <path
- android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" />
+ android:fillColor="#FF000000"
+ android:pathData="M14.44,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83c-0.38,-0.79 -0.57,-1.71 -0.57,-2.76c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11L17.3,6.01c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6h-1.41v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.78,13.07 15.17,13.22 14.44,13.22z"/>
</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml
index 535f358..1de7d78 100644
--- a/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml
+++ b/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml
@@ -14,17 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="12.35dp"
- android:height="15dp"
- android:viewportWidth="14"
- android:viewportHeight="17">
-
+ android:width="22dp"
+ android:height="16dp"
+ android:viewportWidth="22.0"
+ android:viewportHeight="16.0">
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M5.07,10.13h1.11v1.03H5.07v2.31H3.86v-2.31H0.1v-0.75l3.7-6.9h1.27V10.13z M1.44,10.13h2.42V5.4L1.44,10.13z" />
+ android:fillColor="#FF000000"
+ android:pathData="M2,10.98V9.81l4.28,-6.83h1.6v6.59h1.19v1.41H7.88V13H6.4v-2.02H2zM3.68,9.57H6.4V5.33H6.31L3.68,9.57z"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M13.9,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 c-0.05-0.62-0.22-1.1-0.52-1.45s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.72,6.37,8.71,7.4v2.03 c0,1,0.19,1.77,0.57,2.31c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59h-1.82V8.52h3.07V12.24z" />
- <path
- android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" />
+ android:fillColor="#FF000000"
+ android:pathData="M15,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83c-0.38,-0.79 -0.57,-1.71 -0.57,-2.76c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27c-0.28,0.56 -0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6h-1.41v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C16.34,13.07 15.73,13.22 15,13.22z"/>
</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml
index 2aa6e57f..d961c6c 100644
--- a/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml
+++ b/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml
@@ -14,14 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="14dp"
- android:height="17dp"
- android:viewportWidth="14"
- android:viewportHeight="17">
- <path
- android:fillColor="#FF000000"
- android:pathData="M13.9,12.24l-0.22,0.27c-0.63,0.73 -1.55,1.1 -2.76,1.1c-1.08,0 -1.92,-0.36 -2.53,-1.07s-0.93,-1.72 -0.94,-3.02V7.56c0,-1.39 0.28,-2.44 0.84,-3.13s1.39,-1.04 2.51,-1.04c0.95,0 1.69,0.26 2.23,0.79s0.83,1.28 0.89,2.26h-1.25c-0.05,-0.62 -0.22,-1.1 -0.52,-1.45s-0.74,-0.52 -1.34,-0.52c-0.72,0 -1.24,0.23 -1.57,0.7S8.72,6.37 8.71,7.4v2.03c0,1 0.19,1.77 0.57,2.31c0.38,0.54 0.93,0.8 1.65,0.8c0.67,0 1.19,-0.16 1.54,-0.49l0.18,-0.17V9.59h-1.82V8.52h3.07V12.24z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M1.15,8.47l0.43,-4.96h4.33v1.17H2.6L2.37,7.39C2.78,7.1 3.22,6.96 3.69,6.96c0.77,0 1.38,0.3 1.83,0.9s0.66,1.41 0.66,2.43c0,1.03 -0.24,1.84 -0.72,2.43S4.32,13.6 3.48,13.6c-0.75,0 -1.36,-0.24 -1.83,-0.73s-0.74,-1.16 -0.81,-2.02h1.13c0.07,0.57 0.23,1 0.49,1.29c0.26,0.29 0.59,0.43 1.01,0.43c0.47,0 0.84,-0.2 1.1,-0.61c0.26,-0.41 0.4,-0.96 0.4,-1.65c0,-0.65 -0.14,-1.18 -0.43,-1.59S3.88,8.09 3.4,8.09c-0.4,0 -0.72,0.1 -0.96,0.31L2.11,8.73L1.15,8.47z"/>
+ android:width="21dp"
+ android:height="16dp"
+ android:viewportWidth="21.0"
+ android:viewportHeight="16.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/>
</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml
new file mode 100644
index 0000000..93fcad2
--- /dev/null
+++ b/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml
@@ -0,0 +1,33 @@
+<!--
+ Copyright (C) 2021 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="27dp"
+ android:height="16dp"
+ android:viewportWidth="27.0"
+ android:viewportHeight="16.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M23,7.39c-0.53,0 -0.94,-0.16 -1.25,-0.47C21.45,6.6 21.3,6.16 21.3,5.6V3h0.8v2.66c0,0.3 0.08,0.54 0.23,0.71C22.48,6.54 22.7,6.62 23,6.62c0.3,0 0.52,-0.08 0.67,-0.25c0.15,-0.17 0.23,-0.41 0.23,-0.71V3h0.8v2.6c0,0.36 -0.07,0.67 -0.2,0.94s-0.33,0.48 -0.58,0.62C23.65,7.32 23.35,7.39 23,7.39z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M22.99,13.1c-0.39,0 -0.73,-0.09 -1.03,-0.28c-0.3,-0.19 -0.53,-0.45 -0.7,-0.79C21.08,11.7 21,11.3 21,10.85c0,-0.46 0.08,-0.85 0.25,-1.19c0.17,-0.34 0.41,-0.6 0.71,-0.78c0.3,-0.18 0.65,-0.28 1.04,-0.28c0.31,0 0.59,0.05 0.86,0.16c0.26,0.11 0.48,0.27 0.65,0.48c0.18,0.21 0.28,0.48 0.32,0.8l-0.83,0.14c-0.06,-0.26 -0.17,-0.46 -0.35,-0.6C23.49,9.44 23.27,9.37 23,9.37c-0.22,0 -0.42,0.06 -0.61,0.17c-0.18,0.11 -0.32,0.28 -0.43,0.5c-0.1,0.22 -0.16,0.49 -0.16,0.81c0,0.32 0.05,0.58 0.16,0.8s0.25,0.39 0.43,0.5c0.18,0.11 0.38,0.17 0.61,0.17c0.26,0 0.47,-0.07 0.65,-0.21c0.18,-0.14 0.3,-0.34 0.35,-0.59l0.85,0.09c-0.06,0.29 -0.17,0.54 -0.32,0.77c-0.15,0.22 -0.36,0.39 -0.61,0.52C23.66,13.03 23.35,13.1 22.99,13.1z"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml
new file mode 100644
index 0000000..ca47b6f
--- /dev/null
+++ b/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml
@@ -0,0 +1,33 @@
+<!--
+ Copyright (C) 2021 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="27dp"
+ android:height="16dp"
+ android:viewportWidth="27.0"
+ android:viewportHeight="16.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M23,7.39c-0.53,0 -0.94,-0.16 -1.25,-0.47C21.45,6.6 21.3,6.16 21.3,5.6V3h0.8v2.66c0,0.3 0.08,0.54 0.23,0.71C22.48,6.54 22.7,6.62 23,6.62c0.3,0 0.52,-0.08 0.67,-0.25c0.15,-0.17 0.23,-0.41 0.23,-0.71V3h0.8v2.6c0,0.36 -0.07,0.67 -0.2,0.94s-0.33,0.48 -0.58,0.62C23.65,7.32 23.35,7.39 23,7.39z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M21.41,13L20.3,8.7h0.73l0.64,2.78l0.07,0.38h0.04l0.09,-0.38l0.81,-2.78h0.66l0.79,2.78l0.09,0.37h0.04l0.07,-0.37l0.65,-2.78h0.72L24.59,13H23.9l-0.78,-2.84l-0.1,-0.41h-0.04l-0.1,0.41L22.08,13H21.41z"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml b/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml
index ed9d85e..22bcf7b 100644
--- a/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml
+++ b/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml
@@ -14,17 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="38dp"
- android:height="24dp"
- android:viewportWidth="38.0"
- android:viewportHeight="24.0">
+ android:width="24dp"
+ android:height="16dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="16.0">
<path
android:fillColor="#FF000000"
- android:pathData="M9.45,14.48h1.8c-0.05,0.98 -0.24,1.82 -0.6,2.53c-0.35,0.7 -0.85,1.24 -1.51,1.62c-0.66,0.38 -1.48,0.57 -2.47,0.57c-0.71,0 -1.35,-0.14 -1.92,-0.42c-0.57,-0.28 -1.06,-0.68 -1.47,-1.2c-0.4,-0.53 -0.71,-1.16 -0.93,-1.89c-0.21,-0.74 -0.32,-1.56 -0.32,-2.48v-2.63c0,-0.91 0.11,-1.74 0.32,-2.47c0.22,-0.74 0.54,-1.36 0.95,-1.88C3.71,5.69 4.21,5.29 4.8,5.01c0.6,-0.28 1.28,-0.42 2.03,-0.42c0.92,0 1.71,0.19 2.34,0.56c0.64,0.36 1.14,0.9 1.48,1.61c0.35,0.7 0.55,1.57 0.59,2.59h-1.8C9.41,8.59 9.29,7.98 9.1,7.52C8.91,7.04 8.63,6.69 8.26,6.47C7.9,6.24 7.42,6.13 6.84,6.13c-0.52,0 -0.97,0.1 -1.36,0.31C5.1,6.65 4.79,6.95 4.54,7.34C4.3,7.72 4.12,8.19 3.99,8.74c-0.12,0.54 -0.18,1.15 -0.18,1.82v2.65c0,0.62 0.05,1.21 0.15,1.75c0.1,0.54 0.27,1.02 0.49,1.43c0.23,0.4 0.52,0.72 0.89,0.95c0.36,0.23 0.81,0.34 1.33,0.34c0.66,0 1.18,-0.11 1.56,-0.32c0.38,-0.21 0.67,-0.56 0.85,-1.03C9.27,15.85 9.39,15.23 9.45,14.48z"/>
+ android:pathData="M4.59,13L2,2.98h1.69l1.5,6.48l0.17,0.88h0.08l0.21,-0.88l1.89,-6.48h1.54l1.83,6.48l0.21,0.87h0.08l0.15,-0.87l1.51,-6.48h1.68L12.01,13H10.4L8.58,6.36L8.36,5.4H8.27L8.05,6.36L6.16,13H4.59z"/>
<path
android:fillColor="#FF000000"
- android:pathData="M24.87,4.78l-1.74,9.72l-0.2,1.64l-0.29,-1.44l-2.21,-9.92l-0.2,0l-1.06,0l-0.22,0l-2.28,9.92l-0.28,1.4l-0.18,-1.59l-1.78,-9.73l-1.79,0l2.83,14.22l0.34,0l0.92,0l0.35,0l2.48,-10.36l0.14,-0.84l0.15,0.84l2.36,10.36l0.36,0l0.92,0l0.34,0l2.82,-14.22z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M35.72,6.32l0,-1.54l-5.61,0l-0.34,0l-1.45,0l0,14.22l1.79,0l0,-6.28l4.8,0l0,-1.54l-4.8,0l0,-4.86z"/>
+ android:pathData="M15.77,9.85V8.56h2.46V6.1h1.3v2.46H22v1.29h-2.46v2.46h-1.3V9.85H15.77z"/>
</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml
index e6b4fb6..739e29d 100644
--- a/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml
+++ b/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml
@@ -14,20 +14,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="15.88dp"
- android:height="15dp"
- android:viewportWidth="18"
- android:viewportHeight="17">
-
+ android:width="26dp"
+ android:height="16dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="16.0">
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M1.34,12.4h3.9v1.07H0.08V3.52h1.26V12.4z" />
+ android:fillColor="#FF000000"
+ android:pathData="M2,13V2.98h1.53v8.57H8.3V13H2z"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.1,4.6H8.48v8.88H7.23V4.6H4.62V3.52h6.48V4.6z" />
+ android:fillColor="#FF000000"
+ android:pathData="M11.24,13V4.43H8.19V2.98h7.63v1.46h-3.05V13H11.24z"/>
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M17.34,8.88h-3.52v3.53h4.1v1.07h-5.35V3.52h5.28V4.6h-4.03V7.8h3.52V8.88z" />
- <path
- android:pathData="M 0 0 H 18 V 17 H 0 V 0 Z" />
+ android:fillColor="#FF000000"
+ android:pathData="M17.41,13V2.98h6.36v1.46h-4.83v2.65h4.4v1.46h-4.4v3.01h4.83V13H17.41z"/>
</vector>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 039fcba..832894c 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet sal dalk binnekort afgaan (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Toestel sal dalk binnekort afgaan (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> oor tot battery gelaai is"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> tot battery gelaai is"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimeer tans vir batterygesondheid"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Onbekend"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Laai"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Laai tans stadig"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Laai nie"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Ingeprop; kan nie op die oomblik laai nie"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Vol"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Beheer deur administrateur"</string>
<string name="disabled" msgid="8017887509554714950">"Gedeaktiveer"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Toegelaat"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Minder tyd."</string>
<string name="cancel" msgid="5665114069455378395">"Kanselleer"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Wekkers en onthounotas"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Laat toe om wekkers of onthounotas te stel"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Wekkers en onthounotas"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Laat hierdie program toe om wekkers of ander tydgegronde geleenthede te stel. Die program sal kan wakker word en loop selfs wanneer jy nie die toestel gebruik nie. Neem kennis dat hierdie program dalk nie sal werk as hierdie toestemming herroep word nie – in besonder sal enige wekkers wat die program geskeduleer het, nie werk nie."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"skedule, wekker, onthounota, geleentheid"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Skakel aan"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Skakel Moenie steur nie aan"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nooit"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Stel slot op"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Skakel oor na <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Skep tans nuwe gebruiker …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Bynaam"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Voeg gas by"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Verwyder gas"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 051cc3c..520289b 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ጡባዊው በቅርቡ ሊዘጋ ይችላል (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"መሣሪያው በቅርቡ ሊዘጋ ይችላል (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> ኃይል እስከሚሞላ ድረስ ይቀራል"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ኃይል እስከሚሞላ ድረስ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ለባትሪ ጤና ማመቻቸት"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ያልታወቀ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ኃይል በመሙላት ላይ"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ኃይል በዝግታ በመሙላት ላይ"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ባትሪ እየሞላ አይደለም"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ተሰክቷል፣ አሁን ኃይል መሙላት አይቻልም"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ሙሉነው"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"በአስተዳዳሪ ቁጥጥር የተደረገበት"</string>
<string name="disabled" msgid="8017887509554714950">"ቦዝኗል"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ይፈቀዳል"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ያነሰ ጊዜ።"</string>
<string name="cancel" msgid="5665114069455378395">"ይቅር"</string>
<string name="okay" msgid="949938843324579502">"እሺ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ማንቂያዎች እና አስታዋሾች"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"ማንቂያዎች ወይም አስታዋሾች እንዲቀናበሩ ይፍቀዱ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ማንቂያዎች እና አስታዋሾች"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"ይህ መተግበሪያ ማንቂያዎችን ወይም ሌሎች በጊዜ ላይ የተመሠረቱ ክስተቶች መርሐግብር እንዲያስይዝ ይፍቀዱለት። ይህ መሣሪያውን በማይጠቀሙበት ጊዜ እንኳን መተግበሪያው እንዲነቃ እና እንዲሰራ ያስችለዋል። ይህን ፈቃድ መሻር መተግበሪያው በአግባቡ እንዳይሠራ ሊያደርገው እንደሚችል ልብ ይበሉ፣ ማለትም መተግበሪያው መርሐግብር ያስያዛቸው ማናቸውም ማንቂያዎች ከእንግዲህ አይሰሩም።"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"መርሐግብር፣ ማንቂያ፣ አስታዋሽ፣ ክስተት"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"አብራ"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"አትረብሽን አብራ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"በጭራሽ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ቁልፍ አዘጋጅ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"ወደ <xliff:g id="USER_NAME">%s</xliff:g> ቀይር"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"አዲስ ተጠቃሚ በመፍጠር ላይ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ቅጽል ስም"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"እንግዳን አክል"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"እንግዳን አስወግድ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 92d1199..af071e8 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"قد يتم إغلاق الجهاز اللوحي قريبًا (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"قد يتم إغلاق الجهاز قريبًا (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> إلى أن يتم شحن الجهاز بالكامل"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> إلى أن يتم شحن الجهاز بالكامل"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - التحسين للحفاظ على سلامة البطارية"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"غير معروف"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"جارٍ الشحن"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"جارٍ الشحن ببطء"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"لا يتم الشحن"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"تم التوصيل، ولكن يتعذّر الشحن الآن"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ممتلئة"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"إعدادات يتحكم فيها المشرف"</string>
<string name="disabled" msgid="8017887509554714950">"غير مفعّل"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"مسموح به"</string>
@@ -505,16 +508,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"وقت أقل."</string>
<string name="cancel" msgid="5665114069455378395">"إلغاء"</string>
<string name="okay" msgid="949938843324579502">"حسنًا"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"المنبّهات والتذكيرات"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"السماح بضبط المنبّهات أو التذكيرات"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"المنبّهات والتذكيرات"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"يمكنك السماح لهذا التطبيق بضبط المنبّهات أو الموقّتات الأخرى استنادًا إلى الأحداث. سيسمح هذا الأذن بتنشيط التطبيق وتشغيله حتى في حال عدم استخدام الجهاز. تجدر الإشارة إلى أن إبطال هذا الأذن قد يسبب خللاً في عمل التطبيق، وعلى وجه الخصوص لن تعمل أي منبّهات تم ضبطها بواسطة التطبيق."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"جدول زمني، منبّه، تذكير، حدث، فعالية"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تفعيل"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل وضع \"الرجاء عدم الإزعاج\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"مطلقًا"</string>
@@ -568,6 +566,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"تعيين التأمين"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"التبديل إلى <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"جارٍ إنشاء مستخدم جديد…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"اللقب"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"إضافة ضيف"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"إزالة جلسة الضيف"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 2beab14..8b6d29b 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"টেবলেটটো সোনকালে বন্ধ হৈ যাব পাৰে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ডিভাইচটো সোনকালে বন্ধ হৈ যাব পাৰে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"চাৰ্জ হ’বলৈ <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> চাৰ্জ হ\'বলৈ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - বেটাৰীৰ অৱস্থা অপ্টিমাইজ কৰি থকা হৈছে"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"অজ্ঞাত"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"চাৰ্জ কৰি থকা হৈছে"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"লাহে লাহে চাৰ্জ হৈছে"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"চ্চাৰ্জ কৰা নাই"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"প্লাগ কৰি থোৱা হৈছে, এই মুহূৰ্তত চ্চাৰ্জ কৰিব নোৱাৰি"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"পূৰ্ণ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
<string name="disabled" msgid="8017887509554714950">"নিষ্ক্ৰিয়"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমতি দিয়া হৈছে"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"কম সময়।"</string>
<string name="cancel" msgid="5665114069455378395">"বাতিল কৰক"</string>
<string name="okay" msgid="949938843324579502">"ঠিক"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"এলাৰ্ম আৰু ৰিমাইণ্ডাৰ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"এলাৰ্ম অথবা ৰিমাইণ্ডাৰ ছেট কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"এলাৰ্ম আৰু ৰিমাইণ্ডাৰ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"এই এপ্টোক এলাৰ্ম অথবা অন্য সময় ভিত্তিক অনুষ্ঠানৰ সময়সূচী নিৰ্ধাৰণ কৰিবলৈ দিয়ক। এইটোৱে আপুনি ডিভাইচটো ব্যৱহাৰ কৰি নথকাৰ সময়তো অন্য এপক সক্ৰিয় হ’বলৈ আৰু চলিবলৈ অনুমতি দিয়ে। মনত ৰাখিব যে এই অনুমতিটো প্ৰত্যাহাৰ কৰাৰ ফলত এপ্টোৱে ভালদৰে কাম নকৰা হ’ব পাৰে, বিশেষকৈ এপ্টোৱে সময়সূচী নিৰ্ধাৰণ কৰা এলাৰ্মে আৰু কাম নকৰে।"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"সময়সূচী, এলাৰ্ম, ৰিমাইণ্ডাৰ, অনুষ্ঠান"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"অন কৰক"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"অসুবিধা নিদিব অন কৰক"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"কেতিয়াও নহয়"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"লক ছেট কৰক"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>লৈ সলনি কৰক"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰি থকা হৈছে…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"উপনাম"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ কৰক"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি আঁতৰাওক"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index adcb9b4..f00a87b 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Planşet tezliklə sönə bilər (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Cihaz tezliklə sönə bilər (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Enerjinin dolmasına <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - Enerjinin dolmasına <xliff:g id="TIME">%2$s</xliff:g> qalıb"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Enerjiyə qənaət üçün optimallaşdırma"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Naməlum"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Enerji doldurma"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Asta doldurulur"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Doldurulmur"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Cihaz hazırda batareya yığa bilmir"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Tam"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Admin tərəfindən nəzarət olunur"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiv"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İcazə verilib"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Daha az vaxt."</string>
<string name="cancel" msgid="5665114069455378395">"Ləğv et"</string>
<string name="okay" msgid="949938843324579502">"Ok"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Siqnallar və xatırladıcılar"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Siqnal və xatırladıcıları ayarlamağa icazə verin"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Siqnallar və xatırladıcılar"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Bu tətbiqin siqnallar və ya digər vaxta əsaslanan tədbirləri planlaşdırmasına icazə verin. Bu, cihazdan istifadə etmədiyiniz halda belə, tətbiqin oyanmasına və işləməsinə imkan verəcək. Nəzərə alın ki, bu icazəni ləğv etsəniz, tətbiq düzgün işləməyə bilər, xüsusən də, tətbiqin planlaşdırdığı siqnallar işləməyəcək."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"cədvəl, siqnal, xatırladıcı, tədbir"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktiv edin"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Narahat Etməyin\" rejimini aktiv edin"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Heç vaxt"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Kilid ayarlayın"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> adlı istifadəçiyə keçin"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Yeni istifadəçi yaradılır…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Ləqəb"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Qonaq əlavə edin"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Qonağı silin"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index c507f32..26528b5 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet će se uskoro isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Uređaj će se uskoro isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Napuniće se za <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – napuniće se za <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimizuje se radi boljeg stanja baterije"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Puni se"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Sporo se puni"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ne puni se"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Priključeno je, ali punjenje trenutno nije moguće"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Puna"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontroliše administrator"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
@@ -502,16 +505,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Manje vremena."</string>
<string name="cancel" msgid="5665114069455378395">"Otkaži"</string>
<string name="okay" msgid="949938843324579502">"Potvrdi"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmi i podsetnici"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Dozvoli podešavanje alarma ili podsetnika"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmi i podsetnici"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Dozvolite ovoj aplikaciji da zakazuje alarme ili druge događaje zasnovane na vremenu. Time dozvoljavate aplikaciji da se probudi i radi čak i kada ne koristite uređaj. Imajte na umu da aplikacija možda neće ispravno raditi ako opozovete ovu dozvolu. Konkretno, nijedan alarm koji je aplikacija zakazala neće više raditi."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"zakazati, alarm, podsetnik, događaj"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite režim Ne uznemiravaj"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikad"</string>
@@ -565,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Podesi zaključavanje"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Pređi na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Pravi se novi korisnik…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 0d33ff6..3f83d71 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Планшэт у хуткім часе выключыцца (узровень зараду: <xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Прылада ў хуткім часе выключыцца (узровень зараду: <xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Засталося <xliff:g id="TIME">%1$s</xliff:g> да поўнай зарадкі"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> да поўнай зарадкі"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Аптымізацыя стану акумулятара"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Невядома"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарадка"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Павольная зарадка"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не зараджаецца"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Падключана да сеткі сілкавання, зарадзіць зараз немагчыма"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Акумулятар зараджаны"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Кантралюецца адміністратарам"</string>
<string name="disabled" msgid="8017887509554714950">"Адключанае"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дазволена"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Менш часу."</string>
<string name="cancel" msgid="5665114069455378395">"Скасаваць"</string>
<string name="okay" msgid="949938843324579502">"ОК"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Будзільнікі і напаміны"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Дазволіць наладжваць будзільнікі і напаміны"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Будзільнікі і напаміны"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Дазвольце гэтай праграме ўключаць будзільнікі і задаваць час падзей. Дзякуючы гэтаму праграма будзе абуджацца і працаваць, нават калі вы не выкарыстоўваеце прыладу. Звярніце ўвагу, што скасаванне дазволу можа прывесці да збояў у працы праграмы, у прыватнасці, будуць адключаны будзільнікі, зададзеныя праграмай."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"расклад, будзільнік, напамін, падзея"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Уключыць"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Уключэнне рэжыму \"Не турбаваць\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ніколі"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Усталёўка блакiроўкi"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Пераключыцца на карыстальніка <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Ствараецца новы карыстальнік…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Псеўданім"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Дадаць госця"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Выдаліць госця"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 6131c0a6..55e8732 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Възможно е таблетът да се изключи скоро (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Възможно е устройството да се изключи скоро (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Оставащо време до пълно зареждане: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до пълно зареждане"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"Оставащо време до пълно зареждане: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – Оставащо време до пълно зареждане: <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Оптимизиране с цел състоянието на батерията"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Неизвестно"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарежда се"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Зарежда се бавно"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не се зарежда"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Включена в захранването, в момента не се зарежда"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Пълна"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Заредена"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролира се от администратор"</string>
<string name="disabled" msgid="8017887509554714950">"Деактивирано"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Има разрешение"</string>
@@ -501,16 +501,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"По-малко време."</string>
<string name="cancel" msgid="5665114069455378395">"Отказ"</string>
<string name="okay" msgid="949938843324579502">"ОK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Будилници и напомняния"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Разрешаване на задаване на будилници и напомняния"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Будилници и напомняния"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Разрешете на това приложение да задава будилници и да насрочва други събития, свързани с време. Това ще даде възможност на приложението да се активира и изпълнява дори когато не използвате устройството. Обърнете внимание, че отмяната на това разрешение може да възпрепятства работата на приложението (зададените от него будилници вече няма да работят)."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"насрочване, будилник, напомняне, събитие"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включване"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включване на режима „Не безпокойте“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никога"</string>
@@ -564,6 +559,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Задаване на заключване"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Превключване към <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Създава се нов потребител…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Добавяне на гост"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Премахване на госта"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index fb21e38..9e2ce090 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ট্যাবলেটটি শীঘ্রই বন্ধ হয়ে যেতে পারে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ডিভাইসটি শীঘ্রই বন্ধ হয়ে যেতে পারে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">%1$s</xliff:g> বাকি আছে"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>-এ সম্পূর্ণ চার্জ হয়ে যাবে"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ব্যাটারির চার্জ অপটিমাইজ করা হচ্ছে"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"অজানা"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"চার্জ হচ্ছে"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ধীরে চার্জ হচ্ছে"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"চার্জ হচ্ছে না"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"প্লাগ-ইন করা হয়েছে কিন্তু এখনই চার্জ করা যাবে না"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"পূর্ণ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string>
<string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমোদিত"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"আরও কম।"</string>
<string name="cancel" msgid="5665114069455378395">"বাতিল"</string>
<string name="okay" msgid="949938843324579502">"ঠিক আছে"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"অ্যালার্ম এবং রিমাইন্ডার"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"অ্যালার্ম এবং রিমাইন্ডার সেট করতে অনুমতি দিন"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"অ্যালার্ম এবং রিমাইন্ডার"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"অ্যালার্ম শিডিউল করা বা অন্য সময় ভিত্তিক ইভেন্টের জন্য এই অ্যাপকে অনুমতি দিন। আপনি ডিভাইস ব্যবহার না করলেও এর ফলে অ্যাপ কাজ করা শুরু করে দেবে। মনে রাখবেন অনুমতি না দিলে অ্যাপ ঠিকভাবে কাজ নাও করতে পারে, বিশেষ করে অ্যাপে শিডিউল করা যেকোনও অ্যালার্ম নাও বাজতে পারে।"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"শিডিউল, অ্যালার্ম, রিমাইন্ডার, ইভেন্ট"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"চালু করুন"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'বিরক্ত করবে না\' মোড চালু করুন"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"কখনও নয়"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"লক সেট করুন"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>-এ পাল্টান"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"নতুন ব্যবহারকারী তৈরি করা হচ্ছে…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"বিশেষ নাম"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ করুন"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি সরান"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index f9ac065..1021464 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet će se uskoro isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Uređaj će se uskoro isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Napunit će se za <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – napunit će se za <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimiziranje radi očuvanja baterije"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Punjenje"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Sporo punjenje"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ne puni se"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Priključeno, trenutno se ne može puniti"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Puna"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
@@ -560,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Postaviti zaključavanje"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Prebaci na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Kreiranje novog korisnika…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 962260f..2445571 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"És possible que la tauleta s\'apagui aviat (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"És possible que el dispositiu s\'apagui aviat (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> per completar la càrrega"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> per completar la càrrega"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: s\'està optimitzant per preservar l\'estat de la bateria"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconegut"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"S\'està carregant"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregant lentament"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"No s\'està carregant"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"El dispositiu està endollat però en aquests moments no es pot carregar"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Completa"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlat per l\'administrador"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivat"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Amb permís"</string>
@@ -504,7 +507,7 @@
<string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmes i recordatoris"</string>
<string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permet configurar alarmes o recordatoris"</string>
<string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmes i recordatoris"</string>
- <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permet que aquesta aplicació programi alarmes o altres esdeveniments basats en el temps. Això permetrà que l\'aplicació s\'activi i s\'executi fins i tot quan no utilitzes el dispositiu. Si revoques aquest permís, pot ser que l\'aplicació no funcioni correctament; concretament, no sonarà cap alarma que hagi programat l\'aplicació."</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permet que aquesta aplicació programi alarmes o altres esdeveniments basats en el temps. Això permetrà que l\'aplicació s\'activi i s\'executi fins i tot quan no utilitzes el dispositiu. Si revoques aquest permís, pot ser que l\'aplicació no funcioni correctament; concretament, no sonarà cap alarma que l\'aplicació hagi programat."</string>
<string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"programació, alarma, recordatori, esdeveniment"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activa"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activa el mode No molestis"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Defineix un bloqueig"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Canvia a <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"S\'està creant l\'usuari…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Àlies"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Afegeix un convidat"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Suprimeix el convidat"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 7549b00..1e38693 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet se brzy vypne (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Zařízení se brzy vypne (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Do nabití zbývá: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do nabití"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimalizace pro výdrž baterie"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Neznámé"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Nabíjí se"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Pomalé nabíjení"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nenabíjí se"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Zapojeno, ale nelze nabíjet"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Nabitá"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Spravováno administrátorem"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktivováno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Povoleno"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kratší doba"</string>
<string name="cancel" msgid="5665114069455378395">"Zrušit"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Budíky a připomenutí"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Povolit nastavení budíků nebo připomenutí"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Budíky a připomenutí"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Umožní této aplikaci plánovat budíky nebo další události založené na načasování. Aplikace se bude moci probudit a spustit, i když zařízení nebudete používat. Upozorňujeme, že zrušení tohoto oprávnění může mít za následek nesprávné fungování aplikace, konkrétně už nebudou fungovat budíky, které jsou v aplikaci naplánovány."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"plán, budík, připomenutí, událost"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnout"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapněte funkci Nerušit"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikdy"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Nastavit zámek"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Přepnout na uživatele <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Vytváření nového uživatele…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Přezdívka"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Přidat hosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Odstranit hosta"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 24f7166..f1ea6cc 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tabletten lukker muligvis snart ned (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Enheden lukker muligvis snart ned (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Opladet om <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – opladet om <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"Fuldt opladet om <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – fuldt opladet om <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimerer batteritilstanden"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ukendt"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Oplader"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Oplader langsomt"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Oplader ikke"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Enheden er tilsluttet en strømkilde. Det er ikke muligt at oplade på nuværende tidspunkt."</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Fuldt"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Opladet"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolleret af administratoren"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiveret"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tilladt"</string>
@@ -501,16 +501,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mindre tid."</string>
<string name="cancel" msgid="5665114069455378395">"Annuller"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmer og påmindelser"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Tillad indstilling af alarmer og påmindelser"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmer og påmindelser"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Giv denne app tilladelse til at planlægge alarmer og andre timerrelaterede begivenheder. Dette giver tilladelse til, at appen aktiveres og køres, også selvom du ikke bruger enheden. Bemærk, at tilbagekaldelse af denne tilladelse kan medføre, at appen ikke fungerer korrekt. Det kan f.eks. bevirke, at alarmer, som appen har planlagt, ikke længere virker."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"planlæg, alarm, påmindelse, begivenhed"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivér"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivér Forstyr ikke"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrig"</string>
@@ -564,6 +559,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Konfigurer låseskærmen"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Skift til <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Opretter ny bruger…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Kaldenavn"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Tilføj gæst"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gæsten"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index e5ef75b..dcf7879 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet wird eventuell bald ausgeschaltet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Gerät wird eventuell bald ausgeschaltet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Noch <xliff:g id="TIME">%1$s</xliff:g> bis zur Aufladung"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> bis zur Aufladung"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"voll in <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – voll in <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimierung des Akkuzustands"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unbekannt"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Wird aufgeladen"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Langsames Aufladen"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Wird nicht geladen"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Angeschlossen, kann derzeit nicht geladen werden"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Voll"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Aufgeladen"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Durch den Administrator verwaltet"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiviert"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Zugelassen"</string>
@@ -501,16 +501,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Weniger Zeit."</string>
<string name="cancel" msgid="5665114069455378395">"Abbrechen"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Wecker und Erinnerungen"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Erlauben, dass Wecker und Erinnerungen eingerichtet werden"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Wecker und Erinnerungen"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Erlauben, dass diese App Wecker stellt oder andere zeitliche Ereignisse plant. So kann die App gestartet und ausgeführt werden, auch wenn du das Gerät nicht verwendest. Beachte, dass das Aufheben dieser Berechtigung zu einer Fehlfunktion der App führen kann. In der App gestellte Wecker werden beispielsweise nicht mehr läuten."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"einrichten, Wecker, Erinnerung, Ereignis"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivieren"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Bitte nicht stören\" aktivieren"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nie"</string>
@@ -564,6 +559,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Sperre einrichten"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Zu <xliff:g id="USER_NAME">%s</xliff:g> wechseln"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Neuer Nutzer wird erstellt…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Alias"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Gast hinzufügen"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Gast entfernen"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 98ab1c2..9ebafd9 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Το tablet μπορεί να απενεργοποιηθεί σύντομα (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Η συσκευή μπορεί να απενεργοποιηθεί σύντομα (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Απομένουν <xliff:g id="TIME">%1$s</xliff:g> για ολοκλήρωση της φόρτισης"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> για την ολοκλήρωση της φόρτισης"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Βελτιστοποίηση για τη διατήρηση της καλής κατάστασης της μπαταρίας"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Άγνωστο"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Φόρτιση"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Αργή φόρτιση"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Δεν φορτίζει"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Συνδέθηκε, δεν είναι δυνατή η φόρτιση αυτήν τη στιγμή"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Πλήρης"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ελέγχονται από το διαχειριστή"</string>
<string name="disabled" msgid="8017887509554714950">"Απενεργοποιημένο"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Επιτρέπεται"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Λιγότερη ώρα."</string>
<string name="cancel" msgid="5665114069455378395">"Ακύρωση"</string>
<string name="okay" msgid="949938843324579502">"ΟΚ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Ξυπνητήρια και ειδοποιήσεις"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Να επιτρέπεται ο ορισμός ξυπνητηριών/υπενθυμίσεων"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Ξυπνητήρια και ειδοποιήσεις"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Να επιτρέπεται σε αυτήν την εφαρμογή να προγραμματίζει ξυπνητήρια ή άλλα συμβάντα που βασίζονται σε χρονομέτρηση. Αυτό θα επιτρέπει την αφύπνιση και εκτέλεση της εφαρμογής ακόμη και όταν δεν χρησιμοποιείτε τη συσκευή. Λάβετε υπόψη ότι η ανάκληση αυτής της άδειας μπορεί να οδηγήσει σε δυσλειτουργία της εφαρμογής. Συγκεκριμένα, δεν θα λειτουργούν πλέον τυχόν ξυπνητήρια που έχουν προγραμματιστεί από την εφαρμογή."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"χρονοδιάγραμμα, ξυπνητήρι, υπενθύμιση, συμβάν"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ενεργοποίηση"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ενεργοποίηση λειτουργίας \"Μην ενοχλείτε\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ποτέ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Ορισμός κλειδώματος"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Εναλλαγή σε <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Δημιουργία νέου χρήστη…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Ψευδώνυμο"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Προσθήκη επισκέπτη"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Κατάργηση επισκέπτη"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index a3173cd..7beb3789 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Device may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> left until charged"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until charged"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> left until full"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> left until full"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimising for battery health"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unknown"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charging"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charging slowly"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Not charging"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Plugged in, can\'t charge at the moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Full"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
@@ -559,6 +559,7 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Set lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Switch to <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creating new user…"</string>
+ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 8ac9824..b1596c3 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Device may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> left until charged"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until charged"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> left until full"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> left until full"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimising for battery health"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unknown"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charging"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charging slowly"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Not charging"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Plugged in, can\'t charge at the moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Full"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
@@ -559,6 +559,7 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Set lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Switch to <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creating new user…"</string>
+ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index a3173cd..7beb3789 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Device may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> left until charged"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until charged"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> left until full"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> left until full"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimising for battery health"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unknown"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charging"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charging slowly"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Not charging"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Plugged in, can\'t charge at the moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Full"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
@@ -559,6 +559,7 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Set lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Switch to <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creating new user…"</string>
+ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index a3173cd..7beb3789 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Device may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> left until charged"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until charged"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> left until full"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> left until full"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimising for battery health"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unknown"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charging"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charging slowly"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Not charging"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Plugged in, can\'t charge at the moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Full"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
@@ -559,6 +559,7 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Set lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Switch to <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creating new user…"</string>
+ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 502f959..c984f6e 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Device may shut down soon (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> left until charged"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until charged"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> left until full"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> left until full"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Optimizing for battery health"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Unknown"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charging"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charging slowly"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Not charging"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Plugged in, can\'t charge right now"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Full"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
@@ -559,6 +559,7 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Set lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Switch to <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creating new user…"</string>
+ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index c09739f..0b543b8 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Es posible que pronto se apague la tablet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Es posible que pronto se apague el dispositivo (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> para completar la carga"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> para completar la carga"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> para completar"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> para completar"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: Optimizando el estado de la batería"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carga lenta"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"No se está cargando."</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Conectado. No se puede cargar en este momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Cargado"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string>
@@ -501,16 +501,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tiempo"</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
<string name="okay" msgid="949938843324579502">"Aceptar"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmas y recordatorios"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permitir programar alarmas o recordatorios"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmas y recordatorios"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permite que esta app programe alarmas y otros eventos de tiempo. Esto permitirá que la app se active y se ejecute incluso cuando no uses el dispositivo. Ten en cuenta que revocar este permiso podría hacer que la app no funcione correctamente, y es posible que las alarmas que haya programado la app dejen de funcionar."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"programar, alarma, recordatorio, evento"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar No interrumpir"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
@@ -564,6 +559,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Configurar bloqueo"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Cambiar a <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creando usuario nuevo…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Sobrenombre"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Agregar invitado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 887bfbe..5d738d7 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Es posible que el tablet se apague pronto (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Es posible que el dispositivo se apague pronto (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> hasta cargarse completamente"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g> hasta cargarse completamente)"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: preservando estado de la batería"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Cargando lentamente"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"No se está cargando"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Enchufado, pero no se puede cargar en este momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Completa"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizadas"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tiempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
<string name="okay" msgid="949938843324579502">"Aceptar"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmas y recordatorios"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permitir crear alarmas o recordatorios"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmas y recordatorios"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permite que esta aplicación programe alarmas u otros eventos basados en el tiempo. De este modo, podrá activarse y ejecutarse aunque no estés usando el dispositivo. Si quitas este permiso, es posible que la aplicación no funcione correctamente. En concreto, no sonará ninguna alarma que la aplicación haya programado."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"programar, alarma, recordatorio, evento"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar el modo No molestar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Establecer bloqueo"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Cambiar a <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creando usuario…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Apodo"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Añadir invitado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 3dcc721..591290b 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tahvelarvuti võib peagi välja lülituda (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Seade võib peagi välja lülituda (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Täislaadimiseni on jäänud <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> täislaadimiseni"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – optimeerimine aku seisukorra põhjal"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tundmatu"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Laadimine"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Aeglaselt laadimine"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ei lae"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Vooluvõrgus, praegu ei saa laadida"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Täis"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Juhib administraator"</string>
<string name="disabled" msgid="8017887509554714950">"Keelatud"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Lubatud"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Lühem aeg."</string>
<string name="cancel" msgid="5665114069455378395">"Tühista"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Äratused ja meeldetuletused"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Luba määrata äratusi või meeldetuletusi"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Äratused ja meeldetuletused"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Lubage sellel rakendusel ajastada äratusi või muid ajapõhiseid sündmusi. See võimaldab rakendusel ärgata ja käivituda ka siis, kui te seadet ei kasuta. Pange tähele, et selle loa tühistamine võib tekitada rakenduse väärtalitlust. Näiteks ei tööta enam rakenduses ajastatud äratused."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ajakava, äratus, meeldetuletus, sündmus"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Lülita sisse"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Valiku Mitte segada sisselülitamine"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Mitte kunagi"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Määra lukk"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Lülita kasutajale <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Uue kasutaja loomine …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Hüüdnimi"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Lisa külaline"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Eemalda külaline"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index a9b6d82..f5c3615 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Baliteke tableta laster itzaltzea (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Baliteke gailua laster itzaltzea (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> guztiz kargatu arte"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> guztiz kargatu arte"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Optimizatzen, bateria egoera onean mantentzeko"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ezezaguna"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Kargatzen"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Mantso kargatzen"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ez da kargatzen ari"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Konektatuta dago. Ezin da kargatu une honetan."</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Beteta"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administratzaileak kontrolatzen du"</string>
<string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Baimena dauka"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Ezarri blokeoa"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Aldatu <xliff:g id="USER_NAME">%s</xliff:g> erabiltzailera"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Beste erabiltzaile bat sortzen…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Goitizena"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Gehitu gonbidatua"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Kendu gonbidatua"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index a2c2d01..a4cceba 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ممکن است رایانه لوحی بهزودی خاموش شود (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ممکن است دستگاه بهزودی خاموش شود (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> مانده تا شارژ کامل"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> تا شارژ کامل"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - بهینهسازی برای سلامت باتری"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ناشناس"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"در حال شارژ شدن"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"درحال شارژ شدن آهسته"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"شارژ نمیشود"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"به برق وصل شده است، درحالحاضر شارژ نمیشود"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"پر"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"توسط سرپرست سیستم کنترل میشود"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال شد"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"مجاز"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"زمان کمتر."</string>
<string name="cancel" msgid="5665114069455378395">"لغو"</string>
<string name="okay" msgid="949938843324579502">"تأیید"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"زنگهای هشدار و یادآوریها"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"مجاز کردن برای تنظیم زنگ هشدار و یادآوری"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"زنگهای هشدار و یادآوریها"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"به این برنامه اجازه میدهد زنگهای هشدار و دیگر رویدادهای مبتنی بر زمان را زمانبندی کند. با این کار برنامه مجاز میشود حتی زمانی که از دستگاه استفاده نمیکنید بیدار و اجرا شود. توجه داشته باشید که لغو کردن این اجازه ممکن است باعث شود برنامه درست کار نکند، مخصوصاً اینکه همه زنگهای هشداری که برنامه زمانبندی کرده است دیگر کار نخواهند کرد."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"زمانبندی، زنگ هشدار، یادآوری، رویداد"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"روشن کردن"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"روشن کردن «مزاحم نشوید»"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"هرگز"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"تنظیم قفل"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"رفتن به <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"درحال ایجاد کاربر جدید…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"نام مستعار"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"افزودن مهمان"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"حذف مهمان"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index ea3f9c9..f6a1f41 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tabletti voi sammua pian (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Laite voi sammua pian (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> jäljellä täyteen lataukseen"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> täyteen lataukseen"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Akun kunnon optimointi"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tuntematon"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Ladataan"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Hidas lataus"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ei laturissa"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Kytketty virtalähteeseen, lataaminen ei onnistu"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Täynnä"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string>
<string name="disabled" msgid="8017887509554714950">"Pois päältä"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Sallittu"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Vähemmän aikaa"</string>
<string name="cancel" msgid="5665114069455378395">"Peruuta"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Herätykset ja muistutukset"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Salli herätysten ja muistutusten asettaminen"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Herätykset ja muistutukset"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Anna sovelluksen ajoittaa herätyksiä tai muita aikaan sidonnaisia tapahtumia. Siten sovellus voi aktivoitua ja toimia myös silloin, kun et käytä laitetta. Huomaa, että luvan peruuttaminen voi aiheuttaa sovelluksen toimintahäiriöitä, erityisesti sovelluksen ajoittamat herätykset eivät enää toimi."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ajoitus, herätys, muistutus, tapahtuma"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ota käyttöön"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ota Älä häiritse ‑tila käyttöön"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ei koskaan"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Aseta lukitus"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Vaihda tähän käyttäjään: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Luodaan uutta käyttäjää…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Lempinimi"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Lisää vieras"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Poista vieras"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index e342840..2b379c7 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Il se peut que la tablette s\'éteigne bientôt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Il se peut que l\'appareil s\'éteigne bientôt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> jusqu\'à la charge complète"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> : <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimisation pour préserver la pile"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Inconnu"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Charge en cours…"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Recharge lente"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"N\'est pas en charge"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"L\'appareil est branché, mais il ne peut pas être chargé pour le moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Pleine"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisée"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Moins longtemps."</string>
<string name="cancel" msgid="5665114069455378395">"Annuler"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmes et rappels"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Autoriser la création d\'alarmes ou de rappels"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmes et rappels"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Autorisez cette application à programmer des alarmes ou d\'autres événements temporels. Cette option permettra à l\'application de s\'activer et de fonctionner même si vous n\'utilisez pas l\'appareil. Notez que si vous révoquez cette autorisation, l\'application pourrait ne pas fonctionner correctement. En particulier, les alarmes que l\'application a programmées ne fonctionneront plus."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"horaire, alarme, rappel, événement"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode Ne pas déranger"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jamais"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Définir verrouillage écran"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Passer à <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Créer un utilisateur…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudo"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 5a8568b..ef4c707 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"La tablette va bientôt s\'éteindre (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"L\'appareil va bientôt s\'éteindre (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> jusqu\'à ce que la batterie soit chargée"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Optimisation pour préserver batterie"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Inconnu"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Batterie en charge"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Charge lente"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Pas en charge"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Appareil branché, mais impossible de le charger pour le moment"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Pleine"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisé"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Moins longtemps."</string>
<string name="cancel" msgid="5665114069455378395">"Annuler"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmes et rappels"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Autoriser à définir des alarmes et rappels"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmes et rappels"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Autorisez cette appli à définir des alarmes et d\'autres événements liés à l\'heure. L\'appli pourra alors se lancer et s\'exécuter même si vous n\'utilisez pas l\'appareil. Si vous révoquez cette autorisation, l\'appli risque de mal fonctionner. En particulier, les alarmes qu\'elle aura définies ne fonctionneront plus."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"définir, alarme, rappel, événement"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode \"Ne pas déranger\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jamais"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Définir verrouillage écran"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Passer à <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Création d\'un nouvel utilisateur…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudo"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index c38a8072..e9cfa40 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"A tableta pode apagarse en breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"O dispositivo pode apagarse en breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> para completar a carga"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> para completar a carga"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: optimizando a preservación da batería"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Descoñecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Cargando lentamente"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Non se está cargando"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Conectouse, pero non se pode cargar neste momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Completa"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Opción controlada polo administrador"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitida"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
<string name="okay" msgid="949938843324579502">"Aceptar"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmas e recordatorios"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permitir definir alarmas ou recordatorios"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmas e recordatorios"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permite que esta aplicación planifique alarmas ou outros eventos que dependan do tempo para que poida activarse e funcionar aínda que non esteas usando o dispositivo. Se revogas este permiso, é posible que a aplicación deixe de funcionar correctamente. Ademais, as alarmas que planificase non soarán."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"planificar, alarma, recordatorio, evento"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar modo Non molestar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Establecer bloqueo"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Cambiar a <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creando usuario novo…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Alcume"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Engadir convidado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Quitar convidado"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index f1d7356..378215c 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ટૅબ્લેટ થોડીક જ વારમાં બંધ થઈ શકે છે (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ડિવાઇસ થોડીક જ વારમાં બંધ થઈ શકે છે (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ચાર્જ થવામાં <xliff:g id="TIME">%1$s</xliff:g> બાકી છે"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - ચાર્જ થવા માટે <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> • બૅટરીની ક્ષમતા વધારવા ઑપ્ટિમાઇઝ કરી રહ્યાં છીએ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"અજાણ્યું"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ચાર્જ થઈ રહ્યું છે"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ધીમેથી ચાર્જ થાય છે"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ચાર્જ થઈ રહ્યું નથી"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"પ્લગ ઇન કરેલ, હમણાં ચાર્જ કરી શકતા નથી"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"પૂર્ણ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string>
<string name="disabled" msgid="8017887509554714950">"અક્ષમ કર્યો"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"મંજૂરી છે"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ઓછો સમય."</string>
<string name="cancel" msgid="5665114069455378395">"રદ કરો"</string>
<string name="okay" msgid="949938843324579502">"ઓકે"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"અલાર્મ અને રિમાઇન્ડર"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"અલાર્મ અને રિમાઇન્ડર સેટ કરવાની મંજૂરી આપો"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"અલાર્મ અને રિમાઇન્ડર"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"આ ઍપને અલાર્મ અથવા અન્ય સમય આધારિત ઇવેન્ટને શેડ્યૂલ કરવાની મંજૂરી આપો. જ્યારે તમે ડિવાઇસનો ઉપયોગ કરતા ન હો, ત્યારે પણ આ સુવિધા ઍપને સક્રિય થવાની અને કામ કરવાની મંજૂરી આપશે. નોંધો કે આ પરવાનગીને રદ કરવાથી ઍપમાં ખામી સર્જાઈ શકે છે, ખાસ કરીને કોઈપણ અલાર્મ કે જે ઍપ દ્વારા શેડ્યૂલ કરવામાં આવ્યું હોય, તે હવે કામ કરશે નહીં."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"શેડ્યૂલ, અલાર્મ, રિમાઇન્ડર, ઇવેન્ટ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ચાલુ કરો"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ખલેલ પાડશો નહીં ચાલુ કરો"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ક્યારેય નહીં"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"લૉક સેટ કરો"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> પર સ્વિચ કરો"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"નવા વપરાશકર્તા બનાવી રહ્યાં છીએ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ઉપનામ"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"અતિથિ ઉમેરો"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"અતિથિને કાઢી નાખો"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 849e14c..319150a 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"टैबलेट जल्द ही बंद हो सकता है (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"डिवाइस जल्द ही बंद हो सकता है (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"चार्ज पूरा होने में <xliff:g id="TIME">%1$s</xliff:g> बचा है"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - बैटरी की परफ़ॉर्मेंस बेहतर करने के लिए, ऑप्टिमाइज़ किया जा रहा है"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज हो रही है"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"धीरे चार्ज हो रही है"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"चार्ज नहीं हो रही है"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"प्लग इन है, अभी चार्ज नहीं हो सकती"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"पूरी"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"इसका नियंत्रण एडमिन के पास है"</string>
<string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति है"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कम समय."</string>
<string name="cancel" msgid="5665114069455378395">"रद्द करें"</string>
<string name="okay" msgid="949938843324579502">"ठीक है"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"अलार्म और रिमाइंडर"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"अलार्म या रिमाइंडर सेट करने की अनुमति दें"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"अलार्म और रिमाइंडर"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"इस ऐप्लिकेशन को अलार्म या इवेंट के रिमाइंडर सेट करने की अनुमति दें. इससे, यह ऐप्लिकेशन तब भी काम करना शुरू कर देगा, जब आप डिवाइस का इस्तेमाल नहीं कर रहे होंगे. ध्यान रखें कि यह अनुमति न देने पर, हो सकता है कि ऐप्लिकेशन ठीक तरह से काम न करे. खास तौर पर, ऐप्लिकेशन में शेड्यूल किए गए अलार्म नहीं बजेंगे."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"शेड्यूल, अलार्म, रिमाइंडर, इवेंट"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"चालू करें"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'परेशान न करें\' चालू करें"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कभी नहीं"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"लॉक सेट करें"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> पर जाएं"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"नया उपयोगकर्ता बनाया जा रहा है…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"प्रचलित नाम"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"मेहमान जोड़ें"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"मेहमान हटाएं"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 3804f24..82bd8ae 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet bi se uskoro mogao isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Uređaj bi se uskoro mogao isključiti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Napunit će se za <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – napunit će se za <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimiziranje radi zdravlja baterije"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Punjenje"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Sporo punjenje"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ne puni se"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Uključen, trenutačno se ne može puniti"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Puna"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolira administrator"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dopušteno"</string>
@@ -502,16 +505,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Manje vremena."</string>
<string name="cancel" msgid="5665114069455378395">"Odustani"</string>
<string name="okay" msgid="949938843324579502">"U redu"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmi i podsjetnici"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Dopusti postavljanje alarma ili podsjetnika"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmi i podsjetnici"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Aplikaciji dopustite zakazivanje alarma ili drugih događaja koji se temelje na vremenskom rasporedu. Time će se aplikaciji omogućiti aktiviranje i pokretanje čak i dok ne koristite uređaj. Ako to dopuštenje opozovete, aplikacija bi mogla nepravilno raditi, odnosno nijedan alarm koji je zakazala neće više funkcionirati."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"raspored, alarm, podsjetnik, događaj"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite opciju Ne uznemiravaj."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikada"</string>
@@ -565,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Postavi zaključavanje"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Prelazak na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Izrada novog korisnika…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodavanje gosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Uklanjanje gosta"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 7e99d04..edea140 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Előfordulhat, hogy a táblagép hamarosan kikapcsol (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Előfordulhat, hogy az eszköz hamarosan kikapcsol (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> van hátra a feltöltésből"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> a feltöltésig"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Akkumulátor-élettartam optimalizálása"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ismeretlen"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Töltés"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Lassú töltés"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nem tölt"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Csatlakoztatva, jelenleg nem tölt"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Feltöltve"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Rendszergazda által irányítva"</string>
<string name="disabled" msgid="8017887509554714950">"Letiltva"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Engedélyezett"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kevesebb idő."</string>
<string name="cancel" msgid="5665114069455378395">"Mégse"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Ébresztések és emlékeztetők"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Ébresztés/emlékeztető beállításának engedélyezése"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Ébresztések és emlékeztetők"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Ez az alkalmazás ütemezhet ébresztéseket és más időzítésalapú eseményeket. Ez lehetővé teszi, hogy az alkalmazás még akkor is felébredjen és fusson, amikor Ön éppen nem használja az eszközt. Az engedély visszavonása esetén előfordulhat, hogy az alkalmazás nem működik majd megfelelően. Ez különösen igaz azokra az ébresztésekre, amelyeket az alkalmazás már ütemezett."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ütemezés, ébresztés, emlékeztető, esemény"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bekapcsolás"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"A Ne zavarjanak mód bekapcsolása"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Soha"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Képernyőzár beállítása"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Váltás erre: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Új felhasználó létrehozása…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Becenév"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Vendég hozzáadása"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Vendég munkamenet eltávolítása"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 03abeae..4a7b0fe 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Պլանշետը շուտով կանջատվի (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Սարքը շուտով կանջատվի (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> մինչև լիցքավորումը"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> մինչև լիցքավորումը"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Օպտիմալացվում է մարտկոցի պահպանման համար"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Անհայտ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Լիցքավորում"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Դանդաղ լիցքավորում"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Չի լիցքավորվում"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Միացված է հոսանքին, այս պահին չի կարող լիցքավորվել"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Լիցքավորված է"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Վերահսկվում է ադմինիստրատորի կողմից"</string>
<string name="disabled" msgid="8017887509554714950">"Կասեցված է"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Թույլատրված է"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Պակասեցնել ժամանակը:"</string>
<string name="cancel" msgid="5665114069455378395">"Չեղարկել"</string>
<string name="okay" msgid="949938843324579502">"Եղավ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Զարթուցիչներ և հիշեցումներ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Թույլատրել կարգավորել զարթուցիչներ և հիշեցումներ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Զարթուցիչներ և հիշեցումներ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Թույլ տվեք այս հավելվածին կարգավորել զարթուցիչներ և ժամանակացույցների հետ կապված այլ իրադարձություններ։ Հավելվածը կկարողանա միանալ և գործարկվել, նույնիսկ եթե չեք օգտագործում սարքը։ Նկատի ունեցեք, որ եթե չեղարկեք այս թույլտվությունը, հավելվածը կարող է աշխատել թերություններով, մասնավորապես, հավելվածի կողմից կարգավորված զարթուցիչներն այլևս չեն աշխատի։"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ժամանակացույց, զարթուցիչ, հիշեցում, իրադարձություն"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Միացնել"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Միացրեք «Չանհանգստացնել» ռեժիմը"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Երբեք"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Կարգավորել կողպումը"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Անցնել <xliff:g id="USER_NAME">%s</xliff:g> պրոֆիլին"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Ստեղծվում է օգտատիրոջ նոր պրոֆիլ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Կեղծանուն"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Ավելացնել հյուր"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Հեռացնել հյուրին"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index bb48e43..6c70022 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet akan segera dimatikan (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Perangkat akan segera dimatikan (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Sisa <xliff:g id="TIME">%1$s</xliff:g> hingga terisi penuh"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> lagi terisi penuh"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Mengoptimalkan untuk kesehatan baterai"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tidak diketahui"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Mengisi daya"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Mengisi daya lambat"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Tidak mengisi daya"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Tercolok, tidak dapat mengisi baterai sekarang"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Penuh"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikontrol oleh admin"</string>
<string name="disabled" msgid="8017887509554714950">"Dinonaktifkan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Diizinkan"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Lebih cepat."</string>
<string name="cancel" msgid="5665114069455378395">"Batal"</string>
<string name="okay" msgid="949938843324579502">"Oke"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarm dan pengingat"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Izinkan untuk menyetel alarm atau pengingat"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarm dan pengingat"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Izinkan aplikasi ini menjadwalkan alarm atau acara berbasis waktu lainnya. Tindakan ini akan mengizinkan aplikasi aktif dan berjalan, meski Anda tidak menggunakan perangkat. Perlu diketahui bahwa pembatalan izin ini dapat menyebabkan aplikasi gagal berfungsi, khususnya alarm yang telah dijadwalkan oleh aplikasi tidak akan berfungsi lagi."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"jadwal, alarm, pengingat, acara"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktifkan"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktifkan mode Jangan Ganggu"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Tidak pernah"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Setel kunci"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Beralih ke <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Membuat pengguna baru …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Tambahkan tamu"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Hapus tamu"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 82b3ac2..541840ad 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Spjaldtölvan gæti slökkt á sér fljótlega (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Tækið gæti slökkt á sér fljótlega (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> að fullri hleðslu"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> að fullri hleðslu"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Fínstillir fyrir rafhlöðuendingu"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Óþekkt"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Í hleðslu"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Hæg hleðsla"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ekki í hleðslu"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Í sambandi, ekki hægt að hlaða eins og er"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Fullhlaðin"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Stjórnað af kerfisstjóra"</string>
<string name="disabled" msgid="8017887509554714950">"Óvirkt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Heimilað"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Minni tími."</string>
<string name="cancel" msgid="5665114069455378395">"Hætta við"</string>
<string name="okay" msgid="949938843324579502">"Í lagi"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Vekjarar og áminningar"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Leyfa stillingu vekjara og áminninga"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Vekjarar og áminningar"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Leyfa þessu forriti að tímasetja vekjara eða aðra viðburði sem byggjast á tímasetningu. Með þessu móti getur forritið virkjast og keyrt jafnvel þótt þú sért ekki að nota tækið. Athugaðu að ef þú afturkallar þessa heimild gæti forritið hætt að virka, nánar tiltekið hætta vekjarar sem forritið hefur tímasett að virka."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"áætlun, vekjari, áminning, viðburður"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Kveikja"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Kveikja á „Ónáðið ekki“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrei"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Velja lás"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Skipta yfir í <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Stofnar nýjan notanda…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Gælunafn"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Bæta gesti við"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Fjarlægja gest"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index c4c2772..58c0012 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -450,8 +450,8 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Il tablet potrebbe spegnersi a breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Il dispositivo potrebbe spegnersi a breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Tempo rimanente alla carica completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> alla carica completa"</string>
+ <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"<xliff:g id="TIME">%1$s</xliff:g> alla ricarica completa"</string>
+ <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> alla ricarica completa"</string>
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ottimizzazione per integrità batteria"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Sconosciuta"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"In carica"</string>
@@ -459,7 +459,7 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Ricarica lenta"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Non in carica"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Collegato alla corrente. Impossibile caricare al momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Carica"</string>
+ <string name="battery_info_status_full" msgid="1339002294876531312">"Carica"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Gestita dall\'amministratore"</string>
<string name="disabled" msgid="8017887509554714950">"Disattivato"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizzate"</string>
@@ -501,16 +501,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Meno tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Annulla"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Sveglie e promemoria"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Consenti di impostare sveglie o promemoria"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Sveglie e promemoria"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Consenti a questa app di programmare sveglie o altri eventi basati sull\'orario. In questo modo potrai riattivare ed eseguire l\'app anche quando non usi il dispositivo. Tieni presente che la revoca di questa autorizzazione potrebbe causare il malfunzionamento dell\'app; in particolare, le eventuali sveglie programmate nell\'app non funzioneranno più."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"programmare, sveglia, promemoria, evento"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Attiva"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Attiva Non disturbare"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Mai"</string>
@@ -564,6 +559,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Imposta blocco"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Passa a <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Creazione nuovo utente…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Aggiungi ospite"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Rimuovi ospite"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index cc25a12..8ab65d6 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"הטאבלט עלול להיכבות בקרוב (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"המכשיר עלול להיכבות בקרוב (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"נשארו <xliff:g id="TIME">%1$s</xliff:g> עד הטעינה"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> עד הטעינה"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> ﹣ מופעל מיטוב לשמירה על תקינות הסוללה"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"לא ידוע"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"בטעינה"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"הסוללה נטענת לאט"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"לא בטעינה"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"המכשיר מחובר, אבל לא ניתן לטעון עכשיו"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"מלאה"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"נמצא בשליטת מנהל מערכת"</string>
<string name="disabled" msgid="8017887509554714950">"מושבת"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"מורשה"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"פחות זמן."</string>
<string name="cancel" msgid="5665114069455378395">"ביטול"</string>
<string name="okay" msgid="949938843324579502">"אישור"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"השכמות ותזכורות"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"מאפשרת להגדיר השכמות ותזכורות"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"השכמות ותזכורות"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"הגדרה זו מתירה לאפליקציה לתזמן השכמות או אירועים אחרים הניתנים לתזמון. ההגדרה תאפשר לאפליקציה לצאת ממצב שינה ולפעול גם כשהמכשיר לא בשימוש. לתשומת ליבך, ביטול ההרשאה הזאת עלול לגרום לתקלה באפליקציה, כמו השכמות מתוזמנות שלא יפעלו יותר."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"תזמון, השכמה, תזכורת, אירוע"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"הפעלה"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"הפעלת מצב נא לא להפריע"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"אף פעם"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"הגדרת נעילה"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"מעבר אל <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"בתהליך יצירה של משתמש חדש…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"כינוי"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"הוספת אורח"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"הסרת אורח"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index ad4a9b8..19efad6 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"タブレットの電源がもうすぐ切れます(<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"デバイスの電源がもうすぐ切れます(<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"充電完了まであと <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - 充電完了まで <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - 電池の状態を最適化"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"不明"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"低速充電中"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"充電していません"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"接続されていますが、現在、充電できません"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"フル"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"管理者により管理されています"</string>
<string name="disabled" msgid="8017887509554714950">"無効"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"許可"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ロックを設定"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> に切り替え"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"新しいユーザーを作成しています…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ニックネーム"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ゲストを追加"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ゲストを削除"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index e9a4547..ef1110e 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ტაბლეტი შეიძლება მალე გაითიშოს (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"მოწყობილობა შეიძლება მალე გაითიშოს (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"დატენვამდე დარჩა <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> დატენვამდე"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> — ოპტიმიზაცია ბატარეის გამართულობისთვის"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"უცნობი"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"იტენება"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ნელა იტენება"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"არ იტენება"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"მიერთებულია, დატენვა ამჟამად ვერ ხერხდება"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ბატარეა დატენილია"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"იმართება ადმინისტრატორის მიერ"</string>
<string name="disabled" msgid="8017887509554714950">"გამორთული"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"დაშვებულია"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"საკეტის დაყენება"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>-ზე გადართვა"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"მიმდინარეობს ახალი მომხმარებლის შექმნა…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"მეტსახელი"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"სტუმრის დამატება"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"სტუმრის ამოშლა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 63fbb7b..0a9db64 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Планшет көп ұзамай өшуі мүмкін (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Құрылғы көп ұзамай өшуі мүмкін (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Зарядталғанға дейін <xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – зарядталғанға дейін <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Батарея жұмысын оңтайландыру"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Белгісіз"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарядталуда"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Баяу зарядталуда"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Зарядталу орындалып жатқан жоқ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Қосылған, зарядталмайды"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Толы"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Әкімші басқарады"</string>
<string name="disabled" msgid="8017887509554714950">"Өшірілген"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Рұқсат етілген"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Азырақ уақыт."</string>
<string name="cancel" msgid="5665114069455378395">"Бас тарту"</string>
<string name="okay" msgid="949938843324579502">"Жарайды"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Дабылдар мен еске салғыштар"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Дабылдар не еске салғыштар орнатуға рұқсат беру"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Дабылдар мен еске салғыштар"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Қолданбаға дабылдарды немесе уақытқа негізделген басқа да іс-шараларды жоспарлауға рұқсат береді. Сіз құрылғыны пайдаланып жатпасаңыз да қолданбаның іске қосылып, жұмыс істеуіне мүмкіндік береді. Рұқсатты жойсаңыз, қолданба дұрыс жұмыс істемейтінін, әсіресе қолданба жоспарлаған дабылдардың шықпайтынын ескеріңіз."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"кесте, дабыл, еске салғыш, іс-шара"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Қосу"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Мазаламау режимін қосу"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ешқашан"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Бекітпе тағайындау"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> пайдаланушысына ауысу"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Жаңа пайдаланушы профилі жасалуда…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Лақап ат"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Қонақ қосу"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Қонақты жою"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index a0fdf08..3635c82 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ថេប្លេតអាចនឹងបិទក្នុងពេលបន្តិចទៀត (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ឧបករណ៍អាចនឹងបិទក្នុងពេលបន្តិចទៀត (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> ទៀតទើបសាកថ្មពេញ"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ទៀតទើបសាកថ្មពេញ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - កំពុងបង្កើនប្រសិទ្ធភាពគុណភាពថ្ម"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"មិនស្គាល់"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"កំពុងបញ្ចូលថ្ម"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"កំពុងសាកថ្មយឺត"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"មិនកំពុងបញ្ចូលថ្ម"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ដោតសាកថ្មរួចហើយ ប៉ុន្តែសាកថ្មមិនចូលទេឥឡូវនេះ"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ពេញ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"គ្រប់គ្រងដោយអ្នកគ្រប់គ្រង"</string>
<string name="disabled" msgid="8017887509554714950">"បិទ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"បានអនុញ្ញាត"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"រយៈពេលតិចជាង។"</string>
<string name="cancel" msgid="5665114069455378395">"បោះបង់"</string>
<string name="okay" msgid="949938843324579502">"យល់ព្រម"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ម៉ោងរោទ៍ និងការរំលឹក"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"អនុញ្ញាតឱ្យកំណត់ម៉ោងរោទ៍ ឬការរំលឹក"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ម៉ោងរោទ៍ និងការរំលឹក"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"អនុញ្ញាតឱ្យកម្មវិធីនេះកំណត់កាលវិភាគម៉ោងរោទ៍ ឬព្រឹត្តិការណ៍ដែលមានការកំណត់ពេលផ្សេងទៀត។ ការធ្វើបែបនេះនឹងអនុញ្ញាតឱ្យកម្មវិធីនេះចាប់ផ្ដើម និងដំណើរការ ទោះបីជានៅពេលអ្នកមិនប្រើឧបករណ៍ក៏ដោយ។ សូមចំណាំថា ការដកការអនុញ្ញាតនេះអាចបណ្ដាលឱ្យកម្មវិធីដំណើរការខុសប្រក្រតី ជាពិសេសម៉ោងរោទ៍ទាំងឡាយដែលកម្មវិធីបានកំណត់កាលវិភាគនឹងលែងដំណើរការ។"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"កាលវិភាគ ម៉ោងរោទ៍ ការរំលឹក ព្រឹត្តិការណ៍"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"បើក"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"បើកមុខងារកុំរំខាន"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"កុំឱ្យសោះ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"កំណត់ការចាក់សោ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"ប្ដូរទៅ <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"កំពុងបង្កើតអ្នកប្រើប្រាស់ថ្មី…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ឈ្មោះហៅក្រៅ"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"បញ្ចូលភ្ញៀវ"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ដកភ្ញៀវចេញ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index e25caf2..a261d21 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ಟ್ಯಾಬ್ಲೆಟ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ಸಾಧನವು ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಇದೆ"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">%2$s</xliff:g> ಸಮಯ ಬೇಕು"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಬ್ಯಾಟರಿಯ ಸುಸ್ಥಿತಿಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ಅಪರಿಚಿತ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ನಿಧಾನ ಗತಿಯ ಚಾರ್ಜಿಂಗ್"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆ, ಇದೀಗ ಚಾರ್ಜ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ಭರ್ತಿ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ"</string>
<string name="disabled" msgid="8017887509554714950">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ಕಡಿಮೆ ಸಮಯ."</string>
<string name="cancel" msgid="5665114069455378395">"ರದ್ದುಮಾಡಿ"</string>
<string name="okay" msgid="949938843324579502">"ಸರಿ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ಅಲಾರಾಮ್ಗಳು ಮತ್ತು ರಿಮೈಂಡರ್ಗಳು"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"ಅಲಾರಾಮ್ಗಳು ಅಥವಾ ರಿಮೈಂಡರ್ಗಳನ್ನು ಹೊಂದಿಸಲು ಅನುಮತಿಸಿ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ಅಲಾರಾಮ್ಗಳು ಮತ್ತು ರಿಮೈಂಡರ್ಗಳು"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"ಅಲಾರಾಮ್ಗಳು ಅಥವಾ ಸಮಯಾಧಾರಿತ ಈವೆಂಟ್ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿ ನೀಡಿ. ನೀವು ಸಾಧನವನ್ನು ಬಳಸದೇ ಇದ್ದಾಗಲೂ, ಜಾಗೃತಗೊಳಿಸಲು ಮತ್ತು ರನ್ ಆಗಲು ಇದು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ಅನುಮತಿಯನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದು ಆ್ಯಪ್ ಅನ್ನು ಅಸಮರ್ಪಕಗೊಳಿಸುತ್ತದೆ, ನಿರ್ದಿಷ್ಟವಾಗಿ ಆ್ಯಪ್ ನಿಗದಿಪಡಿಸಿದ ಯಾವುದೇ ಅಲಾರಾಮ್ಗಳು ಇನ್ನು ಮುಂದೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ವೇಳಾಪಟ್ಟಿ, ಅಲಾರಾಮ್, ರಿಮೈಂಡರ್, ಈವೆಂಟ್"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ಆನ್ ಮಾಡಿ"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ಎಂದೂ ಇಲ್ಲ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ಲಾಕ್ ಹೊಂದಿಸಿ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> ಗೆ ಬದಲಿಸಿ"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ಅಡ್ಡ ಹೆಸರು"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ಅತಿಥಿಯನ್ನು ಸೇರಿಸಿ"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 1c02d72..14d5d1c 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"태블릿이 곧 종료될 수 있음(<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"기기가 곧 종료될 수 있음(<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"충전 완료까지 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - 충전 완료까지 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - 배터리 상태 최적화 중"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"알 수 없음"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"충전 중"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"저속 충전 중"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"충전 안함"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"전원이 연결되었지만 현재 충전할 수 없음"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"충전 완료"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"관리자가 제어"</string>
<string name="disabled" msgid="8017887509554714950">"사용 안함"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"허용됨"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"잠금 설정"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>(으)로 전환"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"새로운 사용자를 만드는 중…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"닉네임"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"게스트 추가"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"게스트 삭제"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index bf95520..a52cad6 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Планшет бир аздан кийин өчүп калышы мүмкүн (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Түзмөк бир аздан кийин өчүп калышы мүмкүн (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> кийин толук кубатталып бүтөт"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> кийин толук кубатталып бүтөт"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Батареянын кубатын үнөмдөө иштетилди"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Белгисиз"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Кубатталууда"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Жай кубатталууда"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Кубат алган жок"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"сайылып турат, бирок кубатталган жок"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Толук"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Администратор тарабынан көзөмөлдөнөт"</string>
<string name="disabled" msgid="8017887509554714950">"Өчүрүлгөн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Уруксат берилген"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Азыраак убакыт."</string>
<string name="cancel" msgid="5665114069455378395">"Жокко чыгаруу"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Ойготкучтар жана эстеткичтер"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Ойготкучтарды, эстеткичтерди коюуга уруксат берүү"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Ойготкучтар жана эстеткичтер"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Бул колдонмого ойготкучтарды жана белгилүү бир убакытка иш-чараларды коюуга уруксат бериңиз. Ушуну менен түзмөктү колдонбой турганыңызда да, колдонмо өзү иштеп баштайт. Бул уруксаттан баш тартсаңыз, колдонмо туура эмес иштеп, ал койгон бардык ойготкучтар мындан ары иштебей калат."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"график, ойготкуч, эстеткич, иш-чара"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Күйгүзүү"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Тынчымды алба\" режимин күйгүзүү"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Эч качан"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Бөгөт коюу"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> аккаунтуна которулуу"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Жаңы колдонуучу түзүлүүдө…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Ылакап аты"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Конок кошуу"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 7a45523..565fd30 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ແທັບເລັດອາດປິດໃນໄວໆນີ້ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ອຸປະກອນອາດປິດໃນໄວໆນີ້ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ກຳລັງເພີ່ມປະສິດທິພາບເພື່ອສຸຂະພາບແບັດເຕີຣີ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ບໍ່ຮູ້ຈັກ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ກຳລັງສາກໄຟ"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ກຳລັງສາກໄຟຊ້າໆ"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ບໍ່ໄດ້ສາກໄຟ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ສຽບສາຍແລ້ວ, ບໍ່ສາມາດສາກໄດ້ໃນຕອນນີ້"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ເຕັມ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ຄວບຄຸມໂດຍຜູ້ເບິ່ງແຍງ"</string>
<string name="disabled" msgid="8017887509554714950">"ປິດການນຳໃຊ້"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ອະນຸຍາດແລ້ວ"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ຫຼຸດເວລາ."</string>
<string name="cancel" msgid="5665114069455378395">"ຍົກເລີກ"</string>
<string name="okay" msgid="949938843324579502">"ຕົກລົງ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ໂມງປຸກ ແລະ ການແຈ້ງເຕືອນ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"ອະນຸຍາດໃຫ້ຕັ້ງໂມງປຸກ ຫຼື ການແຈ້ງເຕືອນ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ໂມງປຸກ ແລະ ການແຈ້ງເຕືອນ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"ອະນຸຍາດໃຫ້ແອັບນີ້ກຳນົດເວລາໂມງປຸກ ຫຼື ເຫດການທີ່ອ້າງອີງເວລາອື່ນໆ. ນີ້ຈະເຮັດໃຫ້ແອັບສາມາດປຸກ ແລະ ເຮັດວຽກໄດ້ເຖິງແມ່ນວ່າທ່ານຈະບໍ່ໄດ້ໃຊ້ອຸປະກອນຢູ່ກໍຕາມ. ກະລຸນາຮັບຊາບວ່າການຖອດຖອນການອະນຸຍາດນີ້ອາດສົ່ງຜົນໃຫ້ແອັບເຮັດວຽກຜິດປົກກະຕິໄດ້, ໂດຍສະເພາະແມ່ນໂມງປຸກໃດກໍຕາມທີ່ແອັບໄດ້ກຳນົດເວລາໄວ້ຈະບໍ່ສາມາດເຮັດວຽໄດ້ອີກຕໍ່ໄປ."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ກຳນົດເວລາ, ໂມງປຸກ, ການແຈ້ງເຕືອນ, ນັດໝາຍ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ເປີດ"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ເປີດໂໝດຫ້າມລົບກວນ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ບໍ່ໃຊ້"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ຕັ້ງການລັອກ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"ສະຫຼັບໄປ <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"ກຳລັງສ້າງຜູ້ໃຊ້ໃໝ່…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ຊື່ຫຼິ້ນ"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ເພີ່ມແຂກ"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ລຶບແຂກອອກ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 4edcd9c..e35a3088 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Planšetinis komp. netrukus gali būti išjungtas (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Įrenginys netrukus gali būti išjungtas (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Iki visiškos įkrovos liko <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – iki visiškos įkrovos liko <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – optimizuoj. siekiant apsaugoti akum."</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nežinomas"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Kraunasi..."</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Lėtai įkraunama"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nekraunama"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Įjungta į maitinimo lizdą, bet šiuo metu įkrauti neįmanoma"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Visiškai įkrautas"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Valdo administratorius"</string>
<string name="disabled" msgid="8017887509554714950">"Neleidžiama"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Leidžiama"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mažiau laiko."</string>
<string name="cancel" msgid="5665114069455378395">"Atšaukti"</string>
<string name="okay" msgid="949938843324579502">"Gerai"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Signalai ir priminimai"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Leisti nustatyti signalus arba priminimus"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Signalai ir priminimai"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Leisti šiai programai planuoti signalus ar kitą laiką pagal įvykius. Bus leidžiama pažadinti programą ir vykdyti įvykį, kai nenaudojate įrenginio. Atminkite, kad anuliavus šį leidimą programa gali veikti netinkamai, ypač nebeveiks programos suplanuoti signalai."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"tvarkaraštis, signalas, priminimas, įvykis"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Įjungti"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Netrukdymo režimo įjungimas"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Niekada"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Nustatyti užraktą"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Perjungti į <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Kuriamas naujas naudotojas…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Slapyvardis"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Pridėti svečią"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Pašalinti svečią"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index f31cb32..eb8c808 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Planšetdators, iespējams, drīz izslēgsies (<xliff:g id="LEVEL">%1$s</xliff:g>)."</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Ierīce, iespējams, drīz izslēgsies (<xliff:g id="LEVEL">%1$s</xliff:g>)."</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> — <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Vēl <xliff:g id="TIME">%1$s</xliff:g> līdz pilnai uzlādei"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> — <xliff:g id="TIME">%2$s</xliff:g> līdz pilnai uzlādei"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: akumulatora darbības optimizēšana"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nezināms"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Uzlāde"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Notiek lēnā uzlāde"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nenotiek uzlāde"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Pievienots, taču pašlaik nevar veikt uzlādi"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Pilns"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolē administrators"</string>
<string name="disabled" msgid="8017887509554714950">"Atspējots"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Atļauts"</string>
@@ -502,16 +505,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mazāk laika."</string>
<string name="cancel" msgid="5665114069455378395">"Atcelt"</string>
<string name="okay" msgid="949938843324579502">"LABI"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Signāli un atgādinājumi"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Atļaut iestatīt signālus vai atgādinājumus"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Signāli un atgādinājumi"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Atļaujiet šai lietotnei ieplānot signālus vai citus no laika atkarīgus notikumus. Tādējādi lietotne tiks aktivizēta un darbosies, pat ja neizmantosiet ierīci. Ņemiet vērā — atsaucot šo atļauju, var tikt traucēta lietotnes darbība, konkrētāk, vairs nedarbosies lietotnes ieplānotie signāli."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ieplānot, signāls, atgādinājums, notikums"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ieslēgt"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Režīma “Netraucēt” ieslēgšana"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nekad"</string>
@@ -565,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Iestatīt bloķēšanu"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Pārslēgties uz: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Notiek jauna lietotāja izveide…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Segvārds"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Pievienot viesi"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Noņemt viesi"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index ba57616..d0e5996 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Таблетот може да се исклучи наскоро (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Уредот може да се исклучи наскоро (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Уште <xliff:g id="TIME">%1$s</xliff:g> до целосно полнење"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> до целосно полнење"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Се оптимизира за состојба на батерија"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Непознато"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Се полни"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Бавно полнење"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не се полни"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Приклучен е, но батеријата не може да се полни во моментов"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Полна"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string>
<string name="disabled" msgid="8017887509554714950">"Оневозможено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозволено"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Помалку време."</string>
<string name="cancel" msgid="5665114069455378395">"Откажи"</string>
<string name="okay" msgid="949938843324579502">"Во ред"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Аларми и потсетници"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Дозволете поставување аларми или потсетници"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Аларми и потсетници"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Дозволете ѝ на апликацијава да закажува аларми и други временски базирани настани. Ова ќе ѝ дозволи на апликацијата да се разбуди и да се извршува дури и кога не го користите уредот. Имајте предвид дека повлекувањето на дозволава може да предизвика неправилно работење на апликацијата, односно алармите што апликацијата ги закажала веќе нема да функционираат."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"закажување, аларм, потсетник, наастан"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Вклучи"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Исклучување на „Не вознемирувај“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никогаш"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Постави заклучување"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Префрли на <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Се создава нов корисник…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Прекар"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Додај гостин"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Отстрани гостин"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 25e2d00..f5bf135 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ടാബ്ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ഉപകരണം ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"പൂർണ്ണമായി ചാർജാവാൻ <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - പൂർണ്ണമായി ചാർജാവാൻ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ബാറ്ററിയുടെ ആയുസിനായി ഒപ്റ്റിമൈസ് ചെയ്യുന്നു"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"അജ്ഞാതം"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ചാർജ് ചെയ്യുന്നു"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"പതുക്കെയുള്ള ചാർജിംഗ്"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ചാർജ്ജുചെയ്യുന്നില്ല"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"പ്ലഗ് ഇൻ ചെയ്തു, ഇപ്പോൾ ചാർജ് ചെയ്യാനാവില്ല"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"നിറഞ്ഞു"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"അഡ്മിൻ നിയന്ത്രിക്കുന്നത്"</string>
<string name="disabled" msgid="8017887509554714950">"പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"അനുവദനീയം"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ലോക്ക് സജ്ജീകരിക്കുക"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> എന്നതിലേക്ക് മാറുക"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"പുതിയ ഉപയോക്താവിനെ സൃഷ്ടിക്കുന്നു…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"വിളിപ്പേര്"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"അതിഥിയെ ചേർക്കുക"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"അതിഥിയെ നീക്കം ചെയ്യുക"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 501d2d1..3d3f710 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Таблет удахгүй унтарч болзошгүй (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Төхөөрөмж удахгүй унтарч болзошгүй (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Цэнэглэх хүртэл үлдсэн <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - цэнэглэх хүртэл <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Батарейн барилтыг оновчилж байна"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Тодорхойгүй"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Цэнэглэж байна"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Удаан цэнэглэж байна"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Цэнэглэхгүй байна"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Залгаастай тул одоо цэнэглэх боломжгүй"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Дүүрэн"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Админ удирдсан"</string>
<string name="disabled" msgid="8017887509554714950">"Идэвхгүйжүүлсэн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Зөвшөөрсөн"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Түгжээг тохируулах"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> руу сэлгэх"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Шинэ хэрэглэгч үүсгэж байна…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Хоч"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Зочин нэмэх"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Зочин хасах"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index fcfa6c1..f57b164 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"टॅबलेट लवकरच बंद होऊ शकतो (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"डिव्हाइस लवकरच बंद होऊ शकते (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> पर्यंत पूर्ण चार्ज होईल"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> पर्यंत पूर्ण चार्ज होईल"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - बॅटरीची क्षमता वाढवण्यासाठी ऑप्टिमाइझ करत आहे"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज होत आहे"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"हळूहळू चार्ज होत आहे"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"चार्ज होत नाही"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"प्लग इन केलेले आहे, आता चार्ज करू शकत नाही"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"पूर्ण"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकाने नियंत्रित केलेले"</string>
<string name="disabled" msgid="8017887509554714950">"अक्षम"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमती आहे"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कमी वेळ."</string>
<string name="cancel" msgid="5665114069455378395">"रद्द करा"</string>
<string name="okay" msgid="949938843324579502">"ठीक आहे"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"अलार्म आणि रिमाइंडर"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"अलार्म किंवा रिमाइंडर सेट करण्याची अनुमती द्या"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"अलार्म आणि रिमाइंडर"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"या अॅपला अलार्म किंवा वेळेवर आधारित इतर इव्हेंट शेड्युल करण्याची अनुमती द्या. यामुळे तुम्ही डिव्हाइस वापरत नसतानादेखील अॅपला सुरू आणि रन करण्याची अनुमती मिळते. लक्षात ठेवा की, ही परवानगी नाकारल्याने ॲप कदाचित नीट काम करणार नाही, विशेषतः अॅपने शेड्युल केलेले कोणतेही अलार्म यापुढे काम करणार नाहीत."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"शेड्युल, अलार्म, रिमाइंडर, इव्हेंट"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"सुरू करा"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"व्यत्यय आणू नका सुरू करा"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कधीही नाही"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"लॉक सेट करा"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> वर स्विच करा"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"नवीन वापरकर्ता तयार करत आहे…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"टोपणनाव"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"अतिथी जोडा"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"अतिथी काढून टाका"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 64012de..28d9e8e 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet mungkin ditutup tidak lama lagi (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Peranti mungkin ditutup tidak lama lagi (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> lagi sehingga dicas penuh"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> sehingga dicas"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Pengoptimuman untuk kesihatan bateri"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Tidak diketahui"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Mengecas"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Mengecas dgn prlahan"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Tidak mengecas"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Dipalamkan, tidak boleh mengecas sekarang"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Penuh"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikawal oleh pentadbir"</string>
<string name="disabled" msgid="8017887509554714950">"Dilumpuhkan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dibenarkan"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Tetapkan kunci"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Tukar kepada <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Mencipta pengguna baharu…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Tambah tetamu"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Alih keluar tetamu"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 235fdd1..e5df8cb 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"မကြာမီ တက်ဘလက် ပိတ်သွားနိုင်သည် (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"မကြာမီ စက်ပိတ်သွားနိုင်သည် (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"အားပြည့်ရန် <xliff:g id="TIME">%1$s</xliff:g> ကျန်သည်"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - အားပြည့်ရန် <xliff:g id="TIME">%2$s</xliff:g> ကျန်သည်"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ဘက်ထရီအခြေအနေကို အကောင်းဆုံးဖြစ်အောင် လုပ်နေသည်"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"မသိ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"အားသွင်းနေပါသည်"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"နှေးကွေးစွာ အားသွင်း"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"အားသွင်းမနေပါ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ပလပ်ထိုးထားသောကြောင့် ယခုအားသွင်း၍ မရသေးပါ"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"အပြည့်"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
<string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"အချိန်လျှော့ရန်။"</string>
<string name="cancel" msgid="5665114069455378395">"မလုပ်တော့"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"နှိုးစက်နှင့် သတိပေးချက်များ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"နှိုးစက် (သို့) သတိပေးချက်များ သတ်မှတ်ခွင့်ပြုရန်"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"နှိုးစက်နှင့် သတိပေးချက်များ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"နှိုးစက်သတ်မှတ်ရန် (သို့) အချိန်သတ်မှတ်ချက်ပါသည့် အစီအစဉ်များဆွဲရန် ဤအက်ပ်ကို ခွင့်ပြုပါ။ သင်က စက်ကိုအသုံးမပြုနေသည့် အချိန်တွင်လည်း စတင်ရန်နှင့် အလုပ်လုပ်နေရန် အက်ပ်ကို ခွင့်ပြုပါမည်။ ဤခွင့်ပြုချက်ကို ရုတ်သိမ်းခြင်းက အက်ပ်ကို ချွတ်ယွင်းစေမည်ဖြစ်ကြောင်း သတိပြုပါ၊ အထူးသဖြင့် အက်ပ်က သတ်မှတ်ထားသော မည်သည့်နှိုးစက်မျှ အလုပ်မလုပ်တော့ပါ။"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"အချိန်ဇယား၊ နှိုးစက်၊ သတိပေးချက်၊ အစီအစဉ်"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ဖွင့်ရန်"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'မနှောင့်ယှက်ရ\' ဖွင့်ခြင်း"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ဘယ်တော့မှ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"သော့ချရန် သတ်မှတ်ပါ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> သို့ ပြောင်းရန်"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"အသုံးပြုသူအသစ် ပြုလုပ်နေသည်…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"နာမည်ပြောင်"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ဧည့်သည့် ထည့်ရန်"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index bdbda73..a0c5651 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Nettbrettet slås kanskje av snart (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Enheten slås kanskje av snart (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> til batteriet er fulladet"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> til batteriet er fulladet"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – optimaliserer batteritilstanden"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Ukjent"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Lader"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Lader sakte"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Lader ikke"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Laderen er koblet til – kan ikke lade akkurat nå"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Fullt"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrollert av administratoren"</string>
<string name="disabled" msgid="8017887509554714950">"Slått av"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillatt"</string>
@@ -504,7 +507,7 @@
<string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmer og påminnelser"</string>
<string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Gi tillatelse til å angi alarmer og påminnelser"</string>
<string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmer og påminnelser"</string>
- <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Dette gjør at appen kan planlegge alarmer eller andre tidsbaserte hendelser. Dette gjør at appen kan starte og kjøre, selv når du ikke bruker enheten. Hvis du opphever denne tillatelsen, kan det føre til feil med appen, spesifikt at alarmer som appen har planlagt, ikke fungerer lenger."</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Tillat denne appen å planlegge alarmer eller andre tidsbaserte hendelser. Dette gjør at appen kan starte og kjøre, selv når du ikke bruker enheten. Hvis du opphever denne tillatelsen, kan det føre til feil med appen, blant annet at alarmer som appen har planlagt, ikke fungerer lenger."</string>
<string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"tidsplan, alarm, påminnelse, hendelse"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Slå på"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Slå på Ikke forstyrr"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Angi lås"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Bytt til <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Oppretter en ny bruker …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Kallenavn"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Legg til en gjest"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gjesten"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 8139e0a..c98b4ae 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ट्याब्लेट चाँडै बन्द हुन सक्छ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"यन्त्र चाँडै बन्द हुन सक्छ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"पूर्ण चार्ज हुन <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"पूर्ण चार्ज हुन <xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> लाग्छ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ब्याट्री लामो समयसम्म टिक्ने बनाउन अप्टिमाइज गरिँदै छ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज हुँदै"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"बिस्तारै चार्ज गरिँदै"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"चार्ज भइरहेको छैन"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"प्लगइन गरिएको छ, अहिले नै चार्ज गर्न सकिँदैन"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"पूर्ण चार्ज भएको स्थिति"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकद्वारा नियन्त्रित"</string>
<string name="disabled" msgid="8017887509554714950">"असक्षम पारियो"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति छ"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कम समय।"</string>
<string name="cancel" msgid="5665114069455378395">"रद्द गर्नुहोस्"</string>
<string name="okay" msgid="949938843324579502">"ठिक छ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"अलार्म र रिमाइन्डरहरू"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"अलार्म वा रिमाइन्डर सेट गर्ने अनुमति दिनुहोस्"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"अलार्म र रिमाइन्डरहरू"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"यो एपलाई अलार्म वा समयमा आधारित अन्य कार्यक्रमहरूको समय तोक्ने अनुमति दिनुहोस्। यसका सहायताले तपाईंले यो यन्त्र प्रयोग नगरेका बेला पनि यो एपले अन भई काम गर्न सक्छ। स्मरण रहोस्, तपाईंले यो एपलाई दिनुभएको अनुमति रद्द गर्नुभयो भने यसले राम्रोसँग काम नगर्न सक्छ। खास गरी, यो एपले तोकेको कुनै पनि अलार्म बज्ने छैन।"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"कार्यतालिका, अलार्म, रिमाइन्डर, कार्यक्रम"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"सक्रिय गर्नुहोस्"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"बाधा नपुऱ्याउनुहोस् नामक मोडलाई सक्रिय गर्नुहोस्"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कहिल्यै होइन"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"लक सेट गर्नुहोस्"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"प्रयोगकर्ता बदलेर <xliff:g id="USER_NAME">%s</xliff:g> पार्नुहोस्"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"नयाँ प्रयोगकर्ता बनाउँदै…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"उपनाम"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"अतिथि थप्नुहोस्"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"अतिथि हटाउनुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 8f2b43e..8139fe3 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -211,7 +211,7 @@
<string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Foutopsporingsmodus als wifi is verbonden"</string>
<string name="adb_wireless_error" msgid="721958772149779856">"Fout"</string>
<string name="adb_wireless_settings" msgid="2295017847215680229">"Draadloze foutopsporing"</string>
- <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Schakel draadloze foutopsporing in om beschikbare apparaten te bekijken en te gebruiken"</string>
+ <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Zet draadloze foutopsporing aan om beschikbare apparaten te bekijken en te gebruiken"</string>
<string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Apparaat koppelen met QR-code"</string>
<string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Nieuwe apparaten koppelen via QR-codescanner"</string>
<string name="adb_pair_method_code_title" msgid="1122590300445142904">"Apparaat koppelen met koppelingscode"</string>
@@ -240,7 +240,7 @@
<string name="keep_screen_on" msgid="1187161672348797558">"Stand-by"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Scherm gaat nooit uit tijdens het opladen"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Snoop-logbestand voor bluetooth-HCI aanzetten"</string>
- <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth-pakketten opslaan. (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd)."</string>
+ <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth-pakketten opslaan. (Zet Bluetooth aan nadat je deze instelling hebt gewijzigd)."</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM-ontgrendeling"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Toestaan dat de bootloader wordt ontgrendeld"</string>
<string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM-ontgrendeling toestaan?"</string>
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet wordt binnenkort mogelijk uitgezet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Apparaat wordt binnenkort mogelijk uitgezet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Nog <xliff:g id="TIME">%1$s</xliff:g> tot opgeladen"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> tot opgeladen"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Optimaliseren voor batterijduur"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Onbekend"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Opladen"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Langzaam opladen"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Wordt niet opgeladen"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Aangesloten, kan nu niet opladen"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Volledig"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ingesteld door beheerder"</string>
<string name="disabled" msgid="8017887509554714950">"Uitgezet"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Toegestaan"</string>
@@ -501,18 +504,13 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Minder tijd."</string>
<string name="cancel" msgid="5665114069455378395">"Annuleren"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Wekkers en herinneringen"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Instellen van wekkers en herinneringen toestaan"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Wekkers en herinneringen"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Toestaan dat deze app wekkers of andere op tijd gebaseerde afspraken plant. Hiermee kan de app worden geactiveerd en uitgevoerd, ook als je het apparaat niet gebruikt. Als je dit recht intrekt, kan de werking van de app worden verstoord (met name wekkers die de app heeft ingesteld, werken niet meer)."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"schema, wekker, herinnering, afspraak"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aanzetten"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Schakel Niet storen in."</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zet Niet storen aan."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nooit"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Alleen prioriteit"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -526,7 +524,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
<string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoonspeaker"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Deze telefoon"</string>
- <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Schakel het apparaat uit en weer in."</string>
+ <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en feedback"</string>
<string name="storage_category" msgid="2287342585424631813">"Opslag"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Vergrendeling instellen"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Overschakelen naar <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Nieuwe gebruiker maken…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Bijnaam"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Gast toevoegen"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Gast verwijderen"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index a62b9ec..db404b8 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ଟାବଲେଟ୍ ଶୀଘ୍ର ବନ୍ଦ ହୋଇଯାଇପାରେ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ଡିଭାଇସ୍ ଶୀଘ୍ର ବନ୍ଦ ହୋଇଯାଇପାରେ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ଚାର୍ଜ ହେବା ପାଇଁ <xliff:g id="TIME">%1$s</xliff:g> ବାକି ଅଛି"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ଚାର୍ଜ ହେବା ପର୍ଯ୍ୟନ୍ତ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ବ୍ୟାଟେରୀ ହେଲ୍ଥ ପାଇଁ ଅପ୍ଟିମାଇଜ୍ ହେଉଛି"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ଅଜ୍ଞାତ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ଚାର୍ଜ ହେଉଛି"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ଧୀରେ ଚାର୍ଜ ହେଉଛି"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ଚାର୍ଜ ହେଉନାହିଁ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ପ୍ଲଗ୍ରେ ଲାଗିଛି, ହେଲେ ଏବେ ଚାର୍ଜ କରିପାରିବ ନାହିଁ"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ଚାର୍ଜ ସମ୍ପୂର୍ଣ୍ଣ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
<string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"କମ୍ ସମୟ।"</string>
<string name="cancel" msgid="5665114069455378395">"ବାତିଲ୍"</string>
<string name="okay" msgid="949938843324579502">"ଠିକ୍ ଅଛି"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ଆଲାରାମ୍ ଏବଂ ରିମାଇଣ୍ଡରଗୁଡ଼ିକ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"ଆଲାରାମ୍ ବା ରିମାଇଣ୍ଡର୍ ସେଟ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ଆଲାରାମ୍ ଏବଂ ରିମାଇଣ୍ଡରଗୁଡ଼ିକ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"ଆଲାରାମ୍ କିମ୍ବା ଅନ୍ୟ ସମୟ ଆଧାରିତ ଇଭେଣ୍ଟଗୁଡ଼ିକ ସିଡୁଲ୍ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଆପଣ ଡିଭାଇସ୍ ବ୍ୟବହାର କରୁନଥିଲେ ମଧ୍ୟ ଏହା ଆପକୁ ସକ୍ରିୟ ହେବା ଏବଂ ଚାଲିବାକୁ ଅନୁମତି ଦେବ। ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ଏହି ଅନୁମତି ପ୍ରତ୍ୟାହାର କରିବା ଫଳରେ ଆପ୍ ଠିକରେ କାମ ନକରିପାରେ, ନିର୍ଦ୍ଦିଷ୍ଟ ଭାବେ ଆପ୍ ସିଡୁଲ୍ କରିଥିବା ଯେ କୌଣସି ଆଲାରାମ୍ ଆଉ କାମ କରିବ ନାହିଁ।"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ସିଡୁଲ୍, ଆଲାରାମ, ରିମାଇଣ୍ଡର୍, ଇଭେଣ୍ଟ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ଚାଲୁ କରନ୍ତୁ"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରନ୍ତୁ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"କଦାପି ନୁହେଁ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ଲକ୍ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>କୁ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରାଯାଉଛି…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ଡାକନାମ"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ଅତିଥି ଯୋଗ କରନ୍ତୁ"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ଅତିଥିଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 4b339b7..c8af67b 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ਟੈਬਲੈੱਟ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"ਡੀਵਾਈਸ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ਚਾਰਜ ਹੋਣ ਵਿੱਚ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ਤੱਕ ਚਾਰਜ ਹੋ ਜਾਵੇਗੀ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਬੈਟਰੀ ਦੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ਅਗਿਆਤ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ਪਲੱਗ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਇਸ ਸਮੇਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਸਕਦੀ"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"ਪੂਰੀ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕੀਤੀ ਗਈ"</string>
<string name="disabled" msgid="8017887509554714950">"ਅਯੋਗ ਬਣਾਇਆ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ਇਜਾਜ਼ਤ ਹੈ"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ਘੱਟ ਸਮਾਂ।"</string>
<string name="cancel" msgid="5665114069455378395">"ਰੱਦ ਕਰੋ"</string>
<string name="okay" msgid="949938843324579502">"ਠੀਕ"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ਅਲਾਰਮ ਅਤੇ ਰਿਮਾਈਂਡਰ"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"ਅਲਾਰਮ ਜਾਂ ਰਿਮਾਈਂਡਰ ਸੈੱਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"ਅਲਾਰਮ ਅਤੇ ਰਿਮਾਈਂਡਰ"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"ਇਸ ਐਪ ਨੂੰ ਅਲਾਰਮਾਂ ਜਾਂ ਹੋਰ ਸਮੇਂ \'ਤੇ ਆਧਾਰਿਤ ਇਵੈਂਟਾਂ ਦਾ ਸਮਾਂ ਨਿਯਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਭਾਵੇਂ ਤੁਸੀਂ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਵੋ ਤਾਂ ਵੀ ਇਹ ਐਪ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਅਤੇ ਚੱਲਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਵੇਗਾ। ਨੋਟ ਕਰੋ ਕਿ ਇਸ ਇਜਾਜ਼ਤ ਨੂੰ ਰੱਦ ਕਰਨ ਨਾਲ ਐਪ ਵਿੱਚ ਖਰਾਬੀ ਆ ਸਕਦੀ ਹੈ, ਖਾਸ ਤੌਰ \'ਤੇ ਐਪ ਵਿੱਚ ਨਿਯਤ ਕੀਤਾ ਕੋਈ ਵੀ ਅਲਾਰਮ ਹੁਣ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ।"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ਸਮਾਂ-ਸੂਚੀ, ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਇਵੈਂਟ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ਚਾਲੂ ਕਰੋ"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ਕਦੇ ਵੀ ਨਹੀਂ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">" ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> \'ਤੇ ਜਾਓ"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ਉਪਨਾਮ"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"ਮਹਿਮਾਨ ਹਟਾਓ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 42bdba6..687f663 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet może się wkrótce wyłączyć (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Urządzenie może się wkrótce wyłączyć (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Do naładowania <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – do naładowania <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optymalizuję, aby utrzymać baterię w dobrym stanie"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Nieznane"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Ładowanie"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Wolne ładowanie"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nie podłączony"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Podłączony. Nie można teraz ładować"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Naładowana"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
<string name="disabled" msgid="8017887509554714950">"Wyłączone"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mniej czasu."</string>
<string name="cancel" msgid="5665114069455378395">"Anuluj"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmy i przypomnienia"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Zezwól na ustawianie alarmów i przypomnień"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmy i przypomnienia"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Zezwól aplikacji na planowanie alarmów lub innych wydarzeń z harmonogramem. Dzięki temu aplikacja będzie się wybudzać i działać nawet na nieużywanym urządzeniu. Pamiętaj, że anulowanie tego upoważnienia może spowodować nieprawidłowości w działaniu aplikacji. Przede wszystkim przestaną działać wszystkie zaplanowane przez nią alarmy."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"harmonogram, alarm, przypomnienie, wydarzenie"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Włącz"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Włącz tryb Nie przeszkadzać"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nigdy"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Ustaw blokadę"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Przełącz na: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Tworzę nowego użytkownika…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gościa"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Usuń gościa"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index a5e552c..34fff26 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"O tablet pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"O dispositivo pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Tempo restante até a carga completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> até a carga completa"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: otimizando para integridade da bateria"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Carregando"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregando devagar"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Conectado. Não é possível carregar no momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Carregada"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Definir bloqueio"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Mudar para <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Criando novo usuário…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Apelido"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 9396375..bb1d8b2 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"O tablet poderá ser encerrado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"O dispositivo poderá ser encerrado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Falta(m) <xliff:g id="TIME">%1$s</xliff:g> até ficar carregada"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> até ficar carregada"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – A otimizar o estado da bateria"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"A carregar"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregamento lento"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está a carregar"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Ligada à corrente, não é possível carregar neste momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Carregada"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlado pelo gestor"</string>
<string name="disabled" msgid="8017887509554714950">"Desativada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizada"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmes e lembretes"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permitir definir alarmes e lembretes"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmes e lembretes"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permita que esta app agende alarmes e outros eventos com base no tempo. Isto vai permitir que a app seja ativada e executada mesmo quando não estiver a utilizar o dispositivo. Tenha em atenção que revogar esta autorização pode provocar um mau funcionamento da app, especialmente em relação a quaisquer alarmes que a app tenha agendado, os quais deixarão de funcionar."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"agendar, alarme, lembrete, evento"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o modo Não incomodar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Definir bloqueio"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Mudar para <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"A criar novo utilizador…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudónimo"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index a5e552c..34fff26 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"O tablet pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"O dispositivo pode ser desligado em breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Tempo restante até a carga completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> até a carga completa"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g>: otimizando para integridade da bateria"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Carregando"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregando devagar"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Conectado. Não é possível carregar no momento"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Carregada"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Definir bloqueio"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Mudar para <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Criando novo usuário…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Apelido"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 5652813..5e5c044 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tableta se poate închide în curând (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Dispozitivul se poate închide în curând (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Au mai rămas <xliff:g id="TIME">%1$s</xliff:g> până la încărcare"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> până la încărcare"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Se fac optimizări pentru buna funcționare a bateriei"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Necunoscut"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Se încarcă"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Se încarcă lent"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nu se încarcă"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Conectat, nu se poate încărca chiar acum"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Complet"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlată de administrator"</string>
<string name="disabled" msgid="8017887509554714950">"Dezactivată"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permise"</string>
@@ -502,16 +505,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mai puțin timp."</string>
<string name="cancel" msgid="5665114069455378395">"Anulați"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarme și mementouri"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Permiteți setarea de alarme sau mementouri"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarme și mementouri"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Permiteți acestei aplicații să programeze alarme sau alte evenimente legate de timp. Astfel, aplicația va putea să se activeze și să ruleze chiar dacă nu folosiți dispozitivul. Rețineți că revocarea acestei permisiuni poate cauza funcționarea incorectă a aplicației, mai ales dezactivarea alarmelor programate de aplicație."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"programare, alarmă, memento, eveniment"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activați"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activați Nu deranja"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Niciodată"</string>
@@ -565,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Configurați blocarea"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Treceți la <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Se creează un utilizator nou…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Adăugați un invitat"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Ștergeți invitatul"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 7ffd04b..b9b2edb 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Планшет скоро выключится (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Устройство скоро выключится (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> до полной зарядки"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до полной зарядки"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"Оптимизация для увеличения срока службы батареи (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Неизвестно"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Идет зарядка"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Медленная зарядка"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не заряжается"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Подключено, не заряжается"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Батарея заряжена"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролируется администратором"</string>
<string name="disabled" msgid="8017887509554714950">"Отключено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Разрешено"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Уменьшить продолжительность"</string>
<string name="cancel" msgid="5665114069455378395">"Отмена"</string>
<string name="okay" msgid="949938843324579502">"ОК"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Будильники и напоминания"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Разрешить устанавливать будильники и напоминания"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Будильники и напоминания"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Разрешить этому приложению устанавливать будильники или другие события на определенное время. Приложение сможет выходить из спящего режима и запускаться, даже когда вы не пользуетесь устройством. Если отменить это разрешение, приложение не сможет работать, и все установленные им будильники будут отключены."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"установить, будильник, напоминание, событие"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включить"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включите режим \"Не беспокоить\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никогда"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Включить блокировку"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Переключиться на этот аккаунт: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Создаем нового пользователя…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Добавить гостя"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Удалить аккаунт гостя"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index b035b34..cd25803 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ටැබ්ලට් පරිගණකය ඉක්මනින් වැසිය හැකිය (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"උපාංගය ඉක්මනින් වැසිය හැකිය (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ආරෝපණය වන තෙක් <xliff:g id="TIME">%1$s</xliff:g> ඇත"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - ආරෝපණය වන තෙක් <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - බැටරි ආයු කාලය වැඩි දියුණු කරමින්"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"නොදනී"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ආරෝපණය වෙමින්"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"සෙමින් ආරෝපණය"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ආරෝපණය නොවේ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"පේනුගත කර ඇත, මේ අවස්ථාවේදී ආරෝපණය කළ නොහැකිය"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"පූර්ණ"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"පරිපාලක විසින් පාලනය කරන ලදී"</string>
<string name="disabled" msgid="8017887509554714950">"අබල කර ඇත"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ඉඩ දුන්"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"වේලාව අඩුවෙන්."</string>
<string name="cancel" msgid="5665114069455378395">"අවලංගු කරන්න"</string>
<string name="okay" msgid="949938843324579502">"හරි"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"එලාම සහ සිහිකැඳවීම්"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"එලාම හෝ සිහිකැඳවීම් සැකසීමට ඉඩ දෙන්න"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"එලාම සහ සිහිකැඳවීම්"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"එලාම හෝ වේලාව පදනම් කර ගත් වෙනත් සිදුවීම් කාලසටහන්ගත කිරීමට මෙම යෙදුමට ඉඩ දෙන්න. ඔබ උපාංගය භාවිත නොකරන විට පවා යෙදුමට අවදි වීමට සහ ක්රියාත්මක වීමට මෙය ඉඩ දෙයි. මෙම අවසරය අහෝසි කිරීම යෙදුම හොඳින් ක්රියාත්මක නොවීමට හේතු විය හැකි බව සලකන්න, විශේෂයෙන් යෙදුම කාලසටහන්ගත කර ඇති යම් එලාම තවදුරටත් ක්රියා නොකරනු ඇත."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"කාල සටහන, එලාමය, සිහිකැඳවීම, සිදුවීම"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ක්රියාත්මක කරන්න"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"බාධා නොකරන්න ක්රියාත්මක කරන්න"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"කිසි විටක නැත"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"අගුල සකසන්න"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> වෙත මාරු වන්න"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"නව පරිශීලක තනමින්…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"අපනාමය"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"අමුත්තා එක් කරන්න"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"අමුත්තා ඉවත් කරන්න"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index a15df69..03c3cb2 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet sa môže čoskoro vypnúť (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Zariadenie sa môže čoskoro vypnúť (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Zostávajúci čas do úplného nabitia: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do úplného nabitia"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimalizácia stavu batérie"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Neznáme"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Nabíja sa"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Pomalé nabíjanie"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nenabíja sa"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Pripojené, ale nie je možné nabíjať"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Nabitá"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ovládané správcom"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktivované"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Povolené"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kratší čas."</string>
<string name="cancel" msgid="5665114069455378395">"Zrušiť"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Budíky a pripomenutia"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Povoliť nastavovanie budíkov a pripomenutí"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Budíky a pripomenutia"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Povoľte tejto aplikácii plánovať budíky alebo iné udalosti založené na čase. Príslušnej aplikácii tak umožníte prebudiť sa a spustiť, aj keď zariadenie nepoužívate. Upozorňujeme, že ak toto povolenie zrušíte, aplikácia nemusí fungovať správne a konkrétne môže dôjsť k zrušeniu všetkých budíkov, ktoré naplánovala."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"plán, budík, pripomenutie, udalosť"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnúť"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapnite režim bez vyrušení"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikdy"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Nastaviť uzamknutie"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Prepnúť na používateľa <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Vytvára sa nový používateľ…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Prezývka"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Pridať hosťa"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 5aa64b4..b2635fb 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablični računalnik se bo morda kmalu zaustavil (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Naprava se bo morda kmalu zaustavila (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Še <xliff:g id="TIME">%1$s</xliff:g> do polne napolnjenosti"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do polne napolnjenosti"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimizacija za ohranjanje zmogljivosti baterije"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Neznano"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Polnjenje"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Počasno polnjenje"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Se ne polni"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Priključeno, trenutno ni mogoče polniti"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Poln"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Nadzira skrbnik"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogočeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dovoljene"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Krajši čas."</string>
<string name="cancel" msgid="5665114069455378395">"Prekliči"</string>
<string name="okay" msgid="949938843324579502">"V redu"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmi in opomniki"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Dovoli nastavljanje alarmov ali opomnikov"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmi in opomniki"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Tej aplikaciji dovolite nastavljanje alarmov ali drugih časovnih dogodkov. S tem boste aplikaciji omogočili, da se prebudi iz stanja pripravljenosti in zažene, celo kadar naprave ne uporabljate. Upoštevajte, da s preklicem tega dovoljenja lahko povzročite nepravilno delovanje aplikacije – alarmi, ki jih je nastavila aplikacija, ne bodo več delovali."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"urnik, razpored, alarm, opomnik, dogodek"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vklopi"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vklop načina »ne moti«"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikoli"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Nastavi zaklepanje"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Preklop na račun <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Ustvarjanje novega uporabnika …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Vzdevek"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodajanje gosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Odstranitev gosta"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index aa78383..e57ede6 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tableti mund të fiket së shpejti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Pajisja mund të fiket së shpejti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura deri në karikim"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> derisa të karikohet"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Po optimizohet për integritetin e baterisë"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"I panjohur"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Po karikohet"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Po karikohet ngadalë"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Nuk po karikohet"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Në prizë, por nuk mund të karikohet për momentin"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"E mbushur"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolluar nga administratori"</string>
<string name="disabled" msgid="8017887509554714950">"Çaktivizuar"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Lejohet"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Më pak kohë."</string>
<string name="cancel" msgid="5665114069455378395">"Anulo"</string>
<string name="okay" msgid="949938843324579502">"Në rregull"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmet dhe alarmet rikujtuese"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Lejo që të caktohen alarmet dhe alarmet rikujtuese"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmet dhe alarmet rikujtuese"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Lejo që ky aplikacion të planifikojë alarmet dhe ngjarje të tjera të bazuara tek orari. Kjo do ta lejojë aplikacionin të zgjohet dhe të ekzekutohet edhe kur ti nuk e përdor pajisjen. Ki parasysh se anulimi i kësaj lejeje mund të shkaktojë keqfunksionim të aplikacionit. Në mënyrë specifike, çdo alarm që ka planifikuar aplikacioni nuk do të funksionojë më."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"planifiko, alarm, alarm rikujtues, ngjarje"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivizo"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivizo \"Mos shqetëso\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Asnjëherë"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Cakto kyçjen"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Kalo te <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Po krijohet një përdorues i ri…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Pseudonimi"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Shto të ftuar"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Hiq të ftuarin"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 0cfe9ee..c0a9022 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Таблет ће се ускоро искључити (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Уређај ће се ускоро искључити (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Напуниће се за <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – напуниће се за <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Оптимизује се ради бољег стања батерије"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Непознато"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Пуни се"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Споро се пуни"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не пуни се"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Прикључено је, али пуњење тренутно није могуће"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Пуна"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролише администратор"</string>
<string name="disabled" msgid="8017887509554714950">"Онемогућено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозвољено"</string>
@@ -502,16 +505,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Мање времена."</string>
<string name="cancel" msgid="5665114069455378395">"Откажи"</string>
<string name="okay" msgid="949938843324579502">"Потврди"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Аларми и подсетници"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Дозволи подешавање аларма или подсетника"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Аларми и подсетници"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Дозволите овој апликацији да заказује аларме или друге догађаје засноване на времену. Тиме дозвољавате апликацији да се пробуди и ради чак и када не користите уређај. Имајте на уму да апликација можда неће исправно радити ако опозовете ову дозволу. Конкретно, ниједан аларм који је апликација заказала неће више радити."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"заказати, аларм, подсетник, догађај"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Укључи"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Укључите режим Не узнемиравај"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никад"</string>
@@ -565,6 +563,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Подеси закључавање"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Пређи на корисника <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Прави се нови корисник…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Надимак"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Додај госта"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Уклони госта"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 49bb799..da22032 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Surfplattan kanske stängs av snart (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Enheten kanske stängs av snart (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> kvar till full laddning"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> till full laddning"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Optimerar batteriets livslängd"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Okänd"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Laddar"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Laddas långsamt"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Laddar inte"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Ansluten, kan inte laddas just nu"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Fullt"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Strys av administratören"</string>
<string name="disabled" msgid="8017887509554714950">"Inaktiverad"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillåts"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kortare tid."</string>
<string name="cancel" msgid="5665114069455378395">"Avbryt"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarm och påminnelser"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Tillåt att alarm eller påminnelser ställs in"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarm och påminnelser"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Tillåt att appen schemalägger alarm och andra tidsbaserade händelser. På så vis kan appen aktiveras och köras också när du inte använder enheten. Om du återkallar behörigheten kan det leda till att appen inte fungerar. Mer specifikt kommer alarm som schemalagts i appen inte längre att fungera."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"schemalägga, alarm, påminnelse, händelse"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivera"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivera Stör ej."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrig"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Konfigurera lås"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Byt till <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Skapar ny användare …"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Smeknamn"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Lägg till gäst"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Ta bort gäst"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 2e2ae4f..4da8184 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Huenda kompyuta kibao ikazima hivi karibuni (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Huenda kifaa kikazima hivi karibuni (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Imebakisha <xliff:g id="TIME">%1$s</xliff:g> ijae chaji"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ijae chaji"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Inaboresha muda wa kutumia betri"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Haijulikani"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Inachaji"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Inachaji pole pole"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Haichaji"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Haiwezi kuchaji kwa sasa"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Imejaa"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Imedhibitiwa na msimamizi"</string>
<string name="disabled" msgid="8017887509554714950">"Imezimwa"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Imeruhusiwa"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Muda kidogo."</string>
<string name="cancel" msgid="5665114069455378395">"Ghairi"</string>
<string name="okay" msgid="949938843324579502">"Sawa"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Kengele na vikumbusho"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Ruhusu ili uweke kengele au vikumbusho"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Kengele na vikumbusho"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Ruhusu programu hii iweke kengele au matukio mengine yanayolenga muda. Hatua hii itaruhusu programu ifunguke na ifanye kazi hata wakati hutumii kifaa. Kumbuka kuwa hatua ya kubatilisha ruhusa hii inaweza kusababisha programu isifanye kazi ipasavyo, hasa kengele zozote zilizowekwa na programu hazitafanya kazi tena."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ratiba, kengele, kikumbusho, tukio"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Washa"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Washa kipengele cha Usinisumbue"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Kamwe usiwashe"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Weka ufunguo"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Badili utumie <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Inaweka mtumiaji mpya…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Jina wakilishi"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Ongeza mgeni"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Ondoa mgeni"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index e68188f..535bbf2 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும் (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"சாதனம் விரைவில் ஆஃப் ஆகக்கூடும் (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"முழு சார்ஜாக <xliff:g id="TIME">%1$s</xliff:g> ஆகும்"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">%2$s</xliff:g> ஆகும்"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - பேட்டரியின் ஆயுளை மேம்படுத்துகிறது"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"அறியப்படாத"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"சார்ஜ் ஆகிறது"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"மெதுவாக சார்ஜாகிறது"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"சார்ஜ் செய்யப்படவில்லை"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"செருகப்பட்டது, ஆனால் இப்போது சார்ஜ் செய்ய முடியவில்லை"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"முழுவதும் சார்ஜ் ஆனது"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
<string name="disabled" msgid="8017887509554714950">"முடக்கப்பட்டது"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"அனுமதிக்கப்பட்டது"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"நேரத்தைக் குறைக்கும்."</string>
<string name="cancel" msgid="5665114069455378395">"ரத்துசெய்"</string>
<string name="okay" msgid="949938843324579502">"சரி"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"அலாரங்களும் நினைவூட்டல்களும்"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"அலாரங்களையோ நினைவூட்டல்களையோ அமைக்க அனுமதித்தல்"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"அலாரங்களும் நினைவூட்டல்களும்"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"அலாரங்களையோ பிற நேரம் சார்ந்த நிகழ்வுகளையோ திட்டமிட இந்த ஆப்ஸை அனுமதிக்கும். சாதனத்தைப் பயன்படுத்தாதபோதும், ஆப்ஸ் தொடங்கவும் இயங்கவும் இது அனுமதிக்கும். கவனத்திற்கு: இந்த அனுமதியைத் திரும்பப்பெற்றால் ஆப்ஸ் செயலிழக்கக்கூடும். குறிப்பாக, ஆப்ஸ் திட்டமிட்டுள்ள அலாரங்கள் எதுவும் இனி இயங்காது."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"திட்ட அட்டவணை, அலாரம், நினைவூட்டல், நிகழ்வு"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ஆன் செய்"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"தொந்தரவு செய்ய வேண்டாம் என்பதை ஆன் செய்யும்"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ஒருபோதும் வேண்டாம்"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"பூட்டை அமை"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>க்கு மாறு"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"புதிய பயனரை உருவாக்குகிறது…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"புனைப்பெயர்"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"கெஸ்ட்டைச் சேர்"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index e00d5b5..31f7519 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"టాబ్లెట్ త్వరలో షట్డౌన్ కావచ్చు (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"పరికరం త్వరలో షట్డౌన్ కావచ్చు (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"ఛార్జ్ అవ్వడానికి <xliff:g id="TIME">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - ఛార్జ్ అవ్వడానికి <xliff:g id="TIME">%2$s</xliff:g> పడుతుంది"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - బ్యాటరీ జీవితకాలాన్ని పెంచడం కోసం ఆప్టిమైజ్ చేస్తోంది"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"తెలియదు"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"ఛార్జ్ అవుతోంది"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"నెమ్మదిగా ఛార్జింగ్"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ఛార్జ్ కావడం లేదు"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"ప్లగ్ ఇన్ చేయబడింది, ప్రస్తుతం ఛార్జ్ చేయడం సాధ్యం కాదు"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"నిండింది"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"నిర్వాహకుని ద్వారా నియంత్రించబడింది"</string>
<string name="disabled" msgid="8017887509554714950">"నిలిపివేయబడింది"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"అనుమతించినవి"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"తక్కువ సమయం."</string>
<string name="cancel" msgid="5665114069455378395">"రద్దు చేయి"</string>
<string name="okay" msgid="949938843324579502">"సరే"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"అలారాలు, రిమైండర్లు"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"అలారాలు లేదా రిమైండర్లను సెట్ చేయడానికి అనుమతించు"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"అలారాలు, రిమైండర్లు"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"అలారాలు లేదా ఇతర సమయ ఆధారిత ఈవెంట్లను షెడ్యూల్ చేయడానికి ఈ యాప్ను అనుమతించండి. మీరు పరికరాన్ని ఉపయోగించనప్పుడు కూడా యాప్ మేల్కొలపడానికి అలాగే అమలు చేయడానికి ఇది అనుమతిస్తుంది. ఈ అనుమతిని ఉపసంహరించుకోవడం యాప్ పనిచేయకపోవటానికి కారణమవుతుందని గమనించండి, ప్రత్యేకంగా యాప్ షెడ్యూల్ చేసిన ఏవైనా అలారాలు ఇకపై పనిచేయవు."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"షెడ్యూల్, అలారం, రిమైండర్, ఈవెంట్"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ఆన్ చేయండి"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"అంతరాయం కలిగించవద్దును ఆన్ చేయండి"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ఎప్పటికీ వద్దు"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"లాక్ను సెట్ చేయి"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>కు మార్చు"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"కొత్త యూజర్ను క్రియేట్ చేస్తోంది…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"మారుపేరు"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"గెస్ట్ను జోడించండి"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"అతిథిని తీసివేయండి"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 3e1c7bf..59ace4a 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"แท็บเล็ตอาจปิดเครื่องในไม่ช้า (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"อุปกรณ์อาจปิดเครื่องในไม่ช้า (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"เหลือ <xliff:g id="TIME">%1$s</xliff:g> จนกว่าจะชาร์จเต็ม"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> จนกว่าจะชาร์จ"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - กำลังเพิ่มประสิทธิภาพแบตเตอรี่"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"ไม่ทราบ"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"กำลังชาร์จ"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"กำลังชาร์จอย่างช้าๆ"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"ไม่ได้ชาร์จ"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"เสียบอยู่ ไม่สามารถชาร์จได้ในขณะนี้"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"เต็ม"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ผู้ดูแลระบบเป็นผู้ควบคุม"</string>
<string name="disabled" msgid="8017887509554714950">"ปิดอยู่"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"อนุญาต"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"ตั้งค่าล็อก"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"เปลี่ยนเป็น <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"กำลังสร้างผู้ใช้ใหม่…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"ชื่อเล่น"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"เพิ่มผู้เข้าร่วม"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้เข้าร่วมออก"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 27208ee..0c072ca 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Baka mag-shut down na ang tablet (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Baka mag-shut down na ang device (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> ang natitira bago matapos mag-charge"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> hanggang matapos mag-charge"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ino-optimize para sa tagal ng baterya"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Hindi Kilala"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Nagcha-charge"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Mabagal na charge"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Hindi nagcha-charge"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Nakasaksak, hindi makapag-charge sa ngayon"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Puno"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pinapamahalaan ng admin"</string>
<string name="disabled" msgid="8017887509554714950">"Naka-disable"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Pinapayagan"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Bawasan ang oras."</string>
<string name="cancel" msgid="5665114069455378395">"Kanselahin"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Mga alarm at paalala"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Payagang magtakda ng mga alarm o paalala"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Mga alarm at paalala"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Payagan ang app na ito na mag-iskedyul ng mga alarm o iba pang event na batay sa timing. Magbibigay-daan ito sa app na mag-wake at gumana kahit na hindi mo ginagamit ang device. Tandaang kapag binawi ang pahintulot na ito, posibleng hindi gumana nang maayos ang app, partikular dito, hindi na gagana ang anumang alarm na naiskedyul ng app."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"iskedyul, alarm, paalala, event"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"I-on"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"I-on ang Huwag Istorbohin"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Hindi kailanman"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Itakda ang lock"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Lumipat sa <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Gumagawa ng bagong user…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Magdagdag ng bisita"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Alisin ang bisita"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 9c8b245..fc9bd9e 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tablet kısa süre içinde kapanabilir(<xliff:g id="LEVEL">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Cihaz kısa süre içinde kapanabilir (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Şarj olmaya <xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - şarj olmaya <xliff:g id="TIME">%2$s</xliff:g> kaldı"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Pil sağlığı için optimize ediliyor"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Bilinmiyor"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Şarj oluyor"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Yavaş şarj oluyor"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Şarj olmuyor"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Prize takıldı, şu anda şarj olamıyor"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Dolu"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Yönetici tarafından denetleniyor"</string>
<string name="disabled" msgid="8017887509554714950">"Devre dışı"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İzin verildi"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Daha kısa süre."</string>
<string name="cancel" msgid="5665114069455378395">"İptal"</string>
<string name="okay" msgid="949938843324579502">"Tamam"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Alarmlar ve hatırlatıcılar"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Alarm veya hatırlatıcı kurmaya izin ver"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Alarmlar ve hatırlatıcılar"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Bu uygulamanın alarm veya başka zaman bazlı etkinlikleri kurmasına izin verin. Bu, cihazı kullanmadığınız zamanlarda bile uygulamanın uyanmasına ve çalışmasına izin verir. Bu iznin iptal edilmesinin uygulamanın düzgün çalışmasına engel olabileceğini ve özellikle uygulamanın kurmuş olduğu alarmların artık çalışmayacağını unutmayın."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"program, alarm, hatırlatıcı, etkinlik"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aç"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Rahatsız Etmeyin\'i açın"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Hiçbir zaman"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Kilidi ayarla"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> hesabına geç"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Yeni kullanıcı oluşturuluyor…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Takma ad"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Misafir ekle"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Misafir oturumunu kaldır"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index dc584c7..e08b515 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Планшет може невдовзі вимкнутися (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Пристрій може невдовзі вимкнутися (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> до повного заряду"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до повного заряду"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Оптимізація для збереження заряду акумулятора"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Невідомо"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Заряджається"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Повільне заряджання"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Не заряджається"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Підключено, не заряджається"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Акумулятор заряджено"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Керується адміністратором"</string>
<string name="disabled" msgid="8017887509554714950">"Вимкнено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозволено"</string>
@@ -503,16 +506,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Менше часу."</string>
<string name="cancel" msgid="5665114069455378395">"Скасувати"</string>
<string name="okay" msgid="949938843324579502">"ОК"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Будильники й нагадування"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Дозволити створювати будильники або нагадування"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Будильники й нагадування"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Увімкніть, щоб дозволити додатку планувати будильники або нагадування про інші події. Тоді він зможе виходити з режиму сну й запускатися, навіть якщо ви не користуєтеся пристроєм. Зверніть увагу: якщо відкликати цей дозвіл, додаток може не працювати належним чином, зокрема це стосується всіх запланованих у додатку будильників."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"запланувати, будильник, нагадування, подія"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Увімкнути"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Увімкнути режим \"Не турбувати\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ніколи"</string>
@@ -566,6 +564,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Налаштувати блокування"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Перейти до користувача <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Створення нового користувача…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Псевдонім"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Додати гостя"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Видалити гостя"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 78f78ac..0909efb 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"ٹیبلیٹ جلد ہی بند ہو سکتا ہے (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"آلہ جلد ہی بند ہو سکتا ہے (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"چارج ہونے میں <xliff:g id="TIME">%1$s</xliff:g> باقی"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> چارج ہونے تک"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - بیٹری کی صحت کیلئے بہتر بنایا جا رہا ہے"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"نامعلوم"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"چارج ہو رہا ہے"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"آہستہ چارج ہو رہا ہے"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"چارج نہیں ہو رہا ہے"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"پلگ ان ہے، ابھی چارج نہیں کر سکتے"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"مکمل"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"کنٹرول کردہ بذریعہ منتظم"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"اجازت ہے"</string>
@@ -564,6 +567,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"لاک سیٹ کریں"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g> پر سوئچ کریں"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"نیا صارف تخلیق کرنا…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"عرفی نام"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"مہمان کو شامل کریں"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 4bce4c1..f83fe1d 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Planshet tez orada oʻchib qolishi mumkin (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Qurilma tez orada oʻchib qolishi mumkin (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> ichida toʻladi"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> ichida toʻladi"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Batareya uchun optimizatsiya"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Noma’lum"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Quvvat olmoqda"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Sekin quvvat olmoqda"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Quvvat olmayapti"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Ulangan, lekin quvvat olmayapti"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"To‘la"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administrator tomonidan boshqariladi"</string>
<string name="disabled" msgid="8017887509554714950">"Yoqilmagan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Ruxsat berilgan"</string>
@@ -559,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Qulf o‘rnatish"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Bunga almashish: <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Yangi foydalanuvchi yaratilmoqda…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Nik"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Mehmon kiritish"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Mehmonni olib tashlash"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 4326270..ab415f9 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Máy tính bảng có thể sắp tắt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Thiết bị có thể sắp tắt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Còn <xliff:g id="TIME">%1$s</xliff:g> nữa là sạc đầy"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> nữa là sạc đầy"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> – Đang tối ưu hóa để cải thiện độ bền của pin"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Không xác định"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Đang sạc"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Đang sạc chậm"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Hiện không sạc"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Đã cắm nhưng không thể sạc ngay"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Đầy"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Do quản trị viên kiểm soát"</string>
<string name="disabled" msgid="8017887509554714950">"Đã tắt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Được phép"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Ít thời gian hơn."</string>
<string name="cancel" msgid="5665114069455378395">"Hủy"</string>
<string name="okay" msgid="949938843324579502">"OK"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Chuông báo và lời nhắc"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Cho phép đặt chuông báo hoặc lời nhắc"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Chuông báo và lời nhắc"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Cho phép ứng dụng này lên lịch chuông báo hoặc các sự kiện khác theo thời gian. Nhờ vậy, ứng dụng có thể bật và chạy ngay cả khi bạn không dùng thiết bị. Xin lưu ý rằng việc thu hồi quyền này có thể khiến ứng dụng gặp trục trặc, cụ thể là mọi chuông báo mà ứng dụng đã lên lịch sẽ không hoạt động nữa."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"lịch biểu, chuông báo, lời nhắc, sự kiện"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bật"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Bật chế độ Không làm phiền"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Không bao giờ"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Thiết lập khóa"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Chuyển sang <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Đang tạo người dùng mới…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Biệt hiệu"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Thêm khách"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Xóa phiên khách"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 0933556..2d95ab1 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"平板电脑可能即将关机 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"设备可能即将关机 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"还剩 <xliff:g id="TIME">%1$s</xliff:g>充满电"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>后充满电"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - 正在针对电池状况进行优化"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"正在充电"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"正在慢速充电"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"未在充电"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"已插入电源,但是现在无法充电"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"电量充足"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"由管理员控制"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允许"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"减少时间。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
<string name="okay" msgid="949938843324579502">"确定"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"闹钟和提醒"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"允许设置闹钟或提醒"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"闹钟和提醒"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"允许该应用设置闹钟或其他在指定时间发生的活动。这样一来,即使您并未使用设备,该应用仍会唤醒并运行。请注意,撤消此权限可能会导致该应用出现故障,特别是该应用设置的所有闹钟都将不再生效。"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"设置, 闹钟, 提醒, 活动, schedule, alarm, reminder, event"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"开启"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"开启勿扰模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"设置屏幕锁定方式"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"切换到<xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"正在创建新用户…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"昵称"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"添加访客"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"移除访客"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 60c951f..3314f82 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"平板電腦可能即將關機 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"裝置可能即將關機 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"還需 <xliff:g id="TIME">%1$s</xliff:g>才能充滿電"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - 還需 <xliff:g id="TIME">%2$s</xliff:g>才能充滿電"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - 優化電池效能"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"正在慢速充電"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"非充電中"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"已連接電源插頭,但目前無法充電"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"電量已滿"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"減少時間。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
<string name="okay" msgid="949938843324579502">"確定"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"鬧鐘和提醒"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"允許設定鬧鐘或提醒"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"鬧鐘和提醒"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"允許此應用程式安排鬧鐘或其他有時限的活動。執行此操作後,即使您沒有使用裝置,應用程式仍可啟動並執行。請注意,撤消此權限可能會導致應用程式無法運作,尤其是應用程式設定的所有鬧鐘都將不會響鈴。"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"日程表, 鬧鐘, 提醒, 活動"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「請勿騷擾」模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"設定上鎖畫面"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"切換至<xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"正在建立新使用者…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"暱稱"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 11d5992..95eae87 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"平板電腦可能即將關機 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"裝置可能即將關機 (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g>後充飽電"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>後充飽電"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - 最佳化調整電池狀態"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"不明"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"慢速充電中"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"非充電中"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"已接上電源,但現在無法充電"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"電力充足"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"減少時間。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
<string name="okay" msgid="949938843324579502">"確定"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"鬧鐘與提醒"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"允許設定鬧鐘或提醒"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"鬧鐘與提醒"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"允許這個應用程式安排鬧鐘或其他有時限的活動。如此一來,即使你並未使用裝置,應用程式仍可啟動並執行。請注意,如果撤銷這項權限,可能會導致應用程式無法運作,尤其是應用程式設定的所有鬧鐘都將不會響鈴。"</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"時間表, 鬧鐘, 提醒, 活動"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「零打擾」模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"設定鎖定"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"切換至<xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"正在建立新使用者…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"暱稱"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 441a299..f5322a1 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -450,8 +450,10 @@
<string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Ithebulethi ingacisha maduze (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Idivayisi ingacisha maduze (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> esele ize ishaje"</string>
- <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ize igcwale"</string>
+ <!-- no translation found for power_remaining_charging_duration_only (8085099012811384899) -->
+ <skip />
+ <!-- no translation found for power_charging_duration (6127154952524919719) -->
+ <skip />
<string name="power_charging_limited" msgid="1956874810658999681">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ilungiselela impilo yebhethri"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Akwaziwa"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Iyashaja"</string>
@@ -459,7 +461,8 @@
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Ishaja kancane"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Ayishaji"</string>
<string name="battery_info_status_not_charging" msgid="8330015078868707899">"Kuxhunyiwe, ayikwazi ukushaja khona manje"</string>
- <string name="battery_info_status_full" msgid="4443168946046847468">"Kugcwele"</string>
+ <!-- no translation found for battery_info_status_full (1339002294876531312) -->
+ <skip />
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kulawulwa umqondisi"</string>
<string name="disabled" msgid="8017887509554714950">"Akusebenzi"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Kuvumelekile"</string>
@@ -501,16 +504,11 @@
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Isikhathi esincane."</string>
<string name="cancel" msgid="5665114069455378395">"Khansela"</string>
<string name="okay" msgid="949938843324579502">"KULUNGILE"</string>
- <!-- no translation found for alarms_and_reminders_label (6918395649731424294) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_switch_title (186992351401152744) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_title (2988400785896875237) -->
- <skip />
- <!-- no translation found for alarms_and_reminders_footer_title (5882788882647778753) -->
- <skip />
- <!-- no translation found for keywords_alarms_and_reminders (8882739572152019456) -->
- <skip />
+ <string name="alarms_and_reminders_label" msgid="6918395649731424294">"Ama-alamu nezikhumbuzi"</string>
+ <string name="alarms_and_reminders_switch_title" msgid="186992351401152744">"Vumela ukusetha ama-alamu noma izikhumbuzi"</string>
+ <string name="alarms_and_reminders_title" msgid="2988400785896875237">"Ama-alamu nezikhumbuzi"</string>
+ <string name="alarms_and_reminders_footer_title" msgid="5882788882647778753">"Vumela le-app ukuthi ihlele ama-alamu noma eminye imicimbi esuselwe esikhathini. Lokhu kuzovumela i-app ukuthi ivuke futhi isebenze lapho ungasebenzisi idivayisi. Qaphela ukuthi ukuhoxisa le mvume kungase kubangele ukuthi i-app ingasebenzi kahle, ngokuqondile noma yimaphi ama-alamu lawo i-app yakho ewahlelile ngeke esasebenza."</string>
+ <string name="keywords_alarms_and_reminders" msgid="8882739572152019456">"ishejuli, i-alamu, isikhumbuzi, umcimbi"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vula"</string>
<string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vula ukungaphazamisi"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Soze"</string>
@@ -564,6 +562,8 @@
<string name="user_set_lock_button" msgid="1427128184982594856">"Setha ukukhiya"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Shintshela ku-<xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Idala umsebenzisi omusha…"</string>
+ <!-- no translation found for add_user_failed (4809887794313944872) -->
+ <skip />
<string name="user_nickname" msgid="262624187455825083">"Isiteketiso"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Engeza isivakashi"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Susa isihambeli"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index c6472de..bcc22f6 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1405,6 +1405,8 @@
<string name="user_switch_to_user">Switch to <xliff:g id="user_name" example="John Doe">%s</xliff:g></string>
<!-- Dialog message when creating a new user [CHAR LIMIT=40] -->
<string name="creating_new_user_dialog_message">Creating new user…</string>
+ <!-- Text shown to notify that the creation of new user has failed. [CHAR LIMIT=40] -->
+ <string name="add_user_failed">Failed to create a new user</string>
<!-- Title for the preference to enter the nickname of the user to display in the user switcher [CHAR LIMIT=25]-->
<string name="user_nickname">Nickname</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 41ccb16..8f7006e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -26,7 +26,6 @@
import android.net.NetworkRequest;
import android.net.NetworkScoreManager;
import android.net.ScoredNetwork;
-import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
@@ -81,6 +80,9 @@
@Override
public void onCapabilitiesChanged(
Network network, NetworkCapabilities networkCapabilities) {
+ if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) {
+ return;
+ }
if (!mNetworks.contains(network.getNetId())) {
// New network
boolean isVcnOverWifi =
@@ -115,6 +117,9 @@
@Override
public void onLost(Network network) {
+ if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) {
+ return;
+ }
String log = new StringBuilder()
.append(SSDF.format(System.currentTimeMillis())).append(",")
.append("onLost: ")
@@ -346,14 +351,6 @@
if (ssid != null && !WifiManager.UNKNOWN_SSID.equals(ssid)) {
return ssid;
}
- // OK, it's not in the connectionInfo; we have to go hunting for it
- List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
- int length = networks.size();
- for (int i = 0; i < length; i++) {
- if (networks.get(i).networkId == info.getNetworkId()) {
- return networks.get(i).SSID;
- }
- }
return null;
}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 4751095..4ff3c55 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -449,12 +449,21 @@
<!-- Permission required for CTS test - ResourceObserverNativeTest -->
<uses-permission android:name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" />
+ <!-- Permission required for CTS test - CtsPermission5TestCases -->
+ <uses-permission android:name="android.permission.RENOUNCE_PERMISSIONS" />
+
<!-- Permission required for CTS test - android.widget.cts.ToastTest -->
<uses-permission android:name="android.permission.UNLIMITED_TOASTS" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<uses-permission android:name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
+ <!-- Permission required for CTS test - SystemMediaRouter2Test -->
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
+
+ <!-- Permission required for CTS test - CtsRotationResolverServiceDeviceTestCases -->
+ <uses-permission android:name="android.permission.MANAGE_ROTATION_RESOLVER" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml
index ade92db..b975521 100644
--- a/packages/Shell/res/values-iw/strings.xml
+++ b/packages/Shell/res/values-iw/strings.xml
@@ -19,25 +19,25 @@
<string name="app_label" msgid="3701846017049540910">"מעטפת"</string>
<string name="bugreport_notification_channel" msgid="2574150205913861141">"דוחות על באגים"</string>
<string name="bugreport_in_progress_title" msgid="4311705936714972757">"בתהליך יצירה של דוח על באג (<xliff:g id="ID">#%d</xliff:g>)"</string>
- <string name="bugreport_finished_title" msgid="4429132808670114081">"הדוח על הבאג <xliff:g id="ID">#%d</xliff:g> צולם"</string>
+ <string name="bugreport_finished_title" msgid="4429132808670114081">"הדוח על הבאג (<xliff:g id="ID">#%d</xliff:g>) צולם"</string>
<string name="bugreport_updating_title" msgid="4423539949559634214">"בתהליך הוספת פרטים לדוח על הבאג"</string>
- <string name="bugreport_updating_wait" msgid="3322151947853929470">"המתן…"</string>
+ <string name="bugreport_updating_wait" msgid="3322151947853929470">"רק רגע…"</string>
<string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"הדוח על הבאג יופיע בטלפון בקרוב"</string>
<string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"יש להקיש כדי לשתף את הדוח על הבאג"</string>
- <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"הקש כדי לשתף את הדוח על הבאג"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"החלק ימינה כדי לשתף את הדוח על הבאג ללא צילום מסך או המתן להשלמת צילום המסך"</string>
+ <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"יש להקיש כדי לשתף את הדוח על הבאג"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"אפשר להחליק ימינה כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך"</string>
<string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך"</string>
<string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך"</string>
<string name="bugreport_confirm" msgid="5917407234515812495">"דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). כדאי לשתף דוחות על באגים רק עם אפליקציות ואנשים מהימנים."</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"אל תציגו זאת שוב"</string>
- <string name="bugreport_storage_title" msgid="5332488144740527109">"דוחות באגים"</string>
+ <string name="bugreport_storage_title" msgid="5332488144740527109">"דוחות על באגים"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"לא ניתן היה לקרוא את קובץ הדוח על הבאג"</string>
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"לא ניתן היה להוסיף את פרטי הדוח על הבאג לקובץ ה-zip"</string>
<string name="bugreport_unnamed" msgid="2800582406842092709">"ללא שם"</string>
<string name="bugreport_info_action" msgid="2158204228510576227">"פרטים"</string>
<string name="bugreport_screenshot_action" msgid="8677781721940614995">"צילום מסך"</string>
<string name="bugreport_screenshot_taken" msgid="5684211273096253120">"צילום המסך בוצע בהצלחה."</string>
- <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"לא ניתן היה לצלם מסך."</string>
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"לא ניתן היה לצלם את המסך."</string>
<string name="bugreport_info_dialog_title" msgid="1355948594292983332">"פרטי הדוח על הבאג (<xliff:g id="ID">#%d</xliff:g>)"</string>
<string name="bugreport_info_name" msgid="4414036021935139527">"שם קובץ"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"כותרת הבאג"</string>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 9f6ef96..42d7e58 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -679,7 +679,7 @@
<activity
android:name=".settings.brightness.BrightnessDialog"
android:label="@string/quick_settings_brightness_dialog_title"
- android:theme="@*android:style/Theme.DeviceDefault.QuickSettings.Dialog"
+ android:theme="@*android:style/Theme.DeviceDefault.SystemUI.Dialog"
android:finishOnCloseSystemDialogs="true"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
@@ -762,6 +762,17 @@
android:visibleToInstantApps="true">
</activity>
+ <activity android:name=".wallet.ui.WalletActivity"
+ android:label="@string/wallet_title"
+ android:theme="@style/Wallet.Theme"
+ android:excludeFromRecents="true"
+ android:showWhenLocked="true"
+ android:showForAllUsers="true"
+ android:launchMode="singleInstance"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
+ android:visibleToInstantApps="true">
+ </activity>
+
<receiver android:name=".controls.management.ControlsRequestReceiver"
android:exported="true">
<intent-filter>
diff --git a/packages/SystemUI/docs/falsing.md b/packages/SystemUI/docs/falsing.md
index e224ca8..09215ac 100644
--- a/packages/SystemUI/docs/falsing.md
+++ b/packages/SystemUI/docs/falsing.md
@@ -143,10 +143,10 @@
will update its belief in pocket dialing based only on the last call made, so multiple calls per
gesture are not well defined.
-The `FalsingManager` does not update its belief in pocket-dialing until a new
-gesture starts. That is to say, if the owner makes a bad tap on your feature,
-the belief in pocket dialing will not incorporate this new data until the
-following gesture begins.
+The `FalsingManager` does not update its belief in pocket-dialing until after a gesture completes.
+That is to say, if the owner makes a bad tap on your feature, the "belief" in pocket dialing will
+not incorporate this new data after processing on the final `ACTION_UP` or `ACTION_CANCEL` event
+occurs.
If you expect a mix of taps, double taps, and swipes on your feature, segment them
accordingly. Figure out which `FalsingManager` method you need to call first, rather than relying
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java
index 9dd0811..cfe3be0 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java
@@ -14,6 +14,8 @@
package com.android.systemui.plugins.qs;
+import android.content.Context;
+
import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.annotations.DependsOn;
import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -28,9 +30,18 @@
public interface QSFactory extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_QS_FACTORY";
- int VERSION = 1;
+ int VERSION = 2;
QSTile createTile(String tileSpec);
- QSTileView createTileView(QSTile tile, boolean collapsedView);
+
+ /**
+ * Create a view for a tile.
+ *
+ * @param context a themed context for inflating the view
+ * @param tile the tile for which the view is created
+ * @param collapsedView {@code true} if the view will live in QQS and {@code false} otherwise.
+ * @return a view for the tile
+ */
+ QSTileView createTileView(Context context, QSTile tile, boolean collapsedView);
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index 26cead2..c9f2401 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -143,6 +143,7 @@
public SlashState slash;
public boolean handlesLongClick = true;
public boolean showRippleEffect = true;
+ public Drawable sideViewDrawable;
public boolean copyTo(State other) {
if (other == null) throw new IllegalArgumentException();
@@ -163,7 +164,8 @@
|| !Objects.equals(other.dualTarget, dualTarget)
|| !Objects.equals(other.slash, slash)
|| !Objects.equals(other.handlesLongClick, handlesLongClick)
- || !Objects.equals(other.showRippleEffect, showRippleEffect);
+ || !Objects.equals(other.showRippleEffect, showRippleEffect)
+ || !Objects.equals(other.sideViewDrawable, sideViewDrawable);
other.icon = icon;
other.iconSupplier = iconSupplier;
other.label = label;
@@ -179,6 +181,7 @@
other.slash = slash != null ? slash.copy() : null;
other.handlesLongClick = handlesLongClick;
other.showRippleEffect = showRippleEffect;
+ other.sideViewDrawable = sideViewDrawable;
return changed;
}
@@ -204,6 +207,7 @@
sb.append(",isTransient=").append(isTransient);
sb.append(",state=").append(state);
sb.append(",slash=\"").append(slash).append("\"");
+ sb.append(",sideViewDrawable").append(sideViewDrawable);
return sb.append(']');
}
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 773e4ef..6ba6997 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -22,12 +22,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="514691256816366517">"מגן מקלדת"</string>
<string name="keyguard_password_enter_pin_code" msgid="8582296866585566671">"יש להזין את קוד האימות"</string>
- <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"הזן את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן הזן קוד גישה חדש"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"יש להזין את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן את קוד האימות חדש"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="3529260761374385243">"קוד PUK של כרטיס SIM"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="2304037870481240781">"קוד אימות חדש לכרטיס ה-SIM"</string>
- <string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"גע כדי להזין את הסיסמה"</font></string>
- <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"הזן סיסמה לביטול הנעילה"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"הזן את קוד הגישה לביטול הנעילה"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"צריך לגעת כדי להקליד את הסיסמה"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"יש להזין סיסמה לביטול הנעילה"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"יש להזין את קוד האימות לביטול הנעילה"</string>
<string name="keyguard_enter_your_pin" msgid="5429932527814874032">"צריך להזין קוד אימות"</string>
<string name="keyguard_enter_your_pattern" msgid="351503370332324745">"יש להזין קו ביטול נעילה"</string>
<string name="keyguard_enter_your_password" msgid="7225626204122735501">"יש להזין סיסמה"</string>
@@ -39,21 +39,21 @@
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה מהירה"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה איטית"</string>
<string name="keyguard_plugged_in_charging_limited" msgid="1158086783302116604">"<xliff:g id="PERCENTAGE">%s</xliff:g> • מופעלת אופטימיזציה לשמירה על תקינות הסוללה"</string>
- <string name="keyguard_low_battery" msgid="1868012396800230904">"חבר את המטען."</string>
- <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"לחץ על \'תפריט\' כדי לבטל את הנעילה."</string>
+ <string name="keyguard_low_battery" msgid="1868012396800230904">"כדאי לחבר את המטען."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"יש ללחוץ על \'תפריט\' כדי לבטל את הנעילה."</string>
<string name="keyguard_network_locked_message" msgid="407096292844868608">"הרשת נעולה"</string>
<string name="keyguard_missing_sim_message_short" msgid="704159478161444907">"אין כרטיס SIM"</string>
<string name="keyguard_missing_sim_instructions" msgid="1162120926141335918">"יש להכניס כרטיס SIM."</string>
- <string name="keyguard_missing_sim_instructions_long" msgid="2712623293749378570">"כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. הכנס כרטיס SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="2712623293749378570">"כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. יש להכניס כרטיס SIM."</string>
<string name="keyguard_permanent_disabled_sim_message_short" msgid="5842745213110966962">"לא ניתן להשתמש בכרטיס SIM זה."</string>
- <string name="keyguard_permanent_disabled_sim_instructions" msgid="2490584154727897806">"כרטיס ה-SIM שלך הושבת לצמיתות.\nפנה לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="2490584154727897806">"כרטיס ה-SIM שלך הושבת באופן סופי.\nיש לפנות לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר."</string>
<string name="keyguard_sim_locked_message" msgid="4343544458476911044">"כרטיס ה-SIM נעול."</string>
<string name="keyguard_sim_puk_locked_message" msgid="6253830777745450550">"כרטיס ה-SIM נעול באמצעות PUK."</string>
- <string name="keyguard_sim_unlock_progress_dialog_message" msgid="2394023844117630429">"מבטל את הנעילה של כרטיס ה-SIM…"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="2394023844117630429">"בתהליך ביטול נעילה של כרטיס ה-SIM…"</string>
<string name="keyguard_accessibility_pin_area" msgid="7403009340414014734">"אזור של קוד האימות"</string>
- <string name="keyguard_accessibility_password" msgid="3524161948484801450">"סיסמת מכשיר"</string>
- <string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"אזור לקוד הגישה של כרטיס ה-SIM"</string>
- <string name="keyguard_accessibility_sim_puk_area" msgid="5537294043180237374">"אזור לקוד הגישה של כרטיס ה-SIM"</string>
+ <string name="keyguard_accessibility_password" msgid="3524161948484801450">"סיסמת המכשיר"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"אזור לקוד האימות של כרטיס ה-SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="5537294043180237374">"האזור של קוד האימות של כרטיס ה-SIM"</string>
<string name="keyguard_accessibility_next_alarm" msgid="4492876946798984630">"ההתראה הבאה נקבעה ל-<xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="8489719929424895174">"Delete"</string>
<string name="disable_carrier_button_text" msgid="7153361131709275746">"השבתת ה-eSIM"</string>
@@ -70,25 +70,25 @@
<item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
<item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
</plurals>
- <string name="kg_pattern_instructions" msgid="5376036737065051736">"שרטט את קו ביטול הנעילה"</string>
- <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"הזן את קוד הגישה של כרטיס ה-SIM."</string>
+ <string name="kg_pattern_instructions" msgid="5376036737065051736">"צריך לשרטט את קו ביטול הנעילה"</string>
+ <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"יש להזין את קוד האימות של כרטיס ה-SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"יש להזין את קוד האימות של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string>
<string name="kg_pin_instructions" msgid="822353548385014361">"יש להזין קוד אימות"</string>
<string name="kg_password_instructions" msgid="324455062831719903">"צריך להזין את הסיסמה"</string>
<string name="kg_puk_enter_puk_hint" msgid="3005288372875367017">"כרטיס ה-SIM מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. יש לפנות אל הספק לקבלת פרטים."</string>
<string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"ה-SIM של \"<xliff:g id="CARRIER">%1$s</xliff:g>\" מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. לפרטים, יש לפנות אל הספק."</string>
- <string name="kg_puk_enter_pin_hint" msgid="6028432138916150399">"הזן את קוד הגישה הרצוי"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="6028432138916150399">"יש להזין את קוד האימות הרצוי"</string>
<string name="kg_enter_confirm_pin_hint" msgid="4261064020391799132">"צריך לאשר את קוד האימות הרצוי"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="4251352015304070326">"מתבצע ביטול נעילה של כרטיס ה-SIM…"</string>
- <string name="kg_invalid_sim_pin_hint" msgid="2762202646949552978">"הקלד קוד גישה שאורכו 4 עד 8 ספרות."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="2762202646949552978">"יש להקליד קוד אימות שאורכו 4 עד 8 ספרות."</string>
<string name="kg_invalid_sim_puk_hint" msgid="5319756880543857694">"קוד PUK צריך להיות בן 8 ספרות או יותר."</string>
<string name="kg_invalid_puk" msgid="1774337070084931186">"יש להזין את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי."</string>
<string name="kg_login_too_many_attempts" msgid="4519957179182578690">"ניסית לשרטט את קו ביטול הנעילה יותר מדי פעמים"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"הקלדת קוד גישה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nיש לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"קוד הגישה של כרטיס ה-SIM שגוי. צור קשר עם הספק כדי לבטל את נעילת המכשיר."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nאפשר לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nאפשר לנסות שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"קוד האימות של כרטיס ה-SIM שגוי. יש ליצור קשר עם הספק כדי לבטל את נעילת המכשיר."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026">
<item quantity="two">קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות.</item>
<item quantity="many">קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות.</item>
@@ -102,7 +102,7 @@
<item quantity="other">קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
<item quantity="one">קוד ה-PUK של כרטיס ה-SIM שגוי. נותר לך ניסיון <xliff:g id="NUMBER_0">%d</xliff:g> נוסף לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
</plurals>
- <string name="kg_password_pin_failed" msgid="5136259126330604009">"פעולת קוד הגישה של כרטיס ה-SIM נכשלה!"</string>
+ <string name="kg_password_pin_failed" msgid="5136259126330604009">"נכשלה פעולת קוד הגישה של כרטיס ה-SIM"</string>
<string name="kg_password_puk_failed" msgid="6778867411556937118">"הניסיון לביטול הנעילה של כרטיס ה-SIM באמצעות קוד PUK נכשל!"</string>
<string name="kg_pin_accepted" msgid="1625501841604389716">"הקוד התקבל!"</string>
<string name="keyguard_carrier_default" msgid="6359808469637388586">"אין שירות."</string>
@@ -112,12 +112,12 @@
<string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"צריך להזין קוד אימות לאחר הפעלה מחדש של המכשיר"</string>
<string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"יש להזין סיסמה לאחר הפעלה מחדש של המכשיר"</string>
<string name="kg_prompt_reason_timeout_pattern" msgid="9170360502528959889">"יש להזין את קו ביטול הנעילה כדי להגביר את רמת האבטחה"</string>
- <string name="kg_prompt_reason_timeout_pin" msgid="5945186097160029201">"יש להזין קוד גישה כדי להגביר את רמת האבטחה"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="5945186097160029201">"יש להזין קוד אימות כדי להגביר את רמת האבטחה"</string>
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"יש להזין סיסמה כדי להגביר את רמת האבטחה"</string>
<string name="kg_prompt_reason_switch_profiles_pattern" msgid="1922016914701991230">"יש להזין את קו ביטול הנעילה כשמחליפים בין פרופילים"</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="6490434826361055400">"צריך להזין את קוד האימות כשמחליפים פרופיל"</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="1680374696393804441">"יש להזין את הסיסמה בזמן מעבר בין פרופילים"</string>
- <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"מנהל המכשיר נעל את המכשיר"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"המנהל של המכשיר נהל אותו"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="1337428979661197957">
<item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. יש להזין את קו ביטול הנעילה.</item>
@@ -126,10 +126,10 @@
<item quantity="one">נעילת המכשיר לא בוטלה במשך שעה אחת (<xliff:g id="NUMBER_0">%d</xliff:g>). יש להזין את קו ביטול הנעילה.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="6444519502336330270">
- <item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קוד הגישה.</item>
- <item quantity="many">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קוד הגישה.</item>
- <item quantity="other">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קוד הגישה.</item>
- <item quantity="one">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_0">%d</xliff:g> שעה. הזן את קוד הגישה.</item>
+ <item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. יש להזין את קוד האימות.</item>
+ <item quantity="many">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. יש להזין את קוד האימות.</item>
+ <item quantity="other">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. יש להזין את קוד האימות.</item>
+ <item quantity="one">נעילת המכשיר לא בוטלה במשך שעה (<xliff:g id="NUMBER_0">%d</xliff:g>). יש להזין את קוד האימות.</item>
</plurals>
<plurals name="kg_prompt_reason_time_password" formatted="false" msgid="5343961527665116914">
<item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. יש להזין את הסיסמה.</item>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 3275921..ed1ea37 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -46,7 +46,7 @@
<string name="keyguard_missing_sim_instructions" msgid="1162120926141335918">"Plaats een simkaart."</string>
<string name="keyguard_missing_sim_instructions_long" msgid="2712623293749378570">"De simkaart ontbreekt of kan niet worden gelezen. Plaats een simkaart."</string>
<string name="keyguard_permanent_disabled_sim_message_short" msgid="5842745213110966962">"Onbruikbare simkaart."</string>
- <string name="keyguard_permanent_disabled_sim_instructions" msgid="2490584154727897806">"Je simkaart is definitief uitgeschakeld.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="2490584154727897806">"Je simkaart is definitief uitgezet.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart."</string>
<string name="keyguard_sim_locked_message" msgid="4343544458476911044">"Simkaart is vergrendeld."</string>
<string name="keyguard_sim_puk_locked_message" msgid="6253830777745450550">"Simkaart is vergrendeld met pukcode."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="2394023844117630429">"Simkaart ontgrendelen…"</string>
@@ -71,11 +71,11 @@
<string name="kg_pattern_instructions" msgid="5376036737065051736">"Teken je patroon"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Geef de pincode van de simkaart op."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string>
- <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zet de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string>
<string name="kg_pin_instructions" msgid="822353548385014361">"Geef je pincode op"</string>
<string name="kg_password_instructions" msgid="324455062831719903">"Geef je wachtwoord op"</string>
- <string name="kg_puk_enter_puk_hint" msgid="3005288372875367017">"De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
- <string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"Simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met je provider voor meer informatie."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="3005288372875367017">"De simkaart is nu uitgezet. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"Simkaart van <xliff:g id="CARRIER">%1$s</xliff:g> is nu uitgezet. Geef de pukcode op om door te gaan. Neem contact op met je provider voor meer informatie."</string>
<string name="kg_puk_enter_pin_hint" msgid="6028432138916150399">"Geef de gewenste pincode op"</string>
<string name="kg_enter_confirm_pin_hint" msgid="4261064020391799132">"Gewenste pincode bevestigen"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="4251352015304070326">"Simkaart ontgrendelen…"</string>
@@ -132,8 +132,8 @@
<item quantity="one">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om het apparaat te ontgrendelen.</item>
</plurals>
<plurals name="kg_password_default_puk_message" formatted="false" msgid="571308542462946935">
- <item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
- <item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
+ <item quantity="other">De simkaart is nu uitgezet. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
+ <item quantity="one">De simkaart is nu uitgezet. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
</plurals>
<string name="clock_title_default" msgid="6342735240617459864">"Standaard"</string>
<string name="clock_title_bubble" msgid="2204559396790593213">"Bel"</string>
diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml
index 4026dac..a5c7aaa 100644
--- a/packages/SystemUI/res-product/values-iw/strings.xml
+++ b/packages/SystemUI/res-product/values-iw/strings.xml
@@ -21,18 +21,18 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="dock_alignment_slow_charging" product="default" msgid="6997633396534416792">"צריך ליישר את הטלפון כדי לטעון אותו במהירות"</string>
<string name="dock_alignment_not_charging" product="default" msgid="3980752926226749808">"צריך ליישר את הטלפון כדי לטעון אותו באופן אלחוטי"</string>
- <string name="inattentive_sleep_warning_message" product="tv" msgid="6844464574089665063">"מכשיר Android TV ייכבה בקרוב. יש ללחוץ על לחצן כלשהו כדי שהוא ימשיך לפעול."</string>
+ <string name="inattentive_sleep_warning_message" product="tv" msgid="6844464574089665063">"מכשיר ה-Android TV ייכבה בקרוב. יש ללחוץ על לחצן כלשהו כדי שהוא ימשיך לפעול."</string>
<string name="inattentive_sleep_warning_message" product="default" msgid="5693904520452332224">"המכשיר ייכבה בקרוב, יש ללחוץ כדי שהוא ימשיך לפעול."</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="5018086454277963787">"אין כרטיס SIM בטאבלט."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="7053347843877341391">"אין כרטיס SIM בטלפון."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"קודי האימות אינם תואמים"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"קודי האימות לא תואמים"</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטאבלט הזה יאופס וכל הנתונים שבו יימחקו."</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, טלפון זה יאופס וכל הנתונים שבו יימחקו."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטלפון הזה יאופס וכל הנתונים שבו יימחקו."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER">%d</xliff:g> פעמים. הטאבלט יאופס וכל הנתונים שלו יימחקו."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER">%d</xliff:g> פעמים. הטלפון יאופס וכל הנתונים שבו יימחקו."</string>
<string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="7325071812832605911">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."</string>
<string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."</string>
- <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER">%d</xliff:g> פעמים באופן שגוי. משתמש זה יוסר וכל נתוני המשתמש יימחקו."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER">%d</xliff:g> פעמים באופן שגוי. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."</string>
<string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER">%d</xliff:g> פעמים. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו."</string>
<string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"ניסית לבטל את נעילת הטאבלט <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."</string>
<string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."</string>
diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
index 45d8dc1..73b02f4 100644
--- a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
+++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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">
+<!--
+ ~ 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.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingMode="stack" >
<item android:id="@android:id/background"
- android:gravity="center_vertical|fill_horizontal">
- <shape android:shape="rectangle"
- android:tint="?android:attr/colorControlActivated">
- <size android:height="@dimen/seek_bar_height" />
- <solid android:color="@color/white_disabled" />
- <corners android:radius="@dimen/seek_bar_corner_radius" />
- </shape>
+ android:gravity="center_vertical|fill_horizontal">
+ <inset
+ android:insetLeft="@dimen/rounded_slider_track_inset"
+ android:insetRight="@dimen/rounded_slider_track_inset" >
+ <shape>
+ <size android:height="@dimen/rounded_slider_track_width" />
+ <corners android:radius="@dimen/rounded_slider_track_corner_radius" />
+ <solid android:color="?android:attr/textColorPrimary" />
+ </shape>
+ </inset>
</item>
<item android:id="@android:id/progress"
android:gravity="center_vertical|fill_horizontal">
- <scale android:scaleWidth="100%">
- <shape android:shape="rectangle"
- android:tint="?android:attr/colorControlActivated">
- <size android:height="@dimen/seek_bar_height" />
- <solid android:color="@android:color/white" />
- <corners android:radius="@dimen/seek_bar_corner_radius" />
- </shape>
- </scale>
+ <com.android.systemui.util.RoundedCornerProgressDrawable
+ android:drawable="@drawable/brightness_progress_full_drawable"
+ />
</item>
-</layer-list>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable_thick.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable_thick.xml
deleted file mode 100644
index 73b02f4..0000000
--- a/packages/SystemUI/res/drawable/brightness_progress_drawable_thick.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingMode="stack" >
- <item android:id="@android:id/background"
- android:gravity="center_vertical|fill_horizontal">
- <inset
- android:insetLeft="@dimen/rounded_slider_track_inset"
- android:insetRight="@dimen/rounded_slider_track_inset" >
- <shape>
- <size android:height="@dimen/rounded_slider_track_width" />
- <corners android:radius="@dimen/rounded_slider_track_corner_radius" />
- <solid android:color="?android:attr/textColorPrimary" />
- </shape>
- </inset>
- </item>
- <item android:id="@android:id/progress"
- android:gravity="center_vertical|fill_horizontal">
- <com.android.systemui.util.RoundedCornerProgressDrawable
- android:drawable="@drawable/brightness_progress_full_drawable"
- />
- </item>
-</layer-list>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
new file mode 100644
index 0000000..de4d882
--- /dev/null
+++ b/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <size
+ android:height="50dp"
+ android:width="50dp" />
+ <solid android:color="#1A73E8" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/global_actions_lite_background.xml b/packages/SystemUI/res/drawable/global_actions_lite_background.xml
new file mode 100644
index 0000000..3fdce76
--- /dev/null
+++ b/packages/SystemUI/res/drawable/global_actions_lite_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2021, 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.
+*/
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/global_actions_lite_background"/>
+ <corners android:radius="@dimen/global_actions_corner_radius" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/global_actions_lite_button.xml b/packages/SystemUI/res/drawable/global_actions_lite_button.xml
new file mode 100644
index 0000000..b0184e9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/global_actions_lite_button.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2021, 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.
+*/
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid android:color="@color/global_actions_lite_button_background"/>
+</shape>
diff --git a/packages/SystemUI/res/drawable/ic_fingerprint.xml b/packages/SystemUI/res/drawable/ic_fingerprint.xml
index e5f3360..91d72a7 100644
--- a/packages/SystemUI/res/drawable/ic_fingerprint.xml
+++ b/packages/SystemUI/res/drawable/ic_fingerprint.xml
@@ -15,45 +15,25 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="72dp"
+ android:height="72dp"
android:tint="?attr/wallpaperTextColor"
- android:alpha=".75"
- android:viewportHeight="32.0"
- android:viewportWidth="32.0">
+ android:viewportWidth="72"
+ android:viewportHeight="72">
<path
- android:fillColor="#ffffff"
- android:pathData="M23.7,5.9c-0.1,0.0 -0.2,0.0 -0.3,-0.1C21.0,4.5 18.6,3.9 16.0,3.9c-2.5,0.0
- -4.6,0.6 -6.9,1.9C8.8,6.0 8.3,5.9 8.1,5.5C7.9,5.2 8.0,4.7 8.4,4.5c2.5,-1.4 4.9,-2.1 7.7,
- -2.1c2.8,0.0 5.4,0.7 8.0,2.1c0.4,0.2 0.5,0.6 0.3,1.0C24.2,5.7 24.0,5.9 23.7,5.9z" />
- <path
- android:fillColor="#ffffff"
- android:pathData="M5.3,13.2c-0.1,0.0 -0.3,0.0 -0.4,-0.1c-0.3,-0.2 -0.4,-0.7 -0.2,-1.0c1.3,
- -1.9 2.9,-3.4 4.9,-4.5c4.1,-2.2 9.3,-2.2 13.4,0.0c1.9,1.1 3.6,2.5 4.9,4.4c0.2,0.3 0.1,0.8
- -0.2,1.0c-0.3,0.2 -0.8,0.1 -1.0,-0.2c-1.2,-1.7 -2.6,-3.0 -4.3,-4.0c-3.7,-2.0 -8.3,-2.0
- -12.0,0.0c-1.7,0.9 -3.2,2.3 -4.3,4.0C5.7,13.1 5.5,13.2 5.3,13.2z" />
- <path
- android:fillColor="#ffffff"
- android:pathData="M13.3,29.6c-0.2,0.0 -0.4,-0.1 -0.5,-0.2c-1.1,-1.2 -1.7,-2.0 -2.6,
- -3.6c-0.9,-1.7 -1.4,-3.7 -1.4,-5.9c0.0,-4.1 3.3,-7.4 7.4,-7.4c4.1,0.0 7.4,3.3 7.4,7.4c0.0,
- 0.4 -0.3,0.7 -0.7,0.7s-0.7,-0.3 -0.7,-0.7c0.0,-3.3 -2.7,-5.9 -5.9,-5.9c-3.3,0.0 -5.9,
- 2.7 -5.9,5.9c0.0,2.0 0.4,3.8 1.2,5.2c0.8,1.6 1.4,2.2 2.4,3.3c0.3,0.3 0.3,0.8 0.0,1.0
- C13.7,29.5 13.5,29.6 13.3,29.6z" />
- <path
- android:fillColor="#ffffff"
- android:pathData="M22.6,27.1c-1.6,0.0 -2.9,-0.4 -4.1,-1.2c-1.9,-1.4 -3.1,-3.6 -3.1,
- -6.0c0.0,-0.4 0.3,-0.7 0.7,-0.7s0.7,0.3 0.7,0.7c0.0,1.9 0.9,3.7 2.5,4.8c0.9,0.6 1.9,
- 1.0 3.2,1.0c0.3,0.0 0.8,0.0 1.3,-0.1c0.4,-0.1 0.8,0.2 0.8,0.6c0.1,0.4 -0.2,0.8 -0.6,
- 0.8C23.4,27.1 22.8,27.1 22.6,27.1z" />
- <path
- android:fillColor="#ffffff"
- android:pathData="M20.0,29.9c-0.1,0.0 -0.1,0.0 -0.2,0.0c-2.1,-0.6 -3.4,-1.4 -4.8,-2.9c-1.8,
- -1.9 -2.8,-4.4 -2.8,-7.1c0.0,-2.2 1.8,-4.1 4.1,-4.1c2.2,0.0 4.1,1.8 4.1,4.1c0.0,1.4 1.2,
- 2.6 2.6,2.6c1.4,0.0 2.6,-1.2 2.6,-2.6c0.0,-5.1 -4.2,-9.3 -9.3,-9.3c-3.6,0.0 -6.9,2.1 -8.4,
- 5.4C7.3,17.1 7.0,18.4 7.0,19.8c0.0,1.1 0.1,2.7 0.9,4.9c0.1,0.4 -0.1,0.8 -0.4,0.9c-0.4,
- 0.1 -0.8,-0.1 -0.9,-0.4c-0.6,-1.8 -0.9,-3.6 -0.9,-5.4c0.0,-1.6 0.3,-3.1 0.9,-4.4c1.7,
- -3.8 5.6,-6.3 9.8,-6.3c5.9,0.0 10.7,4.8 10.7,10.7c0.0,2.2 -1.8,4.1 -4.1,4.1s-4.0,
- -1.8 -4.0,-4.1c0.0,-1.4 -1.2,-2.6 -2.6,-2.6c-1.4,0.0 -2.6,1.2 -2.6,2.6c0.0,2.3 0.9,
- 4.5 2.4,6.1c1.2,1.3 2.4,2.0 4.2,2.5c0.4,0.1 0.6,0.5 0.5,0.9C20.6,29.7 20.3,29.9 20.0,
- 29.9z" />
+ android:pathData=
+ "M25.5,16.3283C28.47,14.8433 31.9167,14 35.5834,14C39.2501,14 42.6968,
+ 14.8433 45.6668,16.3283
+ M20,28.6669C22.7683,24.3402 28.7084,21.3335 35.5834,21.3335C42.4585,
+ 21.3335 48.3985,24.3402 51.1669,28.6669
+ M22.8607,47.0002C21.834,44.3235 21.834,41.5002 21.834,41.5002C21.834,
+ 34.4051 27.7374,28.6667 35.5841,28.6667C43.4308,28.6667 49.3341,34.4051 49.3341,41.5002
+ M49.3344,41.5003V42.0319C49.3344,44.7636 47.1161,47.0003 44.3661,47.0003C41.9461,
+ 47.0003 39.8744,45.2403 39.471,42.857L38.9577,39.7769C38.591,37.5953 36.7027,
+ 36.0002 34.5027,36.0002C26.5826,36.0002 29.846,49.1087 35.291,50.6487
+ M44.9713,54.6267C42.5513,56.7167 39.2879,58.0001 35.5846,58.0001C32.2296,
+ 58.0001 29.2229,56.9551 26.8945,55.195"
+ android:strokeWidth="3"
+ android:strokeColor="#ffffff"
+ android:strokeLineCap="round"/>
</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
index 7cb44b3..4165830 100644
--- a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
+++ b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
@@ -16,8 +16,5 @@
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
<solid android:color="?android:attr/colorBackgroundFloating"/>
- <corners
- android:topLeftRadius="?android:attr/dialogCornerRadius"
- android:topRightRadius="?android:attr/dialogCornerRadius" />
</shape>
</inset>
diff --git a/packages/SystemUI/res/drawable/rounded_corners.xml b/packages/SystemUI/res/drawable/rounded_corners.xml
new file mode 100644
index 0000000..a84f575
--- /dev/null
+++ b/packages/SystemUI/res/drawable/rounded_corners.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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
+ -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#202124"/>
+ <corners android:radius="10dp"/>
+</shape>
diff --git a/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml b/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml
index 1511659..48faeb2 100644
--- a/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml
@@ -14,11 +14,11 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="@dimen/signal_icon_size"
- android:height="@dimen/signal_icon_size"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:width="16dp"
+ android:height="16dp"
+ android:viewportWidth="16.0"
+ android:viewportHeight="16.0">
<path
android:fillColor="#FF000000"
- android:pathData="M14.21,12.81c0.36,-0.16 0.69,-0.36 0.97,-0.61c0.41,-0.38 0.72,-0.83 0.94,-1.37c0.21,-0.54 0.32,-1.14 0.32,-1.79c0,-0.92 -0.16,-1.7 -0.49,-2.33c-0.32,-0.64 -0.79,-1.12 -1.43,-1.45c-0.62,-0.33 -1.4,-0.49 -2.32,-0.49H8.23V19h1.8v-5.76h2.5L15.06,19h1.92v-0.12L14.21,12.81zM10.03,11.71V6.32h2.18c0.59,0 1.06,0.11 1.42,0.34c0.36,0.22 0.62,0.54 0.78,0.95c0.16,0.41 0.24,0.89 0.24,1.44c0,0.49 -0.09,0.93 -0.27,1.34c-0.18,0.4 -0.46,0.73 -0.82,0.97c-0.36,0.23 -0.82,0.35 -1.37,0.35H10.03z"/>
+ android:pathData="M4.5,13.02V3h3.93c0.97,0 1.75,0.27 2.34,0.81c0.6,0.53 0.9,1.28 0.9,2.25c0,0.63 -0.19,1.2 -0.56,1.74c-0.37,0.53 -0.95,0.91 -1.74,1.12l2.45,4.02v0.08h-1.69L7.75,9.09H6.03v3.93H4.5zM8.46,4.44H6.03v3.23h2.44c0.49,0 0.9,-0.14 1.2,-0.41c0.31,-0.28 0.46,-0.69 0.46,-1.22s-0.15,-0.93 -0.45,-1.2C9.38,4.58 8.98,4.44 8.46,4.44z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/wallet_button.xml b/packages/SystemUI/res/drawable/wallet_button.xml
new file mode 100644
index 0000000..bf7625f
--- /dev/null
+++ b/packages/SystemUI/res/drawable/wallet_button.xml
@@ -0,0 +1,27 @@
+<?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
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="rectangle">
+ <stroke
+ android:width="1dp"
+ android:color="@color/GM2_blue_600"/>
+ <solid android:color="@color/GM2_blue_600"/>
+ <corners android:radius="24dp"/>
+ </shape>
+ </item>
+</selector>
diff --git a/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml b/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml
new file mode 100644
index 0000000..f52889a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml
@@ -0,0 +1,33 @@
+<?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.
+ -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight">
+ <item android:id="@android:id/mask">
+ <shape android:shape="rectangle">
+ <solid android:color="#DADCE0" />
+ <corners android:radius="@dimen/wallet_empty_state_corner_radius" />
+ </shape>
+ </item>
+ <item>
+ <shape>
+ <stroke
+ android:width="1dp"
+ android:color="@color/GM2_grey_900" />
+ <corners android:radius="@dimen/wallet_empty_state_corner_radius" />
+ </shape>
+ </item>
+</ripple>
diff --git a/packages/SystemUI/res/layout-land/global_actions_column.xml b/packages/SystemUI/res/layout-land/global_actions_column.xml
index 98cb0d0..bd1acfc 100644
--- a/packages/SystemUI/res/layout-land/global_actions_column.xml
+++ b/packages/SystemUI/res/layout-land/global_actions_column.xml
@@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:orientation="horizontal"
android:clipToPadding="false"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:gravity="center_horizontal | top"
android:clipChildren="false"
>
diff --git a/packages/SystemUI/res/layout-land/global_actions_column_seascape.xml b/packages/SystemUI/res/layout-land/global_actions_column_seascape.xml
index 5e7604c..412beb7 100644
--- a/packages/SystemUI/res/layout-land/global_actions_column_seascape.xml
+++ b/packages/SystemUI/res/layout-land/global_actions_column_seascape.xml
@@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:orientation="horizontal"
android:clipToPadding="false"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:gravity="center_horizontal | bottom"
android:clipChildren="false"
>
diff --git a/packages/SystemUI/res/layout-land/global_actions_grid.xml b/packages/SystemUI/res/layout-land/global_actions_grid.xml
index 6a10812..da6235c 100644
--- a/packages/SystemUI/res/layout-land/global_actions_grid.xml
+++ b/packages/SystemUI/res/layout-land/global_actions_grid.xml
@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:gravity="right | center_vertical"
android:clipChildren="false"
android:clipToPadding="false"
diff --git a/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml b/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml
index 79c51d9..e52ad2a 100644
--- a/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml
+++ b/packages/SystemUI/res/layout-land/global_actions_grid_seascape.xml
@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:gravity="left | center_vertical"
android:clipChildren="false"
android:clipToPadding="false"
diff --git a/packages/SystemUI/res/layout/auth_biometric_contents.xml b/packages/SystemUI/res/layout/auth_biometric_contents.xml
index eef37ab..99e8116 100644
--- a/packages/SystemUI/res/layout/auth_biometric_contents.xml
+++ b/packages/SystemUI/res/layout/auth_biometric_contents.xml
@@ -44,7 +44,7 @@
<FrameLayout
android:id="@+id/biometric_icon_frame"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
@@ -80,7 +80,7 @@
android:layout_height="88dp"
style="?android:attr/buttonBarStyle"
android:orientation="horizontal"
- android:paddingTop="16dp">
+ android:paddingTop="24dp">
<Space android:id="@+id/leftSpacer"
android:layout_width="8dp"
diff --git a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml b/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
new file mode 100644
index 0000000..87affde
--- /dev/null
+++ b/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2021 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.
+ -->
+
+<com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <include layout="@layout/auth_biometric_contents"/>
+
+</com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/disabled_udfps_view.xml b/packages/SystemUI/res/layout/disabled_udfps_view.xml
index aab8661..13d3065 100644
--- a/packages/SystemUI/res/layout/disabled_udfps_view.xml
+++ b/packages/SystemUI/res/layout/disabled_udfps_view.xml
@@ -16,9 +16,7 @@
-->
<com.android.keyguard.DisabledUdfpsView
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/disabled_udfps_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/circle_white"
/>
diff --git a/packages/SystemUI/res/layout/global_actions_column.xml b/packages/SystemUI/res/layout/global_actions_column.xml
index b58146b..0f958a6 100644
--- a/packages/SystemUI/res/layout/global_actions_column.xml
+++ b/packages/SystemUI/res/layout/global_actions_column.xml
@@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:clipToPadding="false"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:gravity="center_vertical | right"
android:clipChildren="false"
>
diff --git a/packages/SystemUI/res/layout/global_actions_grid.xml b/packages/SystemUI/res/layout/global_actions_grid.xml
index 456553d..8c621b9 100644
--- a/packages/SystemUI/res/layout/global_actions_grid.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid.xml
@@ -23,7 +23,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
diff --git a/packages/SystemUI/res/layout/global_actions_grid_item_lite.xml b/packages/SystemUI/res/layout/global_actions_grid_item_lite.xml
new file mode 100644
index 0000000..9ab1ac8
--- /dev/null
+++ b/packages/SystemUI/res/layout/global_actions_grid_item_lite.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<com.android.systemui.globalactions.GlobalActionsItem
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:orientation="vertical"
+ android:stateListAnimator="@anim/control_state_list_animator">
+ <ImageView
+ android:id="@*android:id/icon"
+ android:layout_width="@dimen/global_actions_button_size"
+ android:layout_height="@dimen/global_actions_button_size"
+ android:layout_marginBottom="@dimen/global_actions_grid_container_bottom_margin"
+ android:padding="@dimen/global_actions_button_padding"
+ android:scaleType="centerInside"
+ android:tint="@color/global_actions_lite_text"
+ android:background="@drawable/global_actions_lite_button"/>
+ <TextView
+ android:id="@*android:id/message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:maxLines="2"
+ android:textSize="12sp"
+ android:gravity="center"
+ android:textColor="@color/global_actions_lite_text"
+ android:breakStrategy="high_quality"
+ android:hyphenationFrequency="full"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+</com.android.systemui.globalactions.GlobalActionsItem>
diff --git a/packages/SystemUI/res/layout/global_actions_grid_lite.xml b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
new file mode 100644
index 0000000..0df9800
--- /dev/null
+++ b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/global_actions_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:layout_gravity="center">
+ <com.android.systemui.globalactions.GlobalActionsLayoutLite
+ android:id="@id/global_actions_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:background="@drawable/global_actions_lite_background"
+ android:padding="@dimen/global_actions_lite_padding">
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@android:id/list"
+ android:gravity="center"
+ android:translationZ="@dimen/global_actions_translate"
+ android:orientation="horizontal"
+ android:layoutDirection="ltr">
+ <androidx.constraintlayout.helper.widget.Flow
+ android:id="@+id/list_flow"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:flow_wrapMode="chain"
+ app:flow_maxElementsWrap="2"
+ app:flow_horizontalGap="@dimen/global_actions_lite_padding"
+ app:flow_verticalGap="@dimen/global_actions_lite_padding"
+ app:flow_horizontalStyle="packed"/>
+ </androidx.constraintlayout.widget.ConstraintLayout>
+ </com.android.systemui.globalactions.GlobalActionsLayoutLite>
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/global_actions_view.xml b/packages/SystemUI/res/layout/global_actions_view.xml
index 454707b..6773c49 100644
--- a/packages/SystemUI/res/layout/global_actions_view.xml
+++ b/packages/SystemUI/res/layout/global_actions_view.xml
@@ -19,7 +19,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:clipChildren="false"
android:clipToPadding="false"
android:layout_marginStart="@dimen/global_actions_side_margin"
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index 6d44138c..e775de2 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -42,6 +42,8 @@
android:padding="6dp"
android:src="@drawable/ic_screenshot_share"
android:layout_marginRight="8dp"
+ android:contentDescription="@*android:string/share"
+ android:tooltipText="@*android:string/share"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/preview" />
@@ -50,8 +52,9 @@
android:id="@+id/preview"
android:layout_width="0px"
android:layout_height="0px"
- android:layout_marginBottom="42dp"
android:paddingHorizontal="48dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="42dp"
app:layout_constrainedHeight="true"
app:layout_constrainedWidth="true"
app:layout_constraintTop_toBottomOf="@id/save"
@@ -66,7 +69,8 @@
android:id="@+id/crop_view"
android:layout_width="0px"
android:layout_height="0px"
- android:layout_marginBottom="42dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="42dp"
app:layout_constrainedHeight="true"
app:layout_constrainedWidth="true"
app:layout_constraintTop_toTopOf="@id/preview"
@@ -115,4 +119,3 @@
/>
</androidx.constraintlayout.widget.ConstraintLayout>
-
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index fcc1aed..1125092 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -36,13 +36,62 @@
android:clipChildren="false"
android:paddingTop="@dimen/notification_guts_header_top_padding"
android:clipToPadding="true">
- <ImageView
- android:id="@+id/conversation_icon"
- android:layout_width="@dimen/notification_guts_conversation_icon_size"
- android:layout_height="@dimen/notification_guts_conversation_icon_size"
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:layout_centerVertical="false"
android:layout_alignParentStart="true"
- android:layout_marginEnd="12dp" />
+ android:layout_marginEnd="12dp"
+ >
+
+ <!-- Big icon: 52x52, 12dp padding left + top, 16dp padding right -->
+ <ImageView
+ android:id="@+id/conversation_icon"
+ android:layout_width="@*android:dimen/conversation_avatar_size"
+ android:layout_height="@*android:dimen/conversation_avatar_size"
+ android:scaleType="centerCrop"
+ android:importantForAccessibility="no"
+ />
+
+ <FrameLayout
+ android:id="@+id/conversation_icon_badge"
+ android:layout_width="@*android:dimen/conversation_icon_size_badged"
+ android:layout_height="@*android:dimen/conversation_icon_size_badged"
+ android:layout_marginLeft="@*android:dimen/conversation_badge_side_margin"
+ android:layout_marginTop="@*android:dimen/conversation_badge_side_margin"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ >
+ <ImageView
+ android:id="@+id/conversation_icon_badge_bg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:src="@*android:drawable/conversation_badge_background"
+ android:forceHasOverlappingRendering="false"
+ />
+ <ImageView
+ android:id="@+id/conversation_icon_badge_icon"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="4dp"
+ android:layout_gravity="center"
+ android:forceHasOverlappingRendering="false"
+ />
+ <ImageView
+ android:id="@+id/conversation_icon_badge_ring"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:src="@*android:drawable/conversation_badge_ring"
+ android:forceHasOverlappingRendering="false"
+ android:clipToPadding="false"
+ android:scaleType="center"
+ />
+ </FrameLayout>
+ </FrameLayout>
<LinearLayout
android:id="@+id/names"
android:layout_weight="1"
diff --git a/packages/SystemUI/res/layout/people_space_tile_view.xml b/packages/SystemUI/res/layout/people_space_tile_view.xml
index 8f64ddf..3e90180 100644
--- a/packages/SystemUI/res/layout/people_space_tile_view.xml
+++ b/packages/SystemUI/res/layout/people_space_tile_view.xml
@@ -35,15 +35,8 @@
<ImageView
android:id="@+id/tile_view_person_icon"
- android:layout_width="48dp"
- android:layout_height="48dp" />
-
- <ImageView
- android:id="@+id/tile_view_package_icon"
- android:layout_width="16dp"
- android:layout_marginStart="-8dp"
- android:layout_marginTop="32dp"
- android:layout_height="16dp" />
+ android:layout_width="52dp"
+ android:layout_height="52dp" />
<LinearLayout
android:orientation="horizontal"
diff --git a/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml
index 726e69f..343b398 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml
@@ -129,10 +129,10 @@
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@+id/tuner_icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingStart="36dp"
- android:paddingEnd="4dp"
+ android:layout_width="8dp"
+ android:layout_height="8dp"
+ android:layout_gravity="center_horizontal|bottom"
+ android:layout_marginBottom="@dimen/qs_footer_icon_padding"
android:src="@drawable/tuner"
android:tint="?android:attr/textColorTertiary"
android:visibility="invisible" />
diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml
index 1ce87c1..f8812ba 100644
--- a/packages/SystemUI/res/layout/qs_tile_label.xml
+++ b/packages/SystemUI/res/layout/qs_tile_label.xml
@@ -16,8 +16,9 @@
-->
<com.android.systemui.qs.tileimpl.ButtonRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="12dp">
diff --git a/packages/SystemUI/res/layout/quick_access_wallet.xml b/packages/SystemUI/res/layout/quick_access_wallet.xml
new file mode 100644
index 0000000..688e1f2
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_access_wallet.xml
@@ -0,0 +1,22 @@
+<?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.
+ -->
+
+<com.android.systemui.wallet.ui.WalletView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/wallet_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 9cc09aa..f4d5304 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- 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.
@@ -13,69 +13,31 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:layout_gravity="center_vertical"
- style="@style/BrightnessDialogContainer">
+ android:layout_gravity="center">
<com.android.systemui.settings.brightness.BrightnessSliderView
android:id="@+id/brightness_slider"
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="@dimen/brightness_mirror_height"
android:layout_gravity="center_vertical"
- android:layout_weight="1"
android:contentDescription="@string/accessibility_brightness"
- android:importantForAccessibility="no"
- systemui:text="@string/status_bar_settings_auto_brightness_label" >
+ android:importantForAccessibility="no" >
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <CheckBox
- android:id="@+id/toggle"
- android:layout_width="48dp"
- android:layout_height="0dp"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:layout_alignParentBottom="true"
- android:button="@null"
- android:background="@*android:drawable/switch_track_material"
- android:visibility="gone"
- />
<com.android.systemui.settings.brightness.ToggleSeekBar
android:id="@+id/slider"
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_toEndOf="@id/toggle"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"
- android:layout_alignParentEnd="true"
- android:paddingStart="20dp"
- android:paddingEnd="20dp"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:thumb="@drawable/ic_brightness_thumb"
+ android:layout_gravity="center_vertical"
+ android:minHeight="48dp"
+ android:thumb="@null"
+ android:background="@null"
+ android:paddingStart="0dp"
+ android:paddingEnd="0dp"
android:progressDrawable="@drawable/brightness_progress_drawable"
android:splitTrack="false"
/>
- <TextView
- android:id="@+id/label"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_alignStart="@id/toggle"
- android:layout_alignEnd="@id/toggle"
- android:layout_centerVertical="true"
- android:gravity="center"
- android:paddingTop="26dp"
- android:textColor="#666666"
- android:textSize="12sp"
- android:visibility="gone"
- />
-
- </RelativeLayout>
</com.android.systemui.settings.brightness.BrightnessSliderView>
-
-</LinearLayout>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog_thick.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog_thick.xml
deleted file mode 100644
index 6cee38d..0000000
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog_thick.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_gravity="center">
-
- <com.android.systemui.settings.brightness.BrightnessSliderView
- android:id="@+id/brightness_slider"
- android:layout_width="match_parent"
- android:layout_height="@dimen/brightness_mirror_height"
- android:layout_gravity="center_vertical"
- android:contentDescription="@string/accessibility_brightness"
- android:importantForAccessibility="no" >
-
- <com.android.systemui.settings.brightness.ToggleSeekBar
- android:id="@+id/slider"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:minHeight="48dp"
- android:thumb="@null"
- android:background="@null"
- android:paddingStart="0dp"
- android:paddingEnd="0dp"
- android:progressDrawable="@drawable/brightness_progress_drawable_thick"
- android:splitTrack="false"
- />
- </com.android.systemui.settings.brightness.BrightnessSliderView>
-</FrameLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml b/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
index 6f9d745..65f55d0 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
@@ -18,7 +18,7 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/plugin_frame"
- android:theme="@style/qs_theme"
+ android:theme="@style/Theme.SystemUI.QuickSettings"
android:layout_width="@dimen/qs_panel_width"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
diff --git a/packages/SystemUI/res/layout/wallet_card_view.xml b/packages/SystemUI/res/layout/wallet_card_view.xml
new file mode 100644
index 0000000..5fd556d
--- /dev/null
+++ b/packages/SystemUI/res/layout/wallet_card_view.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <com.android.systemui.wallet.ui.WalletCardView
+ android:id="@+id/card"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginHorizontal="@dimen/card_margin"
+ android:foreground="?android:attr/selectableItemBackground"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="12dp">
+ <ImageView
+ android:id="@+id/card_image"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:adjustViewBounds="true"
+ android:contentDescription="@null"
+ android:scaleType="fitXY"/>
+ <ImageView
+ android:id="@+id/add_card_logo"
+ android:layout_width="28dp"
+ android:layout_height="28dp"
+ android:layout_gravity="center"
+ android:drawable="@drawable/ic_qs_plus"
+ android:contentDescription="@null"
+ android:scaleType="fitCenter"
+ android:visibility="gone"/>
+ </com.android.systemui.wallet.ui.WalletCardView>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/wallet_empty_state.xml b/packages/SystemUI/res/layout/wallet_empty_state.xml
new file mode 100644
index 0000000..3ca0f73
--- /dev/null
+++ b/packages/SystemUI/res/layout/wallet_empty_state.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+ <LinearLayout
+ android:id="@+id/wallet_empty_state"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginHorizontal="16dp"
+ android:layout_marginTop="48dp"
+ android:background="@drawable/wallet_empty_state_bg"
+ android:orientation="vertical"
+ android:paddingVertical="52dp"
+ android:theme="@style/Wallet.Theme"
+ android:clipChildren="false"
+ android:visibility="gone">
+ <ImageView
+ android:id="@+id/empty_state_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="28dp"
+ android:layout_gravity="center"
+ android:layout_marginBottom="8dp"
+ android:contentDescription="@null"
+ android:scaleType="fitCenter"/>
+ <TextView
+ style="@style/Wallet.TextAppearance"
+ android:id="@+id/empty_state_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"/>
+ </LinearLayout>
+</merge>
diff --git a/packages/SystemUI/res/layout/wallet_fullscreen.xml b/packages/SystemUI/res/layout/wallet_fullscreen.xml
new file mode 100644
index 0000000..dc67848
--- /dev/null
+++ b/packages/SystemUI/res/layout/wallet_fullscreen.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false">
+ <LinearLayout
+ android:id="@+id/card_carousel_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="36dp"
+ android:orientation="vertical">
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginVertical="10dp"
+ android:background="@drawable/circle_wallet_primary_50dp"
+ android:scaleType="center"
+ android:contentDescription="@null"/>
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/Wallet.TextAppearance"
+ android:textAlignment="center"/>
+
+ <com.android.systemui.wallet.ui.WalletCardCarousel
+ android:id="@+id/card_carousel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:transitionName="dotIndicator"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:layout_marginVertical="24dp"/>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
+
+ <Button
+ android:id="@+id/wallet_button"
+ android:background="@drawable/wallet_button"
+ android:textColor="@color/wallet_white"
+ android:textAlignment="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingHorizontal="24dp"
+ android:paddingVertical="8dp"
+ android:layout_marginVertical="24dp"
+ android:layout_gravity="center_horizontal"/>
+
+ </LinearLayout>
+
+ <include layout="@layout/wallet_empty_state"/>
+
+ <TextView
+ android:id="@+id/error_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="80dp"
+ android:layout_marginHorizontal="40dp"
+ android:textSize="14sp"
+ android:textColor="#DADCE0"
+ android:elevation="7dp"
+ android:background="@drawable/rounded_corners"
+ android:gravity="center"
+ android:visibility="gone"/>
+</FrameLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index e2f407e..0e9b683 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die program of jou organisasie laat nie toe dat skermkiekies geneem word nie"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Wysig"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Wysig skermkiekie"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Vang meer vas"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Maak skermkiekie toe"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Boonste grens"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Keer kleure om"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Kleurregstellingmodus"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellings"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikerinstellings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Maak toe"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Gekoppel"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Gekoppel, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Koppel tans …"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Hierdie toestel behoort aan <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> en is gekoppel aan VPN\'e"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jou organisasie kan netwerkverkeer in jou werkprofiel monitor"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan netwerkverkeer in jou werkprofiel monitor"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Jou IT-admin kan netwerkaktiwiteit op jou werkprofiel sien"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netwerk kan gemonitor word"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Hierdie toestel is gekoppel aan VPN\'e"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jou werkprofiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
<string name="wallet_title" msgid="5369767670735827105">"Beursie"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Gereed"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Voeg teël by"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Maak gesprek oop"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Gespreklegstukke"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tik op \'n gesprek om dit by jou tuisskerm te voeg"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Minder as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Meer as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 335fa42..5d4853b 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"አርትዕ ያድርጉ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገጽ ዕይታን አርትዕ ያድርጉ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ተጨማሪ ይቅረጹ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገጽ ዕይታን አሰናብት"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"የላይኛው ወሰን"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ቀለማትን ግልብጥ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"የቀለም እርማት ሁነታ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ተጨማሪ ቅንብሮች"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"የተጠቃሚ ቅንብሮች"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ተከናውኗል"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ዝጋ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ተገናኝቷል"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ተገናኝቷል፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"በማገናኘት ላይ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ይህ መሳሪያ ንብረትነቱ የ<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ሲሆን ከቪፒኤን ጋር ተገናኝቷል"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"የእርስዎ ድርጅት በእርስዎ የሥራ መገለጫ ያለን የአውታረ መረብ ትራፊክን ሊቆጣጠር ይችል ይሆናል"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> በእርስዎ የሥራ መገለጫ ውስጥ የአውታረ መረብ ትራፊክ ላይ ክትትል ሊያደርግ ይችላል"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"የስራ መገለጫ አውታረ መረብ እንቅስቃሴ ለአይቲ አስተዳዳሪዎ ይታያል"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"አውታረ መረብ ክትትል የሚደረግበት ሊሆን ይችላል"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ይህ መሳሪያ ከቪፒኤን ጋር ተገናኝቷል"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"የእርስዎ የሥራ መገለጫ ከ<xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝቷል።"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ኤተርኔት"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ማንቂያ"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"ዝግጁ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"የስራ መገለጫ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"የአውሮፕላን ሁነታ"</string>
<string name="add_tile" msgid="6239678623873086686">"ሰቅ ያክሉ"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"ውይይት ይክፈቱ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"የውይይት ምግብሮች"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"በመነሻ ማያ ገጽዎ ላይ ለማከል አንድ ውይይት መታ ያድርጉ"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"ከ<xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index dbf49ac..5c7cf3b 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"يحظر التطبيق أو تحظر مؤسستك التقاط لقطات شاشة"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"تعديل"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"تعديل لقطة الشاشة"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"التقاط المزيد من المحتوى"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"إغلاق لقطة الشاشة"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"معاينة لقطة الشاشة"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"الحد العلوي"</string>
@@ -388,11 +387,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"قلب الألوان"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"وضع تصحيح الألوان"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"المزيد من الإعدادات"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"إعدادات المستخدم"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تم"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"إغلاق"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"متصل"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"الجهاز متّصل، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"جارٍ الاتصال..."</string>
@@ -545,8 +542,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"هذا الجهاز يخص <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> وتم ربطه بشبكات افتراضية خاصة (VPN)."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"يمكن لمؤسستك مراقبة حركة بيانات الشبكة في الملف الشخصي للعمل"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"يمكن لـ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> مراقبة حركة بيانات الشبكة في ملفك الشخصي للعمل"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"تكون أنشطة شبكة الملف الشخصي للعمل مرئية لمشرف تكنولوجيا المعلومات."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"قد تكون الشبكة خاضعة للمراقبة"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"تم ربط هذا الجهاز بشبكات افتراضية خاصة (VPN)."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"تم ربط الملف الشخصي للعمل بشبكة <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
@@ -676,7 +672,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"إيثرنت"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"المنبّه"</string>
<string name="wallet_title" msgid="5369767670735827105">"المحفظة"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"جاهزة"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"الملف الشخصي للعمل"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"وضع الطيران"</string>
<string name="add_tile" msgid="6239678623873086686">"إضافة فئة"</string>
@@ -1124,6 +1126,14 @@
<string name="basic_status" msgid="2315371112182658176">"محادثة مفتوحة"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"أدوات المحادثة"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"انقر على محادثة لإضافتها إلى \"الشاشة الرئيسية\"."</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"قبل <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"قبل أقل من <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"قبل أكثر <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 279a292..d9a8c6a 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"সম্পাদনা কৰক"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্ৰীনশ্বট সম্পাদনা কৰক"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"অধিক কেপচাৰ কৰক"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ওপৰৰ সীমাৰেখা"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ৰং ওলোটা কৰক"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ৰং শুধৰণী কৰা ম\'ড"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"অধিক ছেটিং"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যৱহাৰকাৰীৰ ছেটিং"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন কৰা হ’ল"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ কৰক"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"সংযোগ কৰা হ’ল"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"সংযুক্ত, বেটাৰি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"সংযোগ কৰি থকা হৈছে..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ৰ আৰু এইটো VPNসমূহৰ সৈতে সংযুক্ত হৈ আছে"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"কৰ্মস্থানৰ প্ৰ’ফাইলৰ নেটৱৰ্কৰ কাৰ্যকলাপ আপোনাৰ আইটি প্ৰশাসকৰ বাবে দৃশ্যমান হয়"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"এই ডিভাইচটো VPNসমূহৰ সৈতে সংযুক্ত হৈ আছে"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ইথাৰনেট"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"এলাৰ্ম"</string>
<string name="wallet_title" msgid="5369767670735827105">"ৱালেট"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"সাজু"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"এয়াৰপ্লেইন ম\'ড"</string>
<string name="add_tile" msgid="6239678623873086686">"টাইল যোগ দিয়ক"</string>
@@ -953,7 +955,7 @@
<string name="notification_channel_hints" msgid="7703783206000346876">"ইংগিতবোৰ"</string>
<string name="instant_apps" msgid="8337185853050247304">"Instant Apps"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> চলি আছে"</string>
- <string name="instant_apps_message" msgid="6112428971833011754">"ইনষ্ট\'ল নকৰাকৈয়েই এপটো খোলা হৈছে।"</string>
+ <string name="instant_apps_message" msgid="6112428971833011754">"এপ্টো ইনষ্ট\'ল নকৰাকৈ খোলা হৈছে।"</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"ইনষ্ট\'ল নকৰাকৈয়েই এপটো খোলা হৈছে। অধিক জানিবলৈ টিপক।"</string>
<string name="app_info" msgid="5153758994129963243">"এপৰ তথ্য"</string>
<string name="go_to_web" msgid="636673528981366511">"ব্ৰাউজাৰলৈ যাওক"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"বাৰ্তালাপ খোলক"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"বাৰ্তালাপ ৱিজেট"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"আপোনাৰ গৃহ স্ক্ৰীনত কোনো বাৰ্তালাপ যোগ দিবলৈ সেইটোত টিপক"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> পূৰ্বে"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ কম সময়ৰ পূৰ্বে"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ বেছি সময়ৰ পূৰ্বে"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 2b51143..75e8aa1 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Skrinşot çəkməyə tətbiq və ya təşkilat tərəfindən icazə verilmir"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redaktə edin"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinşota düzəliş edin"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Daha çoxunu əhatə edin"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Yuxarı hüdud"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Rəngləri çevirin"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Rəng korreksiyası rejimi"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Digər ayarlar"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"İstifadəçi ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hazır"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bağlayın"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Qoşulu"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Qoşuldu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Qoşulur..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> təşkilatına məxsusdur və VPN şəbəkəsinə qoşulub"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Təşkilat iş profilində şəbəkə ötürülməsinə nəzarət edə bilər"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> iş profilində şəbəkə ötürülməsinə nəzarət edə bilər"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"İş profili şəbəkəsi fəalliyyətini IT admini görə bilir"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Şəbəkəyə nəzarət edilə bilər"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu cihaz VPN şəbəkəsinə qoşulub"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"İş profiliniz <xliff:g id="VPN_APP">%1$s</xliff:g> şəbəkəsinə qoşulub"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Zəngli saat"</string>
<string name="wallet_title" msgid="5369767670735827105">"Pulqabı"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Hazır"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"İş profili"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Təyyarə rejimi"</string>
<string name="add_tile" msgid="6239678623873086686">"Xana əlavə edin"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Açıq söhbət"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Söhbət vidcetləri"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Əsas ekranınıza əlavə etmək üçün söhbətə toxunun"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Maksimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Minimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 32a48d7..283d976 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili organizacija ne dozvoljavaju pravljenje snimaka ekrana"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Izmeni"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Izmenite snimak ekrana"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite još"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Obrni boje"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekcije boje"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Još podešavanja"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisnička podešavanja"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Povezan"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Povezuje se..."</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je sa VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizacija može da prati mrežni saobraćaj na poslovnom profilu"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može da nadgleda mrežni saobraćaj na poslovnom profilu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivnost na mreži poslovnog profila je vidljiva IT administratoru"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža se možda nadgleda"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj uređaj je povezan sa VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Poslovni profil je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Eternet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Novčanik"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Poslovni profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Režim rada u avionu"</string>
<string name="add_tile" msgid="6239678623873086686">"Dodaj pločicu"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Otvorite konverzaciju"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za konverzaciju"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite konverzaciju da biste je dodali na početni ekran"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Pre <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pre manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pre više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 11f7440..32b7578 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Рабіць здымкі экрана не дазваляе праграма ці ваша арганізацыя"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Змяніць"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Змяніць здымак экрана"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Зняць больш"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Адхіліць здымак экрана"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граніца"</string>
@@ -380,17 +379,15 @@
<string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Прылада без назвы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Гатова для трансляцыі"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"Няма даступных прылад"</string>
- <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi не падключаны"</string>
+ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Няма падключэння да Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркасць"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"АЎТА"</string>
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Інвертаваць колеры"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Рэжым карэкцыі колеру"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Дадатковыя налады"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налады карыстальніка"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Гатова"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыць"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Падлучана"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Падключана, узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Падлучэнне..."</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Гэта прылада належыць арганізацыі \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" і падключана да VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ваша арганізацыя можа сачыць за сеткавым трафікам у вашым працоўным профілі"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> можа сачыць за сеткавым трафікам у вашым працоўным профілі"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Дзеянні працоўнага профілю ў сетцы бачныя IT-адміністратару"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"За сеткай могуць сачыць"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Гэта прылада падключана да VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш працоўны профіль падключаны да праграмы \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Будзільнік"</string>
<string name="wallet_title" msgid="5369767670735827105">"Кашалёк"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Гатова"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Працоўны профіль"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Рэжым палёту"</string>
<string name="add_tile" msgid="6239678623873086686">"Дадаць плітку"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Адкрытая размова"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Віджэты размовы"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Націсніце на размову, каб дадаць яе на галоўны экран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Менш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Больш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string>
@@ -1126,8 +1136,7 @@
<string name="empty_user_name" msgid="3389155775773578300">"Сябры"</string>
<string name="empty_status" msgid="5938893404951307749">"Паразмаўляем у чаце!"</string>
<string name="missed_call" msgid="4228016077700161689">"Прапушчаны выклік"</string>
- <!-- no translation found for messages_count_overflow_indicator (7850934067082006043) -->
- <skip />
+ <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Глядзець нядаўнія паведамленні, прапушчаныя выклікі і абнаўленні стану"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Размова"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Праблема з чытаннем індыкатара зараду акумулятара"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 01282f4..31ae63f 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Правенето на екранни снимки не е разрешено от приложението или организацията ви"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Редактиране"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Редактиране на екранната снимка"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Заснемане на още"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отхвърляне на екранната снимка"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Инвертиране на цветовете"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим на коригиране на цветовете"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Още настройки"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Потребителски настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затваряне"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Установена е връзка"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Свързано, батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Установява се връзка..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Това устройство принадлежи на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и е свързано с виртуални частни мрежи (VPN)"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Организацията ви може да наблюдава трафика в мрежата в служебния ви потребителски профил"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да наблюдава трафика в мрежата в служебния ви потребителски профил"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Мрежовата активност в служебния потребителски профил е видима за системния ви администратор"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежата може да се наблюдава"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Това устройство е свързано с виртуални частни мрежи (VPN)"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Служебният ви потребителски профил е свързан с(ъс) <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Будилник"</string>
<string name="wallet_title" msgid="5369767670735827105">"Портфейл"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Потребителски профил в Work"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Самолетен режим"</string>
<string name="add_tile" msgid="6239678623873086686">"Добавяне на плочка"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Отворен разговор"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Приспособления за разговор"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Докоснете разговор, за да го добавите към началния си екран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Преди <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Преди по-малко от <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Преди повече от <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 199c368..0e18e8f 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এই অ্যাপ বা আপনার প্রতিষ্ঠান স্ক্রিনশট নেওয়ার অনুমতি দেয়নি"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"এডিট করুন"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্রিনশট এডিট করুন"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"আরও বেশি ক্যাপচার করুন"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্রিনশট বাতিল করুন"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"স্ক্রিনশটের একদম উপরের দিকে"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"বিপরীত রঙ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"রঙ সংশোধন মোড"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"আরও সেটিংস"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যবহারকারী সেটিংস"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন হয়েছে"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ করুন"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"সংযুক্ত হয়েছে"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"সংযুক্ত হয়েছে, ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"সংযুক্ত হচ্ছে..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"এই ডিভাইস <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-এর এবং একাধিক VPN-এ কানেক্ট করা আছে"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলের নেটওয়ার্ক ট্রাফিকে নজর রাখতে পারে"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইলের নেটওয়ার্ক ট্রাফিকে নজর রাখতে পারে"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"আপনার আইটি অ্যাডমিন অফিস প্রোফাইল নেটওয়ার্ক অ্যাক্টিভিটি দেখতে পারবেন"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"নেটওয়ার্কের উপরে নজর রাখা হতে পারে"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"এই ডিভাইস একাধিক VPN-এ কানেক্ট করা আছে"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"<xliff:g id="VPN_APP">%1$s</xliff:g>-এ আপনার অফিস প্রোফাইল কানেক্ট করা রয়েছে"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ইথারনেট"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"অ্যালার্ম"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"তৈরি"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"কাজের প্রোফাইল"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"বিমান মোড"</string>
<string name="add_tile" msgid="6239678623873086686">"টাইল যোগ করুন"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"খোলা কথোপকথন"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"কথোপকথন উইজেট"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"কোনও কথোপথন আপনার হোম স্ক্রিনে যোগ করার জন্য এতে ট্যাপ করুন"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ঘণ্টা আগে"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> থেকে কিছু কম সময় আগে"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> সপ্তাহেরও আগে"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 650bc9c..c7820f4 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ova aplikacija ili vaša organizacija ne dozvoljavaju snimanje ekrana"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Uredite snimak ekrana"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite više"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzija boja"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Način rada za ispravku boje"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Povezano"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija može pratiti mrežni saobraćaj na vašem profilu."</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može pratiti mrežni saobraćaj na vašem radnom profilu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Mrežna aktivnost radnog profila je vidljiva vašem IT administratoru"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža može biti nadzirana"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj uređaj je povezan VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vaš radni profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Novčanik"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil za posao"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Način rada u avionu"</string>
<string name="add_tile" msgid="6239678623873086686">"Dodaj pločicu"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za razgovor"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da ga dodate na početni ekran"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 52dab81..1546113 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'aplicació o la teva organització no permeten fer captures de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edita"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edita la captura de pantalla"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Captura més"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora la captura de pantalla"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Marge superior"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverteix colors"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correcció de color"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Més opcions"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuració d\'usuari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tanca"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Connectat"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connectat (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"S\'està connectant..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Aquest dispositiu pertany a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i està connectat a xarxes VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"És possible que la teva organització supervisi el trànsit de xarxa al teu perfil de treball"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"És possible que <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> supervisi el trànsit de xarxa del teu perfil de treball"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"L\'administrador de TI pot veure l\'activitat de la xarxa del perfil de treball"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"És possible que la xarxa estigui supervisada"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Aquest dispositiu està connectat a xarxes VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"El teu perfil de treball està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"A punt"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de treball"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mode d\'avió"</string>
<string name="add_tile" msgid="6239678623873086686">"Afegeix un mosaic"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa oberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversa per afegir-la a la teva pantalla d\'inici"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Fa <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Fa menys de: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Fa més de: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index e3dcc57..7263391 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikace nebo organizace zakazuje pořizování snímků obrazovky"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Upravit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Upravit snímek obrazovky"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zachytit více"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavřít snímek obrazovky"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Horní hranice"</string>
@@ -386,11 +385,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Převrátit barvy"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekce barev"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Další nastavení"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uživatelské nastavení"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavřít"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Připojeno"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Připojeno, baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Připojování..."</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je připojené k sítím VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizace může ve vašem pracovním profilu sledovat síťový provoz"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> může ve vašem pracovním profilu sledovat síťový provoz"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitu pracovního profilu na síti vidí administrátor IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Síť může být sledována"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Toto zařízení je připojené k sítím VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovní profil je připojen k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Budík"</string>
<string name="wallet_title" msgid="5369767670735827105">"Peněženka"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Připraveno"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Pracovní profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Režim Letadlo"</string>
<string name="add_tile" msgid="6239678623873086686">"Přidat dlaždici"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Otevřít konverzaci"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgety konverzací"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Klepnutím na konverzaci ji přidáte na plochu"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Před <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Před méně než <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Před více než <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5c23627..9348a1c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller din organisation tillader ikke, at du tager screenshots"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger screenshot"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Medtag mere"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Luk screenshot"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Øverste kant"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Afvis"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sæt fingeren på fingeraftrykslæseren"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikon for fingeraftryk"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansigtet kan ikke genkendes. Brug fingeraftryk i stedet."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Brug dit fingeraftryk for at fortsætte"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Fingeraftrykket kan ikke genkendes. Brug skærmlåsen i stedet."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Forsøger at finde dig…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ansigt"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Knap for kompatibilitetszoom."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Byt om på farver"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Farvekorrigeringstilstand"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere indstillinger"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brugerindstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Udfør"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Luk"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Tilsluttet"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tilsluttet – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Opretter forbindelse…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Denne enhed tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og har forbindelse til VPN-netværk"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Din organisation kan overvåge netværkstrafikken på din arbejdsprofil"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan overvåge netværkstrafik på din arbejdsprofil"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Din it-administrator kan se netværksaktivitet på din arbejdsprofil"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netværket kan være overvåget"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Denne enhed har forbindelse til VPN-netværk"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Din arbejdsprofil har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Arbejdsprofil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Flytilstand"</string>
<string name="add_tile" msgid="6239678623873086686">"Tilføj et felt"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Åben samtale"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Samtalewidgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tryk på en samtale for at føje den til din startskærm"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vend tilbage hertil, når du har fået beskeder"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriterede samtaler"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Seneste samtaler"</string>
+ <string name="okay" msgid="6490552955618608554">"Okay"</string>
<string name="timestamp" msgid="6577851592534538533">"For <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"For mindre end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"For mere end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 971752c..f163be8 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die App oder deine Organisation lässt das Erstellen von Screenshots nicht zu"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Bearbeiten"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bearbeiten"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mehr aufnehmen"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot schließen"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Oberer Rand"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Farben umkehren"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Farbkorrekturmodus"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Weitere Einstellungen"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Nutzereinstellungen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fertig"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Schließen"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Verbunden"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Verbindung wird hergestellt…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dieses Gerät gehört <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> und ist mit VPNs verbunden"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Deine Organisation kann den Netzwerkverkehr in deinem Arbeitsprofil überwachen"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kann den Netzwerkverkehr in deinem Arbeitsprofil überwachen"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Dein IT-Administrator kann die Netzwerkaktivitäten deines Arbeitsprofils sehen"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Das Netzwerk wird eventuell überwacht"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dieses Gerät ist mit VPNs verbunden"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Dein Arbeitsprofil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Weckruf"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Bereit"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Arbeitsprofil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Flugmodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Kachel hinzufügen"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Offene Unterhaltung"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Unterhaltungs-Widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tippe auf eine Unterhaltung, um sie deinem Startbildschirm hinzuzufügen"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Vor <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Vor weniger als <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Vor über <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 81898089..4dad056 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Η λήψη στιγμιότυπων οθόνης δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Επεξεργασία"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Επεξεργασία στιγμιότυπου οθόνης"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Λήψη περισσότερων"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Παράβλεψη στιγμιότυπου οθόνης"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Προεπισκόπηση στιγμιότυπου οθόνης"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Ανώτατο όριο"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Παράβλεψη"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Αγγίξτε τον αισθητήρα δακτυλικού αποτυπώματος"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Το πρόσωπο δεν αναγνωρίζεται. Χρησιμ. δακτ. αποτ."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Χρησιμοποιήστε δακτυλ. αποτύπωμα για να συνεχίσετε"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Δεν είναι δυνατή η αναγνώριση του δακτυλικού αποτυπώματος. Χρησιμοποιήστε εναλλακτικά το κλείδωμα οθόνης."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Αναζήτηση για εσάς…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Εικονίδιο προσώπου"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Κουμπί εστίασης συμβατότητας."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Αντιστροφή χρωμάτων"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Λειτουργία διόρθωσης χρώματος"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Περισσότερες ρυθμίσεις"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ρυθμίσεις χρήστη"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Τέλος"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Κλείσιμο"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Συνδέθηκε"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Σύνδεση…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Αυτή η συσκευή ανήκει στον οργανισμό <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> και είναι συνδεδεμένη σε ορισμένα VPN."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ο οργανισμός σας μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου στο προφίλ εργασίας σας"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Ο οργανισμός <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου στο προφίλ εργασίας σας"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Η δραστηριότητα δικτύου του προφίλ εργασίας είναι ορατή στον διαχειριστή IT σας"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Το δίκτυο ενδέχεται να παρακολουθείται"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Αυτή η συσκευή είναι συνδεδεμένη σε ορισμένα VPN."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Το προφίλ εργασίας σας είναι συνδεδεμένο στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Ξυπνητήρι"</string>
<string name="wallet_title" msgid="5369767670735827105">"Πορτοφόλι"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Έτοιμο"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Προφίλ εργασίας"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Λειτουργία πτήσης"</string>
<string name="add_tile" msgid="6239678623873086686">"Προσθήκη πλακιδίου"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Άνοιγμα συνομιλίας"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Γραφικά στοιχεία συνομιλίας"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Πατήστε μια συνομιλία για να την προσθέσετε στην αρχική οθόνη"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Ελέγξτε ξανά εδώ όταν λάβετε ορισμένα μηνύματα"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Συζητήσεις προτεραιότητας"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Πρόσφατες συζητήσεις"</string>
+ <string name="okay" msgid="6490552955618608554">"Εντάξει"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> πριν"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Λιγότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Περισσότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 6ce83cc..7ee1383 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 9c7ce87..0dfe75b 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 6ce83cc..7ee1383 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 6ce83cc..7ee1383 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Aeroplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index c036c1b..588b2cc 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognize face. Use fingerprint instead."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognize fingerprint. Use screen lock instead."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Ready"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profile"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Add tile"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your Home screen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
+ <string name="okay" msgid="6490552955618608554">"Okay"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 7984484..290b3b3 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La app o tu organización no permiten las capturas de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Descartar captura de pantalla"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Límite superior"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Descartar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas dactilares"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícono de huella dactilar"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce el rostro. Usa la huella dactilar."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utiliza tu huella dactilar para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"No se reconoce la huella dactilar. Utiliza el bloqueo de pantalla en su lugar."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Autenticando tu rostro…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ícono de rostro"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botón de zoom de compatibilidad"</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de color"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Más configuraciones"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración del usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectado. Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> y está conectado a VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tu organización puede controlar el tráfico de red en tu perfil de trabajo"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Es posible que <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> controle el tráfico de red en tu perfil de trabajo"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"El administrador de IT puede ver la actividad de la red de tu perfil de trabajo"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Es posible que la red esté supervisada"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabajo"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo de avión"</string>
<string name="add_tile" msgid="6239678623873086686">"Agregar mosaico"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversación"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Presiona una conversación para agregarla a tu pantalla principal"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Vuelve a consultar cuando recibas algunos mensajes"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversaciones prioritarias"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversaciones recientes"</string>
+ <string name="okay" msgid="6490552955618608554">"Aceptar"</string>
<string name="timestamp" msgid="6577851592534538533">"Hace <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index c80482ca9..9d96e18 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Margen superior"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de color"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Más ajustes"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ajustes de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> y está conectado a varias VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tu organización puede supervisar el tráfico de red de tu perfil de trabajo"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> puede supervisar el tráfico de red de tu perfil de trabajo"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Tu administrador de TI puede ver la actividad de red del perfil de trabajo"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Puede que la red esté supervisada"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a varias VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabajo"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avión"</string>
<string name="add_tile" msgid="6239678623873086686">"Añadir icono"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversación"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversación para añadirla a la pantalla de inicio"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Hace <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1500a31..9471baa 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Muutmine"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Ekraanipildi muutmine"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Jäädvustage rohkem"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekraanipildist loobumine"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Ülempiir"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Vaheta värve"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Värviparandusrežiim"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Rohkem seadeid"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kasutaja seaded"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sule"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Ühendatud"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ühendatud, aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Ühenduse loomine ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"See seade kuulub organisatsioonile <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ja on ühendatud VPN-idega"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Teie organisatsioon võib jälgida teie tööprofiilil võrguliiklust"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> võib jälgida võrguliiklust teie tööprofiilil"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Tööprofiili võrgutegevused on teie IT-administraatorile nähtavad"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Võrku võidakse jälgida"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"See seade on ühendatud VPN-idega"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Teie tööprofiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Äratus"</string>
<string name="wallet_title" msgid="5369767670735827105">"Rahakott"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Valmis"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Tööprofiil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lennukirežiim"</string>
<string name="add_tile" msgid="6239678623873086686">"Paani lisamine"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Avage vestlus"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Vestlusvidinad"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Puudutage vestlust, et lisada see oma avakuvale"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Vähem kui <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Üle <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 9e921fe..a078511 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editatu"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editatu pantaila-argazkia"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Atera eduki gehiago argazkian"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Goiko ertza"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Alderantzikatu koloreak"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Koloreen zuzenketa modua"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Ezarpen gehiago"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Erabiltzaile-ezarpenak"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Eginda"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Itxi"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Konektatuta"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Konektatzen…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Gailu hau <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundearena da, eta VPN sareetara dago konektatuta"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Baliteke erakundeak laneko profileko sareko trafikoa gainbegiratzea"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Baliteke <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundeak laneko profilaren sareko trafikoa gainbegiratzea"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IKT saileko administratzaileak laneko profilaren sarearen jarduera ikus dezake"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Baliteke sarea gainbegiratuta egotea"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Gailu hau VPN sareetara dago konektatuta"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"<xliff:g id="VPN_APP">%1$s</xliff:g> sarera konektatuta daukazu laneko profila"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Prest"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work profila"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Hegaldi modua"</string>
<string name="add_tile" msgid="6239678623873086686">"Gehitu lauza"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Elkarrizketa irekia"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Elkarrizketa-widgetak"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Sakatu elkarrizketa bat hasierako pantailan gehitzeko"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Duela <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gutxiago"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gehiago"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 20a4b83..21592bc 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"برنامه یا سازمان شما اجازه نمیدهند نماگرفت بگیرید."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ویرایش"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ویرایش نماگرفت"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ضبط محتوای بیشتر"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"رد کردن نماگرفت"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"پیشنمایش نماگرفت"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"مرز بالایی"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"برگردان رنگها"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"حالت تصحیح رنگ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"تنظیمات بیشتر"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"تنظیمات کاربر"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تمام"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بستن"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"متصل"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"متصل، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"در حال اتصال..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"این دستگاه به <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> تعلق دارد و به VPN متصل است"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ممکن است سازمان شما ترافیک شبکه را در نمایه کاریتان پایش کند"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ممکن است ترافیک شبکه را در نمایه کاری شما پایش کند"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"سرپرست سیستم میتواند فعالیت شبکه نمایه کاری را ببیند"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ممکن است شبکه پایش شود"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"این دستگاه به شبکههای VPN متصل است"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"نمایه کاری به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل است"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"اترنت"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"زنگ"</string>
<string name="wallet_title" msgid="5369767670735827105">"کیفپول"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"آماده"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"نمایه کاری"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"حالت هواپیما"</string>
<string name="add_tile" msgid="6239678623873086686">"افزودن کاشی"</string>
@@ -952,7 +954,7 @@
<string name="notification_channel_storage" msgid="2720725707628094977">"فضای ذخیرهسازی"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"نکات"</string>
<string name="instant_apps" msgid="8337185853050247304">"برنامههای فوری"</string>
- <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> درحال اجرا"</string>
+ <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> درحال اجرا"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"برنامه بدون نصب شدن باز شد."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"برنامه بدون نصب شدن باز شد. برای اطلاعات بیشتر ضربه بزنید."</string>
<string name="app_info" msgid="5153758994129963243">"اطلاعات برنامه"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"باز کردن مکالمه"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ابزارکهای مکالمه"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"روی مکالمهای ضربه بزنید تا به «صفحه اصلی» اضافه شود"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> پیش"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"کمتر از <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
<string name="over_timestamp" msgid="4765793502859358634">"بیشاز <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 3393550..36a17bf 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Sovellus tai organisaatio ei salli kuvakaappauksien tallentamista."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Muuta"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Muokkaa kuvakaappausta"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Kuvaa enemmän"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hylkää kuvakaappaus"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Yläraja"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Käänteiset värit"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Värinkorjaustila"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Lisäasetukset"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Käyttäjäasetukset"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sulje"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Yhdistetty"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Yhdistetty, akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Yhdistetään…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa tämän laitteen, joka on yhdistetty VPN:iin"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisaatiosi voi valvoa työprofiilisi verkkoliikennettä."</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> voi valvoa työprofiilisi verkkoliikennettä."</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT-järjestelmänvalvoja näkee työprofiilin verkkotoiminnan"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Verkkoa saatetaan valvoa"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Tämä laite on yhdistetty VPN:iin"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Työprofiilisi on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Herätys"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Valmis"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Työprofiili"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lentokonetila"</string>
<string name="add_tile" msgid="6239678623873086686">"Lisää ruutu"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Avaa keskustelu"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Keskusteluwidgetit"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Lisää keskustelu aloitusnäytölle napauttamalla sitä"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Alle <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Yli <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 53ef194..d483a8f 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'application ou votre organisation n\'autorise pas les saisies d\'écran"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite supérieure"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverser les couleurs"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correction des couleurs"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminé"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Connecté"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connecté. Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Connexion en cours…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> et est connecté à des RPV"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Votre organisation peut contrôler le trafic réseau dans votre profil professionnel"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> peut contrôler votre trafic réseau dans votre profil professionnel"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Votre administrateur informatique a accès à l\'activité sur le réseau de votre profil professionnel"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Le réseau peut être surveillé"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Cet appareil est connecté à des RPV"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Prêt"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil professionnel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mode Avion"</string>
<string name="add_tile" msgid="6239678623873086686">"Ajouter la tuile"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Ouvrir la conversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Touchez une conversation pour l\'ajouter à votre écran d\'accueil"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index f40d6aa..6054fb8 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Les captures d\'écran ne sont pas autorisées par l\'application ni par votre organisation"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite supérieure"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverser les couleurs"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correction des couleurs"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"OK"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Connecté"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connecté, batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Connexion en cours..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> et il est connecté à des VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Votre entreprise peut contrôler votre trafic réseau dans votre profil professionnel"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> peut contrôler votre trafic réseau dans votre profil professionnel"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Votre administrateur informatique peut voir l\'activité sur le réseau de votre profil professionnel"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Il est possible que le réseau soit surveillé"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Cet appareil est connecté à des VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Prêt"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil professionnel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mode Avion"</string>
<string name="add_tile" msgid="6239678623873086686">"Ajouter un bloc"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Conversation ouverte"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Appuyez sur une conversation pour l\'ajouter à votre écran d\'accueil"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 2ba0738..020e4b0 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A aplicación ou a túa organización non permite realizar capturas de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar a captura de pantalla"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar máis"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar a captura de pantalla"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Bordo superior"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter cores"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de cor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Máis opcións"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Feito"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Pechar"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Dispositivo conectado. Nivel de batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertence a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> e está conectado a varias VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"A túa organización pode controlar o tráfico de rede do teu perfil de traballo"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> pode controlar o tráfico de rede do teu perfil de traballo"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"O teu administrador de TI pode ver a actividade que leves a cabo na rede co perfil de traballo"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"É posible que se controle a rede"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a varias VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"O teu perfil de traballo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Listo"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de traballo"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avión"</string>
<string name="add_tile" msgid="6239678623873086686">"Engade un atallo"</string>
@@ -954,7 +956,7 @@
<string name="instant_apps" msgid="8337185853050247304">"Aplicacións Instantáneas"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"Estase executando <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"Abriuse a aplicación sen ter que instalala."</string>
- <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Abriuse a aplicación sen ter que instalala. Tocar para obter máis información."</string>
+ <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Abriuse a aplicación sen ter que instalala. Toca para obter máis información."</string>
<string name="app_info" msgid="5153758994129963243">"Información da aplicación"</string>
<string name="go_to_web" msgid="636673528981366511">"Ir ao navegador"</string>
<string name="mobile_data" msgid="4564407557775397216">"Datos móbiles"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toca unha conversa para engadila á pantalla de inicio"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Hai <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Hai menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hai máis de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index dbcfe5e..fd3c0ee 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ઍપ્લિકેશન કે તમારી સંસ્થા દ્વારા સ્ક્રીનશૉટ લેવાની મંજૂરી નથી"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ફેરફાર કરો"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"સ્ક્રીનશૉટમાં ફેરફાર કરો"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"વધુ કૅપ્ચર કરો"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"સ્ક્રીનશૉટ છોડી દો"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"સ્ક્રીનશૉટની સૌથી ઉપરની બાજુની સીમા"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"રંગોને ઉલટાવો"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"રંગ સુધારણા મોડ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"વધુ સેટિંગ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"વપરાશકર્તા સેટિંગ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"થઈ ગયું"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"બંધ કરો"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"કનેક્ટ થયેલ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"કનેક્ટ કરેલ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"કનેક્ટ કરી રહ્યું છે..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"આ ડિવાઇસ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ની માલિકીનું છે અને VPNsથી કનેક્ટ કરેલું છે"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"તમારી સંસ્થા તમારી કાર્ય પ્રોફાઇલમાં નેટવર્ક ટ્રાફિકનું નિયમન કરી શકે છે"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> તમારી કાર્ય પ્રોફાઇલમાં નેટવર્ક ટ્રાફિકનું નિયમન કરી શકે છે"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ઑફિસ માટેની ઍપની નેટવર્ક પ્રવૃત્તિને તમારા IT વ્યવસ્થાપક જોઈ શકે છે"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"નેટવર્કનું નિયમન કરવામાં આવી શકે છે"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"આ ડિવાઇસ VPNsથી કનેક્ટ કરેલું છે"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"તમારી ઑફિસની પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g>થી કનેક્ટ કરેલી છે"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ઇથરનેટ"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"એલાર્મ"</string>
<string name="wallet_title" msgid="5369767670735827105">"વૉલેટ"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"તૈયાર છે"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ઑફિસની પ્રોફાઇલ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"એરપ્લેન મોડ"</string>
<string name="add_tile" msgid="6239678623873086686">"ટાઇલ ઉમેરો"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"વાતચીતના વિજેટ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"તમારી હોમ સ્ક્રીનમાં વાતચીત ઉમેરવા માટે તેના પર ટૅપ કરો"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> પહેલાં"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>થી ઓછા સમય પહેલાં"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> કરતાં વધુ સમય પહેલાં"</string>
diff --git a/packages/SystemUI/res/values-h740dp-port/dimens.xml b/packages/SystemUI/res/values-h740dp-port/dimens.xml
index 4a23ee6..966066f 100644
--- a/packages/SystemUI/res/values-h740dp-port/dimens.xml
+++ b/packages/SystemUI/res/values-h740dp-port/dimens.xml
@@ -19,9 +19,9 @@
<dimen name="qs_tile_margin_vertical">24dp</dimen>
<!-- The height of the qs customize header. Should be
- (qs_panel_padding_top (48dp) + brightness_mirror_height (56dp) + qs_tile_margin_top (18dp)) -
+ (qs_panel_padding_top (48dp) + brightness_mirror_height (48dp) + qs_tile_margin_top (18dp)) -
(Toolbar_minWidth (56dp) + qs_tile_margin_top_bottom (12dp))
-->
- <dimen name="qs_customize_header_min_height">54dp</dimen>
+ <dimen name="qs_customize_header_min_height">46dp</dimen>
<dimen name="qs_tile_margin_top">18dp</dimen>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 53ea9dd..4e796fe 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"बदलाव करें"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट में बदलाव करें"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा जानकारी कैप्चर करें"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"स्क्रीनशॉट को ऊपर से काटने की सीमा"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटें"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"रंग सुधार मोड"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"और सेटिंग"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"उपयोगकर्ता सेटिंग"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"हो गया"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करें"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"कनेक्ट है"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"कनेक्ट किया गया, बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट हो रहा है..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"इस डिवाइस का मालिकाना हक <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> के पास है. इस डिवाइस को वीपीएन से कनेक्ट किया गया है"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"आपका संगठन आपकी वर्क प्रोफ़ाइल में नेटवर्क ट्रैफ़िक की निगरानी कर सकता है"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपकी वर्क प्रोफ़ाइल में नेटवर्क ट्रैफ़िक की निगरानी कर सकता है"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"आपका आईटी एडमिन आपकी वर्क प्रोफ़ाइल के नेटवर्क से जुड़ी गतिविधि देख सकता है"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्क की निगरानी की जा सकती है"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"इस डिवाइस को वीपीएन से कनेक्ट किया गया है"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"आपकी वर्क प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट की गई है"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ईथरनेट"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
<string name="wallet_title" msgid="5369767670735827105">"वॉलेट"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"तैयार"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"वर्क प्रोफ़ाइल"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"हवाई जहाज़ मोड"</string>
<string name="add_tile" msgid="6239678623873086686">"टाइल जोड़ें"</string>
@@ -954,7 +956,7 @@
<string name="instant_apps" msgid="8337185853050247304">"Instant Apps"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> चल रहा है"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है."</string>
- <string name="instant_apps_message_with_help" msgid="1816952263531203932">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है. ज़्यादा जानने के लिए टैप करें."</string>
+ <string name="instant_apps_message_with_help" msgid="1816952263531203932">"इस ऐप्लिकेशन को इंस्टॉल करने की ज़रूरत नहीं पड़ती. ज़्यादा जानकारी के लिए इस लिंक पर टैप करें."</string>
<string name="app_info" msgid="5153758994129963243">"ऐप्लिकेशन की जानकारी"</string>
<string name="go_to_web" msgid="636673528981366511">"ब्राउज़र पर जाएं"</string>
<string name="mobile_data" msgid="4564407557775397216">"मोबाइल डेटा"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"ऐसी बातचीत जिसमें इंटरैक्शन डेटा मौजूद नहीं है"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"बातचीत विजेट"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"किसी बातचीत को होम स्क्रीन पर जोड़ने के लिए, उस बातचीत पर टैप करें"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पहले"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> से थोड़ा पहले"</string>
<string name="over_timestamp" msgid="4765793502859358634">"करीब <xliff:g id="DURATION">%1$s</xliff:g> से ज़्यादा"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index dfc2967..39bef2b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili vaša organizacija ne dopuštaju snimanje zaslona"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Uređivanje snimke zaslona"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite više"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacivanje snimke zaslona"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimke zaslona"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Zamjena boja"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Način korekcije boje"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Povezano"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je s VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija može nadzirati mrežni promet na vašem radnom profilu"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može nadzirati mrežni promet na vašem radnom profilu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Mrežna aktivnost poslovnog profila vidljiva je vašem IT administratoru"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža se možda nadzire"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj je uređaj povezan s VPN-ovima"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vaš poslovni profil povezan je s mrežom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Novčanik"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Spremno"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Poslovni profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Način rada u zrakoplovu"</string>
<string name="add_tile" msgid="6239678623873086686">"Dodavanje pločice"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgeti razgovora"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da biste ga dodali na početni zaslon"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index e6a4e3c..229ddca 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Az alkalmazás vagy az Ön szervezete nem engedélyezi képernyőkép készítését"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Szerkesztés"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Képernyőkép szerkesztése"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Több rögzítése"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Képernyőkép elvetése"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Felső határ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Színek invertálása"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Színjavítás mód"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"További beállítások"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Felhasználói beállítások"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kész"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bezárás"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Csatlakoztatva"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Csatlakoztatva; az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Csatlakozás…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ez az eszköz a(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tulajdonában van, és VPN-ekhez van csatlakoztatva"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Szervezete figyelheti a munkaprofil hálózati forgalmát"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"A(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> figyelheti a munkaprofil hálózati forgalmát"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Munkaprofilja hálózati tevékenységét láthatja a rendszergazdája"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Elképzelhető, hogy a hálózatot figyelik"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ez az eszköz VPN-ekhez van csatlakoztatva"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Munkaprofilja össze van kapcsolva a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazással"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Ébresztés"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Kész"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Munkahelyi profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Repülős üzemmód"</string>
<string name="add_tile" msgid="6239678623873086686">"Mozaik hozzáadása"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Beszélgetés megnyitása"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Beszélgetési modulok"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Koppintson a kívánt beszélgetésre a kezdőképernyőre való felvételhez"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kevesebb, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Több, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index b598f01..59eefc1 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Հավելվածը կամ ձեր կազմակերպությունը չի թույլատրում սքրինշոթի ստացումը"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Փոփոխել"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Փոփոխել սքրինշոթը"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Մեծացնել սքրինշոթի տարածքը"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Փակել սքրինշոթը"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Վերևի սահմանագիծ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Շրջել գույները"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Գունաշտկման ռեժիմ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Հավելյալ կարգավորումներ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Օգտատիրոջ կարգավորումներ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Փակել"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Միացված է"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Միացված է, մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Միանում է..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Այս սարքը պատկանում է «<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>» կազմակերպությանը և միացված է վիրտուալ մասնավոր ցանցերի"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ձեր կազմակերպությունը կարող է վերահսկել ձեր աշխատանքային պրոֆիլի ցանցային թրաֆիկը"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> կազմակերպությունը կարող է վերահսկել ձեր աշխատանքային պրոֆիլի ցանցային թրաֆիկը"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Աշխատանքային պրոֆիլով կատարված գործողությունները տեսանելի են ձեր ՏՏ ադմինիստրատորին"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Ցանցը կարող է վերահսկվել"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Այս սարքը միացված է վիրտուալ մասնավոր ցանցերի"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ձեր աշխատանքային պրոֆիլը միացված է <xliff:g id="VPN_APP">%1$s</xliff:g> ցանցին"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Զարթուցիչ"</string>
<string name="wallet_title" msgid="5369767670735827105">"Դրամապանակ"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Պատրաստ է"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Android for Work-ի պրոֆիլ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Ավիառեժիմ"</string>
<string name="add_tile" msgid="6239678623873086686">"Սալիկի ավելացում"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Բաց զրույց"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Զրույցի վիջեթներ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Հպեք զրույցին՝ այն հիմնական էկրանին ավելացնելու համար"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Առավելագույնը <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ավելի քան <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index a823822..33df4ef 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Mengambil screenshot tidak diizinkan oleh aplikasi atau organisasi"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Mengedit screenshot"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Rekam lagi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Menutup screenshot"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Batas atas"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inversi warna"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode koreksi warna"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Setelan lainnya"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setelan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Tersambung"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Perangkat ini milik <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dan terhubung ke VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasi dapat memantau traffic jaringan di profil kerja"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mungkin memantau traffic jaringan di profil kerja Anda"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitas jaringan profil kerja dapat dilihat oleh admin IT Anda"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Jaringan mungkin dipantau"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Perangkat ini terhubung ke VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profil kerja Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Siap"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil kerja"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mode pesawat"</string>
<string name="add_tile" msgid="6239678623873086686">"Tambahkan ubin"</string>
@@ -952,7 +954,7 @@
<string name="notification_channel_storage" msgid="2720725707628094977">"Penyimpanan"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"Petunjuk"</string>
<string name="instant_apps" msgid="8337185853050247304">"Aplikasi Instan"</string>
- <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
+ <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"Aplikasi dapat dibuka tanpa perlu diinstal."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"Aplikasi dapat dibuka tanpa perlu diinstal. Ketuk untuk mempelajari lebih lanjut."</string>
<string name="app_info" msgid="5153758994129963243">"Info aplikasi"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Membuka percakapan"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widget Percakapan"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ketuk percakapan untuk menambahkannya ke Layar utama"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kurang dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Lebih dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 3dd9dfa..8498676 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Forritið eða fyrirtækið þitt leyfir ekki skjámyndatöku"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Breyta"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Breyta skjámynd"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mynda meira"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Loka skjámynd"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Efri mörk"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Loka"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Snertu fingrafaralesarann"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingrafaratákn"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Andlit þekkist ekki. Notaðu fingrafar í staðinn."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Notaðu fingrafarið þitt til að halda áfram"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Fingrafar þekkist ekki. Notaðu skjálás í staðinn."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Leitar að þér ..."</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Andlitstákn"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Hnappur fyrir samhæfisaðdrátt."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Umsnúa litum"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Litaleiðrétting"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Fleiri stillingar"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Notandastillingar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Lokið"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Loka"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Tengt"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tengt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Tengist..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Þetta tæki tilheyrir <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er tengt við VPN-net"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Fyrirtækið þitt kann að fylgjast með netnotkun á vinnusniðinu þínu"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kann að fylgjast með netnotkun á vinnusniðinu þínu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Kerfisstjóri getur séð netvirkni á vinnusniðinu þínu"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Hugsanlega er fylgst með netinu"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Þetta tæki er tengt við VPN-net"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vinnusniðið þitt er tengt við <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Vekjari"</string>
<string name="wallet_title" msgid="5369767670735827105">"Veski"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Tilbúið"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Vinnusnið"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Flugstilling"</string>
<string name="add_tile" msgid="6239678623873086686">"Bæta reit við"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Opna samtal"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Samtalsgræjur"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ýttu á samtal til að bæta því á heimaskjáinn"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Komdu aftur hingað þegar þú hefur fengið skilaboð"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Forgangssamtöl"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nýleg samtöl"</string>
+ <string name="okay" msgid="6490552955618608554">"Í lagi"</string>
<string name="timestamp" msgid="6577851592534538533">"Fyrir <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Fyrir minna en <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Fyrir meira en <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 84b307b..306ce1f 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifica"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifica screenshot"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Acquisisci di più"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora screenshot"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superiore"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Ignora"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Tocca il sensore di impronte"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Icona dell\'impronta"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impossibile riconoscere il volto. Usa l\'impronta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Utilizza la tua impronta per continuare"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Impossibile riconoscere l\'impronta. Usa il blocco schermo."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"In attesa del volto…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Icona volto"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Pulsante zoom compatibilità."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverti colori"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modalità di correzione del colore"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Altre impostazioni"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Impostazioni utente"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fine"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Chiudi"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Connesso"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connesso, batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Connessione..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Questo dispositivo appartiene a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ed è collegato a VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"La tua organizzazione potrebbe monitorare il traffico di rete nel tuo profilo di lavoro"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> potrebbe monitorare il traffico di rete nel tuo profilo di lavoro"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"L\'attività di rete del tuo profilo di lavoro è visibile all\'amministratore IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"La rete potrebbe essere monitorata"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Questo dispositivo è collegato a VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Il tuo profilo di lavoro è collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Sveglia"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profilo di lavoro"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modalità aereo"</string>
<string name="add_tile" msgid="6239678623873086686">"Aggiungi riquadro"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Apri conversazione"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widget di conversazione"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tocca una conversazione per aggiungerla alla schermata Home"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Torna qui dopo aver ricevuto qualche messaggio"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversazioni prioritarie"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversazioni recenti"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> fa"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Meno di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Più di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 6699eea..8f00b73 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -29,7 +29,7 @@
<string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"נותרו <xliff:g id="PERCENTAGE">%1$s</xliff:g>, נשארו בערך <xliff:g id="TIME">%2$s</xliff:g> על סמך השימוש במכשיר"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"נותרו <xliff:g id="PERCENTAGE">%1$s</xliff:g>, נשארו בערך <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>. התכונה \'חיסכון בסוללה\' הופעלה."</string>
- <string name="invalid_charger" msgid="4370074072117767416">"לא ניתן לטעון באמצעות USB. ניתן להשתמש במטען שצורף למכשיר שלך."</string>
+ <string name="invalid_charger" msgid="4370074072117767416">"לא ניתן לטעון באמצעות USB. אפשר להשתמש במטען שצורף למכשיר שלך."</string>
<string name="invalid_charger_title" msgid="938685362320735167">"לא ניתן לטעון באמצעות USB"</string>
<string name="invalid_charger_text" msgid="2339310107232691577">"שימוש במטען שסופק עם המכשיר"</string>
<string name="battery_low_why" msgid="2056750982959359863">"הגדרות"</string>
@@ -44,28 +44,28 @@
<string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"אוטומטי"</string>
<string name="status_bar_settings_notifications" msgid="5285316949980621438">"התראות"</string>
<string name="bluetooth_tethered" msgid="4171071193052799041">"ה-Bluetooth שותף"</string>
- <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"הגדר שיטות קלט"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"הגדרת שיטות קלט"</string>
<string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"מקלדת פיזית"</string>
- <string name="usb_device_permission_prompt" msgid="4414719028369181772">"האם לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
+ <string name="usb_device_permission_prompt" msgid="4414719028369181772">"לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
<string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"האם לאפשר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה."</string>
<string name="usb_accessory_permission_prompt" msgid="717963550388312123">"האם לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
<string name="usb_device_confirm_prompt" msgid="4091711472439910809">"האם לפתוח את <xliff:g id="APPLICATION">%1$s</xliff:g> כדי לעבוד עם <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
<string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"לפתוח את <xliff:g id="APPLICATION">%1$s</xliff:g> לטיפול בהתקן <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nהאפליקציה הזו לא קיבלה הרשאה להקליט אך היא יכולה לתעד אודיו באמצעות התקן ה-USB הזה."</string>
- <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"האם לפתוח את <xliff:g id="APPLICATION">%1$s</xliff:g> כדי לעבוד עם <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
- <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"אין אפליקציות מותקנות הפועלות עם אביזר ה-USB. למידע נוסף על אביזר זה היכנס לכתובת <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"לפתוח את <xliff:g id="APPLICATION">%1$s</xliff:g> כדי לעבוד עם <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"אין אפליקציות מותקנות הפועלות עם אביזר ה-USB. למידע נוסף על האביזר הזה: <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="1236358027511638648">"אביזר USB"</string>
- <string name="label_view" msgid="6815442985276363364">"הצג"</string>
- <string name="always_use_device" msgid="210535878779644679">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> תמיד תיפתח כשהאביזר <xliff:g id="USB_DEVICE">%2$s</xliff:g> יחובר"</string>
+ <string name="label_view" msgid="6815442985276363364">"הצגה"</string>
+ <string name="always_use_device" msgid="210535878779644679">"תמיד לפתוח את האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> כשההתקן <xliff:g id="USB_DEVICE">%2$s</xliff:g> מחובר"</string>
<string name="always_use_accessory" msgid="1977225429341838444">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> תמיד תיפתח כשההתקן <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> יחובר"</string>
<string name="usb_debugging_title" msgid="8274884945238642726">"האם לאפשר ניפוי באגים ב-USB?"</string>
<string name="usb_debugging_message" msgid="5794616114463921773">"טביעת האצבע של מפתח ה-RSA של המחשב היא:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
- <string name="usb_debugging_always" msgid="4003121804294739548">"אפשר תמיד ממחשב זה"</string>
+ <string name="usb_debugging_always" msgid="4003121804294739548">"אפשר תמיד מהמחשב הזה"</string>
<string name="usb_debugging_allow" msgid="1722643858015321328">"יש אישור"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"לא ניתן לבצע ניפוי באגים ב-USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"לאשר ניפוי באגים אלחוטי ברשת הזו?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"שם הרשת (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nכתובת Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
- <string name="wifi_debugging_always" msgid="2968383799517975155">"אפשר תמיד ברשת זו"</string>
+ <string name="wifi_debugging_always" msgid="2968383799517975155">"אפשר תמיד ברשת הזו"</string>
<string name="wifi_debugging_allow" msgid="4573224609684957886">"אישור"</string>
<string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"אין הרשאה לניפוי באגים אלחוטי"</string>
<string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים אלחוטי. כדי להשתמש בתכונה הזו, יש לעבור אל המשתמש הראשי."</string>
@@ -74,23 +74,22 @@
<string name="usb_port_enabled" msgid="531823867664717018">"יציאת USB הופעלה לזיהוי מטענים ואביזרים"</string>
<string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"הפעלת USB"</string>
<string name="learn_more" msgid="4690632085667273811">"מידע נוסף"</string>
- <string name="compat_mode_on" msgid="4963711187149440884">"הגדל תצוגה כדי למלא את המסך"</string>
+ <string name="compat_mode_on" msgid="4963711187149440884">"הגדלת התצוגה למילוי המסך"</string>
<string name="compat_mode_off" msgid="7682459748279487945">"מתיחה למילוי של המסך"</string>
<string name="global_action_screenshot" msgid="2760267567509131654">"צילום מסך"</string>
<string name="remote_input_image_insertion_text" msgid="4850791636452521123">"נשלחה תמונה"</string>
- <string name="screenshot_saving_ticker" msgid="6519186952674544916">"שומר צילום מסך..."</string>
- <string name="screenshot_saving_title" msgid="2298349784913287333">"שומר צילום מסך..."</string>
+ <string name="screenshot_saving_ticker" msgid="6519186952674544916">"צילום המסך נשמר..."</string>
+ <string name="screenshot_saving_title" msgid="2298349784913287333">"המערכת שומרת את צילום המסך..."</string>
<string name="screenshot_saved_title" msgid="8893267638659083153">"צילום המסך נשמר"</string>
<string name="screenshot_saved_text" msgid="7778833104901642442">"אפשר להקיש כדי להציג את צילום המסך"</string>
- <string name="screenshot_failed_title" msgid="3259148215671936891">"לא ניתן היה לשמור צילום מסך"</string>
+ <string name="screenshot_failed_title" msgid="3259148215671936891">"לא ניתן היה לשמור את צילום המסך"</string>
<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_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_edit_label" msgid="8754981973544133050">"עריכה"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"עריכת צילום מסך"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"צילום תוכן נוסף"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"סגירת צילום מסך"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"הקצה העליון"</string>
@@ -125,7 +124,7 @@
<string name="use_mtp_button_title" msgid="5036082897886518086">"טעינה כנגן מדיה (MTP)"</string>
<string name="use_ptp_button_title" msgid="7676427598943446826">"טעינה כמצלמה (PTP)"</string>
<string name="installer_cd_button_title" msgid="5499998592841984743">"התקנת האפליקציה \'העברת קבצים ב-Android\' עבור Mac"</string>
- <string name="accessibility_back" msgid="6530104400086152611">"הקודם"</string>
+ <string name="accessibility_back" msgid="6530104400086152611">"חזרה"</string>
<string name="accessibility_home" msgid="5430449841237966217">"בית"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"תפריט"</string>
<string name="accessibility_accessibility_button" msgid="4089042473497107709">"נגישות"</string>
@@ -136,22 +135,22 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"טלפון"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"האסיסטנט"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"ביטול נעילה"</string>
- <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ממתין לטביעת אצבע"</string>
- <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"בטל את הנעילה בלי להשתמש בטביעת האצבע"</string>
+ <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"בהמתנה לטביעת אצבע"</string>
+ <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"ביטול הנעילה בלי להשתמש בטביעת האצבע"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"סורק פנים"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"שליחה"</string>
<string name="accessibility_manage_notification" msgid="582215815790143983">"ניהול התראות"</string>
- <string name="phone_label" msgid="5715229948920451352">"פתח את הטלפון"</string>
+ <string name="phone_label" msgid="5715229948920451352">"פתיחת הטלפון"</string>
<string name="voice_assist_label" msgid="3725967093735929020">"פתיחת האסיסטנט"</string>
- <string name="camera_label" msgid="8253821920931143699">"פתח את המצלמה"</string>
+ <string name="camera_label" msgid="8253821920931143699">"פתיחת המצלמה"</string>
<string name="cancel" msgid="1089011503403416730">"ביטול"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"אישור"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ניסיון נוסף"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"יש להקיש כדי לבטל את האימות"</string>
- <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"עליך לנסות שוב"</string>
+ <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"יש לנסות שוב"</string>
<string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"המערכת מחפשת את הפנים שלך"</string>
<string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"זיהוי הפנים בוצע"</string>
- <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"מאושר"</string>
+ <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"יש אישור"</string>
<string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"יש להקיש על \'אישור\' לסיום התהליך"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"מאומת"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"שימוש בקוד אימות"</string>
@@ -173,7 +172,7 @@
<string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"הזנה של קוד אימות שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string>
<string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string>
<string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"נעשו יותר מדי ניסיונות שגויים. הנתונים במכשיר יימחקו."</string>
- <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"נעשו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."</string>
+ <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"בוצעו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."</string>
<string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"נעשו יותר מדי ניסיונות שגויים. פרופיל העבודה הזה והנתונים המשויכים אליו יימחקו."</string>
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"סגירה"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"יש לגעת בחיישן טביעות האצבע"</string>
@@ -184,7 +183,7 @@
<skip />
<!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
<skip />
- <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"מחפש אותך…"</string>
+ <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"מתבצע חיפוש…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"סמל הפנים"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"לחצן מרחק מתצוגה של תאימות."</string>
<string name="accessibility_compatibility_zoom_example" msgid="2617218726091234073">"שינוי מרחק מתצוגה של מסך קטן לגדול יותר."</string>
@@ -197,7 +196,7 @@
<string name="accessibility_battery_full" msgid="1480463938961288494">"סוללה מלאה."</string>
<string name="accessibility_battery_unknown" msgid="1807789554617976440">"אחוז טעינת הסוללה לא ידוע."</string>
<string name="accessibility_wifi_name" msgid="4863440268606851734">"התבצע חיבור אל <xliff:g id="WIFI">%s</xliff:g>."</string>
- <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"מחובר אל <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
+ <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"התבצע חיבור אל <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
<string name="accessibility_cast_name" msgid="7344437925388773685">"מחובר אל <xliff:g id="CAST">%s</xliff:g>."</string>
<string name="accessibility_no_wimax" msgid="2014864207473859228">"ללא WiMAX."</string>
<string name="accessibility_wimax_one_bar" msgid="2996915709342221412">"פס אחד של WiMAX."</string>
@@ -228,7 +227,7 @@
<string name="accessibility_no_sims" msgid="5711270400476534667">"אין כרטיס SIM."</string>
<string name="accessibility_battery_details" msgid="6184390274150865789">"פתיחת פרטי סוללה"</string>
<string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> אחוזים של סוללה."</string>
- <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:<xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך: <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="accessibility_battery_level_charging" msgid="8892191177774027364">"הסוללה בטעינה, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string>
<string name="accessibility_settings_button" msgid="2197034218538913880">"הגדרות מערכת"</string>
<string name="accessibility_notifications_button" msgid="3960913924189228831">"התראות"</string>
@@ -243,14 +242,14 @@
<skip />
<!-- no translation found for accessibility_work_mode (1280025758672376313) -->
<skip />
- <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"התראה נדחתה."</string>
+ <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ההתראה נסגרה."</string>
<string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"לוח התראות."</string>
<string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"הגדרות מהירות."</string>
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"מסך נעילה."</string>
<string name="accessibility_desc_settings" msgid="6728577365389151969">"הגדרות"</string>
<string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"סקירה."</string>
- <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה בעבודה"</string>
- <string name="accessibility_desc_close" msgid="8293708213442107755">"סגור"</string>
+ <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה של עבודה"</string>
+ <string name="accessibility_desc_close" msgid="8293708213442107755">"סגירה"</string>
<string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi כבוי."</string>
<string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi מופעל."</string>
@@ -263,8 +262,8 @@
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"השתקה מוחלטת"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"רק התראות"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"נא לא להפריע."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'נא לא להפריע\' כבוי."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'נא לא להפריע\' פועל."</string>
+ <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"התכונה \'נא לא להפריע\' כבויה."</string>
+ <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"התכונה \'נא לא להפריע\' פועלת."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="3795983516942423240">"Bluetooth כבוי."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth מופעל."</string>
@@ -272,10 +271,10 @@
<string name="accessibility_quick_settings_bluetooth_connected" msgid="5237625393869747261">"Bluetooth מחובר."</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth נכבה."</string>
<string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth הופעל."</string>
- <string name="accessibility_quick_settings_location_off" msgid="6122523378294740598">"דיווח מיקום כבוי."</string>
+ <string name="accessibility_quick_settings_location_off" msgid="6122523378294740598">"התכונה \'דיווח מיקום\' כבויה."</string>
<string name="accessibility_quick_settings_location_on" msgid="6869947200325467243">"התכונה \'דיווח מיקום\' מופעלת."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"דיווח מיקום נכבה."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"דיווח מיקום הופעל."</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"התכונה \'דיווח מיקום\' הושבתה."</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"התכונה \'דיווח מיקום\' הופעלה."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ההתראה נקבעה ל-<xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="2974895537860082341">"סגירת הלוח."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"יותר זמן."</string>
@@ -304,7 +303,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1490779000057752281">"השימוש בנתוני 4G מושהה"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"חבילת הגלישה מושהה"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"השימוש בנתונים מושהה"</string>
- <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בחבילת גלישה.\n\nאם תמשיך, ייתכנו חיובים על שימוש בנתונים."</string>
+ <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"הגעת למגבלת הנתונים שהגדרת. כבר לא נעשה שימוש בחבילת הגלישה.\n\nהמשך הפעולה עשוי לגרום לחיובים על שימוש בנתונים."</string>
<string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"המשך"</string>
<string name="gps_notification_searching_text" msgid="231304732649348313">"מחפש GPS"</string>
<string name="gps_notification_found_text" msgid="3145873880174658526">"המיקום מוגדר על ידי GPS"</string>
@@ -325,11 +324,11 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"המסך נעול עכשיו לרוחב."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"המסך נעול כעת לאורך."</string>
<string name="accessibility_rotation_lock_off_changed" msgid="5772498370935088261">"המסך יסתובב עכשיו באופן אוטומטי."</string>
- <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"המסך נעול כעת לרוחב."</string>
+ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"המסך נעול עכשיו לרוחב."</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"המסך נעול כעת לאורך."</string>
<string name="dessert_case" msgid="9104973640704357717">"מזנון קינוחים"</string>
<string name="start_dreams" msgid="9131802557946276718">"שומר מסך"</string>
- <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
+ <string name="ethernet_label" msgid="2203544727007463351">"אתרנט"</string>
<string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"יש ללחוץ על הסמלים לחיצה ארוכה כדי לראות אפשרויות נוספות"</string>
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"נא לא להפריע"</string>
<string name="quick_settings_dnd_priority_label" msgid="6251076422352664571">"עדיפות בלבד"</string>
@@ -337,7 +336,7 @@
<string name="quick_settings_dnd_none_label" msgid="8420869988472836354">"שקט מוחלט"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> מכשירים)"</string>
- <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"Bluetooth מופסק"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"Bluetooth כבוי"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"אין מכשירים מותאמים זמינים"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> סוללה"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"אודיו"</string>
@@ -376,9 +375,9 @@
<string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"אין רשתות Wi-Fi זמינות"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"בתהליך הפעלה…"</string>
<string name="quick_settings_cast_title" msgid="2279220930629235211">"העברת מסך"</string>
- <string name="quick_settings_casting" msgid="1435880708719268055">"מעביר"</string>
+ <string name="quick_settings_casting" msgid="1435880708719268055">"מתבצעת העברה (cast)"</string>
<string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"מכשיר ללא שם"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"מוכן להעביר"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"המכשיר מוכן להעברה (cast)"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"אין מכשירים זמינים"</string>
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"אין חיבור ל-Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"בהירות"</string>
@@ -386,15 +385,13 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"היפוך צבעים"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"מצב תיקון צבע"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"הגדרות נוספות"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"הגדרות המשתמש"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"בוצע"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"סגירה"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"מחובר"</string>
- <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"מחובר, הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="quick_settings_connecting" msgid="2381969772953268809">"מתחבר..."</string>
- <string name="quick_settings_tethering_label" msgid="5257299852322475780">"שיתוף אינטרנט בין ניידים"</string>
+ <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"המכשיר מחובר. סוללה: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="quick_settings_connecting" msgid="2381969772953268809">"מתבצע חיבור..."</string>
+ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"שיתוף אינטרנט בין מכשירים"</string>
<string name="quick_settings_hotspot_label" msgid="1199196300038363424">"נקודת אינטרנט (hotspot)"</string>
<string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"ההפעלה מתבצעת…"</string>
<string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"חוסך הנתונים פועל"</string>
@@ -413,7 +410,7 @@
<string name="quick_settings_cellular_detail_over_limit" msgid="4561921367680636235">"חריגה מהמגבלה"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> בשימוש"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"הגבלה של <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"אזהרה - <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
+ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"אזהרה – <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_work_mode_label" msgid="2754212289804324685">"פרופיל עבודה"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"תאורת לילה"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"התכונה מופעלת בשקיעה"</string>
@@ -438,9 +435,9 @@
<string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"יש להחליק מעלה כדי להחליף אפליקציות"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"יש לגרור ימינה כדי לעבור במהירות בין אפליקציות"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"החלפת מצב של מסכים אחרונים"</string>
- <string name="expanded_header_battery_charged" msgid="5307907517976548448">"טעון"</string>
+ <string name="expanded_header_battery_charged" msgid="5307907517976548448">"הסוללה טעונה"</string>
<string name="expanded_header_battery_charging" msgid="1717522253171025549">"בטעינה"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> עד למילוי"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> לטעינה מלאה"</string>
<string name="expanded_header_battery_not_charging" msgid="809409140358955848">"לא בטעינה"</string>
<string name="ssl_ca_cert_warning" msgid="8373011375250324005">"ייתכן שהרשת\nמנוטרת"</string>
<string name="description_target_search" msgid="3875069993128855865">"חיפוש"</string>
@@ -449,7 +446,7 @@
<string name="zen_priority_introduction" msgid="3159291973383796646">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
<string name="zen_alarms_introduction" msgid="3987266042682300470">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
<string name="zen_priority_customize_button" msgid="4119213187257195047">"התאמה אישית"</string>
- <string name="zen_silence_introduction_voice" msgid="853573681302712348">"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר."</string>
+ <string name="zen_silence_introduction_voice" msgid="853573681302712348">"הפעולה הזו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. עדיין ניתן לבצע שיחות."</string>
<string name="zen_silence_introduction" msgid="6117517737057344014">"הפעולה הזו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים."</string>
<string name="keyguard_more_overflow_text" msgid="5819512373606638727">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="7248696377626341060">"התראות בדחיפות נמוכה יותר מופיעות בהמשך"</string>
@@ -460,10 +457,10 @@
<string name="do_disclosure_generic" msgid="4896482821974707167">"המכשיר הזה שייך לארגון שלך"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"המכשיר הזה שייך לארגון <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"המכשיר הזה התקבל מ-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
- <string name="phone_hint" msgid="6682125338461375925">"החלק מהסמל כדי להפעיל את הטלפון"</string>
+ <string name="phone_hint" msgid="6682125338461375925">"צריך להחליק מהסמל כדי להפעיל את הטלפון"</string>
<string name="voice_hint" msgid="7476017460191291417">"יש להחליק מהסמל כדי להפעיל את האסיסטנט"</string>
<string name="camera_hint" msgid="4519495795000658637">"צריך להחליק מהסמל כדי להפעיל את המצלמה"</string>
- <string name="interruption_level_none_with_warning" msgid="8394434073508145437">"שקט מוחלט. הגדרה זו תשתיק גם קוראי מסך."</string>
+ <string name="interruption_level_none_with_warning" msgid="8394434073508145437">"שקט מוחלט. ההגדרה הזו תשתיק גם קוראי מסך."</string>
<string name="interruption_level_none" msgid="219484038314193379">"שקט מוחלט"</string>
<string name="interruption_level_priority" msgid="661294280016622209">"עדיפות בלבד"</string>
<string name="interruption_level_alarms" msgid="2457850481335846959">"התראות בלבד"</string>
@@ -475,26 +472,26 @@
<string name="keyguard_indication_charging_time_fast" msgid="7895986003578341126">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה מהירה (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום)"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="245442950133408398">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה איטית (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"החלפת משתמש"</string>
- <string name="accessibility_multi_user_switch_switcher_with_current" msgid="5759855008166759399">"החלף משתמש. המשתמש הנוכחי הוא <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
+ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="5759855008166759399">"החלפת משתמש. המשתמש הנוכחי: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="383168614528618402">"משתמש נוכחי <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
- <string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"הצג פרופיל"</string>
+ <string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"הצגת פרופיל"</string>
<string name="user_add_user" msgid="4336657383006913022">"הוספת משתמש"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"משתמש חדש"</string>
<string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"להסיר אורח?"</string>
- <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"כל האפליקציות והנתונים בפעילות זו באתר יימחקו."</string>
+ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"כל האפליקציות והנתונים בסשן הזה יימחקו."</string>
<string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"הסרה"</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"שמחים לראותך שוב!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"האם ברצונך להמשיך בפעילות באתר?"</string>
- <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ברצוני להתחיל מחדש"</string>
- <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"כן, המשך"</string>
+ <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"סשן חדש"</string>
+ <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"כן, להמשיך"</string>
<string name="guest_notification_title" msgid="4434456703930764167">"משתמש אורח"</string>
- <string name="guest_notification_text" msgid="4202692942089571351">"הסר את המשתמש האורח כדי למחוק אפליקציות ונתונים"</string>
- <string name="guest_notification_remove_action" msgid="4153019027696868099">"הסר אורח"</string>
+ <string name="guest_notification_text" msgid="4202692942089571351">"יש להסיר את המשתמש האורח כדי למחוק אפליקציות ונתונים"</string>
+ <string name="guest_notification_remove_action" msgid="4153019027696868099">"הסרת אורח"</string>
<string name="user_logout_notification_title" msgid="3644848998053832589">"ניתוק משתמש"</string>
- <string name="user_logout_notification_text" msgid="7441286737342997991">"צא מהמשתמש הנוכחי"</string>
- <string name="user_logout_notification_action" msgid="7974458760719361881">"נתק משתמש"</string>
+ <string name="user_logout_notification_text" msgid="7441286737342997991">"ניתוק המשתמש הנוכחי"</string>
+ <string name="user_logout_notification_action" msgid="7974458760719361881">"ניתוק משתמש"</string>
<string name="user_add_user_title" msgid="4172327541504825032">"להוסיף משתמש חדש?"</string>
- <string name="user_add_user_message_short" msgid="2599370307878014791">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string>
+ <string name="user_add_user_message_short" msgid="2599370307878014791">"כשמוסיפים משתמש חדש, המשתמש הזה צריך להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string>
<string name="user_limit_reached_title" msgid="2429229448830346057">"הגעת למגבלת המשתמשים שניתן להוסיף"</string>
<plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398">
<item quantity="two">ניתן להוסיף עד <xliff:g id="COUNT">%d</xliff:g> משתמשים.</item>
@@ -502,7 +499,7 @@
<item quantity="other">ניתן להוסיף עד <xliff:g id="COUNT">%d</xliff:g> משתמשים.</item>
<item quantity="one">ניתן ליצור רק משתמש אחד.</item>
</plurals>
- <string name="user_remove_user_title" msgid="9124124694835811874">"האם להסיר את המשתמש?"</string>
+ <string name="user_remove_user_title" msgid="9124124694835811874">"להסיר את המשתמש?"</string>
<string name="user_remove_user_message" msgid="6702834122128031833">"כל האפליקציות והנתונים של המשתמש הזה יימחקו."</string>
<string name="user_remove_user_remove" msgid="8387386066949061256">"הסרה"</string>
<string name="battery_saver_notification_title" msgid="8419266546034372562">"תכונת החיסכון בסוללה פועלת"</string>
@@ -512,7 +509,7 @@
<string name="media_projection_dialog_service_text" msgid="958000992162214611">"לשירות שמספק את הפונקציה הזו תהיה גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך בזמן הקלטה או העברה (cast). זה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."</string>
<string name="media_projection_dialog_service_title" msgid="2888507074107884040">"להתחיל להקליט או להעביר (cast)?"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"להתחיל להקליט או להעביר (cast) באמצעות <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
- <string name="media_projection_remember_text" msgid="6896767327140422951">"אל תציג שוב"</string>
+ <string name="media_projection_remember_text" msgid="6896767327140422951">"לא להציג שוב"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכול"</string>
<string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string>
<string name="manage_notifications_history_text" msgid="57055985396576230">"היסטוריה"</string>
@@ -528,7 +525,7 @@
<string name="vpn_footer" msgid="3457155078010607471">"ייתכן שהרשת נמצאת במעקב"</string>
<string name="branded_vpn_footer" msgid="816930186313188514">"ייתכן שהרשת מנוטרת"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"המכשיר הזה מנוהל על ידי ההורה שלך"</string>
- <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"הארגון שלך הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת"</string>
+ <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"הארגון שלך הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת"</string>
<string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"הארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת"</string>
<string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"המכשיר הזה התקבל מ-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"המכשיר הזה שייך לארגון שלך, והוא מחובר ל-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"המכשיר הזה שייך לארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> והוא מחובר לרשתות VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"הארגון שלך יכול לנטר את התנועה ברשת בפרופיל העבודה שלך"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"הארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> עשוי לנטר את התנועה ברשת בפרופיל העבודה שלך"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"הפעילות ברשת של פרופיל עבודה גלויה למנהל ה-IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ייתכן שהרשת מנוטרת"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"המכשיר הזה מחובר לרשתות VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"פרופיל העבודה שלך מחובר ל-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -566,11 +562,11 @@
<string name="monitoring_description_management_network_logging" msgid="216983105036994771">"מנהל המערכת הפעיל את התכונה \'רישום התנועה ברשת\', שמנטרת את תנועת הנתונים במכשיר."</string>
<string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים בפרופיל העבודה, אבל לא בפרופיל האישי."</string>
<string name="monitoring_description_named_vpn" msgid="5749932930634037027">"התחברת לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
- <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"אתה מחובר לאפליקציות <xliff:g id="VPN_APP_0">%1$s</xliff:g> ו-<xliff:g id="VPN_APP_1">%2$s</xliff:g>, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"התחברת לאפליקציות <xliff:g id="VPN_APP_0">%1$s</xliff:g> ו-<xliff:g id="VPN_APP_1">%2$s</xliff:g>, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"פרופיל העבודה שלך מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"הפרופיל האישי שלך מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"המכשיר שלך מנוהל על ידי <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
- <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> משתמש באפליקציה <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> כדי לנהל את מכשירך."</string>
+ <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"ארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> משתמש באפליקציה <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> כדי לנהל את המכשיר שלך."</string>
<string name="monitoring_description_do_body" msgid="7700878065625769970">"מנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string>
<string name="monitoring_description_do_learn_more" msgid="645149183455573790">"למידע נוסף"</string>
@@ -579,25 +575,25 @@
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"להגדרות ה-VPN"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"פתיחה של פרטי הכניסה המהימנים"</string>
- <string name="monitoring_description_network_logging" msgid="577305979174002252">"מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, צור קשר עם מנהל המערכת."</string>
+ <string name="monitoring_description_network_logging" msgid="577305979174002252">"מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, אפשר ליצור קשר עם מנהל המערכת."</string>
<string name="monitoring_description_vpn" msgid="1685428000684586870">"נתת לאפליקציה כלשהי הרשאה להגדיר חיבור VPN.\n\nהאפליקציה הזו יכולה לעקוב אחר הפעילות שלך ברשת ובמכשיר, כולל הודעות אימייל, אפליקציות ואתרים."</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"פרופיל העבודה שלך מנוהל על-ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\n מנהל המערכת שלך יכול לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\n למידע נוסף, צור קשר עם מנהל המערכת.\n\nבנוסף, אתה מחובר ל-VPN, שגם באמצעותו ניתן לעקוב אחרי הפעילות שלך ברשת."</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"פרופיל העבודה שלך מנוהל על-ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\n מנהל המערכת שלך יכול לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\n למידע נוסף, יש ליצור קשר עם מנהל המערכת.\n\nבנוסף, התבצע חיבור ל-VPN, שגם באמצעותו ניתן לעקוב אחרי הפעילות שלך ברשת."</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"מכשיר זה מנוהל על ידי ההורה שלך. להורה שלך יש אפשרות לצפות בפרטים כמו האפליקציות שבשימוש, המיקום וזמן המסך שלך, ולנהל אותם."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
- <string name="monitoring_description_app" msgid="376868879287922929">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
+ <string name="monitoring_description_app" msgid="376868879287922929">"התחברת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_app_personal" msgid="1970094872688265987">"התחברת לאפליקציית <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
- <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."</string>
- <string name="monitoring_description_app_work" msgid="3713084153786663662">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הפרופיל מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת."</string>
+ <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"התחברת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."</string>
+ <string name="monitoring_description_app_work" msgid="3713084153786663662">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הפרופיל מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, יש לפנות למנהל המערכת."</string>
<string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הפרופיל מחובר לאפליקציה <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nהפרופיל מחובר גם לאפליקציה <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת."</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"הנעילה נמנעת על ידי סביבה אמינה"</string>
<string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"המכשיר יישאר נעול עד שהנעילה שלו תבוטל באופן ידני"</string>
<string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string>
<string name="hidden_notifications_title" msgid="1782412844777612795">"קבלה מהירה של התראות"</string>
- <string name="hidden_notifications_text" msgid="5899627470450792578">"צפה בהן לפני שתבטל נעילה"</string>
+ <string name="hidden_notifications_text" msgid="5899627470450792578">"הצגת ההתראות לפני ביטול הנעילה"</string>
<string name="hidden_notifications_cancel" msgid="4805370226181001278">"לא, תודה"</string>
<string name="hidden_notifications_setup" msgid="2064795578526982467">"הגדרה"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <string name="volume_zen_end_now" msgid="5901885672973736563">"כבה עכשיו"</string>
+ <string name="volume_zen_end_now" msgid="5901885672973736563">"כיבוי"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"הגדרות צליל"</string>
<string name="accessibility_volume_expand" msgid="7653070939304433603">"הרחבה"</string>
<string name="accessibility_volume_collapse" msgid="2746845391013829996">"כיווץ"</string>
@@ -624,7 +620,7 @@
<string name="screen_pinning_exit" msgid="4553787518387346893">"הצמדת האפליקציה בוטלה"</string>
<string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"להסתיר את <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"יופיע מחדש בפעם הבאה שהאפשרות הזו תופעל בהגדרות."</string>
- <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"הסתר"</string>
+ <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"הסתרה"</string>
<string name="stream_voice_call" msgid="7468348170702375660">"שיחה"</string>
<string name="stream_system" msgid="7663148785370565134">"מערכת"</string>
<string name="stream_ring" msgid="7550670036738697526">"צלצול"</string>
@@ -640,9 +636,9 @@
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"השתקה"</string>
<string name="qs_status_phone_vibrate" msgid="7055409506885541979">"הטלפון במצב רטט"</string>
<string name="qs_status_phone_muted" msgid="3763664791309544103">"הטלפון מושתק"</string>
- <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. הקש כדי לבטל את ההשתקה."</string>
+ <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. יש להקיש כדי לבטל את ההשתקה."</string>
<string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. צריך להקיש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."</string>
- <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."</string>
+ <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. יש להקיש כדי להשתיק. ייתכן ששירותי הנגישות יושתקו."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. יש להקיש כדי להעביר למצב רטט."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. יש להקיש כדי להשתיק."</string>
<string name="volume_ringer_change" msgid="3574969197796055532">"יש להקיש כדי לשנות את מצב תוכנת הצלצול"</string>
@@ -654,13 +650,13 @@
<string name="output_title" msgid="3938776561655668350">"פלט מדיה"</string>
<string name="output_calls_title" msgid="7085583034267889109">"פלט שיחת טלפון"</string>
<string name="output_none_found" msgid="5488087293120982770">"לא נמצאו מכשירים"</string>
- <string name="output_none_found_service_off" msgid="935667567681386368">"לא נמצאו מכשירים. יש לנסות להפעיל <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
+ <string name="output_none_found_service_off" msgid="935667567681386368">"לא נמצאו מכשירים. אפשר לנסות להפעיל <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
<string name="output_service_bt" msgid="4315362133973911687">"Bluetooth"</string>
<string name="output_service_wifi" msgid="9003667810868222134">"Wi-Fi"</string>
<string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth ו-Wi-Fi"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
- <string name="show_battery_percentage" msgid="6235377891802910455">"הצג בשורת הסטטוס את אחוז עוצמת הסוללה"</string>
- <string name="show_battery_percentage_summary" msgid="9053024758304102915">"הצג את אחוז עוצמת הסוללה בתוך הסמל שבשורת הסטטוס כשהמכשיר אינו בטעינה"</string>
+ <string name="show_battery_percentage" msgid="6235377891802910455">"הצגה של אחוז עוצמת הסוללה בשורת הסטטוס"</string>
+ <string name="show_battery_percentage_summary" msgid="9053024758304102915">"הצגה של אחוז עוצמת הסוללה בתוך הסמל שבשורת הסטטוס כשהמכשיר אינו בטעינה"</string>
<string name="quick_settings" msgid="6211774484997470203">"הגדרות מהירות"</string>
<string name="status_bar" msgid="4357390266055077437">"שורת סטטוס"</string>
<string name="overview" msgid="3522318590458536816">"סקירה"</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"אתרנט"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"התראה"</string>
<string name="wallet_title" msgid="5369767670735827105">"ארנק"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"מוכן"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"פרופיל עבודה"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"מצב טיסה"</string>
<string name="add_tile" msgid="6239678623873086686">"הוספת אריח"</string>
@@ -683,11 +685,11 @@
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"נקודת אינטרנט (hotspot)"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"פרופיל עבודה"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"מהנה בשביל חלק מהאנשים, אבל לא בשביל כולם"</string>
- <string name="tuner_warning" msgid="1861736288458481650">"System UI Tuner מספק לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string>
- <string name="tuner_persistent_warning" msgid="230466285569307806">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string>
+ <string name="tuner_warning" msgid="1861736288458481650">"התכונה System UI Tuner מספקת לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, לא לעבוד כראוי או להיעלם בגרסאות עתידיות. יש להמשיך בזהירות."</string>
+ <string name="tuner_persistent_warning" msgid="230466285569307806">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. יש להמשיך בזהירות."</string>
<string name="got_it" msgid="477119182261892069">"הבנתי"</string>
- <string name="tuner_toast" msgid="3812684836514766951">"מזל טוב! ה-System UI Tuner נוסף ל\'הגדרות\'"</string>
- <string name="remove_from_settings" msgid="633775561782209994">"הסר מההגדרות"</string>
+ <string name="tuner_toast" msgid="3812684836514766951">"מעולה, ה-System UI Tuner נוסף ל\'הגדרות\'"</string>
+ <string name="remove_from_settings" msgid="633775561782209994">"הסרה מההגדרות"</string>
<string name="remove_from_settings_prompt" msgid="551565437265615426">"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string>
<string name="activity_not_found" msgid="8711661533828200293">"האפליקציה אינה מותקנת במכשיר"</string>
<string name="clock_seconds" msgid="8709189470828542071">"הצגת שניות בשעון"</string>
@@ -705,25 +707,25 @@
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"פקדים של הודעות הפעלה"</string>
<string name="tuner_full_importance_settings_on" msgid="917981436602311547">"פועל"</string>
<string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"כבוי"</string>
- <string name="power_notification_controls_description" msgid="1334963837572708952">"בעזרת פקדים של התראות הפעלה, אפשר להגדיר רמת חשיבות מ-0 עד 5 להתראות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצגה בראש רשימת ההתראות \n- אפשר הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מנע הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n- הסתרה ממסך הנעילה ומשורת הסטטוס \n- הצגה בתחתית רשימת ההתראות \n\n"<b>"רמה 0"</b>" \n- חסימה את כל ההתראות מהאפליקציה"</string>
+ <string name="power_notification_controls_description" msgid="1334963837572708952">"בעזרת פקדים של התראות הפעלה, אפשר להגדיר רמת חשיבות מ-0 עד 5 להתראות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצגה בראש רשימת ההתראות \n- לאפשר הפרעה במסך מלא \n- תמיד לאפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מניעת הפרעה במסך מלא \n- תמיד לאפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n- אף פעם לא לאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n- אף פעם לא לאפשר קול ורטט \n- הסתרה ממסך הנעילה ומשורת הסטטוס \n- הצגה בתחתית רשימת ההתראות \n\n"<b>"רמה 0"</b>" \n- חסימת כל ההתראות מהאפליקציה"</string>
<string name="notification_header_default_channel" msgid="225454696914642444">"התראות"</string>
<string name="notification_channel_disabled" msgid="928065923928416337">"ההתראות האלה לא יוצגו לך יותר"</string>
<string name="notification_channel_minimized" msgid="6892672757877552959">"ההתראות האלה ימוזערו"</string>
- <string name="notification_channel_silenced" msgid="1995937493874511359">"התראות אלה יוצגו ללא צליל"</string>
- <string name="notification_channel_unsilenced" msgid="94878840742161152">"הודעות אלה יישלחו כהתראה"</string>
- <string name="inline_blocking_helper" msgid="2891486013649543452">"התראות אלה בדרך כלל נדחות על ידך. \nלהמשיך להציג אותן?"</string>
+ <string name="notification_channel_silenced" msgid="1995937493874511359">"ההתראות האלה יוצגו ללא צליל"</string>
+ <string name="notification_channel_unsilenced" msgid="94878840742161152">"ההודעות אלה יישלחו כהתראות"</string>
+ <string name="inline_blocking_helper" msgid="2891486013649543452">"ההתראות האלה בדרך כלל נדחות על ידך. \nלהמשיך להציג אותן?"</string>
<string name="inline_done_button" msgid="6043094985588909584">"סיום"</string>
<string name="inline_ok_button" msgid="603075490581280343">"החלה"</string>
<string name="inline_keep_showing" msgid="8736001253507073497">"שנמשיך להציג לך את ההתראות האלה?"</string>
<string name="inline_stop_button" msgid="2453460935438696090">"לא, אל תמשיכו"</string>
<string name="inline_deliver_silently_button" msgid="2714314213321223286">"הצגה ללא צליל"</string>
<string name="inline_block_button" msgid="479892866568378793">"חסימה"</string>
- <string name="inline_keep_button" msgid="299631874103662170">"כן, המשיכו"</string>
+ <string name="inline_keep_button" msgid="299631874103662170">"כן, תמשיכו להציג"</string>
<string name="inline_minimize_button" msgid="1474436209299333445">"מזעור"</string>
<string name="inline_silent_button_silent" msgid="525243786649275816">"שקטה"</string>
<string name="inline_silent_button_stay_silent" msgid="2129254868305468743">"בשקט"</string>
<string name="inline_silent_button_alert" msgid="5705343216858250354">"שליחת התראות"</string>
- <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"המשך שליחת התראות"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"להמשיך לשלוח התראות"</string>
<string name="inline_turn_off_notifications" msgid="8543989584403106071">"השבתת ההתראות"</string>
<string name="inline_keep_showing_app" msgid="4393429060390649757">"שנמשיך להציג לך התראות מהאפליקציה הזאת?"</string>
<string name="notification_silence_title" msgid="8608090968400832335">"שקט"</string>
@@ -747,7 +749,7 @@
<string name="notification_multichannel_desc" msgid="7414593090056236179">"לא ניתן להגדיר כאן את קבוצת ההתראות הזו"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"התראה דרך שרת proxy"</string>
<string name="notification_channel_dialog_title" msgid="6856514143093200019">"כל ההתראות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="see_more_title" msgid="7409317011708185729">"הצגת עוד"</string>
+ <string name="see_more_title" msgid="7409317011708185729">"עוד"</string>
<string name="appops_camera" msgid="5215967620896725715">"האפליקציה הזו משתמשת במצלמה."</string>
<string name="appops_microphone" msgid="8805468338613070149">"האפליקציה הזו משתמשת במיקרופון."</string>
<string name="appops_overlay" msgid="4822261562576558490">"האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך."</string>
@@ -761,12 +763,12 @@
<string name="feedback_silenced" msgid="9116540317466126457">"ההתראה הזו <b>הורדה בדרגה ל\'שקט\'</b> באופן אוטומטי על-ידי המערכת."</string>
<string name="feedback_promoted" msgid="2125562787759780807">"ההתראה הזו <b>דורגה גבוה יותר</b> באופן אוטומטי בהתראות שלך."</string>
<string name="feedback_demoted" msgid="951884763467110604">"ההתראה הזו <b>דורגה נמוך יותר</b&gt באופן אוטומטי בהתראות שלך."</string>
- <string name="feedback_prompt" msgid="3656728972307896379">"אפשר לשלוח למפתח את המשוב שלך. האם פעולה זו הייתה נכונה?"</string>
+ <string name="feedback_prompt" msgid="3656728972307896379">"אפשר לשלוח למפתח את המשוב שלך. הפעולה הזו הייתה נכונה?"</string>
<string name="feedback_response" msgid="4671729244976641339">"תודה על המשוב!"</string>
<string name="feedback_ok" msgid="6481426753298857144">"אישור"</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_channel_switch_accessibility" msgid="8979885820432540252">"התר התראות מערוץ זה"</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_channel_switch_accessibility" msgid="8979885820432540252">"אישור קבלת התראות מהערוץ הזה"</string>
<string name="notification_more_settings" msgid="4936228656989201793">"הגדרות נוספות"</string>
<string name="notification_app_settings" msgid="8963648463858039377">"התאמה אישית"</string>
<string name="notification_done" msgid="6215117625922713976">"סיום"</string>
@@ -799,7 +801,7 @@
<item quantity="one">דקה</item>
</plurals>
<string name="battery_panel_title" msgid="5931157246673665963">"שימוש בסוללה"</string>
- <string name="battery_detail_charging_summary" msgid="8821202155297559706">"תכונת החיסכון בסוללה אינה זמינה בעת טעינת המכשיר"</string>
+ <string name="battery_detail_charging_summary" msgid="8821202155297559706">"תכונת החיסכון בסוללה לא זמינה כשהמכשיר בטעינה"</string>
<string name="battery_detail_switch_title" msgid="6940976502957380405">"חיסכון בסוללה"</string>
<string name="battery_detail_switch_summary" msgid="3668748557848025990">"מפחיתה את רמת הביצועים ואת נתוני הרקע"</string>
<string name="keyboard_key_button_template" msgid="8005673627272051429">"לחצן <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -814,11 +816,11 @@
<string name="keyboard_key_space" msgid="6980847564173394012">"רווח"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Enter"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"BACKSPACE"</string>
- <string name="keyboard_key_media_play_pause" msgid="8389984232732277478">"הפעל/השהה"</string>
- <string name="keyboard_key_media_stop" msgid="1509943745250377699">"עצור"</string>
+ <string name="keyboard_key_media_play_pause" msgid="8389984232732277478">"הפעלה/השהיה"</string>
+ <string name="keyboard_key_media_stop" msgid="1509943745250377699">"עצירה"</string>
<string name="keyboard_key_media_next" msgid="8502476691227914952">"הבא"</string>
<string name="keyboard_key_media_previous" msgid="5637875709190955351">"הקודם"</string>
- <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"הרץ אחורה"</string>
+ <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"הרצה אחורה"</string>
<string name="keyboard_key_media_fast_forward" msgid="3572444327046911822">"הרצה קדימה"</string>
<string name="keyboard_key_page_up" msgid="173914303254199845">"דפדוף למעלה"</string>
<string name="keyboard_key_page_down" msgid="9035902490071829731">"דפדוף למטה"</string>
@@ -844,7 +846,7 @@
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"מוזיקה"</string>
<string name="keyboard_shortcut_group_applications_youtube" msgid="5078136084632450333">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"יומן"</string>
- <string name="tuner_full_zen_title" msgid="5120366354224404511">"הצג עם פקדי עוצמת הקול"</string>
+ <string name="tuner_full_zen_title" msgid="5120366354224404511">"הצגה עם פקדי עוצמת הקול"</string>
<string name="volume_and_do_not_disturb" msgid="502044092739382832">"נא לא להפריע"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"קיצור דרך ללחצני עוצמת קול"</string>
<string name="volume_up_silent" msgid="1035180298885717790">"יציאה ממצב \'נא לא להפריע\' בלחיצה על הלחצן להגברת עוצמת הקול"</string>
@@ -889,19 +891,19 @@
<string name="right_icon" msgid="1103955040645237425">"סמל ימני"</string>
<string name="drag_to_add_tiles" msgid="8933270127508303672">"יש ללחוץ ולגרור כדי להוסיף אריחים"</string>
<string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"יש ללחוץ ולגרור כדי לסדר מחדש את האריחים"</string>
- <string name="drag_to_remove_tiles" msgid="4682194717573850385">"גרור לכאן כדי להסיר"</string>
+ <string name="drag_to_remove_tiles" msgid="4682194717573850385">"אפשר לגרור לכאן כדי להסיר"</string>
<string name="drag_to_remove_disabled" msgid="933046987838658850">"יש צורך ב-<xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> אריחים לפחות"</string>
<string name="qs_edit" msgid="5583565172803472437">"עריכה"</string>
<string name="tuner_time" msgid="2450785840990529997">"שעה"</string>
<string-array name="clock_options">
<item msgid="3986445361435142273">"הצגת שעות, דקות ושניות"</item>
- <item msgid="1271006222031257266">"הצג שעות ודקות (ברירת מחדל)"</item>
+ <item msgid="1271006222031257266">"הצגת שעות ודקות (ברירת מחדל)"</item>
<item msgid="6135970080453877218">"לא להציג את הסמל הזה"</item>
</string-array>
<string-array name="battery_options">
- <item msgid="7714004721411852551">"הצג תמיד באחוזים"</item>
+ <item msgid="7714004721411852551">"תמיד להציג באחוזים"</item>
<item msgid="3805744470661798712">"הצגת אחוזים בזמן הטעינה (ברירת מחדל)"</item>
- <item msgid="8619482474544321778">"אל תציג את הסמל הזה"</item>
+ <item msgid="8619482474544321778">"אל תציגו את הסמל הזה"</item>
</string-array>
<string name="tuner_low_priority" msgid="8412666814123009820">"הצגת סמלי התראות בעדיפות נמוכה"</string>
<string name="other" msgid="429768510980739978">"אחר"</string>
@@ -924,7 +926,7 @@
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"בחירת משתמש"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"אין אינטרנט"</string>
<string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"פתיחת פרטים."</string>
- <string name="accessibility_quick_settings_not_available" msgid="6860875849497473854">"לא זמין כי <xliff:g id="REASON">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_not_available" msgid="6860875849497473854">"לא זמינים כי <xliff:g id="REASON">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"פתיחת הגדרות של <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"עריכת סדר ההגדרות."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"תפריט הפעלה"</string>
@@ -936,17 +938,17 @@
<string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"לצפייה בשלבי הטיפול"</string>
<string name="high_temp_title" msgid="2218333576838496100">"הטלפון מתחמם"</string>
<string name="high_temp_notif_message" msgid="1277346543068257549">"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string>
- <string name="high_temp_dialog_message" msgid="3793606072661253968">"קירור הטלפון ייעשה באופן אוטומטי. תוכל עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string>
+ <string name="high_temp_dialog_message" msgid="3793606072661253968">"קירור הטלפון ייעשה באופן אוטומטי. ניתן עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string>
<string name="high_temp_dialog_help_text" msgid="7380171287943345858">"לצפייה בשלבי הטיפול"</string>
<string name="high_temp_alarm_title" msgid="2359958549570161495">"יש לנתק את המטען"</string>
- <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"יש בעיה עם טעינת מכשיר זה. יש לנתק את מתאם המתח בזהירות כיוון שייתכן שהכבל חם."</string>
+ <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"יש בעיה עם הטעינה של המכשיר הזה. צריך לנתק את מתאם המתח בזהירות כי הכבל עלול להיות חם."</string>
<string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"לצפייה בשלבי הטיפול"</string>
<string name="lockscreen_shortcut_left" msgid="1238765178956067599">"קיצור דרך שמאלי"</string>
<string name="lockscreen_shortcut_right" msgid="4138414674531853719">"קיצור דרך ימני"</string>
<string name="lockscreen_unlock_left" msgid="1417801334370269374">"קיצור דרך שמאלי גם מבטל נעילה"</string>
<string name="lockscreen_unlock_right" msgid="4658008735541075346">"קיצור דרך ימני גם מבטל נעילה"</string>
<string name="lockscreen_none" msgid="4710862479308909198">"ללא"</string>
- <string name="tuner_launch_app" msgid="3906265365971743305">"הפעל את האפליקציה <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_launch_app" msgid="3906265365971743305">"הפעלת האפליקציה <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="tuner_other_apps" msgid="7767462881742291204">"אפליקציות אחרות"</string>
<string name="tuner_circle" msgid="5270591778160525693">"מעגל"</string>
<string name="tuner_plus" msgid="4130366441154416484">"פלוס"</string>
@@ -962,12 +964,12 @@
<string name="notification_channel_storage" msgid="2720725707628094977">"אחסון"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"טיפים"</string>
<string name="instant_apps" msgid="8337185853050247304">"אפליקציות ללא התקנה"</string>
- <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> פועלת"</string>
+ <string name="instant_apps_title" msgid="8942706782103036910">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"האפליקציה נפתחת בלי התקנה."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"האפליקציה נפתחת בלי התקנה. אפשר להקיש כדי לקבל מידע נוסף."</string>
<string name="app_info" msgid="5153758994129963243">"פרטי האפליקציה"</string>
<string name="go_to_web" msgid="636673528981366511">"מעבר אל הדפדפן"</string>
- <string name="mobile_data" msgid="4564407557775397216">"נתונים סלולריים"</string>
+ <string name="mobile_data" msgid="4564407557775397216">"חבילת גלישה"</string>
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi כבוי"</string>
@@ -975,16 +977,16 @@
<string name="dnd_is_off" msgid="3185706903793094463">"מצב \'נא לא להפריע\' כבוי"</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_auto_rule_app" msgid="1841469944118486580">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה או על ידי כלל אוטומטי."</string>
<string name="qs_dnd_until" msgid="7844269319043747955">"עד <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="3829697305432866434">"שמירה"</string>
- <string name="qs_dnd_replace" msgid="7712119051407052689">"החלף"</string>
+ <string name="qs_dnd_replace" msgid="7712119051407052689">"שינוי"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"אפליקציות שפועלות ברקע"</string>
- <string name="running_foreground_services_msg" msgid="3009459259222695385">"הקש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
+ <string name="running_foreground_services_msg" msgid="3009459259222695385">"אפשר להקיש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"לכבות את חבילת הגלישה?"</string>
<string name="mobile_data_disable_message" msgid="8604966027899770415">"לא תהיה לך גישה לנתונים או לאינטרנט באמצעות <xliff:g id="CARRIER">%s</xliff:g>. אינטרנט יהיה זמין רק באמצעות Wi-Fi."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"הספק שלך"</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_0">%1$s</xliff:g> להציג חלקים מ-<xliff:g id="APP_2">%2$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>
@@ -999,7 +1001,7 @@
<string name="open_saver_setting_action" msgid="2111461909782935190">"הגדרות"</string>
<string name="auto_saver_okay_action" msgid="7815925750741935386">"הבנתי"</string>
<string name="heap_dump_tile_name" msgid="2464189856478823046">"ערימת Dump SysUI"</string>
- <string name="ongoing_privacy_chip_content_single_app" msgid="2969750601815230385">"<xliff:g id="APP">%1$s</xliff:g> משתמשת ב<xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
+ <string name="ongoing_privacy_chip_content_single_app" msgid="2969750601815230385">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> משתמשת ב<xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
<string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string>
<string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" וגם "</string>
@@ -1052,8 +1054,8 @@
<item quantity="one">נוסף פקד אחד (<xliff:g id="NUMBER_0">%s</xliff:g>).</item>
</plurals>
<string name="controls_removed" msgid="3731789252222856959">"הוסר"</string>
- <string name="accessibility_control_favorite" msgid="8694362691985545985">"סומן כהעדפה"</string>
- <string name="accessibility_control_favorite_position" msgid="54220258048929221">"סומן כהעדפה, במיקום <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="accessibility_control_favorite" msgid="8694362691985545985">"סומן כמועדף"</string>
+ <string name="accessibility_control_favorite_position" msgid="54220258048929221">"סומן כמועדף, במיקום <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="accessibility_control_not_favorite" msgid="1291760269563092359">"הוסר מהמועדפים"</string>
<string name="accessibility_control_change_favorite" msgid="2943178027582253261">"להוסיף למועדפים"</string>
<string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"להסיר מהמועדפים"</string>
@@ -1081,7 +1083,7 @@
<string name="controls_confirmation_confirming" msgid="2596071302617310665">"בתהליך אישור…"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"יש לאשר את השינוי עבור <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"יש להחליק כדי להציג עוד פריטים"</string>
- <string name="controls_seeding_in_progress" msgid="3033855341410264148">"בטעינת המלצות"</string>
+ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ההמלצות בטעינה"</string>
<string name="controls_media_title" msgid="1746947284862928133">"מדיה"</string>
<string name="controls_media_close_session" msgid="3957093425905475065">"הסתרת הסשן הנוכחי."</string>
<string name="controls_media_active_session" msgid="1984383994625845642">"לא ניתן להסתיר את הסשן הנוכחי."</string>
@@ -1097,7 +1099,7 @@
<string name="controls_error_generic" msgid="352500456918362905">"לא ניתן לטעון את הסטטוס"</string>
<string name="controls_error_failed" msgid="960228639198558525">"שגיאה, יש לנסות שוב"</string>
<string name="controls_in_progress" msgid="4421080500238215939">"בתהליך"</string>
- <string name="controls_added_tooltip" msgid="4842812921719153085">"ניתן ללחוץ על לחצן ההפעלה כדי להציג פקדים חדשים"</string>
+ <string name="controls_added_tooltip" msgid="4842812921719153085">"אפשר ללחוץ על לחצן ההפעלה כדי להציג פקדים חדשים"</string>
<string name="controls_menu_add" msgid="4447246119229920050">"הוספת פקדים"</string>
<string name="controls_menu_edit" msgid="890623986951347062">"עריכת פקדים"</string>
<string name="media_output_dialog_add_output" msgid="5642703238877329518">"הוספת מכשירי פלט"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"פתיחת שיחה"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ווידג\'טים של שיחות"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"יש להקיש על שיחה כדי להוסיף אותה למסך הבית"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"לפני <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"לפני פחות מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"לפני יותר מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-iw/strings_tv.xml b/packages/SystemUI/res/values-iw/strings_tv.xml
index d69d3ed..f01321e 100644
--- a/packages/SystemUI/res/values-iw/strings_tv.xml
+++ b/packages/SystemUI/res/values-iw/strings_tv.xml
@@ -23,7 +23,7 @@
<string name="app_accessed_mic" msgid="2754428675130470196">"לאפליקציה %1$s יש גישה למיקרופון שלך"</string>
<string name="notification_vpn_connected" msgid="3891023882833274730">"ה-VPN מחובר"</string>
<string name="notification_vpn_disconnected" msgid="7150747626448044843">"ה-VPN מנותק"</string>
- <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"באמצעות <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
+ <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"דרך <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="tv_notification_panel_title" msgid="5311050946506276154">"התראות"</string>
<string name="tv_notification_panel_no_notifications" msgid="9115191912267270678">"אין התראות"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 742d1ae..bbd7543 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"スクリーンショットの作成はアプリまたは組織で許可されていません"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編集"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"スクリーンショットを編集します"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"キャプチャ範囲を拡大"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"スクリーンショットを閉じます"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"上部境界"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"閉じる"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"指紋認証センサーをタップ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"指紋アイコン"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"顔を認識できません。指紋認証を使用してください。"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"続行するには指紋認証を使用してください"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"指紋を認識できません。代わりに画面ロックを使用してください。"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"顔を認証しています…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"顔アイコン"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"互換ズームボタン。"</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"色を反転"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"色補正モード"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"詳細設定"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ユーザー設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完了"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"閉じる"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"接続済み"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"接続済み、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"接続しています..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"これは <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> が所有するデバイスで、VPN に接続しています"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"組織は仕事用プロファイルのネットワーク トラフィックを監視することがあります"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> によってこの仕事用プロファイルのネットワーク トラフィックが監視されることもあります"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"仕事用プロファイルのネットワーク アクティビティは IT 管理者に公開されます"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ネットワークが監視されることもあります"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"このデバイスは VPN に接続しています"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"この仕事用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"イーサネット"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"アラーム"</string>
<string name="wallet_title" msgid="5369767670735827105">"ウォレット"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"準備完了"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"仕事用プロファイル"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"機内モード"</string>
<string name="add_tile" msgid="6239678623873086686">"タイルを追加"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"空の会話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"会話ウィジェット"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"会話をタップするとホーム画面に追加されます"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"メッセージを受信したら、ここでもう一度ご確認ください"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"優先度の高い会話"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"最近の会話"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>前まで"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>以上前"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 8e260ca..bd65529 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ეკრანის ანაბეჭდების შექმნა არ არის ნებადართული აპის ან თქვენი ორგანიზაციის მიერ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"რედაქტირება"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ეკრანის ანაბეჭდის რედაქტირება"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"მეტის აღბეჭდვა"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ეკრანის ანაბეჭდის დახურვა"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ეკრანის ანაბეჭდის გადახედვა"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ზედა საზღვარი"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ფერების შებრუნება"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ფერთა კორექციის რეჟიმი"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"დამატებითი პარამეტრები"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"მომხმარებლის პარამეტრები"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"დასრულდა"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"დახურვა"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"დაკავშირებულია"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"დაკავშირებულია. ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"დაკავშირება..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ამ მოწყობილობას ფლობს <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> და ის დაკავშირებულია VPN-ებთან"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"თქვენს ორგანიზაციას სამსახურის პროფილში ქსელის ტრაფიკის მონიტორინგი შეუძლია"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-ს სამსახურის პროფილში ქსელის ტრაფიკის მონიტორინგი შეუძლია"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"სამსახურის პროფილის ქსელის აქტივობა ხილულია თქვენი IT ადმინისტრატორისთვის"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ქსელზე შესაძლოა ხორციელდებოდეს მონიტორინგი"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ეს მოწყობილობა დაკავშირებულია VPN-ებთან"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"თქვენი სამსახურის პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ეთერნეტი"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"მაღვიძარა"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"მზადაა"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"სამსახურის პროფილი"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"თვითმფრინავის რეჟიმი"</string>
<string name="add_tile" msgid="6239678623873086686">"მოზაიკის დამატება"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"მიმოწერის გახსნა"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"საუბრის ვიჯეტები"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"შეეხეთ საუბარს მის თქვენს მთავარ ეკრანზე დასამატებლად"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>-ს წინ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე ნაკლები ხნის წინ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე მეტი ხნის წინ"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 4567410..bbb2161 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Қолданба немесе ұйым скриншоттар түсіруге рұқсат етпейді"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Өзгерту"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотты өзгерту"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Тағы суретке түсіру"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотты жабу"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Жоғарғы шектік сызық"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Түстерді инверсиялау"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Түсті түзету режимі"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Қосымша параметрлер"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пайдаланушы параметрлері"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дайын"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабу"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Қосылды"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Қосылды, батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Қосылуда…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Бұл құрылғы <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ұйымына тиесілі және VPN-дерге қосылған."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ұйымыңыз жұмыс профиліңіздегі желі трафигін бақылауы мүмкін"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> жұмыс профиліңіздегі желі трафигін бақылауы мүмкін"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Желіде жұмыс профилі арқылы не істелгені әкімшіге көрініп тұрады."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Желі бақылануы мүмкін"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Бұл құрылғы VPN-дерге қосылған."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Жұмыс профиліңіз <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған."</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Дабыл"</string>
<string name="wallet_title" msgid="5369767670735827105">"Әмиян"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Дайын"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Жұмыс профилі"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Ұшақ режимі"</string>
<string name="add_tile" msgid="6239678623873086686">"Тақтайша қосу"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Ашық әңгіме"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Әңгіме виджеттері"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Негізгі экранға қосқыңыз келетін әңгімені түртіңіз."</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Максимум <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Кемінде <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index d79144d..a5e66b2 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ការថតរូបអេក្រង់មិនត្រូវបានអនុញ្ញាតដោយកម្មវិធីនេះ ឬស្ថាប័នរបស់អ្នក"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"កែ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"កែរូបថតអេក្រង់"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ថតច្រើនទៀត"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ច្រានចោលរូបថតអេក្រង់"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើលរូបថតអេក្រង់សាកល្បង"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"បន្ទាត់បែងចែកខាងលើ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ដាក់បញ្ច្រាសពណ៌"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"របៀបកែពណ៌"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ការកំណត់ច្រើនទៀត"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ការកំណត់អ្នកប្រើប្រាស់"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"រួចរាល់"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"បិទ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"បានភ្ជាប់"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"បានភ្ជាប់ ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"កំពុងតភ្ជាប់..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ឧបករណ៍នេះគឺជាកម្មសិទ្ធិរបស់ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> និងត្រូវបានភ្ជាប់ទៅ VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ស្ថាប័នរបស់អ្នកអាចនឹងតាមដានចរាចរណ៍បណ្តាញនៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> អាចនឹងតាមដានចរាចរណ៍បណ្តាញនៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកអាចមើលឃើញសកម្មភាពបណ្ដាញនៃកម្រងព័ត៌មានការងារ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"បណ្ដាញអាចត្រូវតាមដាន"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ឧបករណ៍នេះត្រូវបានភ្ជាប់ទៅ VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"កម្រងព័ត៌មានការងាររបស់អ្នកត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"អ៊ីសឺរណិត"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ម៉ោងរោទ៍"</string>
<string name="wallet_title" msgid="5369767670735827105">"កាបូប"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"រួចរាល់"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ប្រវត្តិរូបការងារ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"របៀបក្នុងយន្តហោះ"</string>
<string name="add_tile" msgid="6239678623873086686">"បន្ថែមក្រឡាល្អិត"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"បើកការសន្ទនា"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ធាតុក្រាហ្វិកនៃការសន្ទនា"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ចុចការសន្ទនា ដើម្បីបញ្ចូលវាទៅក្នុងអេក្រង់ដើមរបស់អ្នក"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"តិចជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index bfc6d87..0e44a0c 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ಇನ್ನಷ್ಟು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್ಶಾಟ್ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ಮೇಲಿನ ಗಡಿರೇಖೆ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ಬಣ್ಣಗಳನ್ನು ಇನ್ವರ್ಟ್ ಮಾಡಿ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ ಮೋಡ್"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ಮುಚ್ಚಿರಿ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ಸಂಪರ್ಕಗೊಂಡಿದೆ, ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ಈ ಸಾಧನವು <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ಗೆ ಸೇರಿದೆ ಮತ್ತು VPN ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರಿಗೆ ಗೋಚರಿಸುತ್ತದೆ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ನೆಟ್ವರ್ಕ್ನ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾಗಿದೆ"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ಈ ಸಾಧನವು VPN ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ಇಥರ್ನೆಟ್"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ಅಲಾರಮ್"</string>
<string name="wallet_title" msgid="5369767670735827105">"ವಾಲೆಟ್"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"ಸಿದ್ಧವಾಗಿದೆ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string>
<string name="add_tile" msgid="6239678623873086686">"ಟೈಲ್ ಸೇರಿಸಿ"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"ಸಂಭಾಷಣೆಯನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ಸಂಭಾಷಣೆ ವಿಜೆಟ್ಗಳು"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ಸಂಭಾಷಣೆಯನ್ನು ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಸೇರಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ಸಮಯದ ಹಿಂದೆ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಕಡಿಮೆ ಅವಧಿಯ ಹಿಂದೆ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಹೆಚ್ಚಿನ ಅವಧಿಯ ಹಿಂದೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index e2193ee..005449d 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"앱이나 조직에서 스크린샷 촬영을 허용하지 않습니다."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"수정"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"스크린샷 수정"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"더 캡처하기"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"스크린샷 닫기"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"상단 경계"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"색상 반전"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"색상 보정 모드"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"설정 더보기"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"사용자 설정"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"완료"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"닫기"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"연결됨"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"연결됨, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"연결 중..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에 속한 기기이며 VPN에 연결되었습니다."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"조직에서 직장 프로필의 네트워크 트래픽을 모니터링할 수 있습니다."</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에서 내 직장 프로필의 네트워크 트래픽을 모니터링할 수 있습니다."</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"직장 프로필의 네트워크 활동은 IT 관리자에게 공개됩니다."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"네트워크가 모니터링될 수 있습니다."</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"기기가 VPN에 연결되었습니다."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"직장 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다."</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"이더넷"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"알람"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"준비됨"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"직장 프로필"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"비행기 모드"</string>
<string name="add_tile" msgid="6239678623873086686">"타일 추가"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"대화 열기"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"대화 위젯"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"대화를 탭하여 홈 화면에 추가하세요."</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> 전"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> 이내"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> 이상 경과"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index e7a45b2..13ed32b 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Скриншот тартууга колдонмо же ишканаңыз тыюу салган."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Түзөтүү"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотту түзөтүү"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Көбүрөөк тартуу"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотту четке кагуу"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Жогорку чеги"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Түстөрдү инверсиялоо"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Түстү тууралоо абалы"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Дагы жөндөөлөр"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Колдонуучунун жөндөөлөрү"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Бүттү"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабуу"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Туташкан"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Туташып турат, батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Туташууда…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык жана VPN\'дерге туташтырылган"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ишканаңыз жумуш профилиңиздин тармак трафигин көзөмөлдөй алат"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> жумуш профилиңиздеги тармак трафигин көзөмөлдөй алат"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Жумуш профилинин тармактагы аракеттери IT администраторуна көрүнөт"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Тармак көзөмөлдөнүшү мүмкүн"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Бул түзмөк VPN\'дерге туташтырылган"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Жумуш профилиңиз <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турат"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Ойготкуч"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Даяр"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Жумуш профили"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Учак режими"</string>
<string name="add_tile" msgid="6239678623873086686">"Тайл кошуу"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Маекти ачуу"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Маек виджеттери"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Маекти Башкы экранга кошуу үчүн таптап коюңуз"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> мурда"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> жетпеген убакыт мурда"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ашуун мурда"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 2416dee..3cd7d34 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ແອັບ ຫຼື ອົງກອນຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຖ່າຍຮູບໜ້າຈໍ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ແກ້ໄຂ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ແກ້ໄຂຮູບໜ້າຈໍ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ບັນທຶກເພີ່ມເຕີມ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ປິດຮູບໜ້າຈໍ"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ຕົວຢ່າງຮູບໜ້າຈໍ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ຂອບເຂດທາງເທິງ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ສະຫຼັບສີ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ໂໝດການແກ້ໄຂສີ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ຕັ້ງຄ່າຜູ້ໃຊ້"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ແລ້ວໆ"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ປິດ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ເຊື່ອມຕໍ່ແລ້ວ, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"ກຳລັງເຊື່ອມຕໍ່..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ອຸປະກອນນີ້ເປັນຂອງ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ແລະ ເຊື່ອມຕໍ່ຫາ VPN ແລ້ວ"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ອົງກອນຂອງທ່ານສາມາດຕິດຕາມທຣາບຟິກເຄືອຂ່າຍໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານໄດ້"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ສາມາດຕິດຕາມທຣາບຟິກເຄືອຂ່າຍໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານໄດ້"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ການເຄື່ອນໄຫວເຄືອຂ່າຍໂປຣໄຟລ໌ບ່ອນເຮັດວຽກແມ່ນສະແດງໃຫ້ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານເຫັນໄດ້"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ເຄືອຂ່າຍອາດຖືກຕິດຕາມ"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານເຊື່ອມຕໍ່ຫາ VPN ແລ້ວ"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ອີເທເນັດ"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ໂມງປຸກ"</string>
<string name="wallet_title" msgid="5369767670735827105">"ກະເປົາ"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"ພ້ອມແລ້ວ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ໂໝດເຮືອບິນ"</string>
<string name="add_tile" msgid="6239678623873086686">"ເພີ່ມລາຍຕາກະໂລ່"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"ເປີດການສົນທະນາ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ວິດເຈັດການສົນທະນາ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ແຕະໃສ່ການສົນທະນາໃດໜຶ່ງເພື່ອເພີ່ມມັນໃສ່ໂຮມສະກຣີນຂອງທ່ານ"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ບໍ່ຮອດ <xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ເກີນ <xliff:g id="DURATION">%1$s</xliff:g> ມາແລ້ວ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 698bc9f..f9fdf10 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Jūsų organizacijoje arba naudojant šią programą neleidžiama daryti ekrano kopijų"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redaguoti"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Redaguoti ekrano kopiją"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fiksuoti daugiau"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Praleisti ekrano kopiją"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Viršutinė riba"</string>
@@ -386,11 +385,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Pakeisti spalvas"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Spalvų taisymo režimas"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Daugiau nustatymų"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Naudotojo nustatymai"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Atlikta"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Uždaryti"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Prijungtas"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Prijungta, akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Prisijungiama..."</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Šis įrenginys priklauso „<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ ir yra prijungtas prie VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jūsų organizacija darbo profilyje gali stebėti tinklo srautą"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"„<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ darbo profilyje gali stebėti tinklo srautą"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Darbo profilio tinklo veiklą mato jūsų IT administratorius"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Tinklas gali būti stebimas"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Šis įrenginys prijungtas prie VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Darbo profilis susietas su „<xliff:g id="VPN_APP">%1$s</xliff:g>“"</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Eternetas"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Signalas"</string>
<string name="wallet_title" msgid="5369767670735827105">"Piniginė"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Paruošta"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Darbo profilis"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lėktuvo režimas"</string>
<string name="add_tile" msgid="6239678623873086686">"Pridėti išklotinės elementą"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Atidaryti pokalbį"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Pokalbio valdikliai"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Palieskite pokalbį, kad pridėtumėte jį prie pagrindinio ekrano"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Mažiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Daugiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index e7380cd..ef48270 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Lietotne vai jūsu organizācija neatļauj veikt ekrānuzņēmumus."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediģēt"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediģēt ekrānuzņēmumu"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tvert vairāk"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Nerādīt ekrānuzņēmumu"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Augšējā robeža"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertēt krāsas"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Krāsu korekcijas režīms"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Vairāk iestatījumu"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Lietotāja iestatījumi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gatavs"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Aizvērt"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Pievienota"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Savienojums izveidots, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Notiek savienojuma izveide…"</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Šī ierīce pieder organizācijai<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> un ir savienota ar virtuālajiem privātajiem tīkliem."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jūsu organizācija var uzraudzīt jūsu darba profila tīkla datplūsmu."</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> var uzraudzīt jūsu profila tīkla datplūsmu."</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT administrators var skatīt tīklā veiktās darbības, kurām izmantojat darba profilu"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Var tikt pārraudzītas tīklā veiktās darbības."</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Šī ierīce ir saistīta ar virtuālajiem privātajiem tīkliem."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jūsu darba profils ir savienots ar: <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Tīkls Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Signāls"</string>
<string name="wallet_title" msgid="5369767670735827105">"Maks"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Gatavs"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Darba profils"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Lidojuma režīms"</string>
<string name="add_tile" msgid="6239678623873086686">"Pievienot elementu"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Atvērt sarunu"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Sarunu logrīki"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Pieskarieties kādai sarunai, lai pievienotu to savam sākuma ekrānam."</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Pirms šāda laika: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pirms mazāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pirms vairāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index fbf8b47..bd9c535 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликацијата или вашата организација не дозволува снимање слики од екранот"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Изменете ја сликата од екранот"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Сними повеќе"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отфрлете ја сликата од екранот"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Преврти ги боите"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим за корекција на бои"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Повеќе поставки"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Поставки на корисникот"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Поврзано"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Поврзан, ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Се поврзува..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Уредов е во сопственост на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и е поврзан со VPN-мрежи"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Вашата организација може да го следи мрежниот сообраќај на вашиот работен профил"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да го следи мрежниот сообраќај на вашиот работен профил"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Мрежната активност на работниот профил е видлива за вашиот IT-администратор"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежата можеби се следи"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Уредов е поврзан со VPN-мрежи"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Вашиот работен профил е поврзан со <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Етернет"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Аларм"</string>
<string name="wallet_title" msgid="5369767670735827105">"Паричник"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Подготвено"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Работен профил"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Авионски режим"</string>
<string name="add_tile" msgid="6239678623873086686">"Додај плочка"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Започни разговор"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виџети за разговор"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Допрете на разговор за да го додадете на вашиот почетен екран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Пред <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Пред помалку од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Пред повеќе од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index a0cd24d..568c19e 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"എഡിറ്റ് ചെയ്യുക"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"സ്ക്രീൻഷോട്ട് എഡിറ്റ് ചെയ്യുക"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"കൂടുതൽ ക്യാപ്ചർ ചെയ്യുക"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"സ്ക്രീൻഷോട്ട് പ്രിവ്യു"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"മുകളിലുള്ള അതിർത്തി"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"നെഗറ്റീവ് ലുക്ക്"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"വർണ്ണം ശരിയാക്കൽ മോഡ്"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ഉപയോക്തൃ ക്രമീകരണം"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"അടയ്ക്കുക"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"കണക്റ്റുചെയ്തു"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"കണക്റ്റുചെയ്തു, ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"കണക്റ്റുചെയ്യുന്നു..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ഈ ഉപകരണം <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> എന്ന സ്ഥാപനത്തിന്റേതാണ്, കൂടാതെ VPN-കളിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കാൻ നിങ്ങളുടെ സ്ഥാപനത്തിന് കഴിഞ്ഞേക്കാം"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വർക്ക് ട്രാഫിക്ക് <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> നിരീക്ഷിച്ചേക്കാം"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വര്ക്ക് ആക്റ്റിവിറ്റി ഐടി അഡ്മിന് കാണാനാകും"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ഈ ഉപകരണം VPN-കളിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"<xliff:g id="VPN_APP">%1$s</xliff:g> എന്നതിലേക്ക് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ഇതർനെറ്റ്"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"അലാറം"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"തയ്യാറാണ്"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ഫ്ലൈറ്റ് മോഡ്"</string>
<string name="add_tile" msgid="6239678623873086686">"ടൈൽ ചേർക്കുക"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"സംഭാഷണം തുറക്കുക"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"സംഭാഷണ വിജറ്റുകൾ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"നിങ്ങളുടെ ഹോം സ്ക്രീനിൽ ചേർക്കാൻ സംഭാഷണത്തിൽ ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> എന്നതിൽ കുറവ്"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 4642d3d..953d414 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Таны апп, байгууллагад дэлгэцийн зураг авахыг зөвшөөрдөггүй"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Засах"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Дэлгэцийн агшныг засах"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Ихийг багтаасан зураг авах"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Дэлгэцийн агшныг хаах"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Дээд талын хязгаар"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Хаах"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Хурууны хээ мэдрэгчид хүрэх"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Хурууны хээний дүрс тэмдэг"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Царай таних боломжгүй. Оронд нь хурууны хээ ашигла"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Үргэлжлүүлэхийн тулд хурууныхаа хээг ашиглана уу"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Хурууны хээг таних боломжгүй. Оронд нь дэлгэцийн түгжээ ашиглана уу."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Таныг хайж байна…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Царайны дүрс тэмдэг"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Тохиромжтой өсгөх товч."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Өнгийг урвуулах"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Өнгө залруулах горим"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Бусад тохиргоо"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Хэрэглэгчийн тохиргоо"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дууссан"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Хаах"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Холбогдсон"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Холбогдсон, батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Холбогдож байна..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Энэ төхөөрөмж <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-д харьяалагддаг бөгөөд VPN-д холбогдсон байна"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Таны байгууллага таны ажлын профайлын сүлжээний ачааллыг хянадаг"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> таны ажлын профайлын сүлжээний ачааллыг хянадаг"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Таны IT админд ажлын профайлын сүлжээний үйл ажиллагаа харагдана"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Сүлжээг хянаж байж болзошгүй"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Энэ төхөөрөмж VPN-д холбогдсон байна"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Таны ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Этернет"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Сэрүүлэг"</string>
<string name="wallet_title" msgid="5369767670735827105">"Түрийвч"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Бэлэн"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Ажлын профайл"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Нислэгийн горим"</string>
<string name="add_tile" msgid="6239678623873086686">"Вебсайтын цонх нэмэх"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Харилцан яриаг нээх"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Харилцан ярианы жижиг хэрэгслүүд"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Үндсэн нүүрэндээ нэмэх харилцан яриаг товшино уу"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Та зарим мессеж авсныхаа дараа эндээс буцаж шалгана уу"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Чухал харилцан яриа"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Саяхны харилцан яриа"</string>
+ <string name="okay" msgid="6490552955618608554">"За"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>-н өмнө"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-с бага хугацааны өмнө"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-с дээш хугацааны өмнө"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 0de9a97..4098426 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"अॅप किंवा आपल्या संस्थेद्वारे स्क्रीनशॉट घेण्याची अनुमती नाही"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"संपादित करा"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट संपादित करा"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"आणखी गोष्टी कॅप्चर करा"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"सर्वात वरची सीमा"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटे करा"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"रंग सुधारणा मोड"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"अधिक सेटिंग्ज"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"वापरकर्ता सेटिंग्ज"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करा"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"कनेक्ट केलेले"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"कनेक्ट केलेले आहे, बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट करत आहे..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> चे आहे आणि ते VPN ना कनेक्ट केले आहे"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"तुमची संस्था आपल्या कार्य प्रोफाइलमधील नेटवर्क रहदारीचे परीक्षण करू शकते"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपल्या कार्य प्रोफाइलमधील नेटवर्क रहदारीचे परीक्षण करू शकते"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"तुमच्या IT ॲडमिनला कार्य प्रोफाइलची नेटवर्क अॅक्टिव्हिटी दृश्यमान आहे"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"हे डिव्हाइस VPN ला कनेक्ट केले आहे"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"तुमची कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> ला कनेक्ट केली"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"इथरनेट"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"तयार आहे"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"कार्य प्रोफाईल"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"विमान मोड"</string>
<string name="add_tile" msgid="6239678623873086686">"टाइल जोडा"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"संभाषण उघडा"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"संभाषण विजेट"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"तुमच्या होम स्क्रीन वर संभाषण जोडण्यासाठी त्यावर टॅप करा"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पूर्वी"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा कमी"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा आधी"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index eb0ddd5..2b6a852 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Pengambilan tangkapan skrin tidak dibenarkan oleh apl atau organisasi anda"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edit tangkapan skrin"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tangkap lebih banyak"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ketepikan tangkapan skrin"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Sempadan atas"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Songsangkan warna"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mod pembetulan warna"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Lagi tetapan"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Tetapan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Disambungkan"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Disambungkan, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Peranti ini milik <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dan dihubungkan dengan VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasi anda mungkin memantau trafik rangkaian dalam profil kerja anda"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mungkin memantau trafik rangkaian dalam profil kerja anda"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktiviti rangkaian profil kerja boleh dilihat oleh pentadbir IT anda"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Rangkaian mungkin dipantau"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Peranti ini dihubungkan dengan VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profil kerja anda dihubungkan dengan <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Penggera"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Sedia"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil kerja"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mod pesawat"</string>
<string name="add_tile" msgid="6239678623873086686">"Tambahkan jubin"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Buka perbualan"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widget perbualan"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ketik perbualan untuk menambahkan perbualan itu pada skrin Utama anda"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Kurang daripada <xliff:g id="DURATION">%1$s</xliff:g> lalu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Lebih <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 5f8ae62..abcbb83 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ဖန်သားပြင်ဓာတ်ပုံရိုက်ကူးခြင်းကို ဤအက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"တည်းဖြတ်ရန်"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ဖန်သားပြင်ဓာတ်ပုံကို တည်းဖြတ်သည်"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"နောက်ထပ် ရိုက်ကူးရန်"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ဖန်သားပြင်ဓာတ်ပုံကို ပယ်သည်"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ထိပ်ပိုင်းအနားသတ်"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"အရောင်ပြောင်းပြန်"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"အရောင် မှန်ကန်စေခြင်း အခြေအနေ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"နောက်ထပ် ဆက်တင်များ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"အသုံးပြုသူ ဆက်တင်များ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ပြီးပါပြီ"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ပိတ်ရန်"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ချိတ်ဆက်ထား"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ချိတ်ဆက်ပြီးပါပြီ၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"ဆက်သွယ်နေ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ဤစက်ကို <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> က ပိုင်ဆိုင်ပြီး VPN များသို့ ချိတ်ဆက်ထားပါသည်"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"သင်၏ အဖွဲ့အစည်းက သင့်အလုပ်ပရိုဖိုင်ရှိ ကွန်ရက်ဒေတာ စီးဆင်းမှုကို စောင့်ကြည့်နိုင်သည်"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> သည် သင်၏ အလုပ်ပရိုဖိုင်ရှိ ကွန်ရက်ဒေတာ စီးဆင်းမှုကို စောင့်ကြည့်နိုင်ပါသည်"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"အလုပ်ပရိုဖိုင်ကွန်ရက် လုပ်ဆောင်ချက်ကို သင့် IT စီမံခန့်ခွဲသူက မြင်နိုင်သည်"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ကွန်ရက်ကို စောင့်ကြည့်နိုင်ပါသည်"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ဤစက်ကို VPN များသို့ ချိတ်ဆက်ထားပါသည်"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"သင်၏အလုပ်ပရိုဖိုင်သည် <xliff:g id="VPN_APP">%1$s</xliff:g> ကို ချိတ်ဆက်ထားပါသည်"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"အီသာနက်"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"နှိုးစက်"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"အဆင်သင့်"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"အလုပ် ပရိုဖိုင်"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"လေယာဉ်ပျံမုဒ်"</string>
<string name="add_tile" msgid="6239678623873086686">"လေးထောင့်ကွက် ထည့်ရန်"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"စကားဝိုင်းကို သင်၏ ‘ပင်မစာမျက်နှာ’ သို့ထည့်ရန် တို့ပါ"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"ပြီးခဲ့သည့် <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> မပြည့်ခင်"</string>
<string name="over_timestamp" msgid="4765793502859358634">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> ကျော်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index b0c7465..6f766352 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger skjermdumpen"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Utvidet skjermdump"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Avvis skjermdumpen"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Øvre grense"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter farger"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modus for fargekorrigering"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere innstillinger"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brukerinnstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Ferdig"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Lukk"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Tilkoblet"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tilkoblet, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Kobler til …"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Denne enheten tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er koblet til VPN-er"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasjonen din kan overvåke nettverkstrafikken i jobbprofilen din"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan overvåke nettverkstrafikken i jobbprofilen din"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Nettverksaktiviteten i jobbprofilen er synlig for IT-administratoren din"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Nettverket kan bli overvåket"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Denne enheten er koblet til VPN-er"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jobbprofilen din er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Work-profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Flymodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Legg til felt"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Åpen samtale"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Samtalemoduler"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Trykk på en samtale for å legge den til på startskjermen"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"For <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"For mindre enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"For mer enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index e4fc492..0be4f52 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त एप वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"सम्पादन गर्नुहोस्"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रिनसट सम्पादन गर्नुहोस्"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"अन्य कुराहरू खिच्नुहोस्"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"सिरानको सीमा"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उल्टाउनुहोस्"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"रङ्ग सुधार मोड"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"थप सेटिङहरू"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"प्रयोगकर्तासम्बन्धी सेटिङ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"भयो"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बन्द गर्नुहोस्"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"जोडिएको"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"यन्त्र जडान भयो, ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"जडान हुँदै..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा नेटवर्कको ट्राफिकको अनुगमन गर्न पनि सक्छ"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलमा नेटवर्क ट्राफिकको अनुगमन गर्न पनि सक्छ"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"तपाईंका IT एड्मिन कार्य प्रोफाइलमा गरिने नेटवर्कसम्बन्धी क्रियाकलाप देख्न सक्नुहुन्छ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्कको अनुगमन हुनसक्छ"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"यो यन्त्र VPN हरूमा कनेक्ट गरिएको छ"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"तपाईंको कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"इथरनेट"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"अलार्म"</string>
<string name="wallet_title" msgid="5369767670735827105">"वालेट"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"तयार छ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"कार्य प्रोफाइल"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"हवाइजहाज मोड"</string>
<string name="add_tile" msgid="6239678623873086686">"टाइल थप्नुहोस्"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"वार्तालाप खोल्नुहोस्"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"वार्तालापसम्बन्धी विजेटहरू"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"कुनै वार्तालाप होम स्क्रिनमा हाल्न उक्त वार्तालापमा ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> अघि"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा कम समयअघि"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा बढी समयअघि"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 32886c1..d46d489 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Het maken van screenshots wordt niet toegestaan door de app of je organisatie"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Bewerken"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bewerken"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Meer opnemen"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot sluiten"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Voorbeeld van screenshot"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Bovengrens"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Sluiten"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Raak de vingerafdruksensor aan"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Vingerafdrukpictogram"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gezicht niet herkend. Gebruik je vingerafdruk."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Gebruik je vingerafdruk om door te gaan."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Vingerafdruk niet herkend. Gebruik in plaats daarvan de schermvergrendeling."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Jouw gezicht zoeken…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Gezichtspictogram"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Knop voor compatibiliteitszoom."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Kleuren omkeren"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modus voor kleurcorrectie"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellingen"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikersinstellingen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sluiten"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Verbonden"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Verbonden, batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Verbinding maken…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dit apparaat is eigendom van <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> en is verbonden met VPN\'s"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Je organisatie kan het netwerkverkeer in je werkprofiel bijhouden"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan het netwerkverkeer in je werkprofiel bijhouden"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"De netwerkactiviteit van je werkprofiel is zichtbaar voor je IT-beheerder"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netwerk kan worden bijgehouden"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dit apparaat is verbonden met VPN\'s"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Je werkprofiel is verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -648,7 +641,7 @@
<string name="output_title" msgid="3938776561655668350">"Media-uitvoer"</string>
<string name="output_calls_title" msgid="7085583034267889109">"Uitvoer van telefoongesprek"</string>
<string name="output_none_found" msgid="5488087293120982770">"Geen apparaten gevonden"</string>
- <string name="output_none_found_service_off" msgid="935667567681386368">"Geen apparaten gevonden. Probeer <xliff:g id="SERVICE">%1$s</xliff:g> in te schakelen."</string>
+ <string name="output_none_found_service_off" msgid="935667567681386368">"Geen apparaten gevonden. Probeer <xliff:g id="SERVICE">%1$s</xliff:g> aan te zetten."</string>
<string name="output_service_bt" msgid="4315362133973911687">"Bluetooth"</string>
<string name="output_service_wifi" msgid="9003667810868222134">"Wifi"</string>
<string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth en wifi"</string>
@@ -664,12 +657,18 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Wekker"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Klaar"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string>
<string name="add_tile" msgid="6239678623873086686">"Tegel toevoegen"</string>
<string name="broadcast_tile" msgid="5224010633596487481">"Tegel \'Uitzenden\'"</string>
- <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g> tenzij je dit voor die tijd uitschakelt"</string>
+ <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g> tenzij je dit voor die tijd uitzet"</string>
<string name="zen_alarm_warning" msgid="7844303238486849503">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
@@ -981,7 +980,7 @@
<string name="slice_permission_checkbox" msgid="4242888137592298523">"<xliff:g id="APP">%1$s</xliff:g> toestaan om segmenten van apps te tonen"</string>
<string name="slice_permission_allow" msgid="6340449521277951123">"Toestaan"</string>
<string name="slice_permission_deny" msgid="6870256451658176895">"Weigeren"</string>
- <string name="auto_saver_title" msgid="6873691178754086596">"Tikken om Batterijbesparing in te schakelen"</string>
+ <string name="auto_saver_title" msgid="6873691178754086596">"Tikken om Batterijbesparing aan te zetten"</string>
<string name="auto_saver_text" msgid="3214960308353838764">"Aanzetten als de batterij waarschijnlijk leeg raakt"</string>
<string name="no_auto_saver_action" msgid="7467924389609773835">"Nee"</string>
<string name="auto_saver_enabled_title" msgid="4294726198280286333">"Batterijbesparing staat aan"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Gesprek openen"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Gesprekswidgets"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tik op een gesprek om het toe te voegen aan je startscherm"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Kom hier terug zodra je wat berichten hebt"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriteitsgesprekken"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Recente gesprekken"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> geleden"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Minder dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Meer dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index a14aa18..9739b41 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ଆପ୍ କିମ୍ବା ସଂସ୍ଥା ଦ୍ୱାରା ସ୍କ୍ରୀନଶଟ୍ ନେବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ସ୍କ୍ରିନସଟ୍ ଏଡିଟ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ଅଧିକ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ଶୀର୍ଷ ସୀମାରେଖା"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ଟିପଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ଫେସ୍ ଚିହ୍ନଟ କରିହେବ ନାହିଁ। ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ଟିପଚିହ୍ନକୁ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"ମୁହଁ ଆଇକନ୍"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।"</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ରଙ୍ଗ ଇନଭାର୍ଟ୍ କରନ୍ତୁ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ରଙ୍ଗ ସଂଶୋଧନ ମୋଡ୍"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ଅଧିକ ସେଟିଂସ୍"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ଉପଯୋଗକର୍ତ୍ତା ସେଟିଂସ୍"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ସଂଯୁକ୍ତ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"କନେକ୍ଟ ରହିଛି, ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"ସଂଯୋଗ କରୁଛି..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ଏହି ଡିଭାଇସଟି <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ର ଅଟେ ଏବଂ ଏହା VPNଗୁଡ଼ିକ ସହ ସଂଯୁକ୍ତ ଅଛି"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ଆପଣଙ୍କ ସଂସ୍ଥା ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପ ଆପଣଙ୍କ IT ଆଡମିନଙ୍କୁ ଦେଖାଯିବ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ନେଟୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ଏହି ଡିଭାଇସଟି VPNଗୁଡ଼ିକ ସହ ସଂଯୁକ୍ତ ଅଛି"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g> ସହ ସଂଯୁକ୍ତ ଅଛି"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ଇଥରନେଟ୍"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ଆଲାର୍ମ"</string>
<string name="wallet_title" msgid="5369767670735827105">"ୱାଲେଟ୍"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"ପ୍ରସ୍ତୁତ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string>
<string name="add_tile" msgid="6239678623873086686">"ଟାଇଲ୍ ଯୋଡ଼ନ୍ତୁ"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"ବାର୍ତ୍ତାଳାପ ଖୋଲନ୍ତୁ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ବାର୍ତ୍ତାଳାପ ୱିଜେଟଗୁଡ଼ିକ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ଏକ ବାର୍ତ୍ତାଳାପକୁ ଆପଣଙ୍କ ମୂଳସ୍କ୍ରିନରେ ଯୋଗ କରିବା ପାଇଁ ସେଥିରେ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"ଆପଣ କିଛି ମେସେଜ୍ ପାଇଲେ ଏଠାରେ ପୁଣି ଯାଞ୍ଚ କରନ୍ତୁ"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ପ୍ରାଥମିକତା ଦିଆଯାଇଥିବା ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"ବର୍ତ୍ତମାନର ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string>
+ <string name="okay" msgid="6490552955618608554">"ଠିକ୍ ଅଛି"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ପୂର୍ବେ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ କମ୍ ସମୟ ପୂର୍ବେ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ ଅଧିକ ସମୟ ପୂର୍ବେ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 2b745df..1d9cabc 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"ਹੋਰ ਕੈਪਚਰ ਕਰੋ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ਉੱਪਰ ਦੀ ਸੀਮਾ"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"ਰੰਗ ਪਲਟਾਓ"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"ਰੰਗ ਸੰਸ਼ੋਧਨ ਮੋਡ"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ਬੰਦ ਕਰੋ"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ, ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ਇਹ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ ਅਤੇ VPN ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਦਿਖਾਈ ਦਿੰਦੀ ਹੈ"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ਇਹ ਡੀਵਾਈਸ VPN ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ਈਥਰਨੈਟ"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"ਅਲਾਰਮ"</string>
<string name="wallet_title" msgid="5369767670735827105">"ਵਾਲੇਟ"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"ਤਿਆਰ"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ"</string>
<string name="add_tile" msgid="6239678623873086686">"ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"ਗੱਲਬਾਤ ਵਿਜੇਟ"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕੋਈ ਗੱਲਬਾਤ ਚੁਣੋ"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ਪਹਿਲਾਂ"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਪਹਿਲਾਂ"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਪਹਿਲਾਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index b0ee6e7..c25d43bc 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edytuj"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edytuj zrzut ekranu"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zarejestruj więcej danych"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zamknij zrzut ekranu"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Górna granica"</string>
@@ -386,11 +385,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Odwróć kolory"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Tryb korekcji kolorów"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Więcej ustawień"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ustawienia użytkownika"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotowe"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zamknij"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Połączono"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Połączono, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Łączę..."</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"To urządzenie należy do organizacji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i jest połączone z sieciami VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Twoja organizacja może monitorować ruch w sieci w Twoim profilu służbowym"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> może monitorować ruch w sieci w Twoim profilu służbowym"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktywność w sieci w profilu służbowym jest widoczna dla Twojego administratora IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Sieć może być monitorowana"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"To urządzenie jest połączone z sieciami VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Twój profil służbowy jest połączony z siecią <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Portfel"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Gotowe"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil służbowy"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Tryb samolotowy"</string>
<string name="add_tile" msgid="6239678623873086686">"Dodaj nazwę"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Otwarta rozmowa"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widżety Rozmowa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Kliknij rozmowę, aby dodać ją do ekranu głównego"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Mniej niż <xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ponad <xliff:g id="DURATION">%1$s</xliff:g> temu"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 4861549..32153bf 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dispensar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícone de impressão digital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use sua impressão digital para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Não foi possível reconhecer a impressão digital. Use o bloqueio de tela."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Procurando você…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ícone facial"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botão de zoom da compatibilidade."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avião"</string>
<string name="add_tile" msgid="6239678623873086686">"Adicionar bloco"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toque em uma conversa para adicioná-la à tela inicial"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Volte aqui quando receber mensagens"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversas prioritárias"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversas recentes"</string>
+ <string name="okay" msgid="6490552955618608554">"Ok"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index d8fc157..5f585d4 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A app ou a sua entidade não permitem tirar capturas de ecrã"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de ecrã"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar captura de ecrã"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pré-visualização da captura de ecrã"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superior"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter cores"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de correção de cor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais definições"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Definições do utilizador"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Ligado"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ligado, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"A ligar..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertence à entidade <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> e está ligado a VPNs."</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"A sua entidade pode monitorizar o tráfego de rede no seu perfil de trabalho"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"A <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> pode monitorizar o tráfego de rede no seu perfil de trabalho"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"A atividade da rede do perfil de trabalho fica visível para o administrador de TI"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"A rede pode ser monitorizada"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está ligado a VPNs."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"O seu perfil de trabalho está ligado a <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo de avião"</string>
<string name="add_tile" msgid="6239678623873086686">"Adicionar mosaico"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Abrir conversa"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toque numa conversa para a adicionar ao ecrã principal"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Há <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Há menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Há mais de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 4861549..32153bf 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -177,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dispensar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícone de impressão digital"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use sua impressão digital para continuar"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Não foi possível reconhecer a impressão digital. Use o bloqueio de tela."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Procurando você…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ícone facial"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botão de zoom da compatibilidade."</string>
@@ -660,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarme"</string>
<string name="wallet_title" msgid="5369767670735827105">"Carteira"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pronto"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Perfil de trabalho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modo avião"</string>
<string name="add_tile" msgid="6239678623873086686">"Adicionar bloco"</string>
@@ -1096,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Toque em uma conversa para adicioná-la à tela inicial"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Volte aqui quando receber mensagens"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Conversas prioritárias"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Conversas recentes"</string>
+ <string name="okay" msgid="6490552955618608554">"Ok"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 81b41f92..a70e2a2 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editați"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editați captura de ecran"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Surprindeți mai mult"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Închideți captura de ecran"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Marginea superioară"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inversați culorile"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Mod de corectare a culorilor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mai multe setări"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setări de utilizator"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminat"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Închideți"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Conectat"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectat, bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Se conectează..."</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dispozitivul aparține organizației <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> și este conectat la VPN-uri"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Este posibil ca organizația dvs. să monitorizeze traficul de rețea în profilul dvs. de serviciu"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Este posibil ca <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> să monitorizeze traficul de rețea din profilul dvs. de serviciu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Activitatea din rețeaua de profiluri de serviciu este vizibilă pentru administratorul IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Este posibil ca rețeaua să fie monitorizată"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dispozitivul este conectat la VPN-uri"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profilul dvs. de serviciu este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarmă"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Gata"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil de serviciu"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Mod Avion"</string>
<string name="add_tile" msgid="6239678623873086686">"Adăugați o casetă"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Deschideți conversația"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Widgeturi pentru conversație"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Atingeți o conversație ca să o adăugați pe ecranul de pornire"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Acum <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"În urmă cu mai puțin de <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"În urmă cu peste <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8647aac..30b0e3b 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Не удалось сделать скриншот: нет разрешения от приложения или организации."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Изменить"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Изменить скриншот"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Увеличить площадь скриншота"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрыть скриншот"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граница"</string>
@@ -386,11 +385,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Обратные цвета"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Коррекция цвета"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Настройки"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пользовательские настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыть"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Подключено"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Подключено, уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Соединение..."</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Это устройство принадлежит организации \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" и подключено к приложениям для VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ваша организация может отслеживать сетевой трафик в рабочем профиле"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Организация \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" может отслеживать сетевой трафик в вашем рабочем профиле"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Администратору доступна история действий в сети в рабочем аккаунте."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Сеть может отслеживаться"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Это устройство подключено к приложениям для VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш рабочий профиль подключен к приложению \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Будильник"</string>
<string name="wallet_title" msgid="5369767670735827105">"Кошелек"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Рабочий профиль"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Режим полета"</string>
<string name="add_tile" msgid="6239678623873086686">"Добавить кнопку быстрого доступа"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Открытый чат"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виджеты чатов"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Нажмите на чат, чтобы добавить его на главный экран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> назад"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Прошло не более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Прошло более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index eb3494e..7206f02 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"තිර රූ ගැනීමට යෙදුම හෝ ඔබගේ සංවිධානය ඉඩ නොදේ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"සංස්කරණය කරන්න"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"තිර රුව සංස්කරණය කරන්න"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"තව ග්රහණය කරන්න"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"තිර රුව ඉවත ලන්න"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ඉහළම මායිම"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"ඉවත ලන්න"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"ඇඟිලි සලකුණු නිරූපකය"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"මුහුණ හැඳිනිය නොහැක. ඒ වෙනුවට ඇඟිලි සලකුණ භාවිත ක."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"ඉදිරියට යාමට ඔබගේ ඇඟිලි සලකුණ භාවිත කරන්න"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"ඇඟිලි සලකුණ හඳුනා ගත නොහැකිය. ඒ වෙනුවට තිර අගුල භාවිත කරන්න."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"ඔබව සොයමින්…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"මුහුණ නිරූපකය"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"ගැළපෙන විශාලන බොත්තම."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"වර්ණ යටිකුරු කරන්න"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"වර්ණ නිවැරදි කිරීමේ ප්රකාරය"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"තව සැකසීම්"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"පරිශීලක සැකසීම්"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"නිමයි"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"වසන්න"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"සම්බන්ධිත"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"සම්බන්ධිතයි, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"සම්බන්ධ වෙමින්..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"මෙම උපාංගය <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> සංවිධානයට අයිති අතර VPNs වෙත සම්බන්ධ කර ඇත"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ඔබගේ කාර්යාල පැතිකඩ තුළ ඔබේ සංවිධානය ජාල තදබදය නිරීක්ෂණය කිරීමට හැක"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ඔබේ කාර්යාල පැතිකඩ තුළ ජාල තදබදය නිරීක්ෂණය කළ හැක"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"කාර්යාල පැතිකඩ ජාල ක්රියාකාරකම් ඔබගේ IT පරිපාලකට දෘශ්යමානය"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"මෙම උපාංගය VPNs වෙත සම්බන්ධ කර ඇත"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ඔබේ කාර්යාල පැතිකඩ <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත සම්බන්ධ කර ඇත"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"එලාමය"</string>
<string name="wallet_title" msgid="5369767670735827105">"පසුම්බිය"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"සූදානම්"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"කාර්යාල පැතිකඩ"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ගුවන්යානා ප්රකාරය"</string>
<string name="add_tile" msgid="6239678623873086686">"ටයිල් එක් කරන්න"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"සංවාදය විවෘත කරන්න"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"සංවාද විජට්"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ඔබගේ මුල් තිරයට එය එක් කිරීමට සංවාදයක් තට්ටු කරන්න"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"ඔබට පණිවිඩ කිහිපයක් ලැබුණු පසු නැවත මෙහි පරීක්ෂා කරන්න"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"ප්රමුඛතා සංවාද"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"මෑත සංවාද"</string>
+ <string name="okay" msgid="6490552955618608554">"හරි"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>කට පෙර"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා අඩු කාලයකට පෙර"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා පෙර"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3abd288..4919352 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Upraviť"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Upraviť snímku obrazovky"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasnímať viac"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavrieť snímku obrazovky"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Horná hranica"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Zrušiť"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotknite sa senzora odtlačkov prstov"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona odtlačku prsta"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tvár sa nedá rozpoznať. Použite odtlačok prsta."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Pokračujte nasnímaním odtlačku prsta"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Odtlačok prsta sa nedá rozpoznať. Použite radšej zámku obrazovky."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Hľadáme vás…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona tváre"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Tlačidlo úpravy veľkosti z dôvodu kompatibility."</string>
@@ -386,11 +382,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzia farieb"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekcie farieb"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Ďalšie nastavenia"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Používateľské nastavenia"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavrieť"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Pripojené"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Pripojené, stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Pripája sa..."</string>
@@ -539,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Toto zariadenie patrí organizácii <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je pripojené k sieťam VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizácia môže sledovať sieťovú premávku vo vašom pracovnom profile"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizácia <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> môže sledovať sieťovú premávku vo vašom pracovnom profile"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitu siete pracovného profilu vidí váš správca IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Sieť môže byť sledovaná"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Toto zariadenie je pripojené k sieťam VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovný profil je pripojený k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -670,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Budík"</string>
<string name="wallet_title" msgid="5369767670735827105">"Peňaženka"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pripravené"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Pracovný profil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Režim v lietadle"</string>
<string name="add_tile" msgid="6239678623873086686">"Pridať dlaždicu"</string>
@@ -1112,6 +1111,10 @@
<string name="basic_status" msgid="2315371112182658176">"Otvorená konverzácia"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Miniaplikácie konverzácií"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Klepnite na konverzáciu a pridajte ju tak na plochu"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Sem sa vráťte, keď dostanete nejaké správy"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioritné konverzácie"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nedávne konverzácie"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"Pred <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pred menej ako <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pred viac ako <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 180d65c..c995383 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ali vaša organizacija ne dovoljuje posnetkov zaslona"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Urejanje posnetka zaslona"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zajemi več"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Opusti posnetek zaslona"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Predogled posnetka zaslona"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Zgornji rob"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Opusti"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotaknite se tipala prstnih odtisov"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikona prstnih odtisov"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obraza ni mogoče prepoznati. Uporabite prstni odtis."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Uporabite prstni odtis, če želite nadaljevati."</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Prstnega odtisa ni mogoče prepoznati. Uporabite odklepanje s poverilnico."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Preverjanje vašega obraza …"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikona obraza"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Gumb povečave za združljivost."</string>
@@ -386,11 +382,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzija barv"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Način popravljanja barv"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Več nastavitev"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uporabniške nastavitve"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zapri"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Povezava je vzpostavljena"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezava je vzpostavljena, raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Vzpostavljanje povezave ..."</string>
@@ -539,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ta naprava pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> in je povezana v omrežja VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija lahko nadzira omrežni promet v vašem delovnem profilu"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> lahko nadzira omrežni promet v vašem delovnem profilu"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Omrežna dejavnost delovnega profila je vidna skrbniku za IT."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Omrežje je morda nadzorovano"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ta naprava je povezana v omrežja VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Delovni profil je povezan v aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -670,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Opozorilo"</string>
<string name="wallet_title" msgid="5369767670735827105">"Denarnica"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Pripravljeno"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profil za Android Work"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Način za letalo"</string>
<string name="add_tile" msgid="6239678623873086686">"Dodajanje ploščice"</string>
@@ -1112,6 +1111,10 @@
<string name="basic_status" msgid="2315371112182658176">"Odprt pogovor"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Pripomočki za pogovore"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Dotaknite se pogovora, da ga dodate na začetni zaslon."</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Znova preverite tukaj, ko boste prejeli kakšno sporočilo."</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prednostni pogovori"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Nedavni pogovori"</string>
+ <string name="okay" msgid="6490552955618608554">"V redu"</string>
<string name="timestamp" msgid="6577851592534538533">"pred <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Pred manj kot <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Pred več kot <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index cc62da3..9d54f5f 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifiko"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifiko pamjen e ekranit"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Shkrep më shumë"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Kufiri i sipërm"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Shkëmbe ngjyrat"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Modaliteti i korrigjimit të ngjyrës"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Cilësime të tjera"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cilësimet e përdoruesit"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"U krye"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Mbyll"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"I lidhur"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"E lidhur, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Po lidhet..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Kjo pajisje i përket <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dhe është e lidhur me rrjetet VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizata jote mund të monitorojë trafikun e rrjetit në profilin tënd të punës"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mund të monitorojë trafikun e rrjetit në profilin tënd të punës"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktiviteti i rrjetit të profilit të punës është i dukshëm për administratorin tënd të teknologjisë së informacionit"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Rrjeti mund të jetë i monitoruar"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Kjo pajisje është e lidhur me rrjetet VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profili yt i punës është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Eternet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarmi"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Gati"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profili i punës"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Modaliteti i aeroplanit"</string>
<string name="add_tile" msgid="6239678623873086686">"Shto një pllakëz"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Hap bisedën"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Miniaplikacionet e bisedave"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Trokit te një bisedë dhe shtoje në ekranin bazë"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Më pak se <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mbi <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 6975a45..a10d247 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликација или организација не дозвољавају прављење снимака екрана"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Измените снимак екрана"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Снимите још"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Одбаците снимак екрана"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Горња граница"</string>
@@ -385,11 +384,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Обрни боје"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим корекције боје"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Још подешавања"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Корисничка подешавања"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Повезан"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Повезано, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Повезује се..."</string>
@@ -536,8 +533,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Овај уређај припада организацији <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и повезан је са VPN-овима"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Организација може да прати мрежни саобраћај на пословном профилу"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да надгледа мрежни саобраћај на пословном профилу"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Активност на мрежи пословног профила је видљива ИТ администратору"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежа се можда надгледа"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Овај уређај је повезан са VPN-овима"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Пословни профил је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -667,7 +663,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Етернет"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Аларм"</string>
<string name="wallet_title" msgid="5369767670735827105">"Новчаник"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Спремно"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Пословни профил"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Режим рада у авиону"</string>
<string name="add_tile" msgid="6239678623873086686">"Додај плочицу"</string>
@@ -1106,6 +1108,14 @@
<string name="basic_status" msgid="2315371112182658176">"Отворите конверзацију"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Виџети за конверзацију"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Додирните конверзацију да бисте је додали на почетни екран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"Пре <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Пре мање од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Пре више од <xliff:g id="DURATION">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index f3ed806..7e43a2a 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisationen tillåter inte att du tar skärmbilder"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redigera"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Redigera skärmbild"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fånga mer"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Stäng skärmbild"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmbild"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Övre gräns"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Stäng"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Tryck på fingeravtryckssensorn"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ikon för fingeravtryck"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet kändes inte igen. Använd fingeravtryck."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Fortsätt med hjälp av ditt fingeravtryck"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Fingeravtrycket kändes inte igen. Använd låsskärmen i stället."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Håller utkik efter dig …"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ansiktsikon"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Knapp för kompatibilitetszoom."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertera färger"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Färgkorrigeringsläge"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Fler inställningar"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Användarinställningar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klart"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Stäng"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Ansluten"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ansluten, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Ansluter ..."</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Den här enheten tillhör <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> och är ansluten till VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisationen kan övervaka nätverkstrafik i jobbprofilen"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan övervaka nätverkstrafiken i jobbprofilen"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Jobbprofilens nätverksaktivitet är synlig för IT-administratören"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Nätverket kan vara övervakat"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Den här enheten är ansluten till VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Klar"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Jobbprofil"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Flygplansläge"</string>
<string name="add_tile" msgid="6239678623873086686">"Lägg till en ruta"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Öppen konversation"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Konversationswidgetar"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Tryck på en konversation för att lägga till den på startskärmen"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Besök den här sidan igen när du har fått meddelanden"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Prioriterade konversationer"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Aktuella konversationer"</string>
+ <string name="okay" msgid="6490552955618608554">"Okej"</string>
<string name="timestamp" msgid="6577851592534538533">"För <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Mindre än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mer än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 634cd9d..27fe234 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Programu au shirika lako halikuruhusu kupiga picha za skrini"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Badilisha"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Badilisha picha ya skrini"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasa zaidi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ondoa picha ya skrini"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Mpaka wa sehemu ya juu"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Pindua rangi"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Hali ya kusahihisha rangi"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mipangilio zaidi"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mipangilio ya mtumiaji"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Nimemaliza"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Funga"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Imeunganishwa"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Imeunganishwa, kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Inaunganisha..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Kifaa hiki kinamilikiwa na <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> na kimeunganishwa kwenye VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Huenda shirika lako likafuatilia shughuli kwenye mtandao katika wasifu wako wa kazini"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Huenda <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ikafuatilia shughuli kwenye mtandao katika wasifu wako wa kazini"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Shughuli za mtandao za wasifu wa kazini zinaonekana kwa msimamizi wako wa TEHAMA."</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Huenda mtandao unafuatiliwa"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Kifaa hiki kimeunganishwa kwenye VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Wasifu wako wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethaneti"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Kengele"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Tayari"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Wasifu wa kazini"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Hali ya ndegeni"</string>
<string name="add_tile" msgid="6239678623873086686">"Ongeza kigae"</string>
@@ -952,7 +954,7 @@
<string name="notification_channel_storage" msgid="2720725707628094977">"Hifadhi"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"Vidokezo"</string>
<string name="instant_apps" msgid="8337185853050247304">"Programu Zinazofunguka Papo Hapo"</string>
- <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> inaendelea kutumika"</string>
+ <string name="instant_apps_title" msgid="8942706782103036910">"Programu ya <xliff:g id="APP">%1$s</xliff:g> inatumika"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"Programu inafunguka bila kusakinishwa."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"Programu inafunguka bila kusakinishwa. Gusa ili upate maelezo zaidi."</string>
<string name="app_info" msgid="5153758994129963243">"Maelezo ya programu"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Fungua mazungumzo"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Wijeti za mazungumzo"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Gusa mazungumzo ili uyaweke kwenye Skrini yako ya kwanza"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Chini ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Zaidi ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index a940304..73f8a56 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"திருத்து"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ஸ்கிரீன்ஷாட்டைத் திருத்தும்"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"கூடுதலாகப் படமெடு"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ஸ்கிரீன்ஷாட்டை நிராகரிக்கும்"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"மேற்புற எல்லை"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"வண்ணங்களை மாற்று"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"வண்ணத்தைச் சரிப்படுத்தும் முறை"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"அமைப்பில் மாற்று"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"பயனர் அமைப்புகள்"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"முடிந்தது"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"மூடுக"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"இணைக்கப்பட்டது"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"இணைக்கப்பட்டது, பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"இணைக்கிறது..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"இந்த சாதனம் <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிறுவனத்துக்கு சொந்தமானது, அது VPNகளுடன் இணைக்கப்பட்டுள்ளது"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"உங்கள் நிறுவனம் பணிக் கணக்கில் நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம்"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> உங்கள் பணிக் கணக்கில் நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம்"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"பணிக் கணக்கின் நெட்வொர்க் செயல்பாட்டை IT நிர்வாகியால் பார்க்க முடியும்"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"நெட்வொர்க் கண்காணிக்கப்படலாம்"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"இந்த சாதனம் VPNகளுடன் இணைக்கப்பட்டுள்ளது"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"உங்கள் பணிக் கணக்கு <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ஈதர்நெட்"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"அலாரம்"</string>
<string name="wallet_title" msgid="5369767670735827105">"வாலட்"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"தயாராக உள்ளது"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"பணிக் கணக்கு"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"விமானப் பயன்முறை"</string>
<string name="add_tile" msgid="6239678623873086686">"டைலைச் சேர்க்கும்"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"திறந்தநிலை உரையாடல்"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"உரையாடல் விட்ஜெட்டுகள்"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"ஓர் உரையாடலை உங்கள் முகப்புத் திரையில் சேர்க்க அந்த உரையாடலைத் தட்டுங்கள்"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>க்குக் குறைவாக"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index e76e182..e141210 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"స్క్రీన్షాట్లు తీయడానికి యాప్ లేదా మీ సంస్థ అనుమతించలేదు"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ఎడిట్ చేయండి"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"స్క్రీన్షాట్ను ఎడిట్ చేయండి"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"మరిన్ని క్యాప్చర్ చేయండి"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్షాట్ను విస్మరించు"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్షాట్ ప్రివ్యూ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ఎగువ సరిహద్దు"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"కలర్ మార్పిడి"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"రంగు సవరణ మోడ్"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"మరిన్ని సెట్టింగ్లు"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"యూజర్ సెట్టింగ్లు"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"కనెక్ట్ చేయబడినది"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"కనెక్ట్ అవుతోంది..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>కు చెందినది, ఇది VPNలకు కనెక్ట్ అయి ఉంది"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"మీ కార్యాలయ ప్రొఫైల్లోని నెట్వర్క్ ట్రాఫిక్ని మీ సంస్థ పర్యవేక్షించవచ్చు"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"మీ కార్యాలయ ప్రొఫైల్లోని నెట్వర్క్ ట్రాఫిక్ని <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> పర్యవేక్షించవచ్చు"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"వర్క్ ప్రొఫైల్ నెట్వర్క్ యాక్టివిటీ మీ IT అడ్మిన్కు కనిపిస్తుంది"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ఈ పరికరం VPNలకు కనెక్ట్ అయి ఉంది"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"మీ వర్క్ ప్రొఫైల్ <xliff:g id="VPN_APP">%1$s</xliff:g>కు కనెక్ట్ చేయబడింది"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ఈథర్నెట్"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"అలారం"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"సిద్ధంగా ఉంది"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"కార్యాలయ ప్రొఫైల్"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ఎయిర్ప్లేన్ మోడ్"</string>
<string name="add_tile" msgid="6239678623873086686">"టైల్ను జోడించండి"</string>
@@ -951,7 +953,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"సాధారణ సందేశాలు"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"నిల్వ"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"సూచనలు"</string>
- <string name="instant_apps" msgid="8337185853050247304">"తక్షణ యాప్లు"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"ఇన్స్టంట్ యాప్లు"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"ఇన్స్టాల్ చేయకుండా యాప్ తెరవబడింది."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"ఇన్స్టాల్ చేయకుండా యాప్ తెరవబడింది. మరింత తెలుసుకోవడానికి నొక్కండి."</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"సంభాషణను తెరవండి"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"సంభాషణ విడ్జెట్లు"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"దీనిని మీ మొదటి స్క్రీన్కు జోడించడానికి సంభాషణను ట్యాప్ చేయండి"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> కంటే ముందు"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string>
diff --git a/packages/SystemUI/res/values-television/styles.xml b/packages/SystemUI/res/values-television/styles.xml
index 97a42d9..5772f9d 100644
--- a/packages/SystemUI/res/values-television/styles.xml
+++ b/packages/SystemUI/res/values-television/styles.xml
@@ -23,7 +23,7 @@
<item name="android:windowExitAnimation">@null</item>
</style>
- <style name="volume_dialog_theme" parent="qs_theme">
+ <style name="volume_dialog_theme" parent="Theme.SystemUI">
<item name="android:colorAccent">@color/tv_volume_dialog_accent</item>
<item name="android:dialogCornerRadius">@dimen/volume_dialog_panel_width_half</item>
</style>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index be6eae4..65ebb33c 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"แก้ไข"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"แก้ไขภาพหน้าจอ"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"จับภาพได้มากขึ้น"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ปิดภาพหน้าจอ"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"ขอบเขตด้านบน"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"กลับสี"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"โหมดการแก้ไขสี"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"การตั้งค่าเพิ่มเติม"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"การตั้งค่าของผู้ใช้"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ปิด"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"เชื่อมต่อ"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"เชื่อมต่ออยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"กำลังเชื่อมต่อ..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> เป็นเจ้าของอุปกรณ์นี้ และอุปกรณ์เชื่อมต่ออยู่กับ VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"องค์กรของคุณอาจตรวจสอบการจราจรของข้อมูลในเครือข่ายในโปรไฟล์งาน"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> อาจตรวจสอบการจราจรของข้อมูลในเครือข่ายในโปรไฟล์งานของคุณ"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ผู้ดูแลระบบไอทีจะเห็นกิจกรรมในเครือข่ายโปรไฟล์งาน"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"อาจมีการตรวจสอบเครือข่าย"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"อุปกรณ์นี้เชื่อมต่ออยู่กับ VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"โปรไฟล์งานของคุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"อีเทอร์เน็ต"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"การปลุก"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"พร้อม"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"โปรไฟล์งาน"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"โหมดบนเครื่องบิน"</string>
<string name="add_tile" msgid="6239678623873086686">"เพิ่มไทล์"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"เปิดการสนทนา"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"วิดเจ็ตการสนทนา"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"แตะการสนทนาเพื่อเพิ่มไปยังหน้าจอหลัก"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"ไม่ถึง <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
<string name="over_timestamp" msgid="4765793502859358634">"นานกว่า <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 5847a68..9c86e44 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Hindi pinahihintulutan ng app o ng iyong organisasyon ang pagkuha ng mga screenshot"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"I-edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"I-edit ang screenshot"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mag-capture pa"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"I-dismiss ang screenshot"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Pinakamataas na limitasyon"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"I-invert ang mga kulay"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Correction mode ng kulay"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Higit pang setting"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mga setting ng user"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tapos na"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Isara"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Nakakonekta"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Nakakonekta, baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Kumokonekta..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Pagmamay-ari ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang device na ito at nakakonekta ito sa mga VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Maaaring sumubaybay ang iyong organisasyon ng trapiko sa network sa profile sa trabaho mo"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Maaaring subaybayan ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang trapiko sa network sa iyong profile sa trabaho"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Nakikita ng iyong IT admin ang aktibidad sa network ng profile sa trabaho"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Maaaring sinusubaybayan ang network"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Nakakonekta sa mga VPN ang device na ito"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang iyong profile sa trabaho"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarma"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Handa na"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Profile sa trabaho"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Airplane mode"</string>
<string name="add_tile" msgid="6239678623873086686">"Magdagdag ng tile"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Buksan ang pag-uusap"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Mga widget ng pag-uusap"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Mag-tap sa isang pag-uusap para idagdag ito sa iyong Home screen"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Wala pang <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Mahigit <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index add0260..67e883b 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Uygulama veya kuruluşunuz, ekran görüntüsü alınmasına izin vermiyor."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Düzenle"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Ekran görüntüsünü düzenle"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Daha fazla ekran görüntüsü al"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran görüntüsünü kapat"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Üst sınır"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Renkleri çevir"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Renk düzeltme modu"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Diğer ayarlar"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kullanıcı ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Bitti"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Kapat"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Bağlı"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Bağlandı, pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Bağlanılıyor..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kuruluşuna ait olup VPN\'lere bağlı"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Kuruluşunuz, iş profilinizdeki ağ trafiğini izleyebilir"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, iş profilinizdeki ağ trafiğini izleyebilir"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"BT yöneticiniz, iş profilinizin ağ etkinliğini görebilir"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Ağ trafiği izlenebilir"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu cihaz VPN\'lere bağlı"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"İş profiliniz <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string>
<string name="wallet_title" msgid="5369767670735827105">"Cüzdan"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Hazır"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"İş profili"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Uçak modu"</string>
<string name="add_tile" msgid="6239678623873086686">"Blok ekle"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Görüşmeyi aç"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Görüşme widget\'ları"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Ana ekranınıza eklemek için bir ileti dizisine dokunun"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> önce"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Henüz <xliff:g id="DURATION">%1$s</xliff:g> olmadı"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> üzerinde bir süre önce"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 4c1f55b..f0f51c6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Додаток або адміністратор вашої організації не дозволяють робити знімки екрана"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Редагувати"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Редагувати знімок екрана"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Включити більше деталей"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрити знімок екрана"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхня межа"</string>
@@ -386,11 +385,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Інвертовані кольори"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим коригування кольору"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Більше налаштувань"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налаштування користувача"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрити"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Під’єднано"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Під’єдано, заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"З’єднання…"</string>
@@ -539,8 +536,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\". Його підключено до мереж VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Адміністратор вашої організації може відстежувати мережевий трафік у вашому робочому профілі"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Адміністратор організації <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> мож відстежувати мережевий трафік у вашому робочому профілі"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Дії в мережі в робочому профілі може бачити ваш системний адміністратор"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мережевий трафік може відстежуватися"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Цей пристрій підключено до мереж VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш робочий профіль підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -670,7 +666,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Сигнал"</string>
<string name="wallet_title" msgid="5369767670735827105">"Гаманець"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Готово"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Робочий профіль"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Режим польоту"</string>
<string name="add_tile" msgid="6239678623873086686">"Додавання опції"</string>
@@ -1112,6 +1114,14 @@
<string name="basic_status" msgid="2315371112182658176">"Відкрита розмова"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Віджети розмов"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Натисніть розмову, щоб додати її на головний екран"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Менше ніж <xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Понад <xliff:g id="DURATION">%1$s</xliff:g> тому"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index ab6ae70..4d37244 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -664,7 +664,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"ایتھرنیٹ"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"الارم"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"تیار ہے"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"دفتری پروفائل"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"ہوائی جہاز وضع"</string>
<string name="add_tile" msgid="6239678623873086686">"ٹائل شامل کریں"</string>
@@ -1100,6 +1106,14 @@
<string name="basic_status" msgid="2315371112182658176">"گفتگو کھولیں"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"گفتگو ویجیٹس"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"اسے اپنے ہوم اسکرین پر شامل کرنے کے لیے گفتگو پر تھپتھپائیں"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> قبل"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> سے کچھ کم وقت قبل"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> سے زائد عرصہ قبل"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 7847967..01349b4 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Tahrirlash"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinshotni tahrirlash"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Yana suratga olish"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Skrinshotni yopish"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Yuqori chegara"</string>
@@ -178,12 +177,9 @@
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Yopish"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmoq izi skaneriga tegining"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Barmoq izi belgisi"</string>
- <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) -->
- <skip />
- <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) -->
- <skip />
+ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Bu yuz notanish. Barmoq izi orqali urining."</string>
+ <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Davom etish uchun barmoq izingizdan foydalaning"</string>
+ <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Bu barmoq izi notanish. Ekran qulfi orqali urining."</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Yuzingiz tekshirilmoqda…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Yuz belgisi"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Kattalashtirish tugmasi mosligi."</string>
@@ -384,11 +380,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Teskari ranglar"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Rangni to‘g‘rilash usuli"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Boshqa sozlamalar"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Foydalanuvchi sozlamalari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tayyor"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Yopish"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Ulangan"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ulangan, batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Ulanmoqda…"</string>
@@ -533,8 +527,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu qurilma <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tashkilotiga tegishli va VPN tarmoqlarga ulangan"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tashkilotingiz ishchi profilingizda tarmoq trafigini nazorat qilishi mumkin"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ishchi profilingizda tarmoq trafigini nazorat qilishi mumkin"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Ish profilida tarmoqqa oid harakatlar AT administratoriga koʻrinadi"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Tarmoq kuzatilishi mumkin"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu qurilma VPN tarmoqlarga ulangan"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ish profilingiz <xliff:g id="VPN_APP">%1$s</xliff:g> tarmogʻiga ulangan"</string>
@@ -664,7 +657,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Signal"</string>
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Tayyor"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Ish profili"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Parvoz rejimi"</string>
<string name="add_tile" msgid="6239678623873086686">"Tezkor sozlamalar tugmasini qo‘shish"</string>
@@ -1100,6 +1099,10 @@
<string name="basic_status" msgid="2315371112182658176">"Suhbatni ochish"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Suhbat vidjetlari"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Bosh ekranga chiqariladigan suhbat ustiga bosing"</string>
+ <string name="no_conversations_text" msgid="7362374212649891057">"Keyinroq bu yerda ayrim xabarlar chiqadi"</string>
+ <string name="priority_conversations" msgid="3967482288896653039">"Muhim suhbatlar"</string>
+ <string name="recent_conversations" msgid="8531874684782574622">"Oxirgi suhbatlar"</string>
+ <string name="okay" msgid="6490552955618608554">"OK"</string>
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> oldin"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>dan kam vaqt oldin"</string>
<string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>dan ortiq vaqt oldin"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 54f5f40..dcd029f 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ứng dụng hoặc tổ chức của bạn không cho phép chụp ảnh màn hình"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Chỉnh sửa"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Chỉnh sửa ảnh chụp màn hình"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Chụp được nhiều hơn"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Đóng ảnh chụp màn hình"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Ranh giới trên"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Đảo ngược màu"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Chế độ chỉnh màu"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Chế độ cài đặt khác"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cài đặt người dùng"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Đóng"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Đã kết nối"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Đã kết nối, mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Đang kết nối..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Thiết bị này thuộc về <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> và đã kết nối với VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tổ chức của bạn có thể giám sát lưu lượng truy cập mạng trong hồ sơ công việc của bạn"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> có thể giám sát lưu lượng truy cập mạng trong hồ sơ công việc của bạn"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Quản trị viên CNTT của bạn có thể xem hoạt động trên mạng của hồ sơ công việc"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mạng có thể được giám sát"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Thiết bị này đã kết nối với VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Hồ sơ công việc của bạn đã kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"Báo thức"</string>
<string name="wallet_title" msgid="5369767670735827105">"Ví"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Sẵn sàng"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Hồ sơ công việc"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Chế độ máy bay"</string>
<string name="add_tile" msgid="6239678623873086686">"Thêm ô"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Mở cuộc trò chuyện"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Tiện ích trò chuyện"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Nhấn vào một cuộc trò chuyện để thêm cuộc trò chuyện đó vào Màn hình chính"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Chưa đầy <xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Hơn <xliff:g id="DURATION">%1$s</xliff:g> trước"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 71b1b6a..7172e81 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"此应用或您所在的单位不允许进行屏幕截图"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"编辑"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"编辑屏幕截图"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"截取更多内容"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"关闭屏幕截图"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"顶部边界"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"反色"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"颜色校正模式"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多设置"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"用户设置"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"关闭"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"已连接"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"正在连接…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"此设备归<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>所有,且已连接到多个 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"您所在的单位可能会监控您工作资料中的网络流量"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"“<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>”可能会监控您工作资料中的网络流量"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理员可以看到工作资料的网络活动记录"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"网络可能会受到监控"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"此设备已连接到多个 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"您的工作资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"以太网"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"闹钟"</string>
<string name="wallet_title" msgid="5369767670735827105">"电子钱包"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作资料"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"飞行模式"</string>
<string name="add_tile" msgid="6239678623873086686">"添加图块"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"开放式对话"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"对话微件"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"点按对话即可将其添加到主屏幕"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>内"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超过 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 63a0feb..f243e7c 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"應用程式或您的機構不允許擷取螢幕畫面"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"上方邊界"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"反轉顏色"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"色彩校正模式"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"已連線"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"正在連線…"</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」,並已連結至 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"您的機構可能監控您工作設定檔上的網絡流量"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>可能會監控您工作設定檔上的網絡流量"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理員可以查看工作設定檔的網絡活動"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"網絡可能會受到監控"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"此裝置已連結至 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"您的工作設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"以太網"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"鬧鐘"</string>
<string name="wallet_title" msgid="5369767670735827105">"電子錢包"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作設定檔"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"飛行模式"</string>
<string name="add_tile" msgid="6239678623873086686">"加入圖塊"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"開啟對話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index c8ade67..ffd235e 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"這個應用程式或貴機構不允許擷取螢幕畫面"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"頂端邊界"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"反轉顏色"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"色彩校正模式"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"已連線"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"連線中..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"這部裝置的擁有者為「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」,並且已連線到 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"貴機構可能會監控你工作資料夾的網路流量"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」可能會監控你工作資料夾的網路流量"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理員可以查看工作資料夾的網路活動"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"網路可能會受到監控"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"這部裝置已連線到 VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"你的工作資料夾已連線到「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"乙太網路"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"鬧鐘"</string>
<string name="wallet_title" msgid="5369767670735827105">"電子錢包"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"已可使用"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"工作資料夾"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"飛航模式"</string>
<string name="add_tile" msgid="6239678623873086686">"新增圖塊"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"開放式對話"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"輕觸對話即可新增至主畫面"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string>
<string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 2c6c985..cb6aa0e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -89,8 +89,7 @@
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ukuthatha izithombe-skrini akuvunyelwe uhlelo lokusebenza noma inhlangano yakho"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Hlela"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Hlela isithombe-skrini"</string>
- <!-- no translation found for screenshot_scroll_label (2930198809899329367) -->
- <skip />
+ <string name="screenshot_scroll_label" msgid="2930198809899329367">"Thwebula okuningi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cashisa isithombe-skrini"</string>
<string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string>
<string name="screenshot_top_boundary" msgid="1500569103321300856">"Umngcele ophezulu"</string>
@@ -384,11 +383,9 @@
<string name="quick_settings_inversion_label" msgid="5078769633069667698">"Faka imibala"</string>
<string name="quick_settings_color_space_label" msgid="537528291083575559">"Imodi yokulungisa umbala"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Izilungiselelo eziningi"</string>
- <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) -->
- <skip />
+ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Amasethingi womsebenzisi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kwenziwe"</string>
- <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) -->
- <skip />
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Vala"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"Ixhunyiwe"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Kuxhunyiwe, ibhethri elingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"Iyaxhuma..."</string>
@@ -533,8 +530,7 @@
<string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Le divayisi ngeye-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> futhi ixhunywe kuma-VPN"</string>
<string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Inhlangano yakho ingaqapha ithrafikhi yenethiwekhi kuphrofayela yakho yomsebenzi"</string>
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"I-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ingaqaphela ithrafikhi yenethiwekhi kuphrofayela yakho yomsebenzi"</string>
- <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) -->
- <skip />
+ <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Umsebenzi wenethiwekhi yephrofayela yomsebenzi uyabonakala kumphathi wakho we-IT"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Inethiwekhi kungenzeka iqashiwe"</string>
<string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Le divayisi ixhunywe kuma-VPN"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Iphrofayela yakho yomsebenzi ixhunywe ku-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
@@ -664,7 +660,13 @@
<string name="status_bar_ethernet" msgid="5690979758988647484">"I-Ethernet"</string>
<string name="status_bar_alarm" msgid="87160847643623352">"I-alamu"</string>
<string name="wallet_title" msgid="5369767670735827105">"I-wallet"</string>
+ <!-- no translation found for wallet_button_label_device_unlocked (4653372304880486681) -->
+ <skip />
+ <!-- no translation found for wallet_button_label_device_locked (4418473374652969487) -->
+ <skip />
<string name="wallet_secondary_label" msgid="2017028770884957543">"Isikulungele"</string>
+ <!-- no translation found for wallet_error_generic (257704570182963611) -->
+ <skip />
<string name="status_bar_work" msgid="5238641949837091056">"Iphrofayela yomsebenzi"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Imodi yendiza"</string>
<string name="add_tile" msgid="6239678623873086686">"Engeza ithayili"</string>
@@ -1100,6 +1102,14 @@
<string name="basic_status" msgid="2315371112182658176">"Vula ingxoxo"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"Amawijethi wengxoxo"</string>
<string name="select_conversation_text" msgid="3376048251434956013">"Thepha ingxoxo ukuyengeza Kusikrini sakho sasekhaya"</string>
+ <!-- no translation found for no_conversations_text (7362374212649891057) -->
+ <skip />
+ <!-- no translation found for priority_conversations (3967482288896653039) -->
+ <skip />
+ <!-- no translation found for recent_conversations (8531874684782574622) -->
+ <skip />
+ <!-- no translation found for okay (6490552955618608554) -->
+ <skip />
<string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
<string name="less_than_timestamp" msgid="6598972791137724517">"Ngaphansi kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
<string name="over_timestamp" msgid="4765793502859358634">"Ngaphezu kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index e3bf124..b21c3ae 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -54,6 +54,13 @@
<color name="global_actions_emergency_background">@color/GM2_red_400</color>
<color name="global_actions_emergency_text">@color/GM2_grey_100</color>
+ <!-- Colors for Power Menu Lite -->
+ <color name="global_actions_lite_background">#191C18</color>
+ <color name="global_actions_lite_button_background">#303030</color>
+ <color name="global_actions_lite_text">#F0F0F0</color>
+ <color name="global_actions_lite_emergency_background">#F85D4D</color>
+ <color name="global_actions_lite_emergency_icon">@color/GM2_grey_900</color>
+
<color name="global_actions_shutdown_ui_text">@color/control_primary_text</color>
<!-- Tint color for the content on the notification overflow card. -->
@@ -281,4 +288,9 @@
<!-- Accessibility floating menu -->
<color name="accessibility_floating_menu_background">#CCFFFFFF</color> <!-- 80% -->
<color name="accessibility_floating_menu_stroke_dark">#26FFFFFF</color> <!-- 15% -->
+
+ <!-- Wallet screen -->
+ <color name="wallet_white">#FFFFFF</color>
+ <color name="wallet_card_border">#33FFFFFF</color>
+ <color name="wallet_primary_text">@color/GM2_grey_900</color>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 53a42ae..bd92299 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -570,6 +570,10 @@
<!-- Max number of columns for power menu -->
<integer name="power_menu_max_columns">3</integer>
+ <!-- Max number of columns for power menu lite -->
+ <integer name="power_menu_lite_max_columns">2</integer>
+ <!-- Max number of rows for power menu lite -->
+ <integer name="power_menu_lite_max_rows">4</integer>
<!-- If the dp width of the available space is <= this value, potentially adjust the number
of columns-->
@@ -606,6 +610,21 @@
<!-- Determines whether the shell features all run on another thread. -->
<bool name="config_enableShellMainThread">false</bool>
+ <!-- Default udfps icon. Same path as ic_fingerprint.xml -->
+ <string name="config_udfpsIcon" translatable="false">
+ M25.5,16.3283C28.47,14.8433 31.9167,14 35.5834,14C39.2501,14 42.6968,14.8433 45.6668,16.3283
+ M20,28.6669C22.7683,24.3402 28.7084,21.3335 35.5834,21.3335C42.4585,21.3335 48.3985,
+ 24.3402 51.1669,28.6669
+ M22.8607,47.0002C21.834,44.3235 21.834,41.5002 21.834,41.5002C21.834,
+ 34.4051 27.7374,28.6667 35.5841,28.6667C43.4308,28.6667 49.3341,34.4051 49.3341,41.5002
+ M49.3344,41.5003V42.0319C49.3344,44.7636 47.1161,47.0003 44.3661,47.0003C41.9461,
+ 47.0003 39.8744,45.2403 39.471,42.857L38.9577,
+ 39.7769C38.591,37.5953 36.7027,36.0002 34.5027,
+ 36.0002C26.5826,36.0002 29.846,49.1087 35.291,50.6487
+ M44.9713,54.6267C42.5513,56.7167 39.2879,58.0001 35.5846,58.0001C32.2296,
+ 58.0001 29.2229,56.9551 26.8945,55.195
+ </string>
+
<!-- package name of a built-in camera app to use to restrict implicit intent resolution
when the double-press power gesture is used. Ignored if empty. -->
<string translatable="false" name="config_cameraGesturePackage"></string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 1bd12a3..5a21b30 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -243,7 +243,7 @@
<dimen name="notification_guts_conversation_action_text_padding_start">32dp</dimen>
<dimen name="conversation_onboarding_bullet_gap_width">6dp</dimen>
- <dimen name="notification_guts_header_top_padding">11dp</dimen>
+ <dimen name="notification_guts_header_top_padding">12dp</dimen>
<!-- The height of the header in inline settings -->
<dimen name="notification_guts_header_height">24dp</dimen>
@@ -420,6 +420,8 @@
<!-- Padding on each QS Footer Icon to make the icons 20dpx20dp -->
<dimen name="qs_footer_icon_padding">14dp</dimen>
+ <!-- 3/4 of icon width 20dpx20dp -->
+ <dimen name="qs_footer_tuner_icon_translation">15dp</dimen>
<!-- The padding between the notifications and the quick settings container -->
<dimen name="qs_notification_padding">@dimen/notification_side_paddings</dimen>
@@ -447,7 +449,7 @@
<dimen name="notification_panel_width">@dimen/match_parent</dimen>
- <dimen name="brightness_mirror_height">56dp</dimen>
+ <dimen name="brightness_mirror_height">48dp</dimen>
<!-- The width of the panel that holds the quick settings. -->
<dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>
@@ -529,10 +531,10 @@
<dimen name="qs_tile_margin_top_bottom">12dp</dimen>
<dimen name="qs_tile_margin_top_bottom_negative">-12dp</dimen>
<!-- The height of the qs customize header. Should be
- (qs_panel_padding_top (48dp) + brightness_mirror_height (56dp) + qs_tile_margin_top (0dp)) -
+ (qs_panel_padding_top (48dp) + brightness_mirror_height (48dp) + qs_tile_margin_top (0dp)) -
(Toolbar_minWidth (56dp) + qs_tile_margin_top_bottom (12dp))
-->
- <dimen name="qs_customize_header_min_height">36dp</dimen>
+ <dimen name="qs_customize_header_min_height">28dp</dimen>
<dimen name="qs_tile_margin_top">0dp</dimen>
<dimen name="qs_tile_icon_background_stroke_width">-1dp</dimen>
<dimen name="qs_tile_background_size">44dp</dimen>
@@ -1065,6 +1067,12 @@
<dimen name="global_actions_power_dialog_item_width">255dp</dimen>
<dimen name="global_actions_power_dialog_item_bottom_margin">45dp</dimen>
+ <!-- Power Menu Lite -->
+ <dimen name="global_actions_button_size">96dp</dimen>
+ <dimen name="global_actions_button_padding">38dp</dimen>
+ <dimen name="global_actions_corner_radius">28dp</dimen>
+ <dimen name="global_actions_lite_padding">24dp</dimen>
+
<!-- The maximum offset in either direction that elements are moved horizontally to prevent
burn-in on AOD. -->
<dimen name="burn_in_prevention_offset_x">8dp</dimen>
@@ -1085,7 +1093,7 @@
<!-- The maximum offset for the under-display fingerprint sensor (UDFPS) icon in either
direction that elements aer moved to prevent burn-in on AOD-->
- <dimen name="udfps_burn_in_offset_x">8dp</dimen>
+ <dimen name="udfps_burn_in_offset_x">2dp</dimen>
<dimen name="udfps_burn_in_offset_y">8dp</dimen>
<dimen name="corner_size">8dp</dimen>
@@ -1401,6 +1409,9 @@
<!-- rounded_slider_track_width / 2 -->
<dimen name="rounded_slider_track_corner_radius">4dp</dimen>
+ <!-- inset for ic_lock_open within a DisabledUdfpsView -->
+ <dimen name="udfps_unlock_icon_inset">16dp</dimen>
+
<!-- Location on the screen of the center of the physical power button. This is a reasonable
default that should be overridden by device-specific overlays. -->
<dimen name="physical_power_button_center_screen_location_y">620px</dimen>
@@ -1415,4 +1426,17 @@
For devices with sensors on the back of the device, this corresponds to the location on the
screen directly in front of the sensor. -->
<dimen name="physical_fingerprint_sensor_center_screen_location_y">610px</dimen>
+
+ <!-- Wallet activity screen specs -->
+ <dimen name="wallet_icon_size">36sp</dimen>
+ <dimen name="card_margin">16dp</dimen>
+ <dimen name="card_carousel_dot_offset">24dp</dimen>
+ <dimen name="card_carousel_dot_unselected_radius">2dp</dimen>
+ <dimen name="card_carousel_dot_selected_radius">3dp</dimen>
+ <dimen name="card_carousel_dot_margin">4dp</dimen>
+ <dimen name="min_wallet_empty_height">208dp</dimen>
+ <dimen name="wallet_card_border_width">1dp</dimen>
+ <dimen name="wallet_empty_state_corner_radius">24dp</dimen>
+ <dimen name="wallet_tile_card_view_height">32dp</dimen>
+ <dimen name="wallet_tile_card_view_width">50dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 2f3fbe7..0763109 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -33,8 +33,6 @@
<!-- AOD/Lockscreen alternate layout -->
<bool name="flag_keyguard_layout">false</bool>
- <bool name="flag_brightness_slider">false</bool>
-
<!-- People Tile flag -->
<bool name="flag_conversations">false</bool>
@@ -50,4 +48,6 @@
<bool name="flag_alarm_tile">false</bool>
<bool name="flag_charging_ripple">false</bool>
+
+ <bool name="flag_ongoing_call_status_bar_chip">false</bool>
</resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 5f68bdb4..9665c89 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -167,5 +167,11 @@
<item type="id" name="accessibility_action_move_right"/>
<item type="id" name="accessibility_action_move_up"/>
<item type="id" name="accessibility_action_move_down"/>
+
+ <!-- Accessibility actions for Accessibility floating menu. -->
+ <item type="id" name="action_move_top_left"/>
+ <item type="id" name="action_move_top_right"/>
+ <item type="id" name="action_move_bottom_left"/>
+ <item type="id" name="action_move_bottom_right"/>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index f4b50eb..2299fd5 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1633,8 +1633,14 @@
<!-- Wallet strings -->
<!-- Wallet empty state, title [CHAR LIMIT=32] -->
<string name="wallet_title">Wallet</string>
+ <!-- Label of the button underneath the card carousel when device is unlocked. [CHAR LIMIT=NONE] -->
+ <string name="wallet_button_label_device_unlocked">Show all</string>
+ <!-- Label of the button underneath the card carousel when device is locked. [CHAR LIMIT=NONE] -->
+ <string name="wallet_button_label_device_locked">Unlock to pay</string>
<!-- Secondary label of the quick access wallet tile. [CHAR LIMIT=32] -->
<string name="wallet_secondary_label">Ready</string>
+ <!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->
+ <string name="wallet_error_generic">There was a problem getting your cards, please try again later</string>
<!-- Name of the work status bar icon. -->
<string name="status_bar_work">Work profile</string>
@@ -2687,6 +2693,14 @@
<string name="accessibility_floating_button_migration_tooltip">Accessibility button replaced the accessibility gesture\n\n<annotation id="link">View settings</annotation></string>
<!-- Message for the accessibility floating button docking tooltip. It shows when the user first time drag the button. It will tell the user about docking behavior. [CHAR LIMIT=70] -->
<string name="accessibility_floating_button_docking_tooltip">Move button to the edge to hide it temporarily</string>
+ <!-- Action in accessibility menu to move the accessibility floating button to the top left of the screen. [CHAR LIMIT=30] -->
+ <string name="accessibility_floating_button_action_move_top_left">Move top left</string>
+ <!-- Action in accessibility menu to move the accessibility floating button to the top right of the screen. [CHAR LIMIT=30] -->
+ <string name="accessibility_floating_button_action_move_top_right">Move top right</string>
+ <!-- Action in accessibility menu to move the accessibility floating button to the bottom left of the screen. [CHAR LIMIT=30]-->
+ <string name="accessibility_floating_button_action_move_bottom_left">Move bottom left</string>
+ <!-- Action in accessibility menu to move the accessibility floating button to the bottom right of the screen. [CHAR LIMIT=30]-->
+ <string name="accessibility_floating_button_action_move_bottom_right">Move bottom right</string>
<!-- Device Controls strings -->
<!-- Device Controls empty state, title [CHAR LIMIT=30] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index cb21245..e6fc332 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -316,7 +316,7 @@
<style name="Animation.StatusBar">
</style>
- <style name="Theme.SystemUI" parent="@*android:style/Theme.DeviceDefault.QuickSettings">
+ <style name="Theme.SystemUI" parent="@*android:style/Theme.DeviceDefault.SystemUI">
<item name="lightIconTheme">@style/DualToneLightTheme</item>
<item name="darkIconTheme">@style/DualToneDarkTheme</item>
<item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
@@ -335,7 +335,7 @@
<item name="*android:isLightTheme">false</item>
</style>
- <style name="Theme.SystemUI.Light">
+ <style name="Theme.SystemUI.LightWallpaper">
<item name="wallpaperTextColor">@*android:color/primary_text_material_light</item>
<item name="wallpaperTextColorSecondary">@*android:color/secondary_text_material_light</item>
<item name="wallpaperTextColorAccent">@*android:color/system_accent2_600</item>
@@ -375,7 +375,7 @@
<item name="*android:dotColor">?android:attr/textColorSecondary</item>
</style>
- <style name="qs_theme" parent="@*android:style/Theme.DeviceDefault.QuickSettings">
+ <style name="Theme.SystemUI.QuickSettings" parent="@*android:style/Theme.DeviceDefault.SystemUI">
<item name="lightIconTheme">@style/QSIconTheme</item>
<item name="darkIconTheme">@style/QSIconTheme</item>
<item name="android:colorError">@*android:color/error_color_material_dark</item>
@@ -384,7 +384,7 @@
</style>
<!-- Overridden by values-television/styles.xml with tv-specific settings -->
- <style name="volume_dialog_theme" parent="qs_theme"/>
+ <style name="volume_dialog_theme" parent="Theme.SystemUI"/>
<style name="Theme.SystemUI.Dialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog" />
@@ -395,6 +395,13 @@
<item name="android:windowIsFloating">true</item>
</style>
+ <style name="Theme.SystemUI.Dialog.GlobalActionsLite" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar.Fullscreen">
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:backgroundDimEnabled">true</item>
+ <item name="android:windowCloseOnTouchOutside">true</item>
+ </style>
+
<style name="Theme.SystemUI.Dialog.MediaOutput">
<item name="android:windowBackground">@drawable/media_output_dialog_background</item>
</style>
@@ -580,7 +587,7 @@
<item name="android:elevation">10dp</item>
</style>
- <style name="edit_theme" parent="qs_theme">
+ <style name="Theme.SystemUI.QuickSettings.Edit">
<item name="android:colorBackground">?android:attr/colorSecondary</item>
</style>
@@ -785,4 +792,18 @@
<item name="android:mirrorForRtl">false</item>
<item name="android:progressDrawable">@drawable/udfps_progress_bar</item>
</style>
+
+ <!-- Wallet styles -->
+ <style name="Wallet" />
+
+ <style name="Wallet.TextAppearance">
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+ <item name="android:textColor">@color/wallet_primary_text</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:textSize">14sp</item>
+ </style>
+
+ <style name="Wallet.Theme">
+ <item name="android:colorControlHighlight">@*android:color/primary_text_material_dark</item>
+ </style>
</resources>
diff --git a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java
index 118f98d..15312ad 100644
--- a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java
+++ b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java
@@ -18,27 +18,32 @@
import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.hardware.biometrics.BiometricSourceType;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
+import com.android.settingslib.Utils;
import com.android.systemui.Dumpable;
+import com.android.systemui.R;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.ViewController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
/**
- * Controls when to show the DisabledUdfpsView to unlock the device on the lockscreen.
- * If the device is not authenticated, the bouncer will show.
+ * Controls when to show the DisabledUdfpsView affordance (unlock icon or circle) on lock screen.
*
- * This tap target will only show when:
+ * This view only exists when:
* - User has UDFPS enrolled
* - UDFPS is currently unavailable see {@link KeyguardUpdateMonitor#shouldListenForUdfps}
*/
@@ -47,48 +52,66 @@
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@NonNull private final KeyguardViewController mKeyguardViewController;
@NonNull private final StatusBarStateController mStatusBarStateController;
+ @NonNull private final KeyguardStateController mKeyguardStateController;
+ @NonNull private final Drawable mButton;
+ @NonNull private final Drawable mUnlockIcon;
private boolean mIsDozing;
private boolean mIsBouncerShowing;
private boolean mIsKeyguardShowing;
private boolean mRunningFPS;
- private boolean mAuthenticated;
+ private boolean mCanDismissLockScreen;
private boolean mShowButton;
+ private boolean mShowUnlockIcon;
public DisabledUdfpsController(
@NonNull DisabledUdfpsView view,
@NonNull StatusBarStateController statusBarStateController,
@NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
@NonNull AuthController authController,
- @NonNull KeyguardViewController keyguardViewController
+ @NonNull KeyguardViewController keyguardViewController,
+ @NonNull KeyguardStateController keyguardStateController
) {
super(view);
- mView.setOnClickListener(mOnClickListener);
+ mView.setOnTouchListener(mOnTouchListener);
mView.setSensorProperties(authController.getUdfpsProps().get(0));
mStatusBarStateController = statusBarStateController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mKeyguardViewController = keyguardViewController;
+ mKeyguardStateController = keyguardStateController;
+
+ final Context context = view.getContext();
+ mButton = context.getResources().getDrawable(
+ com.android.systemui.R.drawable.circle_white, context.getTheme());
+ mUnlockIcon = new InsetDrawable(context.getResources().getDrawable(
+ com.android.internal.R.drawable.ic_lock_open, context.getTheme()),
+ context.getResources().getDimensionPixelSize(
+ com.android.systemui.R.dimen.udfps_unlock_icon_inset));
}
@Override
protected void onViewAttached() {
mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
- mIsKeyguardShowing = mStatusBarStateController.getState() == StatusBarState.KEYGUARD;
+ mIsKeyguardShowing = mKeyguardStateController.isShowing();
mIsDozing = mStatusBarStateController.isDozing();
mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
- mAuthenticated = false;
- updateButtonVisibility();
+ mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+ mUnlockIcon.setTint(Utils.getColorAttrDefaultColor(mView.getContext(),
+ R.attr.wallpaperTextColorAccent));
+ updateVisibility();
mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
mStatusBarStateController.addCallback(mStatusBarStateListener);
+ mKeyguardStateController.addCallback(mKeyguardStateCallback);
}
@Override
protected void onViewDetached() {
mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
+ mKeyguardStateController.removeCallback(mKeyguardStateCallback);
}
/**
@@ -100,46 +123,51 @@
}
}
- private void updateButtonVisibility() {
- mShowButton = !mAuthenticated && !mIsDozing && mIsKeyguardShowing
- && !mIsBouncerShowing && !mRunningFPS;
+ private void updateVisibility() {
+ mShowButton = !mCanDismissLockScreen && !mRunningFPS && isLockScreen();
+ mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
+
if (mShowButton) {
+ mView.setImageDrawable(mButton);
+ mView.setVisibility(View.VISIBLE);
+ } else if (mShowUnlockIcon) {
+ mView.setImageDrawable(mUnlockIcon);
mView.setVisibility(View.VISIBLE);
} else {
mView.setVisibility(View.INVISIBLE);
}
}
+ private boolean isLockScreen() {
+ return mIsKeyguardShowing && !mIsDozing && !mIsBouncerShowing;
+ }
+
@Override
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("DisabledUdfpsController state:");
pw.println(" mShowBouncerButton: " + mShowButton);
+ pw.println(" mShowUnlockIcon: " + mShowUnlockIcon);
pw.println(" mIsDozing: " + mIsDozing);
pw.println(" mIsKeyguardShowing: " + mIsKeyguardShowing);
pw.println(" mIsBouncerShowing: " + mIsBouncerShowing);
pw.println(" mRunningFPS: " + mRunningFPS);
- pw.println(" mAuthenticated: " + mAuthenticated);
+ pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
}
- private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ private final View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
@Override
- public void onClick(View v) {
+ public boolean onTouch(View v, MotionEvent event) {
mKeyguardViewController.showBouncer(/* scrim */ true);
+ return true;
}
};
private StatusBarStateController.StateListener mStatusBarStateListener =
new StatusBarStateController.StateListener() {
@Override
- public void onStateChanged(int newState) {
- mIsKeyguardShowing = newState == StatusBarState.KEYGUARD;
- updateButtonVisibility();
- }
-
- @Override
public void onDozingChanged(boolean isDozing) {
mIsDozing = isDozing;
- updateButtonVisibility();
+ updateVisibility();
}
};
@@ -148,7 +176,7 @@
@Override
public void onKeyguardBouncerChanged(boolean bouncer) {
mIsBouncerShowing = bouncer;
- updateButtonVisibility();
+ updateVisibility();
}
@Override
@@ -157,21 +185,29 @@
if (biometricSourceType == FINGERPRINT) {
mRunningFPS = running;
}
- mAuthenticated &= !mRunningFPS;
- updateButtonVisibility();
- }
- @Override
- public void onBiometricAuthenticated(int userId,
- BiometricSourceType biometricSourceType, boolean isStrongBiometric) {
- mAuthenticated = true;
- updateButtonVisibility();
- }
-
- @Override
- public void onUserUnlocked() {
- mAuthenticated = true;
- updateButtonVisibility();
+ updateVisibility();
}
};
+
+ private final KeyguardStateController.Callback mKeyguardStateCallback =
+ new KeyguardStateController.Callback() {
+ @Override
+ public void onKeyguardShowingChanged() {
+ updateIsKeyguardShowing();
+ updateVisibility();
+ }
+
+ @Override
+ public void onUnlockedChanged() {
+ updateIsKeyguardShowing();
+ mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+ updateVisibility();
+ }
+
+ private void updateIsKeyguardShowing() {
+ mIsKeyguardShowing = mKeyguardStateController.isShowing()
+ && !mKeyguardStateController.isKeyguardGoingAway();
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java
index d8ab780..8ae753e 100644
--- a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java
+++ b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java
@@ -22,14 +22,13 @@
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.AttributeSet;
import android.view.Surface;
-import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.ImageView;
/**
- * A full screen view with an oval target where the UDFPS sensor is.
- * Controlled by {@link DisabledUdfpsController}.
+ * A view positioned in the area of the UDPFS sensor.
*/
-public class DisabledUdfpsView extends Button {
+public class DisabledUdfpsView extends ImageView {
@NonNull private final RectF mSensorRect;
@NonNull private final Context mContext;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
index 02a8958..31f1332 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
@@ -492,4 +492,11 @@
mKeyguardSecurityContainerController.updateResources();
}
}
+
+ /** Update keyguard position based on a tapped X coordinate. */
+ public void updateKeyguardPosition(float x) {
+ if (mKeyguardSecurityContainerController != null) {
+ mKeyguardSecurityContainerController.updateKeyguardPosition(x);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 708b2d5..7ed6337 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -267,6 +267,13 @@
updateSecurityViewLocation(false);
}
+ /** Update keyguard position based on a tapped X coordinate. */
+ public void updateKeyguardPosition(float x) {
+ if (mOneHandedMode) {
+ moveBouncerForXCoordinate(x, /* animate= */false);
+ }
+ }
+
/** Return whether the one-handed keyguard should be enabled. */
private boolean canUseOneHandedBouncer() {
// Is it enabled?
@@ -488,9 +495,13 @@
return;
}
+ moveBouncerForXCoordinate(event.getX(), /* animate= */true);
+ }
+
+ private void moveBouncerForXCoordinate(float x, boolean animate) {
// Did the tap hit the "other" side of the bouncer?
- if ((mIsSecurityViewLeftAligned && (event.getX() > getWidth() / 2f))
- || (!mIsSecurityViewLeftAligned && (event.getX() < getWidth() / 2f))) {
+ if ((mIsSecurityViewLeftAligned && (x > getWidth() / 2f))
+ || (!mIsSecurityViewLeftAligned && (x < getWidth() / 2f))) {
mIsSecurityViewLeftAligned = !mIsSecurityViewLeftAligned;
Settings.Global.putInt(
@@ -499,7 +510,7 @@
mIsSecurityViewLeftAligned ? Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT
: Settings.Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT);
- updateSecurityViewLocation(true);
+ updateSecurityViewLocation(animate);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 760eaec..4827cab 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -515,6 +515,11 @@
}
}
+ /** Update keyguard position based on a tapped X coordinate. */
+ public void updateKeyguardPosition(float x) {
+ mView.updateKeyguardPosition(x);
+ }
+
static class Factory {
private final KeyguardSecurityContainer mView;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 27a2ac3..621ca59 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -427,6 +427,7 @@
public void onTrustChanged(boolean enabled, int userId, int flags) {
Assert.isMainThread();
mUserHasTrust.put(userId, enabled);
+ updateBiometricListeningState();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -627,6 +628,7 @@
}
// Don't send cancel if authentication succeeds
mFingerprintCancelSignal = null;
+ updateBiometricListeningState();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -810,6 +812,7 @@
}
// Don't send cancel if authentication succeeds
mFaceCancelSignal = null;
+ updateBiometricListeningState();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -2109,6 +2112,8 @@
boolean shouldListenForUdfps() {
return shouldListenForFingerprint()
&& !mBouncer
+ && !getUserCanSkipBouncer(getCurrentUser())
+ && !isEncryptedOrLockdown(getCurrentUser())
&& mStrongAuthTracker.hasUserAuthenticatedSinceBoot();
}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
index ab05c2a..57be4e8 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
@@ -31,6 +31,7 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
@@ -39,6 +40,8 @@
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.animation.OvershootInterpolator;
import android.widget.FrameLayout;
@@ -284,6 +287,44 @@
// Do Nothing
}
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ setupAccessibilityActions(info);
+ }
+
+ @Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ if (super.performAccessibilityAction(action, arguments)) {
+ return true;
+ }
+
+ fadeIn();
+
+ final Rect bounds = getAvailableBounds();
+ if (action == R.id.action_move_top_left) {
+ snapToLocation(bounds.left, bounds.top);
+ return true;
+ }
+
+ if (action == R.id.action_move_top_right) {
+ snapToLocation(bounds.right, bounds.top);
+ return true;
+ }
+
+ if (action == R.id.action_move_bottom_left) {
+ snapToLocation(bounds.left, bounds.bottom);
+ return true;
+ }
+
+ if (action == R.id.action_move_bottom_right) {
+ snapToLocation(bounds.right, bounds.bottom);
+ return true;
+ }
+
+ return false;
+ }
+
void show() {
if (isShowing()) {
return;
@@ -380,6 +421,33 @@
mUiHandler.postDelayed(() -> mFadeOutAnimator.start(), FADE_EFFECT_DURATION_MS);
}
+ private void setupAccessibilityActions(AccessibilityNodeInfo info) {
+ final Resources res = mContext.getResources();
+ final AccessibilityAction moveTopLeft =
+ new AccessibilityAction(R.id.action_move_top_left,
+ res.getString(
+ R.string.accessibility_floating_button_action_move_top_left));
+ info.addAction(moveTopLeft);
+
+ final AccessibilityAction moveTopRight =
+ new AccessibilityAction(R.id.action_move_top_right,
+ res.getString(
+ R.string.accessibility_floating_button_action_move_top_right));
+ info.addAction(moveTopRight);
+
+ final AccessibilityAction moveBottomLeft =
+ new AccessibilityAction(R.id.action_move_bottom_left,
+ res.getString(
+ R.string.accessibility_floating_button_action_move_bottom_left));
+ info.addAction(moveBottomLeft);
+
+ final AccessibilityAction moveBottomRight =
+ new AccessibilityAction(R.id.action_move_bottom_right,
+ res.getString(
+ R.string.accessibility_floating_button_action_move_bottom_right));
+ info.addAction(moveBottomRight);
+ }
+
private boolean onTouched(MotionEvent event) {
final int action = event.getAction();
final int currentX = (int) event.getX();
@@ -524,7 +592,8 @@
updateLocationWith(mAlignment, mPercentageY);
}
- private void snapToLocation(int endX, int endY) {
+ @VisibleForTesting
+ void snapToLocation(int endX, int endY) {
mDragAnimator.cancel();
mDragAnimator.removeAllUpdateListeners();
mDragAnimator.addUpdateListener(anim -> onDragAnimationUpdate(anim, endX, endY));
@@ -662,6 +731,11 @@
: R.dimen.accessibility_floating_menu_large_single_radius;
}
+ @VisibleForTesting
+ Rect getAvailableBounds() {
+ return new Rect(0, 0, mScreenWidth - getWindowWidth(), mScreenHeight - getWindowHeight());
+ }
+
private int getLayoutWidth() {
return mPadding * 2 + mIconWidth;
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java
new file mode 100644
index 0000000..197f35b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2021 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.biometrics;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+/**
+ * Manages the layout of an auth dialog for devices with a face sensor and an under-display
+ * fingerprint sensor (UDFPS). Face authentication is attempted first, followed by fingerprint if
+ * the initial attempt is unsuccessful.
+ */
+public class AuthBiometricFaceToUdfpsView extends AuthBiometricFaceView {
+ private static final String TAG = "BiometricPrompt/AuthBiometricFaceToUdfpsView";
+
+ protected static class UdfpsIconController extends IconController {
+ protected UdfpsIconController(
+ @NonNull Context context, @NonNull ImageView iconView, @NonNull TextView textView) {
+ super(context, iconView, textView);
+ }
+
+ @Override
+ protected void updateState(int lastState, int newState) {
+ final boolean lastStateIsErrorIcon =
+ lastState == STATE_ERROR || lastState == STATE_HELP;
+
+ switch (newState) {
+ case STATE_IDLE:
+ case STATE_AUTHENTICATING_ANIMATING_IN:
+ case STATE_AUTHENTICATING:
+ case STATE_PENDING_CONFIRMATION:
+ case STATE_AUTHENTICATED:
+ if (lastStateIsErrorIcon) {
+ animateOnce(R.drawable.fingerprint_dialog_error_to_fp);
+ } else {
+ showStaticDrawable(R.drawable.fingerprint_dialog_fp_to_error);
+ }
+ mIconView.setContentDescription(mContext.getString(
+ R.string.accessibility_fingerprint_dialog_fingerprint_icon));
+ break;
+
+ case STATE_ERROR:
+ case STATE_HELP:
+ if (!lastStateIsErrorIcon) {
+ animateOnce(R.drawable.fingerprint_dialog_fp_to_error);
+ } else {
+ showStaticDrawable(R.drawable.fingerprint_dialog_error_to_fp);
+ }
+ mIconView.setContentDescription(mContext.getString(
+ R.string.biometric_dialog_try_again));
+ break;
+
+ default:
+ Log.e(TAG, "Unknown biometric dialog state: " + newState);
+ break;
+ }
+
+ mState = newState;
+ }
+ }
+
+ @BiometricAuthenticator.Modality private int mActiveSensorType = TYPE_FACE;
+
+ @Nullable UdfpsDialogMeasureAdapter mMeasureAdapter;
+ @Nullable private UdfpsIconController mUdfpsIconController;
+
+ public AuthBiometricFaceToUdfpsView(Context context) {
+ super(context);
+ }
+
+ public AuthBiometricFaceToUdfpsView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) {
+ if (mMeasureAdapter == null || mMeasureAdapter.getSensorProps() != sensorProps) {
+ mMeasureAdapter = new UdfpsDialogMeasureAdapter(this, sensorProps);
+ }
+ }
+
+ @Override
+ protected int getDelayAfterAuthenticatedDurationMs() {
+ return mActiveSensorType == TYPE_FINGERPRINT ? 0
+ : super.getDelayAfterAuthenticatedDurationMs();
+ }
+
+ @Override
+ protected boolean supportsManualRetry() {
+ return false;
+ }
+
+ @Override
+ @NonNull
+ protected IconController getIconController() {
+ if (mActiveSensorType == TYPE_FINGERPRINT) {
+ if (!(mIconController instanceof UdfpsIconController)) {
+ mIconController = new UdfpsIconController(getContext(), mIconView, mIndicatorView);
+ }
+ return mIconController;
+ }
+ return super.getIconController();
+ }
+
+ @Override
+ public void updateState(int newState) {
+ if (mState == STATE_HELP || mState == STATE_ERROR) {
+ mActiveSensorType = TYPE_FINGERPRINT;
+ setRequireConfirmation(false);
+ }
+ super.updateState(newState);
+ }
+
+ @Override
+ @NonNull
+ AuthDialog.LayoutParams onMeasureInternal(int width, int height) {
+ final AuthDialog.LayoutParams layoutParams = super.onMeasureInternal(width, height);
+ return mMeasureAdapter != null
+ ? mMeasureAdapter.onMeasureInternal(width, height, layoutParams)
+ : layoutParams;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
index 9b09cfd..4c5ca69 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
@@ -16,6 +16,7 @@
package com.android.systemui.biometrics;
+import android.annotation.NonNull;
import android.content.Context;
import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -28,7 +29,6 @@
import android.widget.ImageView;
import android.widget.TextView;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
public class AuthBiometricFaceView extends AuthBiometricView {
@@ -38,15 +38,15 @@
// Delay before dismissing after being authenticated/confirmed.
private static final int HIDE_DELAY_MS = 500;
- public static class IconController extends Animatable2.AnimationCallback {
- Context mContext;
- ImageView mIconView;
- TextView mTextView;
- Handler mHandler;
- boolean mLastPulseLightToDark; // false = dark to light, true = light to dark
- @BiometricState int mState;
+ protected static class IconController extends Animatable2.AnimationCallback {
+ protected Context mContext;
+ protected ImageView mIconView;
+ protected TextView mTextView;
+ protected Handler mHandler;
+ protected boolean mLastPulseLightToDark; // false = dark to light, true = light to dark
+ protected @BiometricState int mState;
- IconController(Context context, ImageView iconView, TextView textView) {
+ protected IconController(Context context, ImageView iconView, TextView textView) {
mContext = context;
mIconView = iconView;
mTextView = textView;
@@ -54,15 +54,15 @@
showStaticDrawable(R.drawable.face_dialog_pulse_dark_to_light);
}
- void animateOnce(int iconRes) {
+ protected void animateOnce(int iconRes) {
animateIcon(iconRes, false);
}
- public void showStaticDrawable(int iconRes) {
+ protected void showStaticDrawable(int iconRes) {
mIconView.setImageDrawable(mContext.getDrawable(iconRes));
}
- void animateIcon(int iconRes, boolean repeat) {
+ protected void animateIcon(int iconRes, boolean repeat) {
final AnimatedVectorDrawable icon =
(AnimatedVectorDrawable) mContext.getDrawable(iconRes);
mIconView.setImageDrawable(icon);
@@ -73,12 +73,12 @@
icon.start();
}
- void startPulsing() {
+ protected void startPulsing() {
mLastPulseLightToDark = false;
animateIcon(R.drawable.face_dialog_pulse_dark_to_light, true);
}
- void pulseInNextDirection() {
+ protected void pulseInNextDirection() {
int iconRes = mLastPulseLightToDark ? R.drawable.face_dialog_pulse_dark_to_light
: R.drawable.face_dialog_pulse_light_to_dark;
animateIcon(iconRes, true /* repeat */);
@@ -93,7 +93,7 @@
}
}
- public void updateState(int lastState, int newState) {
+ protected void updateState(int lastState, int newState) {
final boolean lastStateIsErrorIcon =
lastState == STATE_ERROR || lastState == STATE_HELP;
@@ -138,7 +138,7 @@
}
}
- @VisibleForTesting IconController mIconController;
+ protected IconController mIconController;
public AuthBiometricFaceView(Context context) {
this(context, null);
@@ -174,14 +174,21 @@
}
@Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mIconController = new IconController(mContext, mIconView, mIndicatorView);
+ protected boolean supportsManualRetry() {
+ return true;
+ }
+
+ @NonNull
+ protected IconController getIconController() {
+ if (mIconController == null) {
+ mIconController = new IconController(mContext, mIconView, mIndicatorView);
+ }
+ return mIconController;
}
@Override
public void updateState(@BiometricState int newState) {
- mIconController.updateState(mState, newState);
+ getIconController().updateState(mState, newState);
if (newState == STATE_AUTHENTICATING_ANIMATING_IN ||
(newState == STATE_AUTHENTICATING && getSize() == AuthDialog.SIZE_MEDIUM)) {
@@ -195,11 +202,13 @@
@Override
public void onAuthenticationFailed(String failureReason) {
if (getSize() == AuthDialog.SIZE_MEDIUM) {
- mTryAgainButton.setVisibility(View.VISIBLE);
- mConfirmButton.setVisibility(View.GONE);
+ if (supportsManualRetry()) {
+ mTryAgainButton.setVisibility(View.VISIBLE);
+ mConfirmButton.setVisibility(View.GONE);
+ }
}
- // Do this last since wa want to know if the button is being animated (in the case of
+ // Do this last since we want to know if the button is being animated (in the case of
// small -> medium dialog)
super.onAuthenticationFailed(failureReason);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricUdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricUdfpsView.java
index 007080b..376368f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricUdfpsView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricUdfpsView.java
@@ -16,33 +16,18 @@
package com.android.systemui.biometrics;
-import android.annotation.IdRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.graphics.Insets;
-import android.graphics.Rect;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Surface;
-import android.view.View;
-import android.view.WindowInsets;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
/**
* Manages the layout for under-display fingerprint sensors (UDFPS). Ensures that UI elements
* do not overlap with
*/
public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView {
-
- private static final String TAG = "AuthBiometricUdfpsView";
-
- @Nullable private FingerprintSensorPropertiesInternal mSensorProps;
+ @Nullable private UdfpsDialogMeasureAdapter mMeasureAdapter;
public AuthBiometricUdfpsView(Context context) {
this(context, null /* attrs */);
@@ -52,269 +37,18 @@
super(context, attrs);
}
- void setSensorProps(@NonNull FingerprintSensorPropertiesInternal prop) {
- mSensorProps = prop;
+ void setSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) {
+ if (mMeasureAdapter == null || mMeasureAdapter.getSensorProps() != sensorProps) {
+ mMeasureAdapter = new UdfpsDialogMeasureAdapter(this, sensorProps);
+ }
}
@Override
@NonNull
AuthDialog.LayoutParams onMeasureInternal(int width, int height) {
- final int displayRotation = getDisplay().getRotation();
- switch (displayRotation) {
- case Surface.ROTATION_0:
- return onMeasureInternalPortrait(width, height);
- case Surface.ROTATION_90:
- case Surface.ROTATION_270:
- return onMeasureInternalLandscape(width, height);
- default:
- Log.e(TAG, "Unsupported display rotation: " + displayRotation);
- return super.onMeasureInternal(width, height);
- }
- }
-
- @NonNull
- private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) {
- // Get the height of the everything below the icon. Currently, that's the indicator and
- // button bar.
- final int textIndicatorHeight = getViewHeightPx(R.id.indicator);
- final int buttonBarHeight = getViewHeightPx(R.id.button_bar);
-
- // Figure out where the bottom of the sensor anim should be.
- // Navbar + dialogMargin + buttonBar + textIndicator + spacerHeight = sensorDistFromBottom
- final int dialogMargin = getDialogMarginPx();
- final WindowManager windowManager = getContext().getSystemService(WindowManager.class);
- final int displayHeight = getWindowBounds(windowManager).height();
- final Insets navbarInsets = getNavbarInsets(windowManager);
- final int bottomSpacerHeight = calculateBottomSpacerHeightForPortrait(
- mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight,
- dialogMargin, navbarInsets.bottom);
-
- // Go through each of the children and do the custom measurement.
- int totalHeight = 0;
- final int numChildren = getChildCount();
- final int sensorDiameter = mSensorProps.sensorRadius * 2;
- for (int i = 0; i < numChildren; i++) {
- final View child = getChildAt(i);
- if (child.getId() == R.id.biometric_icon_frame) {
- final FrameLayout iconFrame = (FrameLayout) child;
- final View icon = iconFrame.getChildAt(0);
-
- // Ensure that the icon is never larger than the sensor.
- icon.measure(
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST));
-
- // Create a frame that's exactly the height of the sensor circle.
- iconFrame.measure(
- MeasureSpec.makeMeasureSpec(
- child.getLayoutParams().width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.EXACTLY));
- } else if (child.getId() == R.id.space_above_icon) {
- child.measure(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(
- child.getLayoutParams().height, MeasureSpec.EXACTLY));
- } else if (child.getId() == R.id.button_bar) {
- child.measure(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(child.getLayoutParams().height,
- MeasureSpec.EXACTLY));
- } else if (child.getId() == R.id.space_below_icon) {
- // Set the spacer height so the fingerprint icon is on the physical sensor area
- child.measure(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY));
- } else {
- child.measure(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
- }
-
- if (child.getVisibility() != View.GONE) {
- totalHeight += child.getMeasuredHeight();
- }
- }
-
- return new AuthDialog.LayoutParams(width, totalHeight);
- }
-
- @NonNull
- private AuthDialog.LayoutParams onMeasureInternalLandscape(int width, int height) {
- // Find the spacer height needed to vertically align the icon with the sensor.
- final int titleHeight = getViewHeightPx(R.id.title);
- final int subtitleHeight = getViewHeightPx(R.id.subtitle);
- final int descriptionHeight = getViewHeightPx(R.id.description);
- final int topSpacerHeight = getViewHeightPx(R.id.space_above_icon);
- final int textIndicatorHeight = getViewHeightPx(R.id.indicator);
- final int buttonBarHeight = getViewHeightPx(R.id.button_bar);
- final WindowManager windowManager = getContext().getSystemService(WindowManager.class);
- final Insets navbarInsets = getNavbarInsets(windowManager);
- final int bottomSpacerHeight = calculateBottomSpacerHeightForLandscape(titleHeight,
- subtitleHeight, descriptionHeight, topSpacerHeight, textIndicatorHeight,
- buttonBarHeight, navbarInsets.bottom);
-
- // Find the spacer width needed to horizontally align the icon with the sensor.
- final int displayWidth = getWindowBounds(windowManager).width();
- final int dialogMargin = getDialogMarginPx();
- final int horizontalInset = navbarInsets.left + navbarInsets.right;
- final int horizontalSpacerWidth = calculateHorizontalSpacerWidthForLandscape(
- mSensorProps, displayWidth, dialogMargin, horizontalInset);
-
- final int sensorDiameter = mSensorProps.sensorRadius * 2;
- final int remeasuredWidth = sensorDiameter + 2 * horizontalSpacerWidth;
-
- int remeasuredHeight = 0;
- final int numChildren = getChildCount();
- for (int i = 0; i < numChildren; i++) {
- final View child = getChildAt(i);
- if (child.getId() == R.id.biometric_icon_frame) {
- final FrameLayout iconFrame = (FrameLayout) child;
- final View icon = iconFrame.getChildAt(0);
-
- // Ensure that the icon is never larger than the sensor.
- icon.measure(
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST));
-
- // Create a frame that's exactly the height of the sensor circle.
- iconFrame.measure(
- MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.EXACTLY));
- } else if (child.getId() == R.id.space_above_icon || child.getId() == R.id.button_bar) {
- // Adjust the width of the top spacer and button bar while preserving their heights.
- child.measure(
- MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(
- child.getLayoutParams().height, MeasureSpec.EXACTLY));
- } else if (child.getId() == R.id.space_below_icon) {
- // Adjust the bottom spacer height to align the fingerprint icon with the sensor.
- child.measure(
- MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY));
- } else {
- // Use the remeasured width for all other child views.
- child.measure(
- MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
- }
-
- if (child.getVisibility() != View.GONE) {
- remeasuredHeight += child.getMeasuredHeight();
- }
- }
-
- return new AuthDialog.LayoutParams(remeasuredWidth, remeasuredHeight);
- }
-
- private int getViewHeightPx(@IdRes int viewId) {
- final View view = findViewById(viewId);
- return view != null ? view.getMeasuredHeight() : 0;
- }
-
- private int getDialogMarginPx() {
- return getResources().getDimensionPixelSize(R.dimen.biometric_dialog_border_padding);
- }
-
- @NonNull
- private static Insets getNavbarInsets(@Nullable WindowManager windowManager) {
- return windowManager != null && windowManager.getCurrentWindowMetrics() != null
- ? windowManager.getCurrentWindowMetrics().getWindowInsets()
- .getInsets(WindowInsets.Type.navigationBars())
- : Insets.NONE;
- }
-
- @NonNull
- private static Rect getWindowBounds(@Nullable WindowManager windowManager) {
- return windowManager != null && windowManager.getCurrentWindowMetrics() != null
- ? windowManager.getCurrentWindowMetrics().getBounds()
- : new Rect();
- }
-
- /**
- * For devices in portrait orientation where the sensor is too high up, calculates the amount of
- * padding necessary to center the biometric icon within the sensor's physical location.
- */
- @VisibleForTesting
- static int calculateBottomSpacerHeightForPortrait(
- @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayHeightPx,
- int textIndicatorHeightPx, int buttonBarHeightPx, int dialogMarginPx,
- int navbarBottomInsetPx) {
-
- final int sensorDistanceFromBottom = displayHeightPx
- - sensorProperties.sensorLocationY
- - sensorProperties.sensorRadius;
-
- final int spacerHeight = sensorDistanceFromBottom
- - textIndicatorHeightPx
- - buttonBarHeightPx
- - dialogMarginPx
- - navbarBottomInsetPx;
-
- Log.d(TAG, "Display height: " + displayHeightPx
- + ", Distance from bottom: " + sensorDistanceFromBottom
- + ", Bottom margin: " + dialogMarginPx
- + ", Navbar bottom inset: " + navbarBottomInsetPx
- + ", Bottom spacer height (portrait): " + spacerHeight);
-
- return spacerHeight;
- }
-
- /**
- * For devices in landscape orientation where the sensor is too high up, calculates the amount
- * of padding necessary to center the biometric icon within the sensor's physical location.
- */
- @VisibleForTesting
- static int calculateBottomSpacerHeightForLandscape(int titleHeightPx, int subtitleHeightPx,
- int descriptionHeightPx, int topSpacerHeightPx, int textIndicatorHeightPx,
- int buttonBarHeightPx, int navbarBottomInsetPx) {
-
- final int dialogHeightAboveIcon = titleHeightPx
- + subtitleHeightPx
- + descriptionHeightPx
- + topSpacerHeightPx;
-
- final int dialogHeightBelowIcon = textIndicatorHeightPx + buttonBarHeightPx;
-
- final int bottomSpacerHeight = dialogHeightAboveIcon
- - dialogHeightBelowIcon
- - navbarBottomInsetPx;
-
- Log.d(TAG, "Title height: " + titleHeightPx
- + ", Subtitle height: " + subtitleHeightPx
- + ", Description height: " + descriptionHeightPx
- + ", Top spacer height: " + topSpacerHeightPx
- + ", Text indicator height: " + textIndicatorHeightPx
- + ", Button bar height: " + buttonBarHeightPx
- + ", Navbar bottom inset: " + navbarBottomInsetPx
- + ", Bottom spacer height (landscape): " + bottomSpacerHeight);
-
- return bottomSpacerHeight;
- }
-
- /**
- * For devices in landscape orientation where the sensor is too left/right, calculates the
- * amount of padding necessary to center the biometric icon within the sensor's physical
- * location.
- */
- @VisibleForTesting
- static int calculateHorizontalSpacerWidthForLandscape(
- @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayWidthPx,
- int dialogMarginPx, int navbarHorizontalInsetPx) {
-
- final int sensorDistanceFromEdge = displayWidthPx
- - sensorProperties.sensorLocationY
- - sensorProperties.sensorRadius;
-
- final int horizontalPadding = sensorDistanceFromEdge
- - dialogMarginPx
- - navbarHorizontalInsetPx;
-
- Log.d(TAG, "Display width: " + displayWidthPx
- + ", Distance from edge: " + sensorDistanceFromEdge
- + ", Dialog margin: " + dialogMarginPx
- + ", Navbar horizontal inset: " + navbarHorizontalInsetPx
- + ", Horizontal spacer width (landscape): " + horizontalPadding);
-
- return horizontalPadding;
+ final AuthDialog.LayoutParams layoutParams = super.onMeasureInternal(width, height);
+ return mMeasureAdapter != null
+ ? mMeasureAdapter.onMeasureInternal(width, height, layoutParams)
+ : layoutParams;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
index d59a865..a40af70 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
@@ -379,7 +379,9 @@
} else {
mNegativeButton.setVisibility(View.VISIBLE);
}
- mTryAgainButton.setVisibility(View.VISIBLE);
+ if (supportsManualRetry()) {
+ mTryAgainButton.setVisibility(View.VISIBLE);
+ }
if (!TextUtils.isEmpty(mSubtitleView.getText())) {
mSubtitleView.setVisibility(View.VISIBLE);
@@ -462,6 +464,10 @@
Utils.notifyAccessibilityContentChanged(mAccessibilityManager, this);
}
+ protected boolean supportsManualRetry() {
+ return false;
+ }
+
public void updateState(@BiometricState int newState) {
Log.v(TAG, "newState: " + newState);
@@ -749,7 +755,9 @@
for (int i = 0; i < numChildren; i++) {
final View child = getChildAt(i);
- if (child.getId() == R.id.space_above_icon) {
+ if (child.getId() == R.id.space_above_icon
+ || child.getId() == R.id.space_below_icon
+ || child.getId() == R.id.button_bar) {
child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(child.getLayoutParams().height,
@@ -765,11 +773,6 @@
child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
- } else if (child.getId() == R.id.button_bar) {
- child.measure(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(child.getLayoutParams().height,
- MeasureSpec.EXACTLY));
} else {
child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index d05e927..4e93f58 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -282,8 +282,9 @@
mPanelController = mInjector.getPanelController(mContext, mPanelView);
// Inflate biometric view only if necessary.
+ final int sensorCount = config.mSensorIds.length;
if (Utils.isBiometricAllowed(mConfig.mPromptInfo)) {
- if (config.mSensorIds.length == 1 || config.mSensorIds.length == 2) {
+ if (sensorCount == 1) {
final int singleSensorAuthId = config.mSensorIds[0];
if (Utils.containsSensorId(mFpProps, singleSensorAuthId)) {
FingerprintSensorPropertiesInternal sensorProps = null;
@@ -314,8 +315,54 @@
mBiometricScrollView = null;
return;
}
+ } else if (sensorCount == 2) {
+ int fingerprintSensorId = -1;
+ int faceSensorId = -1;
+ for (final int sensorId : config.mSensorIds) {
+ if (Utils.containsSensorId(mFpProps, sensorId)) {
+ fingerprintSensorId = sensorId;
+ continue;
+ } else if (Utils.containsSensorId(mFaceProps, sensorId)) {
+ faceSensorId = sensorId;
+ continue;
+ }
+
+ if (fingerprintSensorId != -1 && faceSensorId != -1) {
+ break;
+ }
+ }
+
+ if (fingerprintSensorId == -1 || faceSensorId == -1) {
+ Log.e(TAG, "Missing fingerprint or face for dual-sensor config");
+ mBiometricView = null;
+ mBackgroundView = null;
+ mBiometricScrollView = null;
+ return;
+ }
+
+ FingerprintSensorPropertiesInternal fingerprintSensorProps = null;
+ for (FingerprintSensorPropertiesInternal prop : mFpProps) {
+ if (prop.sensorId == fingerprintSensorId) {
+ fingerprintSensorProps = prop;
+ break;
+ }
+ }
+
+ if (fingerprintSensorProps != null && fingerprintSensorProps.isAnyUdfpsType()) {
+ final AuthBiometricFaceToUdfpsView faceToUdfpsView =
+ (AuthBiometricFaceToUdfpsView) factory.inflate(
+ R.layout.auth_biometric_face_to_udfps_view, null, false);
+ faceToUdfpsView.setFingerprintSensorProps(fingerprintSensorProps);
+ mBiometricView = faceToUdfpsView;
+ } else {
+ Log.e(TAG, "Fingerprint must be UDFPS for dual-sensor config");
+ mBiometricView = null;
+ mBackgroundView = null;
+ mBiometricScrollView = null;
+ return;
+ }
} else {
- Log.e(TAG, "Unsupported sensor array, length: " + config.mSensorIds.length);
+ Log.e(TAG, "Unsupported sensor array, length: " + sensorCount);
mBiometricView = null;
mBackgroundView = null;
mBiometricScrollView = null;
@@ -442,14 +489,18 @@
mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM);
setScrollViewGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
break;
+
case Surface.ROTATION_90:
mPanelController.setPosition(AuthPanelController.POSITION_RIGHT);
setScrollViewGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
break;
+
case Surface.ROTATION_270:
mPanelController.setPosition(AuthPanelController.POSITION_LEFT);
setScrollViewGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
break;
+
+ case Surface.ROTATION_180:
default:
Log.e(TAG, "Unsupported display rotation: " + displayRotation);
mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
index 60fdbab..5647e43 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
@@ -32,9 +32,10 @@
* - optionally can override dozeTimeTick to adjust views for burn-in mitigation
*/
abstract class UdfpsAnimationView extends FrameLayout {
-
+ // mAlpha takes into consideration the status bar expansion amount to fade out icon when
+ // the status bar is expanded
private int mAlpha;
- private boolean mPauseAuth;
+ boolean mPauseAuth;
public UdfpsAnimationView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -75,7 +76,7 @@
getDrawable().setAlpha(calculateAlpha());
}
- protected final int calculateAlpha() {
+ int calculateAlpha() {
return mPauseAuth ? mAlpha : 255;
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
index 2f025f6..f4993f4 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
@@ -16,10 +16,6 @@
package com.android.systemui.biometrics;
-import static com.android.systemui.statusbar.StatusBarState.FULLSCREEN_USER_SWITCHER;
-import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
-import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
-
import android.annotation.NonNull;
import android.graphics.PointF;
import android.graphics.RectF;
@@ -68,18 +64,13 @@
@Override
protected void onViewAttached() {
- mStatusBarStateController.addCallback(mStateListener);
- mStateListener.onStateChanged(mStatusBarStateController.getState());
mStatusBar.addExpansionChangedListener(mStatusBarExpansionChangedListener);
-
mDumpManger.registerDumpable(getDumpTag(), this);
}
@Override
protected void onViewDetached() {
- mStatusBarStateController.removeCallback(mStateListener);
mStatusBar.removeExpansionChangedListener(mStatusBarExpansionChangedListener);
-
mDumpManger.unregisterDumpable(getDumpTag());
}
@@ -106,9 +97,7 @@
* authentication.
*/
boolean shouldPauseAuth() {
- return (mNotificationShadeExpanded && mStatusBarState != KEYGUARD)
- || mStatusBarState == SHADE_LOCKED
- || mStatusBarState == FULLSCREEN_USER_SWITCHER;
+ return mNotificationShadeExpanded;
}
/**
@@ -188,13 +177,4 @@
updatePauseAuth();
}
};
-
- private final StatusBarStateController.StateListener mStateListener =
- new StatusBarStateController.StateListener() {
- @Override
- public void onStateChanged(int newState) {
- mStatusBarState = newState;
- updatePauseAuth();
- }
- };
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 078ec9f..2bdbf51 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -45,12 +45,14 @@
import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.biometrics.HbmTypes.HbmType;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -88,6 +90,8 @@
@NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager;
@NonNull private final DumpManager mDumpManager;
@NonNull private final AuthRippleController mAuthRippleController;
+ @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @NonNull private final KeyguardViewMediator mKeyguardViewMediator;
// Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
// sensors, this, in addition to a lot of the code here, will be updated.
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
@@ -307,7 +311,9 @@
@NonNull StatusBar statusBar,
@NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager,
@NonNull DumpManager dumpManager,
- @NonNull AuthRippleController authRippleController) {
+ @NonNull AuthRippleController authRippleController,
+ @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
+ @NonNull KeyguardViewMediator keyguardViewMediator) {
mContext = context;
mInflater = inflater;
// The fingerprint manager is queried for UDFPS before this class is constructed, so the
@@ -320,6 +326,8 @@
mKeyguardViewManager = statusBarKeyguardViewManager;
mDumpManager = dumpManager;
mAuthRippleController = authRippleController;
+ mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+ mKeyguardViewMediator = keyguardViewMediator;
mSensorProps = findFirstUdfps();
// At least one UDFPS sensor exists
@@ -327,8 +335,7 @@
mStatusBar.setSensorRect(getSensorLocation());
mCoreLayoutParams = new WindowManager.LayoutParams(
- // TODO(b/152419866): Use the UDFPS window type when it becomes available.
- WindowManager.LayoutParams.TYPE_BOOT_PROGRESS,
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
@@ -486,7 +493,10 @@
mStatusBarStateController,
mStatusBar,
mKeyguardViewManager,
- mDumpManager
+ mKeyguardUpdateMonitor,
+ mFgExecutor,
+ mDumpManager,
+ mKeyguardViewMediator
);
case IUdfpsOverlayController.REASON_AUTH_BP:
// note: empty controller, currently shows no visual affordance
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java
new file mode 100644
index 0000000..1ad2b9c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2021 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.biometrics;
+
+import android.annotation.IdRes;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Insets;
+import android.graphics.Rect;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.util.Log;
+import android.view.Surface;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+
+/**
+ * Adapter that remeasures an auth dialog view to ensure that it matches the location of a physical
+ * under-display fingerprint sensor (UDFPS).
+ */
+public class UdfpsDialogMeasureAdapter {
+ private static final String TAG = "UdfpsDialogMeasurementAdapter";
+
+ @NonNull private final ViewGroup mView;
+ @NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
+
+ @Nullable private WindowManager mWindowManager;
+
+ public UdfpsDialogMeasureAdapter(
+ @NonNull ViewGroup view, @NonNull FingerprintSensorPropertiesInternal sensorProps) {
+ mView = view;
+ mSensorProps = sensorProps;
+ }
+
+ @NonNull
+ FingerprintSensorPropertiesInternal getSensorProps() {
+ return mSensorProps;
+ }
+
+ @NonNull
+ AuthDialog.LayoutParams onMeasureInternal(
+ int width, int height, @NonNull AuthDialog.LayoutParams layoutParams) {
+
+ final int displayRotation = mView.getDisplay().getRotation();
+ switch (displayRotation) {
+ case Surface.ROTATION_0:
+ return onMeasureInternalPortrait(width, height);
+ case Surface.ROTATION_90:
+ case Surface.ROTATION_270:
+ return onMeasureInternalLandscape(width, height);
+ default:
+ Log.e(TAG, "Unsupported display rotation: " + displayRotation);
+ return layoutParams;
+ }
+ }
+
+ @NonNull
+ private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) {
+ // Get the height of the everything below the icon. Currently, that's the indicator and
+ // button bar.
+ final int textIndicatorHeight = getViewHeightPx(R.id.indicator);
+ final int buttonBarHeight = getViewHeightPx(R.id.button_bar);
+
+ // Figure out where the bottom of the sensor anim should be.
+ // Navbar + dialogMargin + buttonBar + textIndicator + spacerHeight = sensorDistFromBottom
+ final int dialogMargin = getDialogMarginPx();
+ final int displayHeight = getWindowBounds().height();
+ final Insets navbarInsets = getNavbarInsets();
+ final int bottomSpacerHeight = calculateBottomSpacerHeightForPortrait(
+ mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight,
+ dialogMargin, navbarInsets.bottom);
+
+ // Go through each of the children and do the custom measurement.
+ int totalHeight = 0;
+ final int numChildren = mView.getChildCount();
+ final int sensorDiameter = mSensorProps.sensorRadius * 2;
+ for (int i = 0; i < numChildren; i++) {
+ final View child = mView.getChildAt(i);
+ if (child.getId() == R.id.biometric_icon_frame) {
+ final FrameLayout iconFrame = (FrameLayout) child;
+ final View icon = iconFrame.getChildAt(0);
+
+ // Ensure that the icon is never larger than the sensor.
+ icon.measure(
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST),
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST));
+
+ // Create a frame that's exactly the height of the sensor circle.
+ iconFrame.measure(
+ MeasureSpec.makeMeasureSpec(
+ child.getLayoutParams().width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.EXACTLY));
+ } else if (child.getId() == R.id.space_above_icon) {
+ child.measure(
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(
+ child.getLayoutParams().height, MeasureSpec.EXACTLY));
+ } else if (child.getId() == R.id.button_bar) {
+ child.measure(
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(child.getLayoutParams().height,
+ MeasureSpec.EXACTLY));
+ } else if (child.getId() == R.id.space_below_icon) {
+ // Set the spacer height so the fingerprint icon is on the physical sensor area
+ child.measure(
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY));
+ } else {
+ child.measure(
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
+ }
+
+ if (child.getVisibility() != View.GONE) {
+ totalHeight += child.getMeasuredHeight();
+ }
+ }
+
+ return new AuthDialog.LayoutParams(width, totalHeight);
+ }
+
+ @NonNull
+ private AuthDialog.LayoutParams onMeasureInternalLandscape(int width, int height) {
+ // Find the spacer height needed to vertically align the icon with the sensor.
+ final int titleHeight = getViewHeightPx(R.id.title);
+ final int subtitleHeight = getViewHeightPx(R.id.subtitle);
+ final int descriptionHeight = getViewHeightPx(R.id.description);
+ final int topSpacerHeight = getViewHeightPx(R.id.space_above_icon);
+ final int textIndicatorHeight = getViewHeightPx(R.id.indicator);
+ final int buttonBarHeight = getViewHeightPx(R.id.button_bar);
+ final Insets navbarInsets = getNavbarInsets();
+ final int bottomSpacerHeight = calculateBottomSpacerHeightForLandscape(titleHeight,
+ subtitleHeight, descriptionHeight, topSpacerHeight, textIndicatorHeight,
+ buttonBarHeight, navbarInsets.bottom);
+
+ // Find the spacer width needed to horizontally align the icon with the sensor.
+ final int displayWidth = getWindowBounds().width();
+ final int dialogMargin = getDialogMarginPx();
+ final int horizontalInset = navbarInsets.left + navbarInsets.right;
+ final int horizontalSpacerWidth = calculateHorizontalSpacerWidthForLandscape(
+ mSensorProps, displayWidth, dialogMargin, horizontalInset);
+
+ final int sensorDiameter = mSensorProps.sensorRadius * 2;
+ final int remeasuredWidth = sensorDiameter + 2 * horizontalSpacerWidth;
+
+ int remeasuredHeight = 0;
+ final int numChildren = mView.getChildCount();
+ for (int i = 0; i < numChildren; i++) {
+ final View child = mView.getChildAt(i);
+ if (child.getId() == R.id.biometric_icon_frame) {
+ final FrameLayout iconFrame = (FrameLayout) child;
+ final View icon = iconFrame.getChildAt(0);
+
+ // Ensure that the icon is never larger than the sensor.
+ icon.measure(
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST),
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.AT_MOST));
+
+ // Create a frame that's exactly the height of the sensor circle.
+ iconFrame.measure(
+ MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(sensorDiameter, MeasureSpec.EXACTLY));
+ } else if (child.getId() == R.id.space_above_icon || child.getId() == R.id.button_bar) {
+ // Adjust the width of the top spacer and button bar while preserving their heights.
+ child.measure(
+ MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(
+ child.getLayoutParams().height, MeasureSpec.EXACTLY));
+ } else if (child.getId() == R.id.space_below_icon) {
+ // Adjust the bottom spacer height to align the fingerprint icon with the sensor.
+ child.measure(
+ MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY));
+ } else {
+ // Use the remeasured width for all other child views.
+ child.measure(
+ MeasureSpec.makeMeasureSpec(remeasuredWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
+ }
+
+ if (child.getVisibility() != View.GONE) {
+ remeasuredHeight += child.getMeasuredHeight();
+ }
+ }
+
+ return new AuthDialog.LayoutParams(remeasuredWidth, remeasuredHeight);
+ }
+
+ private int getViewHeightPx(@IdRes int viewId) {
+ final View view = mView.findViewById(viewId);
+ return view != null ? view.getMeasuredHeight() : 0;
+ }
+
+ private int getDialogMarginPx() {
+ return mView.getResources().getDimensionPixelSize(R.dimen.biometric_dialog_border_padding);
+ }
+
+ @NonNull
+ private Insets getNavbarInsets() {
+ final WindowManager windowManager = getWindowManager();
+ return windowManager != null && windowManager.getCurrentWindowMetrics() != null
+ ? windowManager.getCurrentWindowMetrics().getWindowInsets()
+ .getInsets(WindowInsets.Type.navigationBars())
+ : Insets.NONE;
+ }
+
+ @NonNull
+ private Rect getWindowBounds() {
+ final WindowManager windowManager = getWindowManager();
+ return windowManager != null && windowManager.getCurrentWindowMetrics() != null
+ ? windowManager.getCurrentWindowMetrics().getBounds()
+ : new Rect();
+ }
+
+ @Nullable
+ private WindowManager getWindowManager() {
+ if (mWindowManager == null) {
+ mWindowManager = mView.getContext().getSystemService(WindowManager.class);
+ }
+ return mWindowManager;
+ }
+
+ /**
+ * For devices in portrait orientation where the sensor is too high up, calculates the amount of
+ * padding necessary to center the biometric icon within the sensor's physical location.
+ */
+ @VisibleForTesting
+ static int calculateBottomSpacerHeightForPortrait(
+ @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayHeightPx,
+ int textIndicatorHeightPx, int buttonBarHeightPx, int dialogMarginPx,
+ int navbarBottomInsetPx) {
+
+ final int sensorDistanceFromBottom = displayHeightPx
+ - sensorProperties.sensorLocationY
+ - sensorProperties.sensorRadius;
+
+ final int spacerHeight = sensorDistanceFromBottom
+ - textIndicatorHeightPx
+ - buttonBarHeightPx
+ - dialogMarginPx
+ - navbarBottomInsetPx;
+
+ Log.d(TAG, "Display height: " + displayHeightPx
+ + ", Distance from bottom: " + sensorDistanceFromBottom
+ + ", Bottom margin: " + dialogMarginPx
+ + ", Navbar bottom inset: " + navbarBottomInsetPx
+ + ", Bottom spacer height (portrait): " + spacerHeight);
+
+ return spacerHeight;
+ }
+
+ /**
+ * For devices in landscape orientation where the sensor is too high up, calculates the amount
+ * of padding necessary to center the biometric icon within the sensor's physical location.
+ */
+ @VisibleForTesting
+ static int calculateBottomSpacerHeightForLandscape(int titleHeightPx, int subtitleHeightPx,
+ int descriptionHeightPx, int topSpacerHeightPx, int textIndicatorHeightPx,
+ int buttonBarHeightPx, int navbarBottomInsetPx) {
+
+ final int dialogHeightAboveIcon = titleHeightPx
+ + subtitleHeightPx
+ + descriptionHeightPx
+ + topSpacerHeightPx;
+
+ final int dialogHeightBelowIcon = textIndicatorHeightPx + buttonBarHeightPx;
+
+ final int bottomSpacerHeight = dialogHeightAboveIcon
+ - dialogHeightBelowIcon
+ - navbarBottomInsetPx;
+
+ Log.d(TAG, "Title height: " + titleHeightPx
+ + ", Subtitle height: " + subtitleHeightPx
+ + ", Description height: " + descriptionHeightPx
+ + ", Top spacer height: " + topSpacerHeightPx
+ + ", Text indicator height: " + textIndicatorHeightPx
+ + ", Button bar height: " + buttonBarHeightPx
+ + ", Navbar bottom inset: " + navbarBottomInsetPx
+ + ", Bottom spacer height (landscape): " + bottomSpacerHeight);
+
+ return bottomSpacerHeight;
+ }
+
+ /**
+ * For devices in landscape orientation where the sensor is too left/right, calculates the
+ * amount of padding necessary to center the biometric icon within the sensor's physical
+ * location.
+ */
+ @VisibleForTesting
+ static int calculateHorizontalSpacerWidthForLandscape(
+ @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayWidthPx,
+ int dialogMarginPx, int navbarHorizontalInsetPx) {
+
+ final int sensorDistanceFromEdge = displayWidthPx
+ - sensorProperties.sensorLocationY
+ - sensorProperties.sensorRadius;
+
+ final int horizontalPadding = sensorDistanceFromEdge
+ - dialogMarginPx
+ - navbarHorizontalInsetPx;
+
+ Log.d(TAG, "Display width: " + displayWidthPx
+ + ", Distance from edge: " + sensorDistanceFromEdge
+ + ", Dialog margin: " + dialogMarginPx
+ + ", Navbar horizontal inset: " + navbarHorizontalInsetPx
+ + ", Horizontal spacer width (landscape): " + horizontalPadding);
+
+ return horizontalPadding;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java
index 18f5416..55ed5aa 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java
@@ -18,9 +18,13 @@
import android.content.Context;
import android.graphics.ColorFilter;
+import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.PathShape;
+import android.util.PathParser;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -32,15 +36,30 @@
* sensor area.
*/
public abstract class UdfpsDrawable extends Drawable {
- @NonNull protected final Context mContext;
- @NonNull protected final Drawable mFingerprintDrawable;
+ static final float DEFAULT_STROKE_WIDTH = 3f;
+
+ @NonNull final Context mContext;
+ @NonNull final ShapeDrawable mFingerprintDrawable;
+ private final Paint mPaint;
private boolean mIlluminationShowing;
int mAlpha = 255; // 0 - 255
public UdfpsDrawable(@NonNull Context context) {
mContext = context;
- mFingerprintDrawable = context.getResources().getDrawable(R.drawable.ic_fingerprint, null);
+ final String fpPath = context.getResources().getString(R.string.config_udfpsIcon);
+ mFingerprintDrawable = new ShapeDrawable(
+ new PathShape(PathParser.createPathFromPathData(fpPath), 72, 72));
mFingerprintDrawable.mutate();
+
+ mPaint = mFingerprintDrawable.getPaint();
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ setStrokeWidth(DEFAULT_STROKE_WIDTH);
+ }
+
+ void setStrokeWidth(float strokeWidth) {
+ mPaint.setStrokeWidth(strokeWidth);
+ invalidateSelf();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
index 12c15a0..71ed3f8 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
@@ -18,6 +18,7 @@
import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -27,6 +28,7 @@
import com.android.internal.graphics.ColorUtils;
import com.android.settingslib.Utils;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.doze.DozeReceiver;
@@ -37,6 +39,7 @@
private static final String TAG = "UdfpsAnimationKeyguard";
private final int mAmbientDisplayColor;
+ static final float DEFAULT_AOD_STROKE_WIDTH = 1f;
@NonNull private final Context mContext;
private int mLockScreenColor;
@@ -48,22 +51,31 @@
private float mBurnInOffsetX;
private float mBurnInOffsetY;
+ private final ValueAnimator mHintAnimator = ValueAnimator.ofFloat(
+ UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH,
+ .5f,
+ UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH);
+
UdfpsKeyguardDrawable(@NonNull Context context) {
super(context);
mContext = context;
- // TODO: move burn-in to view
mMaxBurnInOffsetX = context.getResources()
.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
mMaxBurnInOffsetY = context.getResources()
.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
+ mHintAnimator.setDuration(2000);
+ mHintAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+ mHintAnimator.addUpdateListener(anim -> setStrokeWidth((float) anim.getAnimatedValue()));
+
mLockScreenColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
mAmbientDisplayColor = Color.WHITE;
- updateAodPositionAndColor();
+
+ updateIcon();
}
- private void updateAodPositionAndColor() {
+ private void updateIcon() {
mBurnInOffsetX = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
- mMaxBurnInOffsetX,
@@ -75,12 +87,14 @@
mFingerprintDrawable.setTint(ColorUtils.blendARGB(mLockScreenColor,
mAmbientDisplayColor, mInterpolatedDarkAmount));
+ setStrokeWidth(MathUtils.lerp(DEFAULT_STROKE_WIDTH, DEFAULT_AOD_STROKE_WIDTH,
+ mInterpolatedDarkAmount));
invalidateSelf();
}
@Override
public void dozeTimeTick() {
- updateAodPositionAndColor();
+ updateIcon();
}
@Override
@@ -88,17 +102,25 @@
if (isIlluminationShowing()) {
return;
}
+ canvas.save();
+ canvas.translate(mBurnInOffsetX, mBurnInOffsetY);
mFingerprintDrawable.draw(canvas);
+ canvas.restore();
+ }
+
+ void animateHint() {
+ mHintAnimator.start();
}
void onDozeAmountChanged(float linear, float eased) {
+ mHintAnimator.cancel();
mInterpolatedDarkAmount = eased;
- updateAodPositionAndColor();
+ updateIcon();
}
void setLockScreenColor(int color) {
if (mLockScreenColor == color) return;
mLockScreenColor = color;
- updateAodPositionAndColor();
+ updateIcon();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index e274843..fc906f2 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -85,7 +85,6 @@
@Override
public boolean dozeTimeTick() {
- // TODO: burnin
mFingerprintDrawable.dozeTimeTick();
return true;
}
@@ -98,15 +97,23 @@
}
}
+ @Override
+ int calculateAlpha() {
+ return mPauseAuth ? 0 : 255;
+ }
+
void onDozeAmountChanged(float linear, float eased) {
mFingerprintDrawable.onDozeAmountChanged(linear, eased);
- invalidate();
+ }
+
+ void animateHint() {
+ mFingerprintDrawable.animateHint();
}
/**
* Animates in the bg protection circle behind the fp icon to highlight the icon.
*/
- void animateHighlightFp() {
+ void animateUdfpsBouncer() {
if (mBgProtection.getVisibility() == View.VISIBLE && mBgProtection.getAlpha() == 1f) {
// already fully highlighted, don't re-animate
return;
@@ -151,10 +158,14 @@
return mStatusBarState == StatusBarState.SHADE_LOCKED;
}
+ boolean isHome() {
+ return mStatusBarState == StatusBarState.SHADE;
+ }
+
/**
* Animates out the bg protection circle behind the fp icon to unhighlight the icon.
*/
- void animateUnhighlightFp(@Nullable Runnable onEndAnimation) {
+ void animateAwayUdfpsBouncer(@Nullable Runnable onEndAnimation) {
if (mBgProtection.getVisibility() == View.GONE) {
// already hidden
return;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
index 1f652db..dc0c685 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
@@ -16,33 +16,63 @@
package com.android.systemui.biometrics;
-import android.annotation.NonNull;
+import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
+import android.annotation.NonNull;
+import android.hardware.biometrics.BiometricSourceType;
+
+import androidx.annotation.Nullable;
+
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.util.concurrency.DelayableExecutor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
/**
* Class that coordinates non-HBM animations during keyguard authentication.
+ *
+ * Highlights the udfps icon when:
+ * - Face authentication has failed
+ * - Face authentication has been run for > 2 seconds
*/
public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<UdfpsKeyguardView> {
- @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager;
+ private static final long AFTER_FACE_AUTH_HINT_DELAY = 2000;
- private boolean mForceShow;
+ @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager;
+ @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @NonNull private final DelayableExecutor mExecutor;
+ @NonNull private final KeyguardViewMediator mKeyguardViewMediator;
+
+ @Nullable private Runnable mCancelRunnable;
+ private boolean mShowBouncer;
private boolean mQsExpanded;
+ private boolean mFaceDetectRunning;
+ private boolean mHintShown;
+ private boolean mTransitioningFromHome;
+ private int mStatusBarState;
protected UdfpsKeyguardViewController(
@NonNull UdfpsKeyguardView view,
@NonNull StatusBarStateController statusBarStateController,
@NonNull StatusBar statusBar,
@NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- @NonNull DumpManager dumpManager) {
+ @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
+ @NonNull DelayableExecutor mainDelayableExecutor,
+ @NonNull DumpManager dumpManager,
+ @NonNull KeyguardViewMediator keyguardViewMediator) {
super(view, statusBarStateController, statusBar, dumpManager);
mKeyguardViewManager = statusBarKeyguardViewManager;
+ mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+ mExecutor = mainDelayableExecutor;
+ mKeyguardViewMediator = keyguardViewMediator;
}
@Override
@@ -53,6 +83,9 @@
@Override
protected void onViewAttached() {
super.onViewAttached();
+ mHintShown = false;
+ mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
+ updateFaceDetectRunning(mKeyguardUpdateMonitor.isFaceDetectionRunning());
final float dozeAmount = mStatusBarStateController.getDozeAmount();
mStatusBarStateController.addCallback(mStateListener);
@@ -64,90 +97,177 @@
@Override
protected void onViewDetached() {
super.onViewDetached();
+ mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
+ mFaceDetectRunning = false;
+
mStatusBarStateController.removeCallback(mStateListener);
- mAlternateAuthInterceptor.resetForceShow();
+ mAlternateAuthInterceptor.hideAlternateAuthBouncer();
mKeyguardViewManager.setAlternateAuthInterceptor(null);
+ mTransitioningFromHome = false;
+
+ if (mCancelRunnable != null) {
+ mCancelRunnable.run();
+ mCancelRunnable = null;
+ }
}
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
super.dump(fd, pw, args);
- pw.println("mForceShow=" + mForceShow);
+ pw.println("mShowBouncer=" + mShowBouncer);
+ pw.println("mFaceDetectRunning=" + mFaceDetectRunning);
+ pw.println("mTransitioningFromHomeToKeyguard=" + mTransitioningFromHome);
}
/**
- * Overrides non-force show logic in shouldPauseAuth to still auth.
+ * Overrides non-bouncer show logic in shouldPauseAuth to still auth.
*/
- private void forceShow(boolean forceShow) {
- if (mForceShow == forceShow) {
+ private void showBouncer(boolean show) {
+ if (mShowBouncer == show) {
return;
}
- mForceShow = forceShow;
+ mShowBouncer = show;
updatePauseAuth();
- if (mForceShow) {
- mView.animateHighlightFp();
+ if (mShowBouncer) {
+ mView.animateUdfpsBouncer();
} else {
- mView.animateUnhighlightFp(() -> mKeyguardViewManager.cancelPostAuthActions());
+ mView.animateAwayUdfpsBouncer(() -> mKeyguardViewManager.cancelPostAuthActions());
}
}
/**
* Returns true if the fingerprint manager is running but we want to temporarily pause
* authentication. On the keyguard, we may want to show udfps when the shade
- * is expanded, so this can be overridden with the forceShow method.
+ * is expanded, so this can be overridden with the showBouncer method.
*/
public boolean shouldPauseAuth() {
- if (mForceShow) {
+ if (mShowBouncer) {
return false;
}
+ if (mStatusBarState != KEYGUARD) {
+ return true;
+ }
+
+ if (mTransitioningFromHome && mKeyguardViewMediator.isAnimatingScreenOff()) {
+ return true;
+ }
+
if (mQsExpanded) {
return true;
}
- return super.shouldPauseAuth();
+ return false;
+ }
+
+ private void cancelDelayedHint() {
+ if (mCancelRunnable != null) {
+ mCancelRunnable.run();
+ mCancelRunnable = null;
+ }
+ }
+
+ private void updateFaceDetectRunning(boolean running) {
+ if (mFaceDetectRunning == running) {
+ return;
+ }
+
+ // show udfps hint a few seconds after face auth started running
+ if (!mFaceDetectRunning && running && !mHintShown && mCancelRunnable == null) {
+ // Face detect started running, show udfps hint after a delay
+ mCancelRunnable = mExecutor.executeDelayed(() -> showHint(false),
+ AFTER_FACE_AUTH_HINT_DELAY);
+ }
+
+ mFaceDetectRunning = running;
+ }
+
+ private void showHint(boolean forceShow) {
+ cancelDelayedHint();
+ if (!mHintShown || forceShow) {
+ mHintShown = true;
+ mView.animateHint();
+ }
}
private final StatusBarStateController.StateListener mStateListener =
new StatusBarStateController.StateListener() {
@Override
public void onDozeAmountChanged(float linear, float eased) {
+ if (linear != 0) showBouncer(false);
mView.onDozeAmountChanged(linear, eased);
- if (linear != 0) forceShow(false);
+ if (linear == 1f) {
+ // transition has finished
+ mTransitioningFromHome = false;
+ }
+ updatePauseAuth();
+ }
+
+ @Override
+ public void onStatePreChange(int oldState, int newState) {
+ mTransitioningFromHome = oldState == StatusBarState.SHADE
+ && newState == StatusBarState.KEYGUARD;
+ updatePauseAuth();
}
@Override
public void onStateChanged(int statusBarState) {
+ mStatusBarState = statusBarState;
mView.setStatusBarState(statusBarState);
}
};
+ private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback =
+ new KeyguardUpdateMonitorCallback() {
+ public void onBiometricRunningStateChanged(boolean running,
+ BiometricSourceType biometricSourceType) {
+ if (biometricSourceType == BiometricSourceType.FACE) {
+ updateFaceDetectRunning(running);
+ }
+ }
+
+ public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) {
+ if (biometricSourceType == BiometricSourceType.FACE) {
+ // show udfps hint when face auth fails
+ showHint(true);
+ }
+ }
+
+ public void onBiometricAuthenticated(int userId,
+ BiometricSourceType biometricSourceType, boolean isStrongBiometric) {
+ if (biometricSourceType == BiometricSourceType.FACE) {
+ // cancel delayed hint if face auth succeeded
+ cancelDelayedHint();
+ }
+ }
+ };
+
private final StatusBarKeyguardViewManager.AlternateAuthInterceptor mAlternateAuthInterceptor =
new StatusBarKeyguardViewManager.AlternateAuthInterceptor() {
@Override
- public boolean showAlternativeAuthMethod() {
- if (mForceShow) {
+ public boolean showAlternateAuthBouncer() {
+ if (mShowBouncer) {
return false;
}
- forceShow(true);
+ showBouncer(true);
return true;
}
@Override
- public boolean resetForceShow() {
- if (!mForceShow) {
+ public boolean hideAlternateAuthBouncer() {
+ if (!mShowBouncer) {
return false;
}
- forceShow(false);
+ showBouncer(false);
return true;
}
@Override
- public boolean isShowingAlternateAuth() {
- return mForceShow;
+ public boolean isShowingAlternateAuthBouncer() {
+ return mShowBouncer;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/camera/CameraIntents.kt b/packages/SystemUI/src/com/android/systemui/camera/CameraIntents.kt
index 464bee1..f8a2002 100644
--- a/packages/SystemUI/src/com/android/systemui/camera/CameraIntents.kt
+++ b/packages/SystemUI/src/com/android/systemui/camera/CameraIntents.kt
@@ -23,11 +23,11 @@
import com.android.systemui.R
-interface CameraIntents {
+class CameraIntents {
companion object {
- const val DEFAULT_SECURE_CAMERA_INTENT_ACTION =
+ val DEFAULT_SECURE_CAMERA_INTENT_ACTION =
MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE
- const val DEFAULT_INSECURE_CAMERA_INTENT_ACTION =
+ val DEFAULT_INSECURE_CAMERA_INTENT_ACTION =
MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA
@JvmStatic
@@ -59,13 +59,13 @@
}
@JvmStatic
- fun isSecureCameraIntent(intent: Intent): Boolean {
- return intent.getAction().equals(DEFAULT_SECURE_CAMERA_INTENT_ACTION)
+ fun isSecureCameraIntent(intent: Intent?): Boolean {
+ return intent?.getAction()?.equals(DEFAULT_SECURE_CAMERA_INTENT_ACTION) ?: false
}
@JvmStatic
- fun isInsecureCameraIntent(intent: Intent): Boolean {
- return intent.getAction().equals(DEFAULT_INSECURE_CAMERA_INTENT_ACTION)
+ fun isInsecureCameraIntent(intent: Intent?): Boolean {
+ return intent?.getAction()?.equals(DEFAULT_INSECURE_CAMERA_INTENT_ACTION) ?: false
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
index bb03720..3871248 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
@@ -112,9 +112,21 @@
/** */
void onBouncerHidden();
- /** */
+ /**
+ * Call this to record a MotionEvent in the {@link com.android.systemui.plugins.FalsingManager}.
+ *
+ * Be sure to call {@link #onMotionEventComplete()} after the rest of SystemUI is done with the
+ * MotionEvent.
+ */
void onTouchEvent(MotionEvent ev);
+ /**
+ * Call this once SystemUI has completed all processing of a given MotionEvent.
+ *
+ * See {@link #onTouchEvent(MotionEvent)}.
+ */
+ void onMotionEventComplete();
+
/** */
void avoidGesture();
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
index 939b45a..28aac05 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
@@ -147,6 +147,10 @@
}
@Override
+ public void onMotionEventComplete() {
+ }
+
+ @Override
public void avoidGesture() {
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index cf61697..aaea9ce 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -275,6 +275,11 @@
}
@Override
+ public void onMotionEventComplete() {
+ mFalsingDataProvider.onMotionEventComplete();
+ }
+
+ @Override
public void avoidGesture() {
mAvoidGesture = true;
if (mPendingDownEvent != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
index 1aaa139..2e60a65 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
@@ -81,8 +81,8 @@
}
if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ // Ensure prior gesture was completed. May be a no-op.
completePriorGesture();
- mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
}
mRecentMotionEvents.addAll(motionEvents);
@@ -100,12 +100,23 @@
mDirty = true;
}
+ void onMotionEventComplete() {
+ if (mRecentMotionEvents.isEmpty()) {
+ return;
+ }
+ int action = mRecentMotionEvents.get(mRecentMotionEvents.size() - 1).getActionMasked();
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ completePriorGesture();
+ }
+ }
+
private void completePriorGesture() {
if (!mRecentMotionEvents.isEmpty()) {
mGestureFinalizedListeners.forEach(listener -> listener.onGestureFinalized(
mRecentMotionEvents.get(mRecentMotionEvents.size() - 1).getEventTime()));
mPriorMotionEvents = mRecentMotionEvents;
+ mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
index 1a72929..187caf9 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
@@ -31,7 +31,6 @@
import android.os.Looper;
import android.os.ServiceManager;
import android.os.UserHandle;
-import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.view.Choreographer;
import android.view.IWindowManager;
import android.view.LayoutInflater;
@@ -376,11 +375,4 @@
public ModeSwitchesController providesModeSwitchesController(Context context) {
return new ModeSwitchesController(context);
}
-
- /** */
- @Provides
- @SysUISingleton
- public QuickAccessWalletClient provideQuickAccessWalletClient(Context context) {
- return QuickAccessWalletClient.create(context);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
index 1c5715c..fd80d50 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
@@ -59,6 +59,7 @@
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.telecom.TelecomManager;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.IWindowManager;
import android.view.ViewConfiguration;
@@ -328,6 +329,12 @@
@Provides
@Singleton
+ static SubscriptionManager provideSubcriptionManager(Context context) {
+ return context.getSystemService(SubscriptionManager.class);
+ }
+
+ @Provides
+ @Singleton
@Nullable
static TelecomManager provideTelecomManager(Context context) {
return context.getSystemService(TelecomManager.class);
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index b67db03..365a102 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -73,6 +73,7 @@
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.util.time.SystemClockImpl;
import com.android.systemui.volume.dagger.VolumeModule;
+import com.android.systemui.wallet.dagger.WalletModule;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
@@ -109,7 +110,8 @@
TunerModule.class,
UserModule.class,
UtilModule.class,
- VolumeModule.class
+ VolumeModule.class,
+ WalletModule.class
},
subcomponents = {
StatusBarComponent.class,
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
index 0673879..37b8a2c 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
@@ -23,6 +23,7 @@
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.qs.QSFragment;
+import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.policy.ConfigurationController;
import java.io.FileDescriptor;
@@ -128,6 +129,9 @@
* Inject a QSFragment.
*/
QSFragment createQSFragment();
+
+ /** Inject a CollapsedStatusBarFragment. */
+ CollapsedStatusBarFragment createCollapsedStatusBarFragment();
}
private class FragmentHostState {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 1862718..34d94d8 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -15,16 +15,8 @@
package com.android.systemui.globalactions;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
-import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN;
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE;
import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_GLOBAL_ACTIONS_SHOWING;
@@ -34,92 +26,47 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.Dialog;
import android.app.IActivityManager;
import android.app.PendingIntent;
-import android.app.StatusBarManager;
-import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.content.res.ColorStateList;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
-import android.net.ConnectivityManager;
-import android.os.Binder;
import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.os.UserHandle;
import android.os.UserManager;
import android.os.Vibrator;
import android.provider.Settings;
import android.service.dreams.IDreamManager;
-import android.sysprop.TelephonyProperties;
import android.telecom.TelecomManager;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
import android.transition.AutoTransition;
import android.transition.TransitionManager;
import android.transition.TransitionSet;
-import android.util.ArraySet;
import android.util.Log;
-import android.view.ContextThemeWrapper;
import android.view.IWindowManager;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.BaseAdapter;
import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
-import android.widget.ListPopupWindow;
import android.widget.TextView;
-import androidx.annotation.NonNull;
-import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.LifecycleRegistry;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.colorextraction.ColorExtractor;
-import com.android.internal.colorextraction.ColorExtractor.GradientColors;
-import com.android.internal.colorextraction.drawable.ScrimDrawable;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.util.EmergencyAffordanceManager;
-import com.android.internal.util.ScreenshotHelper;
import com.android.internal.view.RotationPolicy;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Interpolators;
-import com.android.systemui.MultiListLayout;
-import com.android.systemui.MultiListLayout.MultiListAdapter;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.controls.ControlsServiceInfo;
@@ -139,9 +86,10 @@
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager;
-import com.android.systemui.util.EmergencyDialerConstants;
import com.android.systemui.util.RingerModeTracker;
import com.android.systemui.util.leak.RotationUtils;
+import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.util.settings.SecureSettings;
import java.util.ArrayList;
import java.util.Collections;
@@ -157,144 +105,37 @@
/**
* Helper to show the global actions dialog. Each item is an {@link Action} that may show depending
* on whether the keyguard is showing, and whether the device is provisioned.
+ * This version includes wallet and controls.
*/
-public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
+public class GlobalActionsDialog extends GlobalActionsDialogLite
+ implements DialogInterface.OnDismissListener,
DialogInterface.OnShowListener,
ConfigurationController.ConfigurationListener,
GlobalActionsPanelPlugin.Callbacks,
LifecycleOwner {
- public static final String SYSTEM_DIALOG_REASON_KEY = "reason";
- public static final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
- public static final String SYSTEM_DIALOG_REASON_DREAM = "dream";
-
private static final String TAG = "GlobalActionsDialog";
- private static final boolean SHOW_SILENT_TOGGLE = true;
-
- /* Valid settings for global actions keys.
- * see config.xml config_globalActionList */
- @VisibleForTesting
- static final String GLOBAL_ACTION_KEY_POWER = "power";
- private static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
- static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
- private static final String GLOBAL_ACTION_KEY_SILENT = "silent";
- private static final String GLOBAL_ACTION_KEY_USERS = "users";
- private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
- static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
- private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
- private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
- static final String GLOBAL_ACTION_KEY_RESTART = "restart";
- private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
- static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
- static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
-
public static final String PREFS_CONTROLS_SEEDING_COMPLETED = "SeedingCompleted";
public static final String PREFS_CONTROLS_FILE = "controls_prefs";
private static final int SEEDING_MAX = 2;
- private final Context mContext;
- private final GlobalActionsManager mWindowManagerFuncs;
- private final AudioManager mAudioManager;
- private final IDreamManager mDreamManager;
- private final DevicePolicyManager mDevicePolicyManager;
private final LockPatternUtils mLockPatternUtils;
private final KeyguardStateController mKeyguardStateController;
- private final BroadcastDispatcher mBroadcastDispatcher;
- private final ContentResolver mContentResolver;
- private final Resources mResources;
- private final ConfigurationController mConfigurationController;
- private final UserManager mUserManager;
- private final TrustManager mTrustManager;
- private final IActivityManager mIActivityManager;
- private final TelecomManager mTelecomManager;
- private final MetricsLogger mMetricsLogger;
- private final UiEventLogger mUiEventLogger;
private final NotificationShadeDepthController mDepthController;
private final SysUiState mSysUiState;
-
- // Used for RingerModeTracker
- private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
-
- @VisibleForTesting
- protected final ArrayList<Action> mItems = new ArrayList<>();
- @VisibleForTesting
- protected final ArrayList<Action> mOverflowItems = new ArrayList<>();
- @VisibleForTesting
- protected final ArrayList<Action> mPowerItems = new ArrayList<>();
-
- @VisibleForTesting
- protected ActionsDialog mDialog;
-
- private Action mSilentModeAction;
- private ToggleAction mAirplaneModeOn;
-
- private MyAdapter mAdapter;
- private MyOverflowAdapter mOverflowAdapter;
- private MyPowerOptionsAdapter mPowerAdapter;
-
- private boolean mKeyguardShowing = false;
- private boolean mDeviceProvisioned = false;
- private ToggleState mAirplaneState = ToggleState.Off;
- private boolean mIsWaitingForEcmExit = false;
- private boolean mHasTelephony;
- private boolean mHasVibrator;
- private final boolean mShowSilentToggle;
- private final EmergencyAffordanceManager mEmergencyAffordanceManager;
- private final ScreenshotHelper mScreenshotHelper;
private final ActivityStarter mActivityStarter;
private final SysuiColorExtractor mSysuiColorExtractor;
private final IStatusBarService mStatusBarService;
private final NotificationShadeWindowController mNotificationShadeWindowController;
private GlobalActionsPanelPlugin mWalletPlugin;
private Optional<ControlsUiController> mControlsUiControllerOptional;
- private final IWindowManager mIWindowManager;
- private final Executor mBackgroundExecutor;
private List<ControlsServiceInfo> mControlsServiceInfos = new ArrayList<>();
private ControlsComponent mControlsComponent;
private Optional<ControlsController> mControlsControllerOptional;
- private final RingerModeTracker mRingerModeTracker;
- private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms
- private Handler mMainHandler;
private UserContextProvider mUserContextProvider;
@VisibleForTesting
boolean mShowLockScreenCardsAndControls = false;
- private int mSmallestScreenWidthDp;
-
- @VisibleForTesting
- public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum {
- @UiEvent(doc = "The global actions / power menu surface became visible on the screen.")
- GA_POWER_MENU_OPEN(337),
-
- @UiEvent(doc = "The global actions / power menu surface was dismissed.")
- GA_POWER_MENU_CLOSE(471),
-
- @UiEvent(doc = "The global actions bugreport button was pressed.")
- GA_BUGREPORT_PRESS(344),
-
- @UiEvent(doc = "The global actions bugreport button was long pressed.")
- GA_BUGREPORT_LONG_PRESS(345),
-
- @UiEvent(doc = "The global actions emergency button was pressed.")
- GA_EMERGENCY_DIALER_PRESS(346),
-
- @UiEvent(doc = "The global actions screenshot button was pressed.")
- GA_SCREENSHOT_PRESS(347),
-
- @UiEvent(doc = "The global actions screenshot button was long pressed.")
- GA_SCREENSHOT_LONG_PRESS(348);
-
- private final int mId;
-
- GlobalActionsEvent(int id) {
- mId = id;
- }
-
- @Override
- public int getId() {
- return mId;
- }
- }
/**
* @param context everything needs a context :(
@@ -304,9 +145,9 @@
AudioManager audioManager, IDreamManager iDreamManager,
DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher,
- ConnectivityManager connectivityManager,
TelephonyListenerManager telephonyListenerManager,
- ContentResolver contentResolver, @Nullable Vibrator vibrator, @Main Resources resources,
+ GlobalSettings globalSettings, SecureSettings secureSettings,
+ @Nullable Vibrator vibrator, @Main Resources resources,
ConfigurationController configurationController, ActivityStarter activityStarter,
KeyguardStateController keyguardStateController, UserManager userManager,
TrustManager trustManager, IActivityManager iActivityManager,
@@ -320,83 +161,52 @@
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler,
ControlsComponent controlsComponent,
UserContextProvider userContextProvider) {
- mContext = context;
- mWindowManagerFuncs = windowManagerFuncs;
- mAudioManager = audioManager;
- mDreamManager = iDreamManager;
- mDevicePolicyManager = devicePolicyManager;
+
+ super(context, windowManagerFuncs,
+ audioManager, iDreamManager,
+ devicePolicyManager, lockPatternUtils,
+ broadcastDispatcher, telephonyListenerManager,
+ globalSettings, secureSettings,
+ vibrator, resources,
+ configurationController,
+ keyguardStateController, userManager,
+ trustManager, iActivityManager,
+ telecomManager, metricsLogger,
+ depthController, colorExtractor,
+ statusBarService,
+ notificationShadeWindowController,
+ iWindowManager,
+ backgroundExecutor,
+ uiEventLogger,
+ ringerModeTracker, sysUiState, handler);
+
mLockPatternUtils = lockPatternUtils;
mKeyguardStateController = keyguardStateController;
- mBroadcastDispatcher = broadcastDispatcher;
- mContentResolver = contentResolver;
- mResources = resources;
- mConfigurationController = configurationController;
- mUserManager = userManager;
- mTrustManager = trustManager;
- mIActivityManager = iActivityManager;
- mTelecomManager = telecomManager;
- mMetricsLogger = metricsLogger;
- mUiEventLogger = uiEventLogger;
mDepthController = depthController;
mSysuiColorExtractor = colorExtractor;
mStatusBarService = statusBarService;
mNotificationShadeWindowController = notificationShadeWindowController;
mControlsComponent = controlsComponent;
mControlsUiControllerOptional = controlsComponent.getControlsUiController();
- mIWindowManager = iWindowManager;
- mBackgroundExecutor = backgroundExecutor;
- mRingerModeTracker = ringerModeTracker;
mControlsControllerOptional = controlsComponent.getControlsController();
mSysUiState = sysUiState;
- mMainHandler = handler;
mUserContextProvider = userContextProvider;
- mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp;
-
- // receive broadcasts
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- filter.addAction(Intent.ACTION_SCREEN_OFF);
- filter.addAction(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
- mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
-
- mHasTelephony =
- context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
-
- // get notified of phone state changes
- telephonyListenerManager.addServiceStateListener(mPhoneStateListener);
- contentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,
- mAirplaneModeObserver);
- mHasVibrator = vibrator != null && vibrator.hasVibrator();
-
- mShowSilentToggle = SHOW_SILENT_TOGGLE && !resources.getBoolean(
- R.bool.config_useFixedVolume);
- if (mShowSilentToggle) {
- mRingerModeTracker.getRingerMode().observe(this, ringer ->
- mHandler.sendEmptyMessage(MESSAGE_REFRESH)
- );
- }
-
- mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
- mScreenshotHelper = new ScreenshotHelper(context);
-
- mConfigurationController.addCallback(this);
-
mActivityStarter = activityStarter;
keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override
public void onUnlockedChanged() {
if (mDialog != null) {
+ ActionsDialog dialog = (ActionsDialog) mDialog;
boolean unlocked = mKeyguardStateController.isUnlocked();
- if (mDialog.mWalletViewController != null) {
- mDialog.mWalletViewController.onDeviceLockStateChanged(!unlocked);
+ if (dialog.mWalletViewController != null) {
+ dialog.mWalletViewController.onDeviceLockStateChanged(!unlocked);
}
- if (!mDialog.isShowingControls()
+ if (!dialog.isShowingControls()
&& mControlsComponent.getVisibility() == AVAILABLE) {
- mDialog.showControls(mControlsUiControllerOptional.get());
+ dialog.showControls(mControlsUiControllerOptional.get());
}
if (unlocked) {
- mDialog.hideLockMessage();
+ dialog.hideLockMessage();
}
}
}
@@ -409,11 +219,12 @@
// This callback may occur after the dialog has been shown. If so, add
// controls into the already visible space or show the lock msg if needed.
if (mDialog != null) {
- if (!mDialog.isShowingControls()
+ ActionsDialog dialog = (ActionsDialog) mDialog;
+ if (!dialog.isShowingControls()
&& mControlsComponent.getVisibility() == AVAILABLE) {
- mDialog.showControls(mControlsUiControllerOptional.get());
- } else if (shouldShowLockMessage(mDialog)) {
- mDialog.showLockMessage();
+ dialog.showControls(mControlsUiControllerOptional.get());
+ } else if (shouldShowLockMessage(dialog)) {
+ dialog.showLockMessage();
}
}
});
@@ -421,10 +232,10 @@
// Listen for changes to show controls on the power menu while locked
onPowerMenuLockScreenSettingsChanged();
- mContext.getContentResolver().registerContentObserver(
+ mGlobalSettings.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT),
false /* notifyForDescendants */,
- new ContentObserver(mMainHandler) {
+ new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
onPowerMenuLockScreenSettingsChanged();
@@ -443,7 +254,7 @@
return;
}
- String[] preferredControlsPackages = mContext.getResources()
+ String[] preferredControlsPackages = getContext().getResources()
.getStringArray(com.android.systemui.R.array.config_controlsPreferredPackages);
SharedPreferences prefs = mUserContextProvider.getUserContext()
@@ -498,67 +309,14 @@
*/
public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,
GlobalActionsPanelPlugin walletPlugin) {
- mKeyguardShowing = keyguardShowing;
- mDeviceProvisioned = isDeviceProvisioned;
mWalletPlugin = walletPlugin;
- if (mDialog != null && mDialog.isShowing()) {
- // In order to force global actions to hide on the same affordance press, we must
- // register a call to onGlobalActionsShown() first to prevent the default actions
- // menu from showing. This will be followed by a subsequent call to
- // onGlobalActionsHidden() on dismiss()
- mWindowManagerFuncs.onGlobalActionsShown();
- mDialog.dismiss();
- mDialog = null;
- } else {
- handleShow();
- }
+ super.showOrHideDialog(keyguardShowing, isDeviceProvisioned);
}
- /**
- * Dismiss the global actions dialog, if it's currently shown
- */
- public void dismissDialog() {
- mHandler.removeMessages(MESSAGE_DISMISS);
- mHandler.sendEmptyMessage(MESSAGE_DISMISS);
- }
-
- private void awakenIfNecessary() {
- if (mDreamManager != null) {
- try {
- if (mDreamManager.isDreaming()) {
- mDreamManager.awaken();
- }
- } catch (RemoteException e) {
- // we tried
- }
- }
- }
-
- private void handleShow() {
- awakenIfNecessary();
- mDialog = createDialog();
- prepareDialog();
+ @Override
+ protected void handleShow() {
seedFavorites();
-
- WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
- attrs.setTitle("ActionsDialog");
- attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
- mDialog.getWindow().setAttributes(attrs);
- // Don't acquire soft keyboard focus, to avoid destroying state when capturing bugreports
- mDialog.getWindow().setFlags(FLAG_ALT_FOCUSABLE_IM, FLAG_ALT_FOCUSABLE_IM);
- mDialog.show();
- mWindowManagerFuncs.onGlobalActionsShown();
- }
-
- @VisibleForTesting
- protected boolean shouldShowAction(Action action) {
- if (mKeyguardShowing && !action.showDuringKeyguard()) {
- return false;
- }
- if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
- return false;
- }
- return action.shouldShow();
+ super.handleShow();
}
/**
@@ -566,134 +324,10 @@
* layout is being used.
*/
@VisibleForTesting
+ @Override
protected int getMaxShownPowerItems() {
- return mResources.getInteger(com.android.systemui.R.integer.power_menu_max_columns);
- }
-
- /**
- * Add a power menu action item for to either the main or overflow items lists, depending on
- * whether controls are enabled and whether the max number of shown items has been reached.
- */
- private void addActionItem(Action action) {
- if (mItems.size() < getMaxShownPowerItems()) {
- mItems.add(action);
- } else {
- mOverflowItems.add(action);
- }
- }
-
- @VisibleForTesting
- protected String[] getDefaultActions() {
- return mResources.getStringArray(R.array.config_globalActionsList);
- }
-
- private void addIfShouldShowAction(List<Action> actions, Action action) {
- if (shouldShowAction(action)) {
- actions.add(action);
- }
- }
-
- @VisibleForTesting
- protected void createActionItems() {
- // Simple toggle style if there's no vibrator, otherwise use a tri-state
- if (!mHasVibrator) {
- mSilentModeAction = new SilentModeToggleAction();
- } else {
- mSilentModeAction = new SilentModeTriStateAction(mAudioManager, mHandler);
- }
- mAirplaneModeOn = new AirplaneModeAction();
- onAirplaneModeChanged();
-
- mItems.clear();
- mOverflowItems.clear();
- mPowerItems.clear();
- String[] defaultActions = getDefaultActions();
-
- ShutDownAction shutdownAction = new ShutDownAction();
- RestartAction restartAction = new RestartAction();
- ArraySet<String> addedKeys = new ArraySet<String>();
- List<Action> tempActions = new ArrayList<>();
- CurrentUserProvider currentUser = new CurrentUserProvider();
-
- // make sure emergency affordance action is first, if needed
- if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
- addIfShouldShowAction(tempActions, new EmergencyAffordanceAction());
- addedKeys.add(GLOBAL_ACTION_KEY_EMERGENCY);
- }
-
- for (int i = 0; i < defaultActions.length; i++) {
- String actionKey = defaultActions[i];
- if (addedKeys.contains(actionKey)) {
- // If we already have added this, don't add it again.
- continue;
- }
- if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
- addIfShouldShowAction(tempActions, shutdownAction);
- } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {
- addIfShouldShowAction(tempActions, mAirplaneModeOn);
- } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
- if (shouldDisplayBugReport(currentUser.get())) {
- addIfShouldShowAction(tempActions, new BugReportAction());
- }
- } else if (GLOBAL_ACTION_KEY_SILENT.equals(actionKey)) {
- if (mShowSilentToggle) {
- addIfShouldShowAction(tempActions, mSilentModeAction);
- }
- } else if (GLOBAL_ACTION_KEY_USERS.equals(actionKey)) {
- if (SystemProperties.getBoolean("fw.power_user_switcher", false)) {
- addUserActions(tempActions, currentUser.get());
- }
- } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
- addIfShouldShowAction(tempActions, getSettingsAction());
- } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
- if (shouldDisplayLockdown(currentUser.get())) {
- addIfShouldShowAction(tempActions, new LockDownAction());
- }
- } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
- addIfShouldShowAction(tempActions, getVoiceAssistAction());
- } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
- addIfShouldShowAction(tempActions, getAssistAction());
- } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
- addIfShouldShowAction(tempActions, restartAction);
- } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) {
- addIfShouldShowAction(tempActions, new ScreenshotAction());
- } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) {
- if (mDevicePolicyManager.isLogoutEnabled()
- && currentUser.get() != null
- && currentUser.get().id != UserHandle.USER_SYSTEM) {
- addIfShouldShowAction(tempActions, new LogoutAction());
- }
- } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
- addIfShouldShowAction(tempActions, new EmergencyDialerAction());
- } else {
- Log.e(TAG, "Invalid global action key " + actionKey);
- }
- // Add here so we don't add more than one.
- addedKeys.add(actionKey);
- }
-
- // replace power and restart with a single power options action, if needed
- if (tempActions.contains(shutdownAction) && tempActions.contains(restartAction)
- && tempActions.size() > getMaxShownPowerItems()) {
- // transfer shutdown and restart to their own list of power actions
- int powerOptionsIndex = Math.min(tempActions.indexOf(restartAction),
- tempActions.indexOf(shutdownAction));
- tempActions.remove(shutdownAction);
- tempActions.remove(restartAction);
- mPowerItems.add(shutdownAction);
- mPowerItems.add(restartAction);
-
- // add the PowerOptionsAction after Emergency, if present
- tempActions.add(powerOptionsIndex, new PowerOptionsAction());
- }
- for (Action action : tempActions) {
- addActionItem(action);
- }
- }
-
- private void onRotate() {
- // re-allocate actions between main and overflow lists
- this.createActionItems();
+ return getContext().getResources().getInteger(
+ com.android.systemui.R.integer.power_menu_max_columns);
}
/**
@@ -701,23 +335,20 @@
*
* @return A new dialog.
*/
- private ActionsDialog createDialog() {
- createActionItems();
-
- mAdapter = new MyAdapter();
- mOverflowAdapter = new MyOverflowAdapter();
- mPowerAdapter = new MyPowerOptionsAdapter();
+ @Override
+ protected ActionsDialogLite createDialog() {
+ initDialogItems();
mDepthController.setShowingHomeControls(true);
ControlsUiController uiController = null;
if (mControlsComponent.getVisibility() == AVAILABLE) {
uiController = mControlsUiControllerOptional.get();
}
- ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mOverflowAdapter,
+ ActionsDialog dialog = new ActionsDialog(getContext(), mAdapter, mOverflowAdapter,
this::getWalletViewController, mDepthController, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController,
controlsAvailable(), uiController,
- mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter);
+ mSysUiState, this::onRotate, isKeyguardShowing(), mPowerAdapter);
if (shouldShowLockMessage(dialog)) {
dialog.showLockMessage();
@@ -729,59 +360,6 @@
return dialog;
}
- @VisibleForTesting
- boolean shouldDisplayLockdown(UserInfo user) {
- if (user == null) {
- return false;
- }
-
- int userId = user.id;
-
- // No lockdown option if it's not turned on in Settings
- if (Settings.Secure.getIntForUser(mContentResolver,
- Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) == 0) {
- return false;
- }
-
- // Lockdown is meaningless without a place to go.
- if (!mKeyguardStateController.isMethodSecure()) {
- return false;
- }
-
- // Only show the lockdown button if the device isn't locked down (for whatever reason).
- int state = mLockPatternUtils.getStrongAuthForUser(userId);
- return (state == STRONG_AUTH_NOT_REQUIRED
- || state == SOME_AUTH_REQUIRED_AFTER_USER_REQUEST);
- }
-
- @VisibleForTesting
- boolean shouldDisplayBugReport(UserInfo currentUser) {
- return Settings.Global.getInt(
- mContentResolver, Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0
- && (currentUser == null || currentUser.isPrimary());
- }
-
- @Override
- public void onUiModeChanged() {
- mContext.getTheme().applyStyle(mContext.getThemeResId(), true);
- if (mDialog != null && mDialog.isShowing()) {
- mDialog.refreshDialog();
- }
- }
-
- @Override
- public void onConfigChanged(Configuration newConfig) {
- if (mDialog != null && mDialog.isShowing()
- && (newConfig.smallestScreenWidthDp != mSmallestScreenWidthDp)) {
- mSmallestScreenWidthDp = newConfig.smallestScreenWidthDp;
- mDialog.refreshDialog();
- }
- }
-
- public void destroy() {
- mConfigurationController.removeCallback(this);
- }
-
@Nullable
private GlobalActionsPanelPlugin.PanelViewController getWalletViewController() {
if (mWalletPlugin == null) {
@@ -792,15 +370,6 @@
/**
* Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is
- * called when the quick access wallet requests dismissal.
- */
- @Override
- public void dismissGlobalActionsMenu() {
- dismissDialog();
- }
-
- /**
- * Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is
* called when the quick access wallet requests that an intent be started (with lock screen
* shown first if needed).
*/
@@ -809,1364 +378,39 @@
mActivityStarter.startPendingIntentDismissingKeyguard(pendingIntent);
}
- @VisibleForTesting
- protected final class PowerOptionsAction extends SinglePressAction {
- private PowerOptionsAction() {
- super(com.android.systemui.R.drawable.ic_settings_power,
- R.string.global_action_power_options);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
-
- @Override
- public void onPress() {
- if (mDialog != null) {
- mDialog.showPowerOptionsMenu();
- }
- }
- }
-
- @VisibleForTesting
- final class ShutDownAction extends SinglePressAction implements LongPressAction {
- private ShutDownAction() {
- super(R.drawable.ic_lock_power_off,
- R.string.global_action_power_off);
- }
-
- @Override
- public boolean onLongPress() {
- if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) {
- mWindowManagerFuncs.reboot(true);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
-
- @Override
- public void onPress() {
- // shutdown by making sure radio and power are handled accordingly.
- mWindowManagerFuncs.shutdown();
- }
- }
-
- @VisibleForTesting
- protected abstract class EmergencyAction extends SinglePressAction {
- EmergencyAction(int iconResId, int messageResId) {
- super(iconResId, messageResId);
- }
-
- @Override
- public boolean shouldBeSeparated() {
- return false;
- }
-
- @Override
- public View create(
- Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
- View v = super.create(context, convertView, parent, inflater);
- int textColor;
- v.setBackgroundTintList(ColorStateList.valueOf(v.getResources().getColor(
- com.android.systemui.R.color.global_actions_emergency_background)));
- textColor = v.getResources().getColor(
- com.android.systemui.R.color.global_actions_emergency_text);
- TextView messageView = v.findViewById(R.id.message);
- messageView.setTextColor(textColor);
- messageView.setSelected(true); // necessary for marquee to work
- ImageView icon = v.findViewById(R.id.icon);
- icon.getDrawable().setTint(textColor);
- return v;
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
- }
-
- private class EmergencyAffordanceAction extends EmergencyAction {
- EmergencyAffordanceAction() {
- super(R.drawable.emergency_icon,
- R.string.global_action_emergency);
- }
-
- @Override
- public void onPress() {
- mEmergencyAffordanceManager.performEmergencyCall();
- }
- }
-
- @VisibleForTesting
- class EmergencyDialerAction extends EmergencyAction {
- private EmergencyDialerAction() {
- super(com.android.systemui.R.drawable.ic_emergency_star,
- R.string.global_action_emergency);
- }
-
- @Override
- public void onPress() {
- mMetricsLogger.action(MetricsEvent.ACTION_EMERGENCY_DIALER_FROM_POWER_MENU);
- mUiEventLogger.log(GlobalActionsEvent.GA_EMERGENCY_DIALER_PRESS);
- if (mTelecomManager != null) {
- Intent intent = mTelecomManager.createLaunchEmergencyDialerIntent(
- null /* number */);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- intent.putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE,
- EmergencyDialerConstants.ENTRY_TYPE_POWER_MENU);
- mContext.startActivityAsUser(intent, UserHandle.CURRENT);
- }
- }
- }
-
- @VisibleForTesting
- EmergencyDialerAction makeEmergencyDialerActionForTesting() {
- return new EmergencyDialerAction();
- }
-
- @VisibleForTesting
- final class RestartAction extends SinglePressAction implements LongPressAction {
- private RestartAction() {
- super(R.drawable.ic_restart, R.string.global_action_restart);
- }
-
- @Override
- public boolean onLongPress() {
- if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) {
- mWindowManagerFuncs.reboot(true);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
-
- @Override
- public void onPress() {
- mWindowManagerFuncs.reboot(false);
- }
- }
-
- @VisibleForTesting
- class ScreenshotAction extends SinglePressAction {
- final String KEY_SYSTEM_NAV_2BUTTONS = "system_nav_2buttons";
-
- public ScreenshotAction() {
- super(R.drawable.ic_screenshot, R.string.global_action_screenshot);
- }
-
- @Override
- public void onPress() {
- // Add a little delay before executing, to give the
- // dialog a chance to go away before it takes a
- // screenshot.
- // TODO: instead, omit global action dialog layer
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, true, true,
- SCREENSHOT_GLOBAL_ACTIONS, mHandler, null);
- mMetricsLogger.action(MetricsEvent.ACTION_SCREENSHOT_POWER_MENU);
- mUiEventLogger.log(GlobalActionsEvent.GA_SCREENSHOT_PRESS);
- }
- }, mDialogPressDelay);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return false;
- }
-
- @Override
- public boolean shouldShow() {
- // Include screenshot in power menu for legacy nav because it is not accessible
- // through Recents in that mode
- return is2ButtonNavigationEnabled();
- }
-
- boolean is2ButtonNavigationEnabled() {
- return NAV_BAR_MODE_2BUTTON == mContext.getResources().getInteger(
- com.android.internal.R.integer.config_navBarInteractionMode);
- }
- }
-
- @VisibleForTesting
- ScreenshotAction makeScreenshotActionForTesting() {
- return new ScreenshotAction();
- }
-
- @VisibleForTesting
- class BugReportAction extends SinglePressAction implements LongPressAction {
-
- public BugReportAction() {
- super(R.drawable.ic_lock_bugreport, R.string.bugreport_title);
- }
-
- @Override
- public void onPress() {
- // don't actually trigger the bugreport if we are running stability
- // tests via monkey
- if (ActivityManager.isUserAMonkey()) {
- return;
- }
- // Add a little delay before executing, to give the
- // dialog a chance to go away before it takes a
- // screenshot.
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- try {
- // Take an "interactive" bugreport.
- mMetricsLogger.action(
- MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_INTERACTIVE);
- mUiEventLogger.log(GlobalActionsEvent.GA_BUGREPORT_PRESS);
- if (!mIActivityManager.launchBugReportHandlerApp()) {
- Log.w(TAG, "Bugreport handler could not be launched");
- mIActivityManager.requestInteractiveBugReport();
- }
- } catch (RemoteException e) {
- }
- }
- }, mDialogPressDelay);
- }
-
- @Override
- public boolean onLongPress() {
- // don't actually trigger the bugreport if we are running stability
- // tests via monkey
- if (ActivityManager.isUserAMonkey()) {
- return false;
- }
- try {
- // Take a "full" bugreport.
- mMetricsLogger.action(MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_FULL);
- mUiEventLogger.log(GlobalActionsEvent.GA_BUGREPORT_LONG_PRESS);
- mIActivityManager.requestFullBugReport();
- } catch (RemoteException e) {
- }
- return false;
- }
-
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return false;
- }
- }
-
- @VisibleForTesting
- BugReportAction makeBugReportActionForTesting() {
- return new BugReportAction();
- }
-
- private final class LogoutAction extends SinglePressAction {
- private LogoutAction() {
- super(R.drawable.ic_logout, R.string.global_action_logout);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return false;
- }
-
- @Override
- public void onPress() {
- // Add a little delay before executing, to give the dialog a chance to go away before
- // switching user
- mHandler.postDelayed(() -> {
- try {
- int currentUserId = getCurrentUser().id;
- mIActivityManager.switchUser(UserHandle.USER_SYSTEM);
- mIActivityManager.stopUser(currentUserId, true /*force*/, null);
- } catch (RemoteException re) {
- Log.e(TAG, "Couldn't logout user " + re);
- }
- }, mDialogPressDelay);
- }
- }
-
- private Action getSettingsAction() {
- return new SinglePressAction(R.drawable.ic_settings,
- R.string.global_action_settings) {
-
- @Override
- public void onPress() {
- Intent intent = new Intent(Settings.ACTION_SETTINGS);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mContext.startActivity(intent);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
- };
- }
-
- private Action getAssistAction() {
- return new SinglePressAction(R.drawable.ic_action_assist_focused,
- R.string.global_action_assist) {
- @Override
- public void onPress() {
- Intent intent = new Intent(Intent.ACTION_ASSIST);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mContext.startActivity(intent);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
- };
- }
-
- private Action getVoiceAssistAction() {
- return new SinglePressAction(R.drawable.ic_voice_search,
- R.string.global_action_voice_assist) {
- @Override
- public void onPress() {
- Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mContext.startActivity(intent);
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return true;
- }
- };
- }
-
- @VisibleForTesting
- class LockDownAction extends SinglePressAction {
- LockDownAction() {
- super(R.drawable.ic_lock_lockdown, R.string.global_action_lockdown);
- }
-
- @Override
- public void onPress() {
- mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
- UserHandle.USER_ALL);
- try {
- mIWindowManager.lockNow(null);
- // Lock profiles (if any) on the background thread.
- mBackgroundExecutor.execute(() -> lockProfiles());
- } catch (RemoteException e) {
- Log.e(TAG, "Error while trying to lock device.", e);
- }
- }
-
- @Override
- public boolean showDuringKeyguard() {
- return true;
- }
-
- @Override
- public boolean showBeforeProvisioning() {
- return false;
- }
- }
-
- private void lockProfiles() {
- final int currentUserId = getCurrentUser().id;
- final int[] profileIds = mUserManager.getEnabledProfileIds(currentUserId);
- for (final int id : profileIds) {
- if (id != currentUserId) {
- mTrustManager.setDeviceLockedForUser(id, true);
- }
- }
- }
-
- private UserInfo getCurrentUser() {
- try {
- return mIActivityManager.getCurrentUser();
- } catch (RemoteException re) {
- return null;
- }
- }
-
- /**
- * Non-thread-safe current user provider that caches the result - helpful when a method needs
- * to fetch it an indeterminate number of times.
- */
- private class CurrentUserProvider {
- private UserInfo mUserInfo = null;
- private boolean mFetched = false;
-
- @Nullable
- UserInfo get() {
- if (!mFetched) {
- mFetched = true;
- mUserInfo = getCurrentUser();
- }
- return mUserInfo;
- }
- }
-
- private void addUserActions(List<Action> actions, UserInfo currentUser) {
- if (mUserManager.isUserSwitcherEnabled()) {
- List<UserInfo> users = mUserManager.getUsers();
- for (final UserInfo user : users) {
- if (user.supportsSwitchToByUser()) {
- boolean isCurrentUser = currentUser == null
- ? user.id == 0 : (currentUser.id == user.id);
- Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath)
- : null;
- SinglePressAction switchToUser = new SinglePressAction(
- R.drawable.ic_menu_cc, icon,
- (user.name != null ? user.name : "Primary")
- + (isCurrentUser ? " \u2714" : "")) {
- public void onPress() {
- try {
- mIActivityManager.switchUser(user.id);
- } catch (RemoteException re) {
- Log.e(TAG, "Couldn't switch user " + re);
- }
- }
-
- public boolean showDuringKeyguard() {
- return true;
- }
-
- public boolean showBeforeProvisioning() {
- return false;
- }
- };
- addIfShouldShowAction(actions, switchToUser);
- }
- }
- }
- }
-
- private void prepareDialog() {
- refreshSilentMode();
- mAirplaneModeOn.updateState(mAirplaneState);
- mAdapter.notifyDataSetChanged();
- mLifecycle.setCurrentState(Lifecycle.State.RESUMED);
- }
-
- private void refreshSilentMode() {
- if (!mHasVibrator) {
- Integer value = mRingerModeTracker.getRingerMode().getValue();
- final boolean silentModeOn = value != null && value != AudioManager.RINGER_MODE_NORMAL;
- ((ToggleAction) mSilentModeAction).updateState(
- silentModeOn ? ToggleState.On : ToggleState.Off);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void onDismiss(DialogInterface dialog) {
- if (mDialog == dialog) {
- mDialog = null;
- }
- mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_CLOSE);
- mWindowManagerFuncs.onGlobalActionsHidden();
- mLifecycle.setCurrentState(Lifecycle.State.CREATED);
- }
-
- /**
- * {@inheritDoc}
- */
- public void onShow(DialogInterface dialog) {
- mMetricsLogger.visible(MetricsEvent.POWER_MENU);
- mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_OPEN);
- }
-
- /**
- * The adapter used for power menu items shown in the global actions dialog.
- */
- public class MyAdapter extends MultiListAdapter {
- private int countItems(boolean separated) {
- int count = 0;
- for (int i = 0; i < mItems.size(); i++) {
- final Action action = mItems.get(i);
-
- if (action.shouldBeSeparated() == separated) {
- count++;
- }
- }
- return count;
- }
-
- @Override
- public int countSeparatedItems() {
- return countItems(true);
- }
-
- @Override
- public int countListItems() {
- return countItems(false);
- }
-
- @Override
- public int getCount() {
- return countSeparatedItems() + countListItems();
- }
-
- @Override
- public boolean isEnabled(int position) {
- return getItem(position).isEnabled();
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public Action getItem(int position) {
- int filteredPos = 0;
- for (int i = 0; i < mItems.size(); i++) {
- final Action action = mItems.get(i);
- if (!shouldShowAction(action)) {
- continue;
- }
- if (filteredPos == position) {
- return action;
- }
- filteredPos++;
- }
-
- throw new IllegalArgumentException("position " + position
- + " out of range of showable actions"
- + ", filtered count=" + getCount()
- + ", keyguardshowing=" + mKeyguardShowing
- + ", provisioned=" + mDeviceProvisioned);
- }
-
-
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Action action = getItem(position);
- View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext));
- view.setOnClickListener(v -> onClickItem(position));
- if (action instanceof LongPressAction) {
- view.setOnLongClickListener(v -> onLongClickItem(position));
- }
- return view;
- }
-
- @Override
- public boolean onLongClickItem(int position) {
- final Action action = mAdapter.getItem(position);
- if (action instanceof LongPressAction) {
- if (mDialog != null) {
- mDialog.dismiss();
- } else {
- Log.w(TAG, "Action long-clicked while mDialog is null.");
- }
- return ((LongPressAction) action).onLongPress();
- }
- return false;
- }
-
- @Override
- public void onClickItem(int position) {
- Action item = mAdapter.getItem(position);
- if (!(item instanceof SilentModeTriStateAction)) {
- if (mDialog != null) {
- // don't dismiss the dialog if we're opening the power options menu
- if (!(item instanceof PowerOptionsAction)) {
- mDialog.dismiss();
- }
- } else {
- Log.w(TAG, "Action clicked while mDialog is null.");
- }
- item.onPress();
- }
- }
-
- @Override
- public boolean shouldBeSeparated(int position) {
- return getItem(position).shouldBeSeparated();
- }
- }
-
- /**
- * The adapter used for items in the overflow menu.
- */
- public class MyPowerOptionsAdapter extends BaseAdapter {
- @Override
- public int getCount() {
- return mPowerItems.size();
- }
-
- @Override
- public Action getItem(int position) {
- return mPowerItems.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Action action = getItem(position);
- if (action == null) {
- Log.w(TAG, "No power options action found at position: " + position);
- return null;
- }
- int viewLayoutResource = com.android.systemui.R.layout.global_actions_power_item;
- View view = convertView != null ? convertView
- : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
- view.setOnClickListener(v -> onClickItem(position));
- if (action instanceof LongPressAction) {
- view.setOnLongClickListener(v -> onLongClickItem(position));
- }
- ImageView icon = view.findViewById(R.id.icon);
- TextView messageView = view.findViewById(R.id.message);
- messageView.setSelected(true); // necessary for marquee to work
-
- icon.setImageDrawable(action.getIcon(mContext));
- icon.setScaleType(ScaleType.CENTER_CROP);
-
- if (action.getMessage() != null) {
- messageView.setText(action.getMessage());
- } else {
- messageView.setText(action.getMessageResId());
- }
- return view;
- }
-
- private boolean onLongClickItem(int position) {
- final Action action = getItem(position);
- if (action instanceof LongPressAction) {
- if (mDialog != null) {
- mDialog.dismiss();
- } else {
- Log.w(TAG, "Action long-clicked while mDialog is null.");
- }
- return ((LongPressAction) action).onLongPress();
- }
- return false;
- }
-
- private void onClickItem(int position) {
- Action item = getItem(position);
- if (!(item instanceof SilentModeTriStateAction)) {
- if (mDialog != null) {
- mDialog.dismiss();
- } else {
- Log.w(TAG, "Action clicked while mDialog is null.");
- }
- item.onPress();
- }
- }
- }
-
- /**
- * The adapter used for items in the power options menu, triggered by the PowerOptionsAction.
- */
- public class MyOverflowAdapter extends BaseAdapter {
- @Override
- public int getCount() {
- return mOverflowItems.size();
- }
-
- @Override
- public Action getItem(int position) {
- return mOverflowItems.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Action action = getItem(position);
- if (action == null) {
- Log.w(TAG, "No overflow action found at position: " + position);
- return null;
- }
- int viewLayoutResource = com.android.systemui.R.layout.controls_more_item;
- View view = convertView != null ? convertView
- : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
- TextView textView = (TextView) view;
- if (action.getMessageResId() != 0) {
- textView.setText(action.getMessageResId());
- } else {
- textView.setText(action.getMessage());
- }
- return textView;
- }
-
- private boolean onLongClickItem(int position) {
- final Action action = getItem(position);
- if (action instanceof LongPressAction) {
- if (mDialog != null) {
- mDialog.dismiss();
- } else {
- Log.w(TAG, "Action long-clicked while mDialog is null.");
- }
- return ((LongPressAction) action).onLongPress();
- }
- return false;
- }
-
- private void onClickItem(int position) {
- Action item = getItem(position);
- if (!(item instanceof SilentModeTriStateAction)) {
- if (mDialog != null) {
- mDialog.dismiss();
- } else {
- Log.w(TAG, "Action clicked while mDialog is null.");
- }
- item.onPress();
- }
- }
- }
-
- // note: the scheme below made more sense when we were planning on having
- // 8 different things in the global actions dialog. seems overkill with
- // only 3 items now, but may as well keep this flexible approach so it will
- // be easy should someone decide at the last minute to include something
- // else, such as 'enable wifi', or 'enable bluetooth'
-
- /**
- * What each item in the global actions dialog must be able to support.
- */
- public interface Action {
- /**
- * @return Text that will be announced when dialog is created. null for none.
- */
- CharSequence getLabelForAccessibility(Context context);
-
- View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater);
-
- void onPress();
-
- /**
- * @return whether this action should appear in the dialog when the keygaurd is showing.
- */
- boolean showDuringKeyguard();
-
- /**
- * @return whether this action should appear in the dialog before the
- * device is provisioned.f
- */
- boolean showBeforeProvisioning();
-
- boolean isEnabled();
-
- default boolean shouldBeSeparated() {
- return false;
- }
-
- /**
- * Return the id of the message associated with this action, or 0 if it doesn't have one.
- * @return
- */
- int getMessageResId();
-
- /**
- * Return the icon drawable for this action.
- */
- Drawable getIcon(Context context);
-
- /**
- * Return the message associated with this action, or null if it doesn't have one.
- * @return
- */
- CharSequence getMessage();
-
- default boolean shouldShow() {
- return true;
- }
- }
-
- /**
- * An action that also supports long press.
- */
- private interface LongPressAction extends Action {
- boolean onLongPress();
- }
-
- /**
- * A single press action maintains no state, just responds to a press and takes an action.
- */
-
- private abstract class SinglePressAction implements Action {
- private final int mIconResId;
- private final Drawable mIcon;
- private final int mMessageResId;
- private final CharSequence mMessage;
-
- protected SinglePressAction(int iconResId, int messageResId) {
- mIconResId = iconResId;
- mMessageResId = messageResId;
- mMessage = null;
- mIcon = null;
- }
-
- protected SinglePressAction(int iconResId, Drawable icon, CharSequence message) {
- mIconResId = iconResId;
- mMessageResId = 0;
- mMessage = message;
- mIcon = icon;
- }
-
- public boolean isEnabled() {
- return true;
- }
-
- public String getStatus() {
- return null;
- }
-
- abstract public void onPress();
-
- public CharSequence getLabelForAccessibility(Context context) {
- if (mMessage != null) {
- return mMessage;
- } else {
- return context.getString(mMessageResId);
- }
- }
-
- public int getMessageResId() {
- return mMessageResId;
- }
-
- public CharSequence getMessage() {
- return mMessage;
- }
-
- @Override
- public Drawable getIcon(Context context) {
- if (mIcon != null) {
- return mIcon;
- } else {
- return context.getDrawable(mIconResId);
- }
- }
-
- public View create(
- Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
- View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2,
- parent, false /* attach */);
-
- ImageView icon = v.findViewById(R.id.icon);
- TextView messageView = v.findViewById(R.id.message);
- messageView.setSelected(true); // necessary for marquee to work
-
- icon.setImageDrawable(getIcon(context));
- icon.setScaleType(ScaleType.CENTER_CROP);
-
- if (mMessage != null) {
- messageView.setText(mMessage);
- } else {
- messageView.setText(mMessageResId);
- }
-
- return v;
- }
- }
-
- private enum ToggleState {
- Off(false),
- TurningOn(true),
- TurningOff(true),
- On(false);
-
- private final boolean mInTransition;
-
- ToggleState(boolean intermediate) {
- mInTransition = intermediate;
- }
-
- public boolean inTransition() {
- return mInTransition;
- }
- }
-
- /**
- * A toggle action knows whether it is on or off, and displays an icon and status message
- * accordingly.
- */
- private abstract class ToggleAction implements Action {
-
- protected ToggleState mState = ToggleState.Off;
-
- // prefs
- protected int mEnabledIconResId;
- protected int mDisabledIconResid;
- protected int mMessageResId;
- protected int mEnabledStatusMessageResId;
- protected int mDisabledStatusMessageResId;
-
- /**
- * @param enabledIconResId The icon for when this action is on.
- * @param disabledIconResid The icon for when this action is off.
- * @param message The general information message, e.g 'Silent Mode'
- * @param enabledStatusMessageResId The on status message, e.g 'sound disabled'
- * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled'
- */
- public ToggleAction(int enabledIconResId,
- int disabledIconResid,
- int message,
- int enabledStatusMessageResId,
- int disabledStatusMessageResId) {
- mEnabledIconResId = enabledIconResId;
- mDisabledIconResid = disabledIconResid;
- mMessageResId = message;
- mEnabledStatusMessageResId = enabledStatusMessageResId;
- mDisabledStatusMessageResId = disabledStatusMessageResId;
- }
-
- /**
- * Override to make changes to resource IDs just before creating the View.
- */
- void willCreate() {
-
- }
-
- @Override
- public CharSequence getLabelForAccessibility(Context context) {
- return context.getString(mMessageResId);
- }
-
- private boolean isOn() {
- return mState == ToggleState.On || mState == ToggleState.TurningOn;
- }
-
- @Override
- public CharSequence getMessage() {
- return null;
- }
- @Override
- public int getMessageResId() {
- return isOn() ? mEnabledStatusMessageResId : mDisabledStatusMessageResId;
- }
-
- private int getIconResId() {
- return isOn() ? mEnabledIconResId : mDisabledIconResid;
- }
-
- @Override
- public Drawable getIcon(Context context) {
- return context.getDrawable(getIconResId());
- }
-
- public View create(Context context, View convertView, ViewGroup parent,
- LayoutInflater inflater) {
- willCreate();
-
- View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2,
- parent, false /* attach */);
-
- ImageView icon = (ImageView) v.findViewById(R.id.icon);
- TextView messageView = (TextView) v.findViewById(R.id.message);
- final boolean enabled = isEnabled();
-
- if (messageView != null) {
- messageView.setText(getMessageResId());
- messageView.setEnabled(enabled);
- messageView.setSelected(true); // necessary for marquee to work
- }
-
- if (icon != null) {
- icon.setImageDrawable(context.getDrawable(getIconResId()));
- icon.setEnabled(enabled);
- }
-
- v.setEnabled(enabled);
-
- return v;
- }
-
- public final void onPress() {
- if (mState.inTransition()) {
- Log.w(TAG, "shouldn't be able to toggle when in transition");
- return;
- }
-
- final boolean nowOn = !(mState == ToggleState.On);
- onToggle(nowOn);
- changeStateFromPress(nowOn);
- }
-
- public boolean isEnabled() {
- return !mState.inTransition();
- }
-
- /**
- * Implementations may override this if their state can be in on of the intermediate states
- * until some notification is received (e.g airplane mode is 'turning off' until we know the
- * wireless connections are back online
- *
- * @param buttonOn Whether the button was turned on or off
- */
- protected void changeStateFromPress(boolean buttonOn) {
- mState = buttonOn ? ToggleState.On : ToggleState.Off;
- }
-
- abstract void onToggle(boolean on);
-
- public void updateState(ToggleState state) {
- mState = state;
- }
- }
-
- private class AirplaneModeAction extends ToggleAction {
- AirplaneModeAction() {
- super(
- R.drawable.ic_lock_airplane_mode,
- R.drawable.ic_lock_airplane_mode_off,
- R.string.global_actions_toggle_airplane_mode,
- R.string.global_actions_airplane_mode_on_status,
- R.string.global_actions_airplane_mode_off_status);
- }
-
- void onToggle(boolean on) {
- if (mHasTelephony && TelephonyProperties.in_ecm_mode().orElse(false)) {
- mIsWaitingForEcmExit = true;
- // Launch ECM exit dialog
- Intent ecmDialogIntent =
- new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null);
- ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(ecmDialogIntent);
- } else {
- changeAirplaneModeSystemSetting(on);
- }
- }
-
- @Override
- protected void changeStateFromPress(boolean buttonOn) {
- if (!mHasTelephony) return;
-
- // In ECM mode airplane state cannot be changed
- if (!TelephonyProperties.in_ecm_mode().orElse(false)) {
- mState = buttonOn ? ToggleState.TurningOn : ToggleState.TurningOff;
- mAirplaneState = mState;
- }
- }
-
- public boolean showDuringKeyguard() {
- return true;
- }
-
- public boolean showBeforeProvisioning() {
- return false;
- }
- }
-
- private class SilentModeToggleAction extends ToggleAction {
- public SilentModeToggleAction() {
- super(R.drawable.ic_audio_vol_mute,
- R.drawable.ic_audio_vol,
- R.string.global_action_toggle_silent_mode,
- R.string.global_action_silent_mode_on_status,
- R.string.global_action_silent_mode_off_status);
- }
-
- void onToggle(boolean on) {
- if (on) {
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- } else {
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- }
- }
-
- public boolean showDuringKeyguard() {
- return true;
- }
-
- public boolean showBeforeProvisioning() {
- return false;
- }
- }
-
- private static class SilentModeTriStateAction implements Action, View.OnClickListener {
-
- private final int[] ITEM_IDS = {R.id.option1, R.id.option2, R.id.option3};
-
- private final AudioManager mAudioManager;
- private final Handler mHandler;
-
- SilentModeTriStateAction(AudioManager audioManager, Handler handler) {
- mAudioManager = audioManager;
- mHandler = handler;
- }
-
- private int ringerModeToIndex(int ringerMode) {
- // They just happen to coincide
- return ringerMode;
- }
-
- private int indexToRingerMode(int index) {
- // They just happen to coincide
- return index;
- }
-
- @Override
- public CharSequence getLabelForAccessibility(Context context) {
- return null;
- }
-
- @Override
- public int getMessageResId() {
- return 0;
- }
-
- @Override
- public CharSequence getMessage() {
- return null;
- }
-
- @Override
- public Drawable getIcon(Context context) {
- return null;
- }
-
-
- public View create(Context context, View convertView, ViewGroup parent,
- LayoutInflater inflater) {
- View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false);
-
- int selectedIndex = ringerModeToIndex(mAudioManager.getRingerMode());
- for (int i = 0; i < 3; i++) {
- View itemView = v.findViewById(ITEM_IDS[i]);
- itemView.setSelected(selectedIndex == i);
- // Set up click handler
- itemView.setTag(i);
- itemView.setOnClickListener(this);
- }
- return v;
- }
-
- public void onPress() {
- }
-
- public boolean showDuringKeyguard() {
- return true;
- }
-
- public boolean showBeforeProvisioning() {
- return false;
- }
-
- public boolean isEnabled() {
- return true;
- }
-
- void willCreate() {
- }
-
- public void onClick(View v) {
- if (!(v.getTag() instanceof Integer)) return;
-
- int index = (Integer) v.getTag();
- mAudioManager.setRingerMode(indexToRingerMode(index));
- mHandler.sendEmptyMessageDelayed(MESSAGE_DISMISS, DIALOG_DISMISS_DELAY);
- }
- }
-
- private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
- || Intent.ACTION_SCREEN_OFF.equals(action)) {
- String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
- if (!SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) {
- mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_DISMISS, reason));
- }
- } else if (TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(action)) {
- // Airplane mode can be changed after ECM exits if airplane toggle button
- // is pressed during ECM mode
- if (!(intent.getBooleanExtra(TelephonyManager.EXTRA_PHONE_IN_ECM_STATE, false))
- && mIsWaitingForEcmExit) {
- mIsWaitingForEcmExit = false;
- changeAirplaneModeSystemSetting(true);
- }
- }
- }
- };
-
- private final TelephonyCallback.ServiceStateListener mPhoneStateListener =
- new TelephonyCallback.ServiceStateListener() {
- @Override
- public void onServiceStateChanged(ServiceState serviceState) {
- if (!mHasTelephony) return;
- final boolean inAirplaneMode = serviceState.getState() == ServiceState.STATE_POWER_OFF;
- mAirplaneState = inAirplaneMode ? ToggleState.On : ToggleState.Off;
- mAirplaneModeOn.updateState(mAirplaneState);
- mAdapter.notifyDataSetChanged();
- mOverflowAdapter.notifyDataSetChanged();
- mPowerAdapter.notifyDataSetChanged();
- }
- };
-
- private ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) {
- @Override
- public void onChange(boolean selfChange) {
- onAirplaneModeChanged();
- }
- };
-
- private static final int MESSAGE_DISMISS = 0;
- private static final int MESSAGE_REFRESH = 1;
- private static final int DIALOG_DISMISS_DELAY = 300; // ms
- private static final int DIALOG_PRESS_DELAY = 850; // ms
-
- @VisibleForTesting void setZeroDialogPressDelayForTesting() {
- mDialogPressDelay = 0; // ms
- }
-
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_DISMISS:
- if (mDialog != null) {
- if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) {
- mDialog.completeDismiss();
- } else {
- mDialog.dismiss();
- }
- mDialog = null;
- }
- break;
- case MESSAGE_REFRESH:
- refreshSilentMode();
- mAdapter.notifyDataSetChanged();
- break;
- }
- }
- };
-
- private void onAirplaneModeChanged() {
- // Let the service state callbacks handle the state.
- if (mHasTelephony) return;
-
- boolean airplaneModeOn = Settings.Global.getInt(
- mContentResolver,
- Settings.Global.AIRPLANE_MODE_ON,
- 0) == 1;
- mAirplaneState = airplaneModeOn ? ToggleState.On : ToggleState.Off;
- mAirplaneModeOn.updateState(mAirplaneState);
- }
-
- /**
- * Change the airplane mode system setting
- */
- private void changeAirplaneModeSystemSetting(boolean on) {
- Settings.Global.putInt(
- mContentResolver,
- Settings.Global.AIRPLANE_MODE_ON,
- on ? 1 : 0);
- Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
- intent.putExtra("state", on);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- if (!mHasTelephony) {
- mAirplaneState = on ? ToggleState.On : ToggleState.Off;
- }
- }
-
- @NonNull
@Override
- public Lifecycle getLifecycle() {
- return mLifecycle;
+ protected int getEmergencyTextColor(Context context) {
+ return context.getResources().getColor(
+ com.android.systemui.R.color.global_actions_emergency_text);
+ }
+
+ @Override
+ protected int getEmergencyIconColor(Context context) {
+ return getContext().getResources().getColor(
+ com.android.systemui.R.color.global_actions_emergency_text);
+ }
+
+ @Override
+ protected int getEmergencyBackgroundColor(Context context) {
+ return getContext().getResources().getColor(
+ com.android.systemui.R.color.global_actions_emergency_background);
+ }
+
+ @Override
+ protected int getGridItemLayoutResource() {
+ return com.android.systemui.R.layout.global_actions_grid_item_v2;
}
@VisibleForTesting
- static final class ActionsDialog extends Dialog implements DialogInterface,
- ColorExtractor.OnColorsChangedListener {
+ static class ActionsDialog extends ActionsDialogLite {
- private final Context mContext;
- private final MyAdapter mAdapter;
- private final MyOverflowAdapter mOverflowAdapter;
- private final MyPowerOptionsAdapter mPowerOptionsAdapter;
- private final IStatusBarService mStatusBarService;
- private final IBinder mToken = new Binder();
- private MultiListLayout mGlobalActionsLayout;
- private Drawable mBackgroundDrawable;
- private final SysuiColorExtractor mColorExtractor;
private final Provider<GlobalActionsPanelPlugin.PanelViewController> mWalletFactory;
@Nullable private GlobalActionsPanelPlugin.PanelViewController mWalletViewController;
- private boolean mKeyguardShowing;
- private boolean mShowing;
- private float mScrimAlpha;
private ResetOrientationData mResetOrientationData;
- private final NotificationShadeWindowController mNotificationShadeWindowController;
- private final NotificationShadeDepthController mDepthController;
- private final SysUiState mSysUiState;
- private ListPopupWindow mOverflowPopup;
- private Dialog mPowerOptionsDialog;
- private final Runnable mOnRotateCallback;
private final boolean mControlsAvailable;
private ControlsUiController mControlsUiController;
private ViewGroup mControlsView;
- private ViewGroup mContainer;
@VisibleForTesting ViewGroup mLockMessageContainer;
private TextView mLockMessage;
@@ -2178,27 +422,16 @@
boolean controlsAvailable, @Nullable ControlsUiController controlsUiController,
SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing,
MyPowerOptionsAdapter powerAdapter) {
- super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
- mContext = context;
- mAdapter = adapter;
- mOverflowAdapter = overflowAdapter;
- mPowerOptionsAdapter = powerAdapter;
- mDepthController = depthController;
- mColorExtractor = sysuiColorExtractor;
- mStatusBarService = statusBarService;
- mNotificationShadeWindowController = notificationShadeWindowController;
+ super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions,
+ adapter, overflowAdapter, depthController, sysuiColorExtractor,
+ statusBarService, notificationShadeWindowController, sysuiState,
+ onRotateCallback, keyguardShowing, powerAdapter);
mControlsAvailable = controlsAvailable;
mControlsUiController = controlsUiController;
- mSysUiState = sysuiState;
- mOnRotateCallback = onRotateCallback;
- mKeyguardShowing = keyguardShowing;
mWalletFactory = walletFactory;
- // Window initialization
+ // Update window attributes
Window window = getWindow();
- window.requestFeature(Window.FEATURE_NO_TITLE);
- // Inflate the decor view, so the attributes below are not overwritten by the theme.
- window.getDecorView();
window.getAttributes().systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
@@ -2211,10 +444,7 @@
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
- window.getAttributes().setFitInsetsTypes(0 /* types */);
setTitle(R.string.global_actions);
-
initializeLayout();
}
@@ -2233,6 +463,9 @@
}
private void initializeWalletView() {
+ if (mWalletFactory == null) {
+ return;
+ }
mWalletViewController = mWalletFactory.get();
if (!isWalletViewAvailable()) {
return;
@@ -2313,132 +546,24 @@
}
}
- private ListPopupWindow createPowerOverflowPopup() {
- GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu(
- new ContextThemeWrapper(
- mContext,
- com.android.systemui.R.style.Control_ListPopupWindow
- ), false /* isDropDownMode */);
- popup.setOnItemClickListener(
- (parent, view, position, id) -> mOverflowAdapter.onClickItem(position));
- popup.setOnItemLongClickListener(
- (parent, view, position, id) -> mOverflowAdapter.onLongClickItem(position));
- View overflowButton =
- findViewById(com.android.systemui.R.id.global_actions_overflow_button);
- popup.setAnchorView(overflowButton);
- popup.setAdapter(mOverflowAdapter);
- return popup;
+ @Override
+ protected int getLayoutResource() {
+ return com.android.systemui.R.layout.global_actions_grid_v2;
}
- public void showPowerOptionsMenu() {
- mPowerOptionsDialog = GlobalActionsPowerDialog.create(mContext, mPowerOptionsAdapter);
- mPowerOptionsDialog.show();
- }
-
- private void showPowerOverflowMenu() {
- mOverflowPopup = createPowerOverflowPopup();
- mOverflowPopup.show();
- }
-
- private void initializeLayout() {
- setContentView(com.android.systemui.R.layout.global_actions_grid_v2);
- fixNavBarClipping();
+ @Override
+ protected void initializeLayout() {
+ super.initializeLayout();
mControlsView = findViewById(com.android.systemui.R.id.global_actions_controls);
- mGlobalActionsLayout = findViewById(com.android.systemui.R.id.global_actions_view);
- mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
- @Override
- public boolean dispatchPopulateAccessibilityEvent(
- View host, AccessibilityEvent event) {
- // Populate the title here, just as Activity does
- event.getText().add(mContext.getString(R.string.global_actions));
- return true;
- }
- });
- mGlobalActionsLayout.setRotationListener(this::onRotate);
- mGlobalActionsLayout.setAdapter(mAdapter);
- mContainer = findViewById(com.android.systemui.R.id.global_actions_container);
mLockMessageContainer = requireViewById(
com.android.systemui.R.id.global_actions_lock_message_container);
mLockMessage = requireViewById(com.android.systemui.R.id.global_actions_lock_message);
-
- View overflowButton = findViewById(
- com.android.systemui.R.id.global_actions_overflow_button);
- if (overflowButton != null) {
- if (mOverflowAdapter.getCount() > 0) {
- overflowButton.setOnClickListener((view) -> showPowerOverflowMenu());
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
- params.setMarginEnd(0);
- mGlobalActionsLayout.setLayoutParams(params);
- } else {
- overflowButton.setVisibility(View.GONE);
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
- params.setMarginEnd(mContext.getResources().getDimensionPixelSize(
- com.android.systemui.R.dimen.global_actions_side_margin));
- mGlobalActionsLayout.setLayoutParams(params);
- }
- }
-
initializeWalletView();
- if (mBackgroundDrawable == null) {
- mBackgroundDrawable = new ScrimDrawable();
- mScrimAlpha = 1.0f;
- }
getWindow().setBackgroundDrawable(mBackgroundDrawable);
}
- private void fixNavBarClipping() {
- ViewGroup content = findViewById(android.R.id.content);
- content.setClipChildren(false);
- content.setClipToPadding(false);
- ViewGroup contentParent = (ViewGroup) content.getParent();
- contentParent.setClipChildren(false);
- contentParent.setClipToPadding(false);
- }
-
@Override
- protected void onStart() {
- super.setCanceledOnTouchOutside(true);
- super.onStart();
- mGlobalActionsLayout.updateList();
-
- if (mBackgroundDrawable instanceof ScrimDrawable) {
- mColorExtractor.addOnColorsChangedListener(this);
- GradientColors colors = mColorExtractor.getNeutralColors();
- updateColors(colors, false /* animate */);
- }
- }
-
- /**
- * Updates background and system bars according to current GradientColors.
- *
- * @param colors Colors and hints to use.
- * @param animate Interpolates gradient if true, just sets otherwise.
- */
- private void updateColors(GradientColors colors, boolean animate) {
- if (!(mBackgroundDrawable instanceof ScrimDrawable)) {
- return;
- }
- ((ScrimDrawable) mBackgroundDrawable).setColor(Color.BLACK, animate);
- View decorView = getWindow().getDecorView();
- if (colors.supportsDarkText()) {
- decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
- View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
- } else {
- decorView.setSystemUiVisibility(0);
- }
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mColorExtractor.removeOnColorsChangedListener(this);
- }
-
- @Override
- public void show() {
- super.show();
+ protected void showDialog() {
mShowing = true;
mNotificationShadeWindowController.setRequestTopUi(true, TAG);
mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, true)
@@ -2482,42 +607,9 @@
}
@Override
- public void dismiss() {
- dismissWithAnimation(() -> {
- mContainer.setTranslationX(0);
- ObjectAnimator alphaAnimator =
- ObjectAnimator.ofFloat(mContainer, "alpha", 1f, 0f);
- alphaAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
- alphaAnimator.setDuration(233);
- alphaAnimator.addUpdateListener((animation) -> {
- float animatedValue = 1f - animation.getAnimatedFraction();
- int alpha = (int) (animatedValue * mScrimAlpha * 255);
- mBackgroundDrawable.setAlpha(alpha);
- mDepthController.updateGlobalDialogVisibility(animatedValue,
- mGlobalActionsLayout);
- });
-
- float xOffset = mGlobalActionsLayout.getAnimationOffsetX();
- ObjectAnimator xAnimator =
- ObjectAnimator.ofFloat(mContainer, "translationX", 0f, xOffset);
- xAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
- xAnimator.setDuration(350);
-
- AnimatorSet animatorSet = new AnimatorSet();
- animatorSet.playTogether(alphaAnimator, xAnimator);
- animatorSet.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- completeDismiss();
- }
- });
-
- animatorSet.start();
-
- // close first, as popup windows will not fade during the animation
- dismissOverflow(false);
- dismissPowerOptions(false);
- if (mControlsUiController != null) mControlsUiController.closeDialogs(false);
- });
+ protected void dismissInternal() {
+ super.dismissInternal();
+ if (mControlsUiController != null) mControlsUiController.closeDialogs(false);
}
private void dismissForControlsActivity() {
@@ -2527,26 +619,12 @@
});
}
- void dismissWithAnimation(Runnable animation) {
- if (!mShowing) {
- return;
- }
- mShowing = false;
- animation.run();
- }
-
- private void completeDismiss() {
- mShowing = false;
- resetOrientation();
+ @Override
+ protected void completeDismiss() {
dismissWallet();
- dismissOverflow(true);
- dismissPowerOptions(true);
if (mControlsUiController != null) mControlsUiController.hide();
- mNotificationShadeWindowController.setRequestTopUi(false, TAG);
- mDepthController.updateGlobalDialogVisibility(0, null /* view */);
- mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, false)
- .commitUpdate(mContext.getDisplayId());
- super.dismiss();
+ resetOrientation();
+ super.completeDismiss();
}
private void dismissWallet() {
@@ -2557,38 +635,6 @@
}
}
- private void dismissOverflow(boolean immediate) {
- if (mOverflowPopup != null) {
- if (immediate) {
- mOverflowPopup.dismissImmediate();
- } else {
- mOverflowPopup.dismiss();
- }
- }
- }
-
- private void dismissPowerOptions(boolean immediate) {
- if (mPowerOptionsDialog != null) {
- if (immediate) {
- mPowerOptionsDialog.dismiss();
- } else {
- mPowerOptionsDialog.dismiss();
- }
- }
- }
-
- private void setRotationSuggestionsEnabled(boolean enabled) {
- try {
- final int userId = Binder.getCallingUserHandle().getIdentifier();
- final int what = enabled
- ? StatusBarManager.DISABLE2_NONE
- : StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS;
- mStatusBarService.disable2ForUser(what, mToken, mContext.getPackageName(), userId);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
- }
-
private void resetOrientation() {
if (mResetOrientationData != null) {
RotationPolicy.setRotationLockAtAngle(mContext, mResetOrientationData.locked,
@@ -2598,49 +644,20 @@
}
@Override
- public void onColorsChanged(ColorExtractor extractor, int which) {
- if (mKeyguardShowing) {
- if ((WallpaperManager.FLAG_LOCK & which) != 0) {
- updateColors(extractor.getColors(WallpaperManager.FLAG_LOCK),
- true /* animate */);
- }
- } else {
- if ((WallpaperManager.FLAG_SYSTEM & which) != 0) {
- updateColors(extractor.getColors(WallpaperManager.FLAG_SYSTEM),
- true /* animate */);
- }
- }
- }
-
- public void setKeyguardShowing(boolean keyguardShowing) {
- mKeyguardShowing = keyguardShowing;
- }
-
public void refreshDialog() {
// ensure dropdown menus are dismissed before re-initializing the dialog
dismissWallet();
- dismissOverflow(true);
- dismissPowerOptions(true);
if (mControlsUiController != null) {
mControlsUiController.hide();
}
- // re-create dialog
- initializeLayout();
- mGlobalActionsLayout.updateList();
+ super.refreshDialog();
if (mControlsUiController != null) {
mControlsUiController.show(mControlsView, this::dismissForControlsActivity,
null /* activityContext */);
}
}
- public void onRotate(int from, int to) {
- if (mShowing) {
- mOnRotateCallback.run();
- refreshDialog();
- }
- }
-
void hideLockMessage() {
if (mLockMessageContainer.getVisibility() == View.VISIBLE) {
mLockMessageContainer.animate().alpha(0).setDuration(150).setListener(
@@ -2683,7 +700,7 @@
}
private boolean controlsAvailable() {
- return mDeviceProvisioned
+ return isDeviceProvisioned()
&& mControlsComponent.isEnabled()
&& !mControlsServiceInfos.isEmpty();
}
@@ -2703,7 +720,7 @@
}
private void onPowerMenuLockScreenSettingsChanged() {
- mShowLockScreenCardsAndControls = Settings.Secure.getInt(mContentResolver,
+ mShowLockScreenCardsAndControls = mSecureSettings.getInt(
Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT, 0) != 0;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
new file mode 100644
index 0000000..47ae145
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -0,0 +1,2391 @@
+/*
+ * Copyright 2021 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.globalactions;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
+import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;
+
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_GLOBAL_ACTIONS_SHOWING;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.Dialog;
+import android.app.IActivityManager;
+import android.app.StatusBarManager;
+import android.app.WallpaperManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.content.res.ColorStateList;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.service.dreams.IDreamManager;
+import android.sysprop.TelephonyProperties;
+import android.telecom.TelecomManager;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+import android.util.ArraySet;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.IWindowManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.colorextraction.ColorExtractor;
+import com.android.internal.colorextraction.ColorExtractor.GradientColors;
+import com.android.internal.colorextraction.drawable.ScrimDrawable;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.util.EmergencyAffordanceManager;
+import com.android.internal.util.ScreenshotHelper;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.Interpolators;
+import com.android.systemui.MultiListLayout;
+import com.android.systemui.MultiListLayout.MultiListAdapter;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.model.SysUiState;
+import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
+import com.android.systemui.plugins.GlobalActionsPanelPlugin;
+import com.android.systemui.statusbar.NotificationShadeDepthController;
+import com.android.systemui.statusbar.NotificationShadeWindowController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.EmergencyDialerConstants;
+import com.android.systemui.util.RingerModeTracker;
+import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.util.settings.SecureSettings;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+
+import javax.inject.Inject;
+
+/**
+ * Helper to show the global actions dialog. Each item is an {@link Action} that may show depending
+ * on whether the keyguard is showing, and whether the device is provisioned.
+ */
+public class GlobalActionsDialogLite implements DialogInterface.OnDismissListener,
+ DialogInterface.OnShowListener,
+ ConfigurationController.ConfigurationListener,
+ GlobalActionsPanelPlugin.Callbacks,
+ LifecycleOwner {
+
+ public static final String SYSTEM_DIALOG_REASON_KEY = "reason";
+ public static final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
+ public static final String SYSTEM_DIALOG_REASON_DREAM = "dream";
+
+ private static final String TAG = "GlobalActionsDialogLite";
+
+ private static final boolean SHOW_SILENT_TOGGLE = true;
+
+ /* Valid settings for global actions keys.
+ * see config.xml config_globalActionList */
+ @VisibleForTesting
+ static final String GLOBAL_ACTION_KEY_POWER = "power";
+ private static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
+ static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
+ private static final String GLOBAL_ACTION_KEY_SILENT = "silent";
+ private static final String GLOBAL_ACTION_KEY_USERS = "users";
+ private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
+ static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
+ private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
+ private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
+ static final String GLOBAL_ACTION_KEY_RESTART = "restart";
+ private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
+ static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
+ static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
+
+ private final Context mContext;
+ private final GlobalActionsManager mWindowManagerFuncs;
+ private final AudioManager mAudioManager;
+ private final IDreamManager mDreamManager;
+ private final DevicePolicyManager mDevicePolicyManager;
+ private final LockPatternUtils mLockPatternUtils;
+ private final KeyguardStateController mKeyguardStateController;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+ protected final GlobalSettings mGlobalSettings;
+ protected final SecureSettings mSecureSettings;
+ protected final Resources mResources;
+ private final ConfigurationController mConfigurationController;
+ private final UserManager mUserManager;
+ private final TrustManager mTrustManager;
+ private final IActivityManager mIActivityManager;
+ private final TelecomManager mTelecomManager;
+ private final MetricsLogger mMetricsLogger;
+ private final UiEventLogger mUiEventLogger;
+ private final NotificationShadeDepthController mDepthController;
+ private final SysUiState mSysUiState;
+
+ // Used for RingerModeTracker
+ private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
+
+ @VisibleForTesting
+ protected final ArrayList<Action> mItems = new ArrayList<>();
+ @VisibleForTesting
+ protected final ArrayList<Action> mOverflowItems = new ArrayList<>();
+ @VisibleForTesting
+ protected final ArrayList<Action> mPowerItems = new ArrayList<>();
+
+ @VisibleForTesting
+ protected ActionsDialogLite mDialog;
+
+ private Action mSilentModeAction;
+ private ToggleAction mAirplaneModeOn;
+
+ protected MyAdapter mAdapter;
+ protected MyOverflowAdapter mOverflowAdapter;
+ protected MyPowerOptionsAdapter mPowerAdapter;
+
+ private boolean mKeyguardShowing = false;
+ private boolean mDeviceProvisioned = false;
+ private ToggleState mAirplaneState = ToggleState.Off;
+ private boolean mIsWaitingForEcmExit = false;
+ private boolean mHasTelephony;
+ private boolean mHasVibrator;
+ private final boolean mShowSilentToggle;
+ private final EmergencyAffordanceManager mEmergencyAffordanceManager;
+ private final ScreenshotHelper mScreenshotHelper;
+ private final SysuiColorExtractor mSysuiColorExtractor;
+ private final IStatusBarService mStatusBarService;
+ protected final NotificationShadeWindowController mNotificationShadeWindowController;
+ private final IWindowManager mIWindowManager;
+ private final Executor mBackgroundExecutor;
+ private final RingerModeTracker mRingerModeTracker;
+ private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms
+ protected Handler mMainHandler;
+ private int mSmallestScreenWidthDp;
+
+ @VisibleForTesting
+ public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "The global actions / power menu surface became visible on the screen.")
+ GA_POWER_MENU_OPEN(337),
+
+ @UiEvent(doc = "The global actions / power menu surface was dismissed.")
+ GA_POWER_MENU_CLOSE(471),
+
+ @UiEvent(doc = "The global actions bugreport button was pressed.")
+ GA_BUGREPORT_PRESS(344),
+
+ @UiEvent(doc = "The global actions bugreport button was long pressed.")
+ GA_BUGREPORT_LONG_PRESS(345),
+
+ @UiEvent(doc = "The global actions emergency button was pressed.")
+ GA_EMERGENCY_DIALER_PRESS(346),
+
+ @UiEvent(doc = "The global actions screenshot button was pressed.")
+ GA_SCREENSHOT_PRESS(347),
+
+ @UiEvent(doc = "The global actions screenshot button was long pressed.")
+ GA_SCREENSHOT_LONG_PRESS(348);
+
+ private final int mId;
+
+ GlobalActionsEvent(int id) {
+ mId = id;
+ }
+
+ @Override
+ public int getId() {
+ return mId;
+ }
+ }
+
+ /**
+ * @param context everything needs a context :(
+ */
+ @Inject
+ public GlobalActionsDialogLite(Context context, GlobalActionsManager windowManagerFuncs,
+ AudioManager audioManager, IDreamManager iDreamManager,
+ DevicePolicyManager devicePolicyManager, LockPatternUtils lockPatternUtils,
+ BroadcastDispatcher broadcastDispatcher,
+ TelephonyListenerManager telephonyListenerManager,
+ GlobalSettings globalSettings, SecureSettings secureSettings,
+ @Nullable Vibrator vibrator, @Main Resources resources,
+ ConfigurationController configurationController,
+ KeyguardStateController keyguardStateController, UserManager userManager,
+ TrustManager trustManager, IActivityManager iActivityManager,
+ @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger,
+ NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor,
+ IStatusBarService statusBarService,
+ NotificationShadeWindowController notificationShadeWindowController,
+ IWindowManager iWindowManager,
+ @Background Executor backgroundExecutor,
+ UiEventLogger uiEventLogger,
+ RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) {
+ mContext = context;
+ mWindowManagerFuncs = windowManagerFuncs;
+ mAudioManager = audioManager;
+ mDreamManager = iDreamManager;
+ mDevicePolicyManager = devicePolicyManager;
+ mLockPatternUtils = lockPatternUtils;
+ mKeyguardStateController = keyguardStateController;
+ mBroadcastDispatcher = broadcastDispatcher;
+ mGlobalSettings = globalSettings;
+ mSecureSettings = secureSettings;
+ mResources = resources;
+ mConfigurationController = configurationController;
+ mUserManager = userManager;
+ mTrustManager = trustManager;
+ mIActivityManager = iActivityManager;
+ mTelecomManager = telecomManager;
+ mMetricsLogger = metricsLogger;
+ mUiEventLogger = uiEventLogger;
+ mDepthController = depthController;
+ mSysuiColorExtractor = colorExtractor;
+ mStatusBarService = statusBarService;
+ mNotificationShadeWindowController = notificationShadeWindowController;
+ mIWindowManager = iWindowManager;
+ mBackgroundExecutor = backgroundExecutor;
+ mRingerModeTracker = ringerModeTracker;
+ mSysUiState = sysUiState;
+ mMainHandler = handler;
+ mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp;
+
+ // receive broadcasts
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
+ mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
+
+ mHasTelephony =
+ context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+
+ // get notified of phone state changes
+ telephonyListenerManager.addServiceStateListener(mPhoneStateListener);
+ mGlobalSettings.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,
+ mAirplaneModeObserver);
+ mHasVibrator = vibrator != null && vibrator.hasVibrator();
+
+ mShowSilentToggle = SHOW_SILENT_TOGGLE && !resources.getBoolean(
+ R.bool.config_useFixedVolume);
+ if (mShowSilentToggle) {
+ mRingerModeTracker.getRingerMode().observe(this, ringer ->
+ mHandler.sendEmptyMessage(MESSAGE_REFRESH)
+ );
+ }
+
+ mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
+ mScreenshotHelper = new ScreenshotHelper(context);
+
+ mConfigurationController.addCallback(this);
+ }
+
+ protected Context getContext() {
+ return mContext;
+ }
+
+ /**
+ * Show the global actions dialog (creating if necessary)
+ *
+ * @param keyguardShowing True if keyguard is showing
+ */
+ public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned) {
+ mKeyguardShowing = keyguardShowing;
+ mDeviceProvisioned = isDeviceProvisioned;
+ if (mDialog != null && mDialog.isShowing()) {
+ // In order to force global actions to hide on the same affordance press, we must
+ // register a call to onGlobalActionsShown() first to prevent the default actions
+ // menu from showing. This will be followed by a subsequent call to
+ // onGlobalActionsHidden() on dismiss()
+ mWindowManagerFuncs.onGlobalActionsShown();
+ mDialog.dismiss();
+ mDialog = null;
+ } else {
+ handleShow();
+ }
+ }
+
+ protected boolean isKeyguardShowing() {
+ return mKeyguardShowing;
+ }
+
+ protected boolean isDeviceProvisioned() {
+ return mDeviceProvisioned;
+ }
+
+ /**
+ * Dismiss the global actions dialog, if it's currently shown
+ */
+ public void dismissDialog() {
+ mHandler.removeMessages(MESSAGE_DISMISS);
+ mHandler.sendEmptyMessage(MESSAGE_DISMISS);
+ }
+
+ protected void awakenIfNecessary() {
+ if (mDreamManager != null) {
+ try {
+ if (mDreamManager.isDreaming()) {
+ mDreamManager.awaken();
+ }
+ } catch (RemoteException e) {
+ // we tried
+ }
+ }
+ }
+
+ protected void handleShow() {
+ awakenIfNecessary();
+ mDialog = createDialog();
+ prepareDialog();
+
+ WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
+ attrs.setTitle("ActionsDialog");
+ attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+ mDialog.getWindow().setAttributes(attrs);
+ // Don't acquire soft keyboard focus, to avoid destroying state when capturing bugreports
+ mDialog.getWindow().setFlags(FLAG_ALT_FOCUSABLE_IM, FLAG_ALT_FOCUSABLE_IM);
+ mDialog.show();
+ mWindowManagerFuncs.onGlobalActionsShown();
+ }
+
+ @VisibleForTesting
+ protected boolean shouldShowAction(Action action) {
+ if (mKeyguardShowing && !action.showDuringKeyguard()) {
+ return false;
+ }
+ if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
+ return false;
+ }
+ return action.shouldShow();
+ }
+
+ /**
+ * Returns the maximum number of power menu items to show based on which GlobalActions
+ * layout is being used.
+ */
+ @VisibleForTesting
+ protected int getMaxShownPowerItems() {
+ return mResources.getInteger(com.android.systemui.R.integer.power_menu_lite_max_columns)
+ * mResources.getInteger(com.android.systemui.R.integer.power_menu_lite_max_rows);
+ }
+
+ /**
+ * Add a power menu action item for to either the main or overflow items lists, depending on
+ * whether controls are enabled and whether the max number of shown items has been reached.
+ */
+ private void addActionItem(Action action) {
+ if (mItems.size() < getMaxShownPowerItems()) {
+ mItems.add(action);
+ } else {
+ mOverflowItems.add(action);
+ }
+ }
+
+ @VisibleForTesting
+ protected String[] getDefaultActions() {
+ return mResources.getStringArray(R.array.config_globalActionsList);
+ }
+
+ private void addIfShouldShowAction(List<Action> actions, Action action) {
+ if (shouldShowAction(action)) {
+ actions.add(action);
+ }
+ }
+
+ @VisibleForTesting
+ protected void createActionItems() {
+ // Simple toggle style if there's no vibrator, otherwise use a tri-state
+ if (!mHasVibrator) {
+ mSilentModeAction = new SilentModeToggleAction();
+ } else {
+ mSilentModeAction = new SilentModeTriStateAction(mAudioManager, mHandler);
+ }
+ mAirplaneModeOn = new AirplaneModeAction();
+ onAirplaneModeChanged();
+
+ mItems.clear();
+ mOverflowItems.clear();
+ mPowerItems.clear();
+ String[] defaultActions = getDefaultActions();
+
+ ShutDownAction shutdownAction = new ShutDownAction();
+ RestartAction restartAction = new RestartAction();
+ ArraySet<String> addedKeys = new ArraySet<>();
+ List<Action> tempActions = new ArrayList<>();
+ CurrentUserProvider currentUser = new CurrentUserProvider();
+
+ // make sure emergency affordance action is first, if needed
+ if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
+ addIfShouldShowAction(tempActions, new EmergencyAffordanceAction());
+ addedKeys.add(GLOBAL_ACTION_KEY_EMERGENCY);
+ }
+
+ for (int i = 0; i < defaultActions.length; i++) {
+ String actionKey = defaultActions[i];
+ if (addedKeys.contains(actionKey)) {
+ // If we already have added this, don't add it again.
+ continue;
+ }
+ if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, shutdownAction);
+ } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, mAirplaneModeOn);
+ } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
+ if (shouldDisplayBugReport(currentUser.get())) {
+ addIfShouldShowAction(tempActions, new BugReportAction());
+ }
+ } else if (GLOBAL_ACTION_KEY_SILENT.equals(actionKey)) {
+ if (mShowSilentToggle) {
+ addIfShouldShowAction(tempActions, mSilentModeAction);
+ }
+ } else if (GLOBAL_ACTION_KEY_USERS.equals(actionKey)) {
+ if (SystemProperties.getBoolean("fw.power_user_switcher", false)) {
+ addUserActions(tempActions, currentUser.get());
+ }
+ } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, getSettingsAction());
+ } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
+ if (shouldDisplayLockdown(currentUser.get())) {
+ addIfShouldShowAction(tempActions, new LockDownAction());
+ }
+ } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, getVoiceAssistAction());
+ } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, getAssistAction());
+ } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, restartAction);
+ } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, new ScreenshotAction());
+ } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) {
+ if (mDevicePolicyManager.isLogoutEnabled()
+ && currentUser.get() != null
+ && currentUser.get().id != UserHandle.USER_SYSTEM) {
+ addIfShouldShowAction(tempActions, new LogoutAction());
+ }
+ } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
+ addIfShouldShowAction(tempActions, new EmergencyDialerAction());
+ } else {
+ Log.e(TAG, "Invalid global action key " + actionKey);
+ }
+ // Add here so we don't add more than one.
+ addedKeys.add(actionKey);
+ }
+
+ // replace power and restart with a single power options action, if needed
+ if (tempActions.contains(shutdownAction) && tempActions.contains(restartAction)
+ && tempActions.size() > getMaxShownPowerItems()) {
+ // transfer shutdown and restart to their own list of power actions
+ int powerOptionsIndex = Math.min(tempActions.indexOf(restartAction),
+ tempActions.indexOf(shutdownAction));
+ tempActions.remove(shutdownAction);
+ tempActions.remove(restartAction);
+ mPowerItems.add(shutdownAction);
+ mPowerItems.add(restartAction);
+
+ // add the PowerOptionsAction after Emergency, if present
+ tempActions.add(powerOptionsIndex, new PowerOptionsAction());
+ }
+ for (Action action : tempActions) {
+ addActionItem(action);
+ }
+ }
+
+ protected void onRotate() {
+ // re-allocate actions between main and overflow lists
+ this.createActionItems();
+ }
+
+ protected void initDialogItems() {
+ createActionItems();
+ mAdapter = new MyAdapter();
+ mOverflowAdapter = new MyOverflowAdapter();
+ mPowerAdapter = new MyPowerOptionsAdapter();
+ }
+
+ /**
+ * Create the global actions dialog.
+ *
+ * @return A new dialog.
+ */
+ protected ActionsDialogLite createDialog() {
+ initDialogItems();
+
+ mDepthController.setShowingHomeControls(false);
+ ActionsDialogLite dialog = new ActionsDialogLite(mContext,
+ com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
+ mAdapter, mOverflowAdapter,
+ mDepthController, mSysuiColorExtractor,
+ mStatusBarService, mNotificationShadeWindowController,
+ mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter);
+
+ dialog.setCanceledOnTouchOutside(true);
+ dialog.setOnDismissListener(this);
+ dialog.setOnShowListener(this);
+
+ return dialog;
+ }
+
+ @VisibleForTesting
+ boolean shouldDisplayLockdown(UserInfo user) {
+ if (user == null) {
+ return false;
+ }
+
+ int userId = user.id;
+
+ // No lockdown option if it's not turned on in Settings
+ if (mSecureSettings.getIntForUser(Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) == 0) {
+ return false;
+ }
+
+ // Lockdown is meaningless without a place to go.
+ if (!mKeyguardStateController.isMethodSecure()) {
+ return false;
+ }
+
+ // Only show the lockdown button if the device isn't locked down (for whatever reason).
+ int state = mLockPatternUtils.getStrongAuthForUser(userId);
+ return (state == STRONG_AUTH_NOT_REQUIRED
+ || state == SOME_AUTH_REQUIRED_AFTER_USER_REQUEST);
+ }
+
+ @VisibleForTesting
+ boolean shouldDisplayBugReport(UserInfo currentUser) {
+ return mGlobalSettings.getInt(Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0
+ && (currentUser == null || currentUser.isPrimary());
+ }
+
+ @Override
+ public void onUiModeChanged() {
+ mContext.getTheme().applyStyle(mContext.getThemeResId(), true);
+ if (mDialog != null && mDialog.isShowing()) {
+ mDialog.refreshDialog();
+ }
+ }
+
+ @Override
+ public void onConfigChanged(Configuration newConfig) {
+ if (mDialog != null && mDialog.isShowing()
+ && (newConfig.smallestScreenWidthDp != mSmallestScreenWidthDp)) {
+ mSmallestScreenWidthDp = newConfig.smallestScreenWidthDp;
+ mDialog.refreshDialog();
+ }
+ }
+
+ /**
+ * Clean up callbacks
+ */
+ public void destroy() {
+ mConfigurationController.removeCallback(this);
+ }
+
+ /**
+ * Implements {@link GlobalActionsPanelPlugin.Callbacks#dismissGlobalActionsMenu()}, which is
+ * called when the quick access wallet requests dismissal.
+ */
+ @Override
+ public void dismissGlobalActionsMenu() {
+ dismissDialog();
+ }
+
+ @VisibleForTesting
+ protected final class PowerOptionsAction extends SinglePressAction {
+ private PowerOptionsAction() {
+ super(com.android.systemui.R.drawable.ic_settings_power,
+ R.string.global_action_power_options);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+
+ @Override
+ public void onPress() {
+ if (mDialog != null) {
+ mDialog.showPowerOptionsMenu();
+ }
+ }
+ }
+
+ @VisibleForTesting
+ final class ShutDownAction extends SinglePressAction implements LongPressAction {
+ private ShutDownAction() {
+ super(R.drawable.ic_lock_power_off,
+ R.string.global_action_power_off);
+ }
+
+ @Override
+ public boolean onLongPress() {
+ if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) {
+ mWindowManagerFuncs.reboot(true);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+
+ @Override
+ public void onPress() {
+ // shutdown by making sure radio and power are handled accordingly.
+ mWindowManagerFuncs.shutdown();
+ }
+ }
+
+ @VisibleForTesting
+ protected abstract class EmergencyAction extends SinglePressAction {
+ EmergencyAction(int iconResId, int messageResId) {
+ super(iconResId, messageResId);
+ }
+
+ @Override
+ public boolean shouldBeSeparated() {
+ return false;
+ }
+
+ @Override
+ public View create(
+ Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
+ View v = super.create(context, convertView, parent, inflater);
+ int textColor = getEmergencyTextColor(context);
+ int iconColor = getEmergencyIconColor(context);
+ int backgroundColor = getEmergencyBackgroundColor(context);
+ TextView messageView = v.findViewById(R.id.message);
+ messageView.setTextColor(textColor);
+ messageView.setSelected(true); // necessary for marquee to work
+ ImageView icon = v.findViewById(R.id.icon);
+ icon.getDrawable().setTint(iconColor);
+ icon.setBackgroundTintList(ColorStateList.valueOf(backgroundColor));
+ v.setBackgroundTintList(ColorStateList.valueOf(backgroundColor));
+ return v;
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+ }
+
+ protected int getEmergencyTextColor(Context context) {
+ return context.getResources().getColor(
+ com.android.systemui.R.color.global_actions_lite_text);
+ }
+
+ protected int getEmergencyIconColor(Context context) {
+ return context.getResources().getColor(
+ com.android.systemui.R.color.global_actions_lite_emergency_icon);
+ }
+
+ protected int getEmergencyBackgroundColor(Context context) {
+ return context.getResources().getColor(
+ com.android.systemui.R.color.global_actions_lite_emergency_background);
+ }
+
+ private class EmergencyAffordanceAction extends EmergencyAction {
+ EmergencyAffordanceAction() {
+ super(R.drawable.emergency_icon,
+ R.string.global_action_emergency);
+ }
+
+ @Override
+ public void onPress() {
+ mEmergencyAffordanceManager.performEmergencyCall();
+ }
+ }
+
+ @VisibleForTesting
+ class EmergencyDialerAction extends EmergencyAction {
+ private EmergencyDialerAction() {
+ super(com.android.systemui.R.drawable.ic_emergency_star,
+ R.string.global_action_emergency);
+ }
+
+ @Override
+ public void onPress() {
+ mMetricsLogger.action(MetricsEvent.ACTION_EMERGENCY_DIALER_FROM_POWER_MENU);
+ mUiEventLogger.log(GlobalActionsEvent.GA_EMERGENCY_DIALER_PRESS);
+ if (mTelecomManager != null) {
+ Intent intent = mTelecomManager.createLaunchEmergencyDialerIntent(
+ null /* number */);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE,
+ EmergencyDialerConstants.ENTRY_TYPE_POWER_MENU);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ EmergencyDialerAction makeEmergencyDialerActionForTesting() {
+ return new EmergencyDialerAction();
+ }
+
+ @VisibleForTesting
+ final class RestartAction extends SinglePressAction implements LongPressAction {
+ private RestartAction() {
+ super(R.drawable.ic_restart, R.string.global_action_restart);
+ }
+
+ @Override
+ public boolean onLongPress() {
+ if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) {
+ mWindowManagerFuncs.reboot(true);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+
+ @Override
+ public void onPress() {
+ mWindowManagerFuncs.reboot(false);
+ }
+ }
+
+ @VisibleForTesting
+ class ScreenshotAction extends SinglePressAction {
+ ScreenshotAction() {
+ super(R.drawable.ic_screenshot, R.string.global_action_screenshot);
+ }
+
+ @Override
+ public void onPress() {
+ // Add a little delay before executing, to give the
+ // dialog a chance to go away before it takes a
+ // screenshot.
+ // TODO: instead, omit global action dialog layer
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, true, true,
+ SCREENSHOT_GLOBAL_ACTIONS, mHandler, null);
+ mMetricsLogger.action(MetricsEvent.ACTION_SCREENSHOT_POWER_MENU);
+ mUiEventLogger.log(GlobalActionsEvent.GA_SCREENSHOT_PRESS);
+ }
+ }, mDialogPressDelay);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldShow() {
+ // Include screenshot in power menu for legacy nav because it is not accessible
+ // through Recents in that mode
+ return is2ButtonNavigationEnabled();
+ }
+
+ boolean is2ButtonNavigationEnabled() {
+ return NAV_BAR_MODE_2BUTTON == mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_navBarInteractionMode);
+ }
+ }
+
+ @VisibleForTesting
+ ScreenshotAction makeScreenshotActionForTesting() {
+ return new ScreenshotAction();
+ }
+
+ @VisibleForTesting
+ class BugReportAction extends SinglePressAction implements LongPressAction {
+
+ BugReportAction() {
+ super(R.drawable.ic_lock_bugreport, R.string.bugreport_title);
+ }
+
+ @Override
+ public void onPress() {
+ // don't actually trigger the bugreport if we are running stability
+ // tests via monkey
+ if (ActivityManager.isUserAMonkey()) {
+ return;
+ }
+ // Add a little delay before executing, to give the
+ // dialog a chance to go away before it takes a
+ // screenshot.
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // Take an "interactive" bugreport.
+ mMetricsLogger.action(
+ MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_INTERACTIVE);
+ mUiEventLogger.log(GlobalActionsEvent.GA_BUGREPORT_PRESS);
+ if (!mIActivityManager.launchBugReportHandlerApp()) {
+ Log.w(TAG, "Bugreport handler could not be launched");
+ mIActivityManager.requestInteractiveBugReport();
+ }
+ } catch (RemoteException e) {
+ }
+ }
+ }, mDialogPressDelay);
+ }
+
+ @Override
+ public boolean onLongPress() {
+ // don't actually trigger the bugreport if we are running stability
+ // tests via monkey
+ if (ActivityManager.isUserAMonkey()) {
+ return false;
+ }
+ try {
+ // Take a "full" bugreport.
+ mMetricsLogger.action(MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_FULL);
+ mUiEventLogger.log(GlobalActionsEvent.GA_BUGREPORT_LONG_PRESS);
+ mIActivityManager.requestFullBugReport();
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+ }
+
+ @VisibleForTesting
+ BugReportAction makeBugReportActionForTesting() {
+ return new BugReportAction();
+ }
+
+ private final class LogoutAction extends SinglePressAction {
+ private LogoutAction() {
+ super(R.drawable.ic_logout, R.string.global_action_logout);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+
+ @Override
+ public void onPress() {
+ // Add a little delay before executing, to give the dialog a chance to go away before
+ // switching user
+ mHandler.postDelayed(() -> {
+ try {
+ int currentUserId = getCurrentUser().id;
+ mIActivityManager.switchUser(UserHandle.USER_SYSTEM);
+ mIActivityManager.stopUser(currentUserId, true /*force*/, null);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Couldn't logout user " + re);
+ }
+ }, mDialogPressDelay);
+ }
+ }
+
+ private Action getSettingsAction() {
+ return new SinglePressAction(R.drawable.ic_settings,
+ R.string.global_action_settings) {
+
+ @Override
+ public void onPress() {
+ Intent intent = new Intent(Settings.ACTION_SETTINGS);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivity(intent);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+ };
+ }
+
+ private Action getAssistAction() {
+ return new SinglePressAction(R.drawable.ic_action_assist_focused,
+ R.string.global_action_assist) {
+ @Override
+ public void onPress() {
+ Intent intent = new Intent(Intent.ACTION_ASSIST);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivity(intent);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+ };
+ }
+
+ private Action getVoiceAssistAction() {
+ return new SinglePressAction(R.drawable.ic_voice_search,
+ R.string.global_action_voice_assist) {
+ @Override
+ public void onPress() {
+ Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivity(intent);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+ };
+ }
+
+ @VisibleForTesting
+ class LockDownAction extends SinglePressAction {
+ LockDownAction() {
+ super(R.drawable.ic_lock_lockdown, R.string.global_action_lockdown);
+ }
+
+ @Override
+ public void onPress() {
+ mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
+ UserHandle.USER_ALL);
+ try {
+ mIWindowManager.lockNow(null);
+ // Lock profiles (if any) on the background thread.
+ mBackgroundExecutor.execute(() -> lockProfiles());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error while trying to lock device.", e);
+ }
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+ }
+
+ private void lockProfiles() {
+ final int currentUserId = getCurrentUser().id;
+ final int[] profileIds = mUserManager.getEnabledProfileIds(currentUserId);
+ for (final int id : profileIds) {
+ if (id != currentUserId) {
+ mTrustManager.setDeviceLockedForUser(id, true);
+ }
+ }
+ }
+
+ protected UserInfo getCurrentUser() {
+ try {
+ return mIActivityManager.getCurrentUser();
+ } catch (RemoteException re) {
+ return null;
+ }
+ }
+
+ /**
+ * Non-thread-safe current user provider that caches the result - helpful when a method needs
+ * to fetch it an indeterminate number of times.
+ */
+ private class CurrentUserProvider {
+ private UserInfo mUserInfo = null;
+ private boolean mFetched = false;
+
+ @Nullable
+ UserInfo get() {
+ if (!mFetched) {
+ mFetched = true;
+ mUserInfo = getCurrentUser();
+ }
+ return mUserInfo;
+ }
+ }
+
+ private void addUserActions(List<Action> actions, UserInfo currentUser) {
+ if (mUserManager.isUserSwitcherEnabled()) {
+ List<UserInfo> users = mUserManager.getUsers();
+ for (final UserInfo user : users) {
+ if (user.supportsSwitchToByUser()) {
+ boolean isCurrentUser = currentUser == null
+ ? user.id == 0 : (currentUser.id == user.id);
+ Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath)
+ : null;
+ SinglePressAction switchToUser = new SinglePressAction(
+ R.drawable.ic_menu_cc, icon,
+ (user.name != null ? user.name : "Primary")
+ + (isCurrentUser ? " \u2714" : "")) {
+ public void onPress() {
+ try {
+ mIActivityManager.switchUser(user.id);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Couldn't switch user " + re);
+ }
+ }
+
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+ };
+ addIfShouldShowAction(actions, switchToUser);
+ }
+ }
+ }
+ }
+
+ protected void prepareDialog() {
+ refreshSilentMode();
+ mAirplaneModeOn.updateState(mAirplaneState);
+ mAdapter.notifyDataSetChanged();
+ mLifecycle.setCurrentState(Lifecycle.State.RESUMED);
+ }
+
+ private void refreshSilentMode() {
+ if (!mHasVibrator) {
+ Integer value = mRingerModeTracker.getRingerMode().getValue();
+ final boolean silentModeOn = value != null && value != AudioManager.RINGER_MODE_NORMAL;
+ ((ToggleAction) mSilentModeAction).updateState(
+ silentModeOn ? ToggleState.On : ToggleState.Off);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ if (mDialog == dialog) {
+ mDialog = null;
+ }
+ mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_CLOSE);
+ mWindowManagerFuncs.onGlobalActionsHidden();
+ mLifecycle.setCurrentState(Lifecycle.State.CREATED);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onShow(DialogInterface dialog) {
+ mMetricsLogger.visible(MetricsEvent.POWER_MENU);
+ mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_OPEN);
+ }
+
+ /**
+ * The adapter used for power menu items shown in the global actions dialog.
+ */
+ public class MyAdapter extends MultiListAdapter {
+ private int countItems(boolean separated) {
+ int count = 0;
+ for (int i = 0; i < mItems.size(); i++) {
+ final Action action = mItems.get(i);
+
+ if (action.shouldBeSeparated() == separated) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ @Override
+ public int countSeparatedItems() {
+ return countItems(true);
+ }
+
+ @Override
+ public int countListItems() {
+ return countItems(false);
+ }
+
+ @Override
+ public int getCount() {
+ return countSeparatedItems() + countListItems();
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return getItem(position).isEnabled();
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ @Override
+ public Action getItem(int position) {
+ int filteredPos = 0;
+ for (int i = 0; i < mItems.size(); i++) {
+ final Action action = mItems.get(i);
+ if (!shouldShowAction(action)) {
+ continue;
+ }
+ if (filteredPos == position) {
+ return action;
+ }
+ filteredPos++;
+ }
+
+ throw new IllegalArgumentException("position " + position
+ + " out of range of showable actions"
+ + ", filtered count=" + getCount()
+ + ", keyguardshowing=" + mKeyguardShowing
+ + ", provisioned=" + mDeviceProvisioned);
+ }
+
+ /**
+ * Get the row ID for an item
+ * @param position The position of the item within the adapter's data set
+ * @return
+ */
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Action action = getItem(position);
+ View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext));
+ view.setOnClickListener(v -> onClickItem(position));
+ if (action instanceof LongPressAction) {
+ view.setOnLongClickListener(v -> onLongClickItem(position));
+ }
+ return view;
+ }
+
+ @Override
+ public boolean onLongClickItem(int position) {
+ final Action action = mAdapter.getItem(position);
+ if (action instanceof LongPressAction) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ } else {
+ Log.w(TAG, "Action long-clicked while mDialog is null.");
+ }
+ return ((LongPressAction) action).onLongPress();
+ }
+ return false;
+ }
+
+ @Override
+ public void onClickItem(int position) {
+ Action item = mAdapter.getItem(position);
+ if (!(item instanceof SilentModeTriStateAction)) {
+ if (mDialog != null) {
+ // don't dismiss the dialog if we're opening the power options menu
+ if (!(item instanceof PowerOptionsAction)) {
+ mDialog.dismiss();
+ }
+ } else {
+ Log.w(TAG, "Action clicked while mDialog is null.");
+ }
+ item.onPress();
+ }
+ }
+
+ @Override
+ public boolean shouldBeSeparated(int position) {
+ return getItem(position).shouldBeSeparated();
+ }
+ }
+
+ /**
+ * The adapter used for items in the overflow menu.
+ */
+ public class MyPowerOptionsAdapter extends BaseAdapter {
+ @Override
+ public int getCount() {
+ return mPowerItems.size();
+ }
+
+ @Override
+ public Action getItem(int position) {
+ return mPowerItems.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Action action = getItem(position);
+ if (action == null) {
+ Log.w(TAG, "No power options action found at position: " + position);
+ return null;
+ }
+ int viewLayoutResource = com.android.systemui.R.layout.global_actions_power_item;
+ View view = convertView != null ? convertView
+ : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
+ view.setOnClickListener(v -> onClickItem(position));
+ if (action instanceof LongPressAction) {
+ view.setOnLongClickListener(v -> onLongClickItem(position));
+ }
+ ImageView icon = view.findViewById(R.id.icon);
+ TextView messageView = view.findViewById(R.id.message);
+ messageView.setSelected(true); // necessary for marquee to work
+
+ icon.setImageDrawable(action.getIcon(mContext));
+ icon.setScaleType(ScaleType.CENTER_CROP);
+
+ if (action.getMessage() != null) {
+ messageView.setText(action.getMessage());
+ } else {
+ messageView.setText(action.getMessageResId());
+ }
+ return view;
+ }
+
+ private boolean onLongClickItem(int position) {
+ final Action action = getItem(position);
+ if (action instanceof LongPressAction) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ } else {
+ Log.w(TAG, "Action long-clicked while mDialog is null.");
+ }
+ return ((LongPressAction) action).onLongPress();
+ }
+ return false;
+ }
+
+ private void onClickItem(int position) {
+ Action item = getItem(position);
+ if (!(item instanceof SilentModeTriStateAction)) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ } else {
+ Log.w(TAG, "Action clicked while mDialog is null.");
+ }
+ item.onPress();
+ }
+ }
+ }
+
+ /**
+ * The adapter used for items in the power options menu, triggered by the PowerOptionsAction.
+ */
+ public class MyOverflowAdapter extends BaseAdapter {
+ @Override
+ public int getCount() {
+ return mOverflowItems.size();
+ }
+
+ @Override
+ public Action getItem(int position) {
+ return mOverflowItems.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Action action = getItem(position);
+ if (action == null) {
+ Log.w(TAG, "No overflow action found at position: " + position);
+ return null;
+ }
+ int viewLayoutResource = com.android.systemui.R.layout.controls_more_item;
+ View view = convertView != null ? convertView
+ : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
+ TextView textView = (TextView) view;
+ if (action.getMessageResId() != 0) {
+ textView.setText(action.getMessageResId());
+ } else {
+ textView.setText(action.getMessage());
+ }
+ return textView;
+ }
+
+ protected boolean onLongClickItem(int position) {
+ final Action action = getItem(position);
+ if (action instanceof LongPressAction) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ } else {
+ Log.w(TAG, "Action long-clicked while mDialog is null.");
+ }
+ return ((LongPressAction) action).onLongPress();
+ }
+ return false;
+ }
+
+ protected void onClickItem(int position) {
+ Action item = getItem(position);
+ if (!(item instanceof SilentModeTriStateAction)) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ } else {
+ Log.w(TAG, "Action clicked while mDialog is null.");
+ }
+ item.onPress();
+ }
+ }
+ }
+
+ // note: the scheme below made more sense when we were planning on having
+ // 8 different things in the global actions dialog. seems overkill with
+ // only 3 items now, but may as well keep this flexible approach so it will
+ // be easy should someone decide at the last minute to include something
+ // else, such as 'enable wifi', or 'enable bluetooth'
+
+ /**
+ * What each item in the global actions dialog must be able to support.
+ */
+ public interface Action {
+ /**
+ * @return Text that will be announced when dialog is created. null for none.
+ */
+ CharSequence getLabelForAccessibility(Context context);
+
+ /**
+ * Create the item's view
+ * @param context
+ * @param convertView
+ * @param parent
+ * @param inflater
+ * @return
+ */
+ View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater);
+
+ /**
+ * Handle a regular press
+ */
+ void onPress();
+
+ /**
+ * @return whether this action should appear in the dialog when the keygaurd is showing.
+ */
+ boolean showDuringKeyguard();
+
+ /**
+ * @return whether this action should appear in the dialog before the
+ * device is provisioned.f
+ */
+ boolean showBeforeProvisioning();
+
+ /**
+ * @return whether this action is enabled
+ */
+ boolean isEnabled();
+
+ /**
+ * @return whether this action should be in a separate section
+ */
+ default boolean shouldBeSeparated() {
+ return false;
+ }
+
+ /**
+ * Return the id of the message associated with this action, or 0 if it doesn't have one.
+ * @return
+ */
+ int getMessageResId();
+
+ /**
+ * Return the icon drawable for this action.
+ */
+ Drawable getIcon(Context context);
+
+ /**
+ * Return the message associated with this action, or null if it doesn't have one.
+ * @return
+ */
+ CharSequence getMessage();
+
+ /**
+ * @return whether the action should be visible
+ */
+ default boolean shouldShow() {
+ return true;
+ }
+ }
+
+ /**
+ * An action that also supports long press.
+ */
+ private interface LongPressAction extends Action {
+ boolean onLongPress();
+ }
+
+ /**
+ * A single press action maintains no state, just responds to a press and takes an action.
+ */
+
+ private abstract class SinglePressAction implements Action {
+ private final int mIconResId;
+ private final Drawable mIcon;
+ private final int mMessageResId;
+ private final CharSequence mMessage;
+
+ protected SinglePressAction(int iconResId, int messageResId) {
+ mIconResId = iconResId;
+ mMessageResId = messageResId;
+ mMessage = null;
+ mIcon = null;
+ }
+
+ protected SinglePressAction(int iconResId, Drawable icon, CharSequence message) {
+ mIconResId = iconResId;
+ mMessageResId = 0;
+ mMessage = message;
+ mIcon = icon;
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public String getStatus() {
+ return null;
+ }
+
+ public abstract void onPress();
+
+ public CharSequence getLabelForAccessibility(Context context) {
+ if (mMessage != null) {
+ return mMessage;
+ } else {
+ return context.getString(mMessageResId);
+ }
+ }
+
+ public int getMessageResId() {
+ return mMessageResId;
+ }
+
+ public CharSequence getMessage() {
+ return mMessage;
+ }
+
+ @Override
+ public Drawable getIcon(Context context) {
+ if (mIcon != null) {
+ return mIcon;
+ } else {
+ return context.getDrawable(mIconResId);
+ }
+ }
+
+ public View create(
+ Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
+ View v = inflater.inflate(getGridItemLayoutResource(), parent, false /* attach */);
+ // ConstraintLayout flow needs an ID to reference
+ v.setId(View.generateViewId());
+
+ ImageView icon = v.findViewById(R.id.icon);
+ TextView messageView = v.findViewById(R.id.message);
+ messageView.setSelected(true); // necessary for marquee to work
+
+ icon.setImageDrawable(getIcon(context));
+ icon.setScaleType(ScaleType.CENTER_CROP);
+
+ if (mMessage != null) {
+ messageView.setText(mMessage);
+ } else {
+ messageView.setText(mMessageResId);
+ }
+
+ return v;
+ }
+ }
+
+ protected int getGridItemLayoutResource() {
+ return com.android.systemui.R.layout.global_actions_grid_item_lite;
+ }
+
+ private enum ToggleState {
+ Off(false),
+ TurningOn(true),
+ TurningOff(true),
+ On(false);
+
+ private final boolean mInTransition;
+
+ ToggleState(boolean intermediate) {
+ mInTransition = intermediate;
+ }
+
+ public boolean inTransition() {
+ return mInTransition;
+ }
+ }
+
+ /**
+ * A toggle action knows whether it is on or off, and displays an icon and status message
+ * accordingly.
+ */
+ private abstract class ToggleAction implements Action {
+
+ protected ToggleState mState = ToggleState.Off;
+
+ // prefs
+ protected int mEnabledIconResId;
+ protected int mDisabledIconResid;
+ protected int mMessageResId;
+ protected int mEnabledStatusMessageResId;
+ protected int mDisabledStatusMessageResId;
+
+ /**
+ * @param enabledIconResId The icon for when this action is on.
+ * @param disabledIconResid The icon for when this action is off.
+ * @param message The general information message, e.g 'Silent Mode'
+ * @param enabledStatusMessageResId The on status message, e.g 'sound disabled'
+ * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled'
+ */
+ ToggleAction(int enabledIconResId,
+ int disabledIconResid,
+ int message,
+ int enabledStatusMessageResId,
+ int disabledStatusMessageResId) {
+ mEnabledIconResId = enabledIconResId;
+ mDisabledIconResid = disabledIconResid;
+ mMessageResId = message;
+ mEnabledStatusMessageResId = enabledStatusMessageResId;
+ mDisabledStatusMessageResId = disabledStatusMessageResId;
+ }
+
+ /**
+ * Override to make changes to resource IDs just before creating the View.
+ */
+ void willCreate() {
+
+ }
+
+ @Override
+ public CharSequence getLabelForAccessibility(Context context) {
+ return context.getString(mMessageResId);
+ }
+
+ private boolean isOn() {
+ return mState == ToggleState.On || mState == ToggleState.TurningOn;
+ }
+
+ @Override
+ public CharSequence getMessage() {
+ return null;
+ }
+ @Override
+ public int getMessageResId() {
+ return isOn() ? mEnabledStatusMessageResId : mDisabledStatusMessageResId;
+ }
+
+ private int getIconResId() {
+ return isOn() ? mEnabledIconResId : mDisabledIconResid;
+ }
+
+ @Override
+ public Drawable getIcon(Context context) {
+ return context.getDrawable(getIconResId());
+ }
+
+ public View create(Context context, View convertView, ViewGroup parent,
+ LayoutInflater inflater) {
+ willCreate();
+
+ View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2,
+ parent, false /* attach */);
+ ViewGroup.LayoutParams p = v.getLayoutParams();
+ p.width = WRAP_CONTENT;
+ v.setLayoutParams(p);
+
+ ImageView icon = (ImageView) v.findViewById(R.id.icon);
+ TextView messageView = (TextView) v.findViewById(R.id.message);
+ final boolean enabled = isEnabled();
+
+ if (messageView != null) {
+ messageView.setText(getMessageResId());
+ messageView.setEnabled(enabled);
+ messageView.setSelected(true); // necessary for marquee to work
+ }
+
+ if (icon != null) {
+ icon.setImageDrawable(context.getDrawable(getIconResId()));
+ icon.setEnabled(enabled);
+ }
+
+ v.setEnabled(enabled);
+
+ return v;
+ }
+
+ public final void onPress() {
+ if (mState.inTransition()) {
+ Log.w(TAG, "shouldn't be able to toggle when in transition");
+ return;
+ }
+
+ final boolean nowOn = !(mState == ToggleState.On);
+ onToggle(nowOn);
+ changeStateFromPress(nowOn);
+ }
+
+ public boolean isEnabled() {
+ return !mState.inTransition();
+ }
+
+ /**
+ * Implementations may override this if their state can be in on of the intermediate states
+ * until some notification is received (e.g airplane mode is 'turning off' until we know the
+ * wireless connections are back online
+ *
+ * @param buttonOn Whether the button was turned on or off
+ */
+ protected void changeStateFromPress(boolean buttonOn) {
+ mState = buttonOn ? ToggleState.On : ToggleState.Off;
+ }
+
+ abstract void onToggle(boolean on);
+
+ public void updateState(ToggleState state) {
+ mState = state;
+ }
+ }
+
+ private class AirplaneModeAction extends ToggleAction {
+ AirplaneModeAction() {
+ super(
+ R.drawable.ic_lock_airplane_mode,
+ R.drawable.ic_lock_airplane_mode_off,
+ R.string.global_actions_toggle_airplane_mode,
+ R.string.global_actions_airplane_mode_on_status,
+ R.string.global_actions_airplane_mode_off_status);
+ }
+
+ void onToggle(boolean on) {
+ if (mHasTelephony && TelephonyProperties.in_ecm_mode().orElse(false)) {
+ mIsWaitingForEcmExit = true;
+ // Launch ECM exit dialog
+ Intent ecmDialogIntent =
+ new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null);
+ ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(ecmDialogIntent);
+ } else {
+ changeAirplaneModeSystemSetting(on);
+ }
+ }
+
+ @Override
+ protected void changeStateFromPress(boolean buttonOn) {
+ if (!mHasTelephony) return;
+
+ // In ECM mode airplane state cannot be changed
+ if (!TelephonyProperties.in_ecm_mode().orElse(false)) {
+ mState = buttonOn ? ToggleState.TurningOn : ToggleState.TurningOff;
+ mAirplaneState = mState;
+ }
+ }
+
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+ }
+
+ private class SilentModeToggleAction extends ToggleAction {
+ SilentModeToggleAction() {
+ super(R.drawable.ic_audio_vol_mute,
+ R.drawable.ic_audio_vol,
+ R.string.global_action_toggle_silent_mode,
+ R.string.global_action_silent_mode_on_status,
+ R.string.global_action_silent_mode_off_status);
+ }
+
+ void onToggle(boolean on) {
+ if (on) {
+ mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+ } else {
+ mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+ }
+ }
+
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+ }
+
+ private static class SilentModeTriStateAction implements Action, View.OnClickListener {
+
+ private static final int[] ITEM_IDS = {R.id.option1, R.id.option2, R.id.option3};
+
+ private final AudioManager mAudioManager;
+ private final Handler mHandler;
+
+ SilentModeTriStateAction(AudioManager audioManager, Handler handler) {
+ mAudioManager = audioManager;
+ mHandler = handler;
+ }
+
+ private int ringerModeToIndex(int ringerMode) {
+ // They just happen to coincide
+ return ringerMode;
+ }
+
+ private int indexToRingerMode(int index) {
+ // They just happen to coincide
+ return index;
+ }
+
+ @Override
+ public CharSequence getLabelForAccessibility(Context context) {
+ return null;
+ }
+
+ @Override
+ public int getMessageResId() {
+ return 0;
+ }
+
+ @Override
+ public CharSequence getMessage() {
+ return null;
+ }
+
+ @Override
+ public Drawable getIcon(Context context) {
+ return null;
+ }
+
+
+ public View create(Context context, View convertView, ViewGroup parent,
+ LayoutInflater inflater) {
+ View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false);
+
+ int selectedIndex = ringerModeToIndex(mAudioManager.getRingerMode());
+ for (int i = 0; i < 3; i++) {
+ View itemView = v.findViewById(ITEM_IDS[i]);
+ itemView.setSelected(selectedIndex == i);
+ // Set up click handler
+ itemView.setTag(i);
+ itemView.setOnClickListener(this);
+ }
+ return v;
+ }
+
+ public void onPress() {
+ }
+
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ public boolean showBeforeProvisioning() {
+ return false;
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ void willCreate() {
+ }
+
+ public void onClick(View v) {
+ if (!(v.getTag() instanceof Integer)) return;
+
+ int index = (Integer) v.getTag();
+ mAudioManager.setRingerMode(indexToRingerMode(index));
+ mHandler.sendEmptyMessageDelayed(MESSAGE_DISMISS, DIALOG_DISMISS_DELAY);
+ }
+ }
+
+ private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
+ || Intent.ACTION_SCREEN_OFF.equals(action)) {
+ String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
+ if (!SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) {
+ mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_DISMISS, reason));
+ }
+ } else if (TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(action)) {
+ // Airplane mode can be changed after ECM exits if airplane toggle button
+ // is pressed during ECM mode
+ if (!(intent.getBooleanExtra(TelephonyManager.EXTRA_PHONE_IN_ECM_STATE, false))
+ && mIsWaitingForEcmExit) {
+ mIsWaitingForEcmExit = false;
+ changeAirplaneModeSystemSetting(true);
+ }
+ }
+ }
+ };
+
+ private final TelephonyCallback.ServiceStateListener mPhoneStateListener =
+ new TelephonyCallback.ServiceStateListener() {
+ @Override
+ public void onServiceStateChanged(ServiceState serviceState) {
+ if (!mHasTelephony) return;
+ if (mAirplaneModeOn == null) {
+ Log.d(TAG, "Service changed before actions created");
+ return;
+ }
+ final boolean inAirplaneMode = serviceState.getState() == ServiceState.STATE_POWER_OFF;
+ mAirplaneState = inAirplaneMode ? ToggleState.On : ToggleState.Off;
+ mAirplaneModeOn.updateState(mAirplaneState);
+ mAdapter.notifyDataSetChanged();
+ mOverflowAdapter.notifyDataSetChanged();
+ mPowerAdapter.notifyDataSetChanged();
+ }
+ };
+
+ private ContentObserver mAirplaneModeObserver = new ContentObserver(mMainHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ onAirplaneModeChanged();
+ }
+ };
+
+ private static final int MESSAGE_DISMISS = 0;
+ private static final int MESSAGE_REFRESH = 1;
+ private static final int DIALOG_DISMISS_DELAY = 300; // ms
+ private static final int DIALOG_PRESS_DELAY = 850; // ms
+
+ @VisibleForTesting void setZeroDialogPressDelayForTesting() {
+ mDialogPressDelay = 0; // ms
+ }
+
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_DISMISS:
+ if (mDialog != null) {
+ if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) {
+ mDialog.completeDismiss();
+ } else {
+ mDialog.dismiss();
+ }
+ mDialog = null;
+ }
+ break;
+ case MESSAGE_REFRESH:
+ refreshSilentMode();
+ mAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ };
+
+ private void onAirplaneModeChanged() {
+ // Let the service state callbacks handle the state.
+ if (mHasTelephony || mAirplaneModeOn == null) return;
+
+ boolean airplaneModeOn = mGlobalSettings.getInt(
+ Settings.Global.AIRPLANE_MODE_ON,
+ 0) == 1;
+ mAirplaneState = airplaneModeOn ? ToggleState.On : ToggleState.Off;
+ mAirplaneModeOn.updateState(mAirplaneState);
+ }
+
+ /**
+ * Change the airplane mode system setting
+ */
+ private void changeAirplaneModeSystemSetting(boolean on) {
+ mGlobalSettings.putInt(Settings.Global.AIRPLANE_MODE_ON, on ? 1 : 0);
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ intent.putExtra("state", on);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ if (!mHasTelephony) {
+ mAirplaneState = on ? ToggleState.On : ToggleState.Off;
+ }
+ }
+
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycle;
+ }
+
+ @VisibleForTesting
+ static class ActionsDialogLite extends Dialog implements DialogInterface,
+ ColorExtractor.OnColorsChangedListener {
+
+ protected final Context mContext;
+ protected MultiListLayout mGlobalActionsLayout;
+ protected final MyAdapter mAdapter;
+ protected final MyOverflowAdapter mOverflowAdapter;
+ protected final MyPowerOptionsAdapter mPowerOptionsAdapter;
+ protected final IStatusBarService mStatusBarService;
+ protected final IBinder mToken = new Binder();
+ protected Drawable mBackgroundDrawable;
+ protected final SysuiColorExtractor mColorExtractor;
+ private boolean mKeyguardShowing;
+ protected boolean mShowing;
+ protected float mScrimAlpha;
+ protected final NotificationShadeWindowController mNotificationShadeWindowController;
+ protected final NotificationShadeDepthController mDepthController;
+ protected final SysUiState mSysUiState;
+ private ListPopupWindow mOverflowPopup;
+ private Dialog mPowerOptionsDialog;
+ protected final Runnable mOnRotateCallback;
+
+ protected ViewGroup mContainer;
+
+ ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
+ MyOverflowAdapter overflowAdapter,
+ NotificationShadeDepthController depthController,
+ SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
+ NotificationShadeWindowController notificationShadeWindowController,
+ SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing,
+ MyPowerOptionsAdapter powerAdapter) {
+ super(context, themeRes);
+ mContext = context;
+ mAdapter = adapter;
+ mOverflowAdapter = overflowAdapter;
+ mPowerOptionsAdapter = powerAdapter;
+ mDepthController = depthController;
+ mColorExtractor = sysuiColorExtractor;
+ mStatusBarService = statusBarService;
+ mNotificationShadeWindowController = notificationShadeWindowController;
+ mSysUiState = sysuiState;
+ mOnRotateCallback = onRotateCallback;
+ mKeyguardShowing = keyguardShowing;
+
+ // Window initialization
+ Window window = getWindow();
+ window.requestFeature(Window.FEATURE_NO_TITLE);
+ // Inflate the decor view, so the attributes below are not overwritten by the theme.
+ window.getDecorView();
+ window.getAttributes().systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+ window.setLayout(MATCH_PARENT, WRAP_CONTENT);
+ window.addFlags(
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+ window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
+ window.getAttributes().setFitInsetsTypes(0 /* types */);
+ setTitle(R.string.global_actions);
+
+ initializeLayout();
+ }
+
+ private ListPopupWindow createPowerOverflowPopup() {
+ GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu(
+ new ContextThemeWrapper(
+ mContext,
+ com.android.systemui.R.style.Control_ListPopupWindow
+ ), false /* isDropDownMode */);
+ popup.setOnItemClickListener(
+ (parent, view, position, id) -> mOverflowAdapter.onClickItem(position));
+ popup.setOnItemLongClickListener(
+ (parent, view, position, id) -> mOverflowAdapter.onLongClickItem(position));
+ View overflowButton =
+ findViewById(com.android.systemui.R.id.global_actions_overflow_button);
+ popup.setAnchorView(overflowButton);
+ popup.setAdapter(mOverflowAdapter);
+ return popup;
+ }
+
+ public void showPowerOptionsMenu() {
+ mPowerOptionsDialog = GlobalActionsPowerDialog.create(mContext, mPowerOptionsAdapter);
+ mPowerOptionsDialog.show();
+ }
+
+ protected void showPowerOverflowMenu() {
+ mOverflowPopup = createPowerOverflowPopup();
+ mOverflowPopup.show();
+ }
+
+ protected int getLayoutResource() {
+ return com.android.systemui.R.layout.global_actions_grid_lite;
+ }
+
+ protected void initializeLayout() {
+ setContentView(getLayoutResource());
+ fixNavBarClipping();
+
+ mGlobalActionsLayout = findViewById(com.android.systemui.R.id.global_actions_view);
+ mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(
+ View host, AccessibilityEvent event) {
+ // Populate the title here, just as Activity does
+ event.getText().add(mContext.getString(R.string.global_actions));
+ return true;
+ }
+ });
+ mGlobalActionsLayout.setRotationListener(this::onRotate);
+ mGlobalActionsLayout.setAdapter(mAdapter);
+ mContainer = findViewById(com.android.systemui.R.id.global_actions_container);
+
+ View overflowButton = findViewById(
+ com.android.systemui.R.id.global_actions_overflow_button);
+ if (overflowButton != null) {
+ if (mOverflowAdapter.getCount() > 0) {
+ overflowButton.setOnClickListener((view) -> showPowerOverflowMenu());
+ LinearLayout.LayoutParams params =
+ (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
+ params.setMarginEnd(0);
+ mGlobalActionsLayout.setLayoutParams(params);
+ } else {
+ overflowButton.setVisibility(View.GONE);
+ LinearLayout.LayoutParams params =
+ (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
+ params.setMarginEnd(mContext.getResources().getDimensionPixelSize(
+ com.android.systemui.R.dimen.global_actions_side_margin));
+ mGlobalActionsLayout.setLayoutParams(params);
+ }
+ }
+
+ if (mBackgroundDrawable == null) {
+ mBackgroundDrawable = new ScrimDrawable();
+ mScrimAlpha = 1.0f;
+ }
+ }
+
+ protected void fixNavBarClipping() {
+ ViewGroup content = findViewById(android.R.id.content);
+ content.setClipChildren(false);
+ content.setClipToPadding(false);
+ ViewGroup contentParent = (ViewGroup) content.getParent();
+ contentParent.setClipChildren(false);
+ contentParent.setClipToPadding(false);
+ }
+
+ @Override
+ protected void onStart() {
+ super.setCanceledOnTouchOutside(true);
+ super.onStart();
+ mGlobalActionsLayout.updateList();
+
+ if (mBackgroundDrawable instanceof ScrimDrawable) {
+ mColorExtractor.addOnColorsChangedListener(this);
+ GradientColors colors = mColorExtractor.getNeutralColors();
+ updateColors(colors, false /* animate */);
+ }
+ }
+
+ /**
+ * Updates background and system bars according to current GradientColors.
+ *
+ * @param colors Colors and hints to use.
+ * @param animate Interpolates gradient if true, just sets otherwise.
+ */
+ private void updateColors(GradientColors colors, boolean animate) {
+ if (!(mBackgroundDrawable instanceof ScrimDrawable)) {
+ return;
+ }
+ ((ScrimDrawable) mBackgroundDrawable).setColor(Color.BLACK, animate);
+ View decorView = getWindow().getDecorView();
+ if (colors.supportsDarkText()) {
+ decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
+ | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ } else {
+ decorView.setSystemUiVisibility(0);
+ }
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mColorExtractor.removeOnColorsChangedListener(this);
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ // split this up so we can override but still call Dialog.show
+ showDialog();
+ }
+
+ protected void showDialog() {
+ mShowing = true;
+ mNotificationShadeWindowController.setRequestTopUi(true, TAG);
+ mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, true)
+ .commitUpdate(mContext.getDisplayId());
+
+ ViewGroup root = (ViewGroup) mGlobalActionsLayout.getRootView();
+ root.setOnApplyWindowInsetsListener((v, windowInsets) -> {
+ root.setPadding(windowInsets.getStableInsetLeft(),
+ windowInsets.getStableInsetTop(),
+ windowInsets.getStableInsetRight(),
+ windowInsets.getStableInsetBottom());
+ return WindowInsets.CONSUMED;
+ });
+
+ mBackgroundDrawable.setAlpha(0);
+ float xOffset = mGlobalActionsLayout.getAnimationOffsetX();
+ ObjectAnimator alphaAnimator =
+ ObjectAnimator.ofFloat(mContainer, "alpha", 0f, 1f);
+ alphaAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
+ alphaAnimator.setDuration(183);
+ alphaAnimator.addUpdateListener((animation) -> {
+ float animatedValue = animation.getAnimatedFraction();
+ int alpha = (int) (animatedValue * mScrimAlpha * 255);
+ mBackgroundDrawable.setAlpha(alpha);
+ mDepthController.updateGlobalDialogVisibility(animatedValue, mGlobalActionsLayout);
+ });
+
+ ObjectAnimator xAnimator =
+ ObjectAnimator.ofFloat(mContainer, "translationX", xOffset, 0f);
+ xAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
+ xAnimator.setDuration(350);
+
+ AnimatorSet animatorSet = new AnimatorSet();
+ animatorSet.playTogether(alphaAnimator, xAnimator);
+ animatorSet.start();
+ }
+
+ @Override
+ public void dismiss() {
+ dismissWithAnimation(() -> {
+ dismissInternal();
+ });
+ }
+
+ protected void dismissInternal() {
+ mContainer.setTranslationX(0);
+ ObjectAnimator alphaAnimator =
+ ObjectAnimator.ofFloat(mContainer, "alpha", 1f, 0f);
+ alphaAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
+ alphaAnimator.setDuration(233);
+ alphaAnimator.addUpdateListener((animation) -> {
+ float animatedValue = 1f - animation.getAnimatedFraction();
+ int alpha = (int) (animatedValue * mScrimAlpha * 255);
+ mBackgroundDrawable.setAlpha(alpha);
+ mDepthController.updateGlobalDialogVisibility(animatedValue, mGlobalActionsLayout);
+ });
+
+ float xOffset = mGlobalActionsLayout.getAnimationOffsetX();
+ ObjectAnimator xAnimator =
+ ObjectAnimator.ofFloat(mContainer, "translationX", 0f, xOffset);
+ xAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
+ xAnimator.setDuration(350);
+
+ AnimatorSet animatorSet = new AnimatorSet();
+ animatorSet.playTogether(alphaAnimator, xAnimator);
+ animatorSet.addListener(new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animation) {
+ completeDismiss();
+ }
+ });
+
+ animatorSet.start();
+
+ // close first, as popup windows will not fade during the animation
+ dismissOverflow(false);
+ dismissPowerOptions(false);
+ }
+
+ void dismissWithAnimation(Runnable animation) {
+ if (!mShowing) {
+ return;
+ }
+ mShowing = false;
+ animation.run();
+ }
+
+ protected void completeDismiss() {
+ mShowing = false;
+ dismissOverflow(true);
+ dismissPowerOptions(true);
+ mNotificationShadeWindowController.setRequestTopUi(false, TAG);
+ mDepthController.updateGlobalDialogVisibility(0, null /* view */);
+ mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, false)
+ .commitUpdate(mContext.getDisplayId());
+ super.dismiss();
+ }
+
+ protected final void dismissOverflow(boolean immediate) {
+ if (mOverflowPopup != null) {
+ if (immediate) {
+ mOverflowPopup.dismissImmediate();
+ } else {
+ mOverflowPopup.dismiss();
+ }
+ }
+ }
+
+ protected final void dismissPowerOptions(boolean immediate) {
+ if (mPowerOptionsDialog != null) {
+ if (immediate) {
+ mPowerOptionsDialog.dismiss();
+ } else {
+ mPowerOptionsDialog.dismiss();
+ }
+ }
+ }
+
+ protected final void setRotationSuggestionsEnabled(boolean enabled) {
+ try {
+ final int userId = Binder.getCallingUserHandle().getIdentifier();
+ final int what = enabled
+ ? StatusBarManager.DISABLE2_NONE
+ : StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS;
+ mStatusBarService.disable2ForUser(what, mToken, mContext.getPackageName(), userId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ @Override
+ public void onColorsChanged(ColorExtractor extractor, int which) {
+ if (mKeyguardShowing) {
+ if ((WallpaperManager.FLAG_LOCK & which) != 0) {
+ updateColors(extractor.getColors(WallpaperManager.FLAG_LOCK),
+ true /* animate */);
+ }
+ } else {
+ if ((WallpaperManager.FLAG_SYSTEM & which) != 0) {
+ updateColors(extractor.getColors(WallpaperManager.FLAG_SYSTEM),
+ true /* animate */);
+ }
+ }
+ }
+
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ mKeyguardShowing = keyguardShowing;
+ }
+
+ public void refreshDialog() {
+ // ensure dropdown menus are dismissed before re-initializing the dialog
+ dismissOverflow(true);
+ dismissPowerOptions(true);
+
+ // re-create dialog
+ initializeLayout();
+ mGlobalActionsLayout.updateList();
+ }
+
+ public void onRotate(int from, int to) {
+ if (mShowing) {
+ mOnRotateCallback.run();
+ refreshDialog();
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsLayoutLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsLayoutLite.java
new file mode 100644
index 0000000..eb4cd6b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsLayoutLite.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2021 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.globalactions;
+
+import static com.android.systemui.util.leak.RotationUtils.ROTATION_NONE;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.constraintlayout.helper.widget.Flow;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.HardwareBgDrawable;
+import com.android.systemui.R;
+
+/**
+ * ConstraintLayout implementation of the button layout created by the global actions dialog.
+ */
+public class GlobalActionsLayoutLite extends GlobalActionsLayout {
+ private final int mMaxColumns;
+ private final int mMaxRows;
+
+ public GlobalActionsLayoutLite(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mMaxColumns = getResources().getInteger(
+ com.android.systemui.R.integer.power_menu_lite_max_columns);
+ mMaxRows = getResources().getInteger(
+ com.android.systemui.R.integer.power_menu_lite_max_rows);
+ }
+
+ @VisibleForTesting
+ @Override
+ protected boolean shouldReverseListItems() {
+ // Handled in XML
+ return false;
+ }
+
+ @Override
+ protected HardwareBgDrawable getBackgroundDrawable(int backgroundColor) {
+ return null;
+ }
+
+ @Override
+ public void onUpdateList() {
+ super.onUpdateList();
+ int nElementsWrap = (getCurrentRotation() == ROTATION_NONE) ? mMaxColumns : mMaxRows;
+ int nChildren = getListView().getChildCount() - 1; // don't count flow element
+ if (getCurrentRotation() != ROTATION_NONE && nChildren > mMaxRows) {
+ // up to 4 elements can fit in a row in landscape, otherwise limit for balance
+ nElementsWrap -= 1;
+ }
+ Flow flow = findViewById(R.id.list_flow);
+ flow.setMaxElementsWrap(nElementsWrap);
+ }
+
+ @Override
+ protected void addToListView(View v, boolean reverse) {
+ super.addToListView(v, reverse);
+ Flow flow = findViewById(R.id.list_flow);
+ flow.addView(v);
+ }
+
+ @Override
+ protected void removeAllListViews() {
+ View flow = findViewById(R.id.list_flow);
+ super.removeAllListViews();
+
+ // Add flow element back after clearing the list view
+ super.addToListView(flow, false);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ boolean anyTruncated = false;
+ ViewGroup listView = getListView();
+
+ // Check to see if any of the GlobalActionsItems have had their messages truncated
+ for (int i = 0; i < listView.getChildCount(); i++) {
+ View child = listView.getChildAt(i);
+ if (child instanceof GlobalActionsItem) {
+ GlobalActionsItem item = (GlobalActionsItem) child;
+ anyTruncated = anyTruncated || item.isTruncated();
+ }
+ }
+ // If any of the items have been truncated, set the all to single-line marquee
+ if (anyTruncated) {
+ for (int i = 0; i < listView.getChildCount(); i++) {
+ View child = listView.getChildAt(i);
+ if (child instanceof GlobalActionsItem) {
+ GlobalActionsItem item = (GlobalActionsItem) child;
+ item.setMarquee(true);
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ protected float getGridItemSize() {
+ return getContext().getResources().getDimension(R.dimen.global_actions_grid_item_height);
+ }
+
+ @VisibleForTesting
+ protected float getAnimationDistance() {
+ return getGridItemSize() / 2;
+ }
+
+ @Override
+ public float getAnimationOffsetX() {
+ return getAnimationDistance();
+ }
+
+ @Override
+ public float getAnimationOffsetY() {
+ return 0f;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 743ac86..d3ae932 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -16,6 +16,7 @@
package com.android.systemui.media;
+import static android.app.Notification.safeCharSequence;
import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS;
import android.app.PendingIntent;
@@ -266,7 +267,7 @@
// Song name
TextView titleText = mViewHolder.getTitleText();
- titleText.setText(data.getSong());
+ titleText.setText(safeCharSequence(data.getSong()));
// App title
TextView appName = mViewHolder.getAppName();
@@ -277,7 +278,7 @@
// Artist name
TextView artistText = mViewHolder.getArtistText();
- artistText.setText(data.getArtist());
+ artistText.setText(safeCharSequence(data.getArtist()));
// Transfer chip
mViewHolder.getSeamless().setVisibility(View.VISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java
index 531ccb4..9ea9383 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java
@@ -436,6 +436,9 @@
@Override
public void abortCurrentGesture() {
Log.d("b/63783866", "KeyButtonView.abortCurrentGesture");
+ if (mCode != KeyEvent.KEYCODE_UNKNOWN) {
+ sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_CANCELED);
+ }
setPressed(false);
mRipple.abortDelayedRipple();
mGestureAborted = true;
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index ba41d33..02c12f6 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -19,6 +19,9 @@
import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID;
import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID;
+import static com.android.systemui.people.PeopleTileViewHelper.getPersonIconBitmap;
+import static com.android.systemui.people.PeopleTileViewHelper.getSizeInDp;
+
import android.app.Activity;
import android.app.INotificationManager;
import android.app.people.IPeopleManager;
@@ -149,11 +152,11 @@
/** Sets {@code tileView} with the data in {@code conversation}. */
private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile) {
try {
- String pkg = tile.getPackageName();
-
tileView.setName(tile.getUserName().toString());
- tileView.setPackageIcon(mPackageManager.getApplicationIcon(pkg));
- tileView.setPersonIcon(tile.getUserIcon());
+ tileView.setPersonIcon(getPersonIconBitmap(mContext, tile,
+ getSizeInDp(mContext, R.dimen.avatar_size_for_medium,
+ mContext.getResources().getDisplayMetrics().density)));
+
tileView.setOnClickListener(v -> storeWidgetConfiguration(tile));
} catch (Exception e) {
Log.e(TAG, "Couldn't retrieve shortcut information", e);
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
index e30ad80..36b435b0 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
@@ -19,8 +19,7 @@
import android.app.people.PeopleSpaceTile;
import android.content.Context;
import android.content.pm.LauncherApps;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
+import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -37,7 +36,6 @@
private View mTileView;
private TextView mNameView;
- private ImageView mPackageIconView;
private ImageView mPersonIconView;
public PeopleSpaceTileView(Context context, ViewGroup view, String shortcutId, boolean isLast) {
@@ -56,7 +54,6 @@
}
}
mNameView = mTileView.findViewById(R.id.tile_view_name);
- mPackageIconView = mTileView.findViewById(R.id.tile_view_package_icon);
mPersonIconView = mTileView.findViewById(R.id.tile_view_person_icon);
}
@@ -65,14 +62,9 @@
mNameView.setText(name);
}
- /** Sets the package drawable on the tile. */
- public void setPackageIcon(Drawable drawable) {
- mPackageIconView.setImageDrawable(drawable);
- }
-
- /** Sets the person bitmap on the tile. */
- public void setPersonIcon(Icon icon) {
- mPersonIconView.setImageIcon(icon);
+ /** Sets the person and package drawable on the tile. */
+ public void setPersonIcon(Bitmap bitmap) {
+ mPersonIconView.setImageBitmap(bitmap);
}
/** Sets the click listener of the tile. */
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index 8d1b712..96fbe69 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -192,7 +192,11 @@
}
private int getSizeInDp(int dimenResourceId) {
- return (int) (mContext.getResources().getDimension(dimenResourceId) / mDensity);
+ return getSizeInDp(mContext, dimenResourceId, mDensity);
+ }
+
+ public static int getSizeInDp(Context context, int dimenResourceId, float density) {
+ return (int) (context.getResources().getDimension(dimenResourceId) / density);
}
private int getContentHeightForLayout(int lineHeight) {
@@ -278,24 +282,11 @@
} else {
views.setViewVisibility(R.id.availability, View.GONE);
}
- boolean hasNewStory =
- mTile.getStatuses() != null && mTile.getStatuses().stream().anyMatch(
- c -> c.getActivity() == ACTIVITY_NEW_STORY);
+
views.setTextViewText(R.id.name, mTile.getUserName().toString());
views.setBoolean(R.id.image, "setClipToOutline", true);
-
- Icon icon = mTile.getUserIcon();
- PeopleStoryIconFactory storyIcon = new PeopleStoryIconFactory(mContext,
- mContext.getPackageManager(),
- IconDrawableFactory.newInstance(mContext, false),
- maxAvatarSize);
- Drawable drawable = icon.loadDrawable(mContext);
- Drawable personDrawable = storyIcon.getPeopleTileDrawable(drawable,
- mTile.getPackageName(), getUserId(mTile), mTile.isImportantConversation(),
- hasNewStory);
- Bitmap bitmap = convertDrawableToBitmap(personDrawable);
- views.setImageViewBitmap(R.id.person_icon, bitmap);
-
+ views.setImageViewBitmap(R.id.person_icon,
+ getPersonIconBitmap(mContext, mTile, maxAvatarSize));
return views;
} catch (Exception e) {
Log.e(TAG, "Failed to set common fields: " + e);
@@ -583,4 +574,23 @@
return R.layout.people_tile_small;
}
}
+
+ /** Returns a bitmap with the user icon and package icon. */
+ public static Bitmap getPersonIconBitmap(
+ Context context, PeopleSpaceTile tile, int maxAvatarSize) {
+ boolean hasNewStory =
+ tile.getStatuses() != null && tile.getStatuses().stream().anyMatch(
+ c -> c.getActivity() == ACTIVITY_NEW_STORY);
+
+ Icon icon = tile.getUserIcon();
+ PeopleStoryIconFactory storyIcon = new PeopleStoryIconFactory(context,
+ context.getPackageManager(),
+ IconDrawableFactory.newInstance(context, false),
+ maxAvatarSize);
+ Drawable drawable = icon.loadDrawable(context);
+ Drawable personDrawable = storyIcon.getPeopleTileDrawable(drawable,
+ tile.getPackageName(), getUserId(tile), tile.isImportantConversation(),
+ hasNewStory);
+ return convertDrawableToBitmap(personDrawable);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index d54d3f2..9a889e0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -210,6 +210,7 @@
mDetailAdapter = adapter;
listener = mHideGridContentWhenDone;
setVisibility(View.VISIBLE);
+ updateDetailText();
} else {
if (wasShowingDetail) {
Dependency.get(MetricsLogger.class).hidden(mDetailAdapter.getMetricsCategory());
@@ -223,7 +224,6 @@
mQsPanelController.setGridContentVisibility(true);
mQsPanelCallback.onScanStateChanged(false);
}
- updateDetailText();
sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
if (mShouldAnimate) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
index 3d8784b..eb7b115 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
@@ -75,6 +75,8 @@
private TouchAnimator mSettingsCogAnimator;
private View mActionsContainer;
+ private View mTunerIcon;
+ private int mTunerIconTranslation;
private OnClickListener mExpandClickListener;
@@ -107,6 +109,7 @@
mActionsContainer = requireViewById(R.id.qs_footer_actions_container);
mEditContainer = findViewById(R.id.qs_footer_actions_edit_container);
mBuildText = findViewById(R.id.build);
+ mTunerIcon = requireViewById(R.id.tuner_icon);
// RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view
@@ -166,6 +169,9 @@
private void updateResources() {
updateFooterAnimator();
+ mTunerIconTranslation = mContext.getResources()
+ .getDimensionPixelOffset(R.dimen.qs_footer_tuner_icon_translation);
+ mTunerIcon.setTranslationX(isLayoutRtl() ? -mTunerIconTranslation : mTunerIconTranslation);
}
private void updateFooterAnimator() {
@@ -274,8 +280,7 @@
private void updateVisibilities(boolean isTunerEnabled) {
mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
- mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
- isTunerEnabled ? View.VISIBLE : View.INVISIBLE);
+ mTunerIcon.setVisibility(isTunerEnabled ? View.VISIBLE : View.INVISIBLE);
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE);
if (mEditContainer != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
index f1f4e16..52e05a4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
@@ -32,6 +32,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
+import com.android.systemui.globalactions.GlobalActionsDialogLite;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.settings.UserTracker;
@@ -68,6 +69,7 @@
private final PageIndicator mPageIndicator;
private final View mPowerMenuLite;
private final boolean mShowPMLiteButton;
+ private GlobalActionsDialogLite mGlobalActionsDialog;
private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =
new UserInfoController.OnUserInfoChangedListener() {
@@ -115,6 +117,8 @@
} else {
startSettingsActivity();
}
+ } else if (v == mPowerMenuLite) {
+ mGlobalActionsDialog.showOrHideDialog(false, true);
}
}
};
@@ -129,7 +133,8 @@
QSPanelController qsPanelController, QSDetailDisplayer qsDetailDisplayer,
QuickQSPanelController quickQSPanelController,
TunerService tunerService, MetricsLogger metricsLogger,
- @Named(PM_LITE_ENABLED) boolean showPMLiteButton) {
+ @Named(PM_LITE_ENABLED) boolean showPMLiteButton,
+ GlobalActionsDialogLite globalActionsDialog) {
super(view);
mUserManager = userManager;
mUserInfoController = userInfoController;
@@ -149,11 +154,15 @@
mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
mPowerMenuLite = mView.findViewById(R.id.pm_lite);
mShowPMLiteButton = showPMLiteButton;
+ mGlobalActionsDialog = globalActionsDialog;
}
@Override
protected void onViewAttached() {
- if (!mShowPMLiteButton) {
+ if (mShowPMLiteButton) {
+ mPowerMenuLite.setVisibility(View.VISIBLE);
+ mPowerMenuLite.setOnClickListener(mSettingsOnClickListener);
+ } else {
mPowerMenuLite.setVisibility(View.GONE);
}
mView.addOnLayoutChangeListener(
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 94b99c3..cb58eff 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -132,7 +132,8 @@
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
Bundle savedInstanceState) {
inflater = mInjectionInflater.injectable(
- inflater.cloneInContext(new ContextThemeWrapper(getContext(), R.style.qs_theme)));
+ inflater.cloneInContext(new ContextThemeWrapper(getContext(),
+ R.style.Theme_SystemUI_QuickSettings)));
return inflater.inflate(R.layout.qs_panel, container, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 86836f9..e41a038 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -202,11 +202,10 @@
private void addTile(final QSTile tile, boolean collapsedView) {
final TileRecord r = new TileRecord();
r.tile = tile;
- r.tileView = mHost.createTileView(tile, collapsedView);
+ r.tileView = mHost.createTileView(getContext(), tile, collapsedView);
mView.addTile(r);
mRecords.add(r);
mCachedSpecs = getTilesSpecs();
-
}
/** */
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 0a9c12f..faac196 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -423,9 +423,15 @@
return null;
}
- public QSTileView createTileView(QSTile tile, boolean collapsedView) {
+ /**
+ * Create a view for a tile, iterating over all possible {@link QSFactory}.
+ *
+ * @see QSFactory#createTileView
+ */
+ public QSTileView createTileView(Context themedContext, QSTile tile, boolean collapsedView) {
for (int i = 0; i < mQsFactories.size(); i++) {
- QSTileView view = mQsFactories.get(i).createTileView(tile, collapsedView);
+ QSTileView view = mQsFactories.get(i)
+ .createTileView(themedContext, tile, collapsedView);
if (view != null) {
return view;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 8aaf84b..b661e2b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -17,9 +17,6 @@
import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN;
-import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON;
-
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -41,7 +38,7 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.qs.QSDetail.Callback;
-import com.android.systemui.statusbar.StatusBarMobileView;
+import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import com.android.systemui.statusbar.phone.StatusIconContainer;
@@ -91,7 +88,7 @@
public QuickStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
- mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_mobile);
+ mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_no_calling);
}
/**
@@ -221,8 +218,8 @@
}
private void updateAlphaAnimator() {
- StatusBarMobileView icon =
- ((StatusBarMobileView) mIconContainer.getViewForSlot(mMobileSlotName));
+ StatusBarIconView icon =
+ ((StatusBarIconView) mIconContainer.getViewForSlot(mMobileSlotName));
TouchAnimator.Builder builder = new TouchAnimator.Builder()
.addFloat(mQSCarriers, "alpha", 0, 1)
.addFloat(mDatePrivacyView, "alpha", 0, mDatePrivacyAlpha);
@@ -231,14 +228,12 @@
builder.setListener(new TouchAnimator.ListenerAdapter() {
@Override
public void onAnimationAtEnd() {
- icon.forceHidden(true);
- icon.setVisibleState(STATE_HIDDEN);
+ mIconContainer.addIgnoredSlot(mMobileSlotName);
}
@Override
public void onAnimationStarted() {
- icon.forceHidden(false);
- icon.setVisibleState(STATE_ICON);
+ mIconContainer.removeIgnoredSlot(mMobileSlotName);
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
index ce90fc1..b609df5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
@@ -134,8 +134,9 @@
mSignal.setPaddingRelative(0, 0, 0, 0);
}
final boolean shouldAnimate = allowAnimations && isShown();
- setVisibility(mIn, shouldAnimate, s.activityIn);
- setVisibility(mOut, shouldAnimate, s.activityOut);
+ // Do not show activity indicators
+// setVisibility(mIn, shouldAnimate, s.activityIn);
+// setVisibility(mOut, shouldAnimate, s.activityOut);
}
private void setVisibility(View view, boolean shown, boolean visible) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index dce081f..6f789d3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -63,7 +63,7 @@
private boolean mIsShowingNavBackdrop;
public QSCustomizer(Context context, AttributeSet attrs) {
- super(new ContextThemeWrapper(context, R.style.edit_theme), attrs);
+ super(new ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Edit), attrs);
LayoutInflater.from(getContext()).inflate(R.layout.qs_customize_panel_content, this);
mClipper = new QSDetailClipper(findViewById(R.id.customize_container));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index ba349c6..9b0536c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -19,9 +19,7 @@
import android.content.Context;
import android.os.Build;
import android.util.Log;
-import android.view.ContextThemeWrapper;
-import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSIconView;
@@ -251,8 +249,7 @@
}
@Override
- public QSTileView createTileView(QSTile tile, boolean collapsedView) {
- Context context = new ContextThemeWrapper(mQsHostLazy.get().getContext(), R.style.qs_theme);
+ public QSTileView createTileView(Context context, QSTile tile, boolean collapsedView) {
QSIconView icon = tile.createTileView(context);
if (mSideLabels) {
return new QSTileViewHorizontal(context, icon, collapsedView);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index c7ed89b..3d5a709 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -43,7 +43,7 @@
protected TextView mLabel;
protected TextView mSecondLine;
private ImageView mPadLock;
- private int mState;
+ protected int mState;
protected ViewGroup mLabelContainer;
private View mExpandIndicator;
private View mExpandSpace;
@@ -133,14 +133,7 @@
protected void handleStateChanged(QSTile.State state) {
super.handleStateChanged(state);
if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) {
- ColorStateList labelColor;
- if (state.state == Tile.STATE_ACTIVE) {
- labelColor = mColorLabelActive;
- } else if (state.state == Tile.STATE_INACTIVE) {
- labelColor = mColorLabelInactive;
- } else {
- labelColor = mColorLabelUnavailable;
- }
+ ColorStateList labelColor = getLabelColor(state.state);
changeLabelColor(labelColor);
mState = state.state;
mLabel.setText(state.label);
@@ -163,6 +156,15 @@
mPadLock.setVisibility(state.disabledByPolicy ? View.VISIBLE : View.GONE);
}
+ protected final ColorStateList getLabelColor(int state) {
+ if (state == Tile.STATE_ACTIVE) {
+ return mColorLabelActive;
+ } else if (state == Tile.STATE_INACTIVE) {
+ return mColorLabelInactive;
+ }
+ return mColorLabelUnavailable;
+ }
+
protected void changeLabelColor(ColorStateList color) {
mLabel.setTextColor(color);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
index 188e89e..7a8b2c6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
@@ -24,6 +24,8 @@
import android.graphics.drawable.RippleDrawable
import android.service.quicksettings.Tile.STATE_ACTIVE
import android.view.Gravity
+import android.view.View
+import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import com.android.systemui.R
@@ -41,6 +43,7 @@
private var paintColor = Color.WHITE
private var paintAnimator: ValueAnimator? = null
private var labelAnimator: ValueAnimator? = null
+ private var mSideView: ImageView = ImageView(mContext)
override var heightOverride: Int = HeightOverrideable.NO_OVERRIDE
init {
@@ -56,7 +59,16 @@
val iconSize = context.resources.getDimensionPixelSize(R.dimen.qs_icon_size)
addView(mIcon, 0, LayoutParams(iconSize, iconSize))
+ mSideView.visibility = View.GONE
+ addView(
+ mSideView,
+ -1,
+ LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {
+ gravity = Gravity.CENTER_VERTICAL
+ })
+
mColorLabelActive = ColorStateList.valueOf(getColorForState(getContext(), STATE_ACTIVE))
+ changeLabelColor(getLabelColor(mState)) // Matches the default state of the tile
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
@@ -121,14 +133,13 @@
if (allowAnimations) {
animateBackground(newColor)
} else {
- if (newColor != paintColor) {
- clearBackgroundAnimator()
- colorBackgroundDrawable?.setTintList(ColorStateList.valueOf(newColor))?.also {
- paintColor = newColor
- }
+ clearBackgroundAnimator()
+ colorBackgroundDrawable?.setTintList(ColorStateList.valueOf(newColor))?.also {
paintColor = newColor
}
+ paintColor = newColor
}
+ loadSideViewDrawableIfNecessary(state)
}
private fun animateBackground(newBackgroundColor: Int) {
@@ -181,5 +192,21 @@
labelAnimator?.cancel()?.also { labelAnimator = null }
}
+ private fun loadSideViewDrawableIfNecessary(state: QSTile.State) {
+ if (state.sideViewDrawable != null) {
+ (mSideView.layoutParams as MarginLayoutParams).apply {
+ marginStart =
+ context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin)
+ }
+ mSideView.setImageDrawable(state.sideViewDrawable)
+ mSideView.visibility = View.VISIBLE
+ mSideView.adjustViewBounds = true
+ mSideView.scaleType = ImageView.ScaleType.FIT_CENTER
+ } else {
+ mSideView.setImageDrawable(null)
+ mSideView.visibility = GONE
+ }
+ }
+
override fun handleExpand(dualTarget: Boolean) {}
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
index 0d73a5a..5b986b6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
@@ -66,7 +66,7 @@
return getHost().getContext().getPackageManager().hasSystemFeature(FEATURE_CAMERA_TOGGLE)
&& whitelistIpcs(() -> DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
"camera_toggle_enabled",
- false));
+ true));
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
index b8d8792..42bd77b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
@@ -67,7 +67,7 @@
.hasSystemFeature(FEATURE_MICROPHONE_TOGGLE)
&& whitelistIpcs(() -> DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
"mic_toggle_enabled",
- false));
+ true));
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 60c5d1c..032e47e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -20,11 +20,20 @@
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsRequest;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.service.quickaccesswallet.WalletCard;
import android.service.quicksettings.Tile;
+import android.util.Log;
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
@@ -40,20 +49,29 @@
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.settings.SecureSettings;
+import java.util.List;
+import java.util.concurrent.Executor;
+
import javax.inject.Inject;
/** Quick settings tile: Quick access wallet **/
public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
+ private static final String TAG = "QuickAccessWalletTile";
private static final String FEATURE_CHROME_OS = "org.chromium.arc";
+
private final CharSequence mLabel = mContext.getString(R.string.wallet_title);
+ private final WalletCardRetriever mCardRetriever = new WalletCardRetriever();
// TODO(b/180959290): Re-create the QAW Client when the default NFC payment app changes.
private final QuickAccessWalletClient mQuickAccessWalletClient;
private final KeyguardStateController mKeyguardStateController;
private final PackageManager mPackageManager;
private final SecureSettings mSecureSettings;
+ private final Executor mExecutor;
private final FeatureFlags mFeatureFlags;
+ @VisibleForTesting Drawable mCardViewDrawable;
+
@Inject
public QuickAccessWalletTile(
QSHost host,
@@ -68,6 +86,7 @@
KeyguardStateController keyguardStateController,
PackageManager packageManager,
SecureSettings secureSettings,
+ @Background Executor executor,
FeatureFlags featureFlags) {
super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
@@ -75,6 +94,7 @@
mKeyguardStateController = keyguardStateController;
mPackageManager = packageManager;
mSecureSettings = secureSettings;
+ mExecutor = executor;
mFeatureFlags = featureFlags;
}
@@ -87,6 +107,14 @@
}
@Override
+ protected void handleSetListening(boolean listening) {
+ super.handleSetListening(listening);
+ if (listening) {
+ queryWalletCards();
+ }
+ }
+
+ @Override
protected void handleClick() {
mActivityStarter.postStartActivityDismissingKeyguard(
mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0);
@@ -108,6 +136,7 @@
} else {
state.state = Tile.STATE_UNAVAILABLE;
}
+ state.sideViewDrawable = mCardViewDrawable;
}
@Override
@@ -133,4 +162,40 @@
CharSequence qawLabel = mQuickAccessWalletClient.getServiceLabel();
return qawLabel == null ? mLabel : qawLabel;
}
+
+ private void queryWalletCards() {
+ int cardWidth =
+ mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
+ int cardHeight =
+ mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height);
+ int iconSizePx = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_icon_size);
+ GetWalletCardsRequest request =
+ new GetWalletCardsRequest(cardWidth, cardHeight, iconSizePx, /* maxCards= */ 2);
+ mQuickAccessWalletClient.getWalletCards(mExecutor, request, mCardRetriever);
+ }
+
+ private class WalletCardRetriever implements
+ QuickAccessWalletClient.OnWalletCardsRetrievedCallback {
+
+ @Override
+ public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
+ Log.i(TAG, "Successfully retrieved wallet cards.");
+ List<WalletCard> cards = response.getWalletCards();
+ if (cards.isEmpty()) {
+ Log.d(TAG, "No wallet cards exist.");
+ mCardViewDrawable = null;
+ refreshState();
+ return;
+ }
+ mCardViewDrawable = cards.get(0).getCardImage().loadDrawable(mContext);
+ refreshState();
+ }
+
+ @Override
+ public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
+ Log.w(TAG, "Error retrieve wallet cards");
+ mCardViewDrawable = null;
+ refreshState();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
index 04d1996..9ce0eeb 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
@@ -411,19 +411,22 @@
float imageRatio = bounds.width() / (float) bounds.height();
int previewWidth = mPreview.getWidth() - mPreview.getPaddingLeft()
- mPreview.getPaddingRight();
- float viewRatio = previewWidth / (float) mPreview.getHeight();
+ int previewHeight = mPreview.getHeight() - mPreview.getPaddingTop()
+ - mPreview.getPaddingBottom();
+ float viewRatio = previewWidth / (float) previewHeight;
if (imageRatio > viewRatio) {
// Image is full width and height is constrained, compute extra padding to inform
// CropView
- float imageHeight = mPreview.getHeight() * viewRatio / imageRatio;
- int extraPadding = (int) (mPreview.getHeight() - imageHeight) / 2;
- mCropView.setExtraPadding(extraPadding, extraPadding);
+ float imageHeight = previewHeight * viewRatio / imageRatio;
+ int extraPadding = (int) (previewHeight - imageHeight) / 2;
+ mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
+ extraPadding + mPreview.getPaddingBottom());
mCropView.setImageWidth(previewWidth);
} else {
// Image is full height
- mCropView.setExtraPadding(0, 0);
- mCropView.setImageWidth((int) (mPreview.getHeight() * imageRatio));
+ mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
+ mCropView.setImageWidth((int) (previewHeight * imageRatio));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java
index 926d5c4..2863074 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java
@@ -83,6 +83,13 @@
int getMaxTiles();
/**
+ * @return the maximum combined capture height for this session, in pixels.
+ */
+ default int getMaxHeight() {
+ return getMaxTiles() * getTileHeight();
+ }
+
+ /**
* @return the height of each image tile
*/
int getTileHeight();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
index d3dd048..bbcfdbd 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
@@ -27,6 +27,7 @@
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.screenshot.ScrollCaptureClient.CaptureResult;
import com.android.systemui.screenshot.ScrollCaptureClient.Session;
@@ -139,6 +140,11 @@
mImageTileSet = imageTileSet;
}
+ @VisibleForTesting
+ float getTargetTopSizeRatio() {
+ return IDEAL_PORTION_ABOVE;
+ }
+
/**
* Run scroll capture. Performs a batch capture, collecting image tiles.
*
@@ -197,7 +203,7 @@
&& result.captured.height() < result.requested.height();
boolean finish = false;
- if (partialResult || emptyResult) {
+ if (emptyResult) {
// Potentially reached a vertical boundary. Extend in the other direction.
if (mFinishOnBoundary) {
Log.d(TAG, "Partial/empty: finished!");
@@ -211,12 +217,12 @@
Log.d(TAG, "Partial/empty: cleared, switch direction to finish");
}
} else {
- // Got the full requested result, but may have got enough bitmap data now
+ // Got a non-empty result, but may already have enough bitmap data now
int expectedTiles = mImageTileSet.size() + 1;
if (expectedTiles >= mSession.getMaxTiles()) {
Log.d(TAG, "Hit max tiles: finished");
- // If we ever hit the max tiles, we've got enough bitmap data to finish (even if we
- // weren't sure we'd finish on this pass).
+ // If we ever hit the max tiles, we've got enough bitmap data to finish
+ // (even if we weren't sure we'd finish on this pass).
finish = true;
} else {
if (mScrollingUp && !mFinishOnBoundary) {
@@ -253,10 +259,18 @@
return;
}
- // Partial or empty results caused the direction the flip, so we can reliably use the
- // requested edges to determine the next top.
- int nextTop = (mScrollingUp) ? result.requested.top - mSession.getTileHeight()
- : result.requested.bottom;
+ int nextTop;
+ if (emptyResult) {
+ // An empty result caused the direction the flip,
+ // so use the requested edges to determine the next top.
+ nextTop = (mScrollingUp)
+ ? result.requested.top - mSession.getTileHeight()
+ : result.requested.bottom;
+ } else {
+ nextTop = (mScrollingUp)
+ ? result.captured.top - mSession.getTileHeight()
+ : result.captured.bottom;
+ }
requestNextTile(nextTop);
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
index bdb3926..357256c 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
@@ -58,10 +58,9 @@
private static final int SLIDER_ANIMATION_DURATION = 3000;
private static final int MSG_UPDATE_SLIDER = 1;
- private static final int MSG_SET_CHECKED = 2;
- private static final int MSG_ATTACH_LISTENER = 3;
- private static final int MSG_DETACH_LISTENER = 4;
- private static final int MSG_VR_MODE_CHANGED = 5;
+ private static final int MSG_ATTACH_LISTENER = 2;
+ private static final int MSG_DETACH_LISTENER = 3;
+ private static final int MSG_VR_MODE_CHANGED = 4;
private static final Uri BRIGHTNESS_MODE_URI =
Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
@@ -80,7 +79,6 @@
private final int mDisplayId;
private final Context mContext;
private final ToggleSlider mControl;
- private final boolean mAutomaticAvailable;
private final DisplayManager mDisplayManager;
private final CurrentUserTracker mUserTracker;
private final IVrManager mVrManager;
@@ -219,16 +217,12 @@
private final Runnable mUpdateModeRunnable = new Runnable() {
@Override
public void run() {
- if (mAutomaticAvailable) {
- int automatic;
- automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS_MODE,
- Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
- UserHandle.USER_CURRENT);
- mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
- } else {
- mHandler.obtainMessage(MSG_SET_CHECKED, 0).sendToTarget();
- }
+ int automatic;
+ automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
+ UserHandle.USER_CURRENT);
+ mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
}
};
@@ -266,9 +260,6 @@
case MSG_UPDATE_SLIDER:
updateSlider(Float.intBitsToFloat(msg.arg1), msg.arg2 != 0);
break;
- case MSG_SET_CHECKED:
- mControl.setChecked(msg.arg1 != 0);
- break;
case MSG_ATTACH_LISTENER:
mControl.setOnChangedListener(BrightnessController.this);
break;
@@ -312,9 +303,6 @@
mDefaultBacklightForVr = pm.getBrightnessConstraint(
PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR);
-
- mAutomaticAvailable = context.getResources().getBoolean(
- com.android.internal.R.bool.config_automatic_brightness_available);
mDisplayManager = context.getSystemService(DisplayManager.class);
mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
Context.VR_SERVICE));
@@ -339,8 +327,7 @@
}
@Override
- public void onChanged(boolean tracking, boolean automatic,
- int value, boolean stopTracking) {
+ public void onChanged(boolean tracking, int value, boolean stopTracking) {
if (mExternalChange) return;
if (mSliderAnimator != null) {
@@ -398,12 +385,6 @@
});
}
- private void setMode(int mode) {
- Settings.System.putIntForUser(mContext.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
- mUserTracker.getCurrentUserId());
- }
-
private void setBrightness(float brightness) {
mDisplayManager.setTemporaryBrightness(mDisplayId, brightness);
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
index ab4895e..db82057 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
@@ -21,7 +21,6 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.CompoundButton;
import android.widget.SeekBar;
import androidx.annotation.Nullable;
@@ -31,7 +30,6 @@
import com.android.systemui.R;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.util.ViewController;
@@ -95,14 +93,12 @@
@Override
protected void onViewAttached() {
mBrightnessSliderView.setOnSeekBarChangeListener(mSeekListener);
- mBrightnessSliderView.setOnCheckedChangeListener(mCheckListener);
mBrightnessSliderView.setOnInterceptListener(mOnInterceptListener);
}
@Override
protected void onViewDetached() {
mBrightnessSliderView.setOnSeekBarChangeListener(null);
- mBrightnessSliderView.setOnCheckedChangeListener(null);
mBrightnessSliderView.setOnDispatchTouchEventListener(null);
mBrightnessSliderView.setOnInterceptListener(null);
}
@@ -132,7 +128,6 @@
private void setMirror(ToggleSlider toggleSlider) {
mMirror = toggleSlider;
if (mMirror != null) {
- mMirror.setChecked(mBrightnessSliderView.isChecked());
mMirror.setMax(mBrightnessSliderView.getMax());
mMirror.setValue(mBrightnessSliderView.getValue());
mBrightnessSliderView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
@@ -166,16 +161,6 @@
}
@Override
- public void setChecked(boolean checked) {
- mBrightnessSliderView.setChecked(checked);
- }
-
- @Override
- public boolean isChecked() {
- return mBrightnessSliderView.isChecked();
- }
-
- @Override
public void setMax(int max) {
mBrightnessSliderView.setMax(max);
if (mMirror != null) {
@@ -206,7 +191,7 @@
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mListener != null) {
- mListener.onChanged(mTracking, isChecked(), progress, false);
+ mListener.onChanged(mTracking, progress, false);
}
}
@@ -215,12 +200,9 @@
mTracking = true;
if (mListener != null) {
- mListener.onChanged(mTracking, isChecked(),
- getValue(), false);
+ mListener.onChanged(mTracking, getValue(), false);
}
- setChecked(false);
-
if (mMirrorController != null) {
mMirrorController.showMirror();
mMirrorController.setLocation((View) mBrightnessSliderView.getParent());
@@ -232,8 +214,7 @@
mTracking = false;
if (mListener != null) {
- mListener.onChanged(mTracking, isChecked(),
- getValue(), true);
+ mListener.onChanged(mTracking, getValue(), true);
}
if (mMirrorController != null) {
@@ -242,35 +223,15 @@
}
};
- private final CompoundButton.OnCheckedChangeListener mCheckListener =
- new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton toggle, boolean checked) {
- enableSlider(!checked);
-
- if (mListener != null) {
- mListener.onChanged(mTracking, checked, getValue(), false);
- }
-
- if (mMirror != null) {
- mMirror.setChecked(checked);
- }
- }
- };
-
/**
* Creates a {@link BrightnessSlider} with its associated view.
- *
- * The views inflated are determined by {@link FeatureFlags#useNewBrightnessSlider()}.
*/
public static class Factory {
- final FeatureFlags mFeatureFlags;
private final FalsingManager mFalsingManager;
@Inject
- public Factory(FeatureFlags featureFlags, FalsingManager falsingManager) {
- mFeatureFlags = featureFlags;
+ public Factory(FalsingManager falsingManager) {
mFalsingManager = falsingManager;
}
@@ -296,9 +257,7 @@
/** Get the layout to inflate based on what slider to use */
private int getLayout() {
- return mFeatureFlags.useNewBrightnessSlider()
- ? R.layout.quick_settings_brightness_dialog_thick
- : R.layout.quick_settings_brightness_dialog;
+ return R.layout.quick_settings_brightness_dialog;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
index 5b71c62..dbd6758 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
@@ -17,18 +17,13 @@
package com.android.systemui.settings.brightness;
import android.content.Context;
-import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.FrameLayout;
import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import com.android.settingslib.RestrictedLockUtils;
import com.android.systemui.Gefingerpoken;
@@ -37,23 +32,11 @@
/**
* {@code FrameLayout} used to show and manipulate a {@link ToggleSeekBar}.
*
- * It can additionally control a {@link CompoundButton} and display a label. For the class to work,
- * add children before inflation with the following ids:
- * <ul>
- * <li>{@code @id/slider} of type {@link ToggleSeekBar}</li>
- * <li>{@code @id/toggle} of type {@link CompoundButton} (optional)</li>
- * <li>{@code @id/label} of type {@link TextView} (optional)</li>
- * </ul>
*/
public class BrightnessSliderView extends FrameLayout {
- @Nullable
- private CompoundButton mToggle;
@NonNull
private ToggleSeekBar mSlider;
- @Nullable
- private TextView mLabel;
- private final CharSequence mText;
private DispatchTouchEventListener mListener;
private Gefingerpoken mOnInterceptListener;
@@ -62,31 +45,15 @@
}
public BrightnessSliderView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public BrightnessSliderView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- final TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.ToggleSliderView, defStyle, 0);
- mText = a.getString(R.styleable.ToggleSliderView_text);
-
- a.recycle();
+ super(context, attrs);
}
// Inflated from quick_settings_brightness_dialog or quick_settings_brightness_dialog_thick
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mToggle = findViewById(R.id.toggle);
mSlider = requireViewById(R.id.slider);
-
- mLabel = findViewById(R.id.label);
- if (mLabel != null) {
- mLabel.setText(mText);
- }
mSlider.setAccessibilityLabel(getContentDescription().toString());
}
@@ -125,25 +92,11 @@
}
/**
- * Attaches a listener to the {@link CompoundButton} in the view (if present) so changes to its
- * state can be observed
- * @param checkListener use {@code null} to remove listener
- */
- public void setOnCheckedChangeListener(OnCheckedChangeListener checkListener) {
- if (mToggle != null) {
- mToggle.setOnCheckedChangeListener(checkListener);
- }
- }
-
- /**
* Enforces admin rules for toggling auto-brightness and changing value of brightness
* @param admin
* @see ToggleSeekBar#setEnforcedAdmin
*/
public void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
- if (mToggle != null) {
- mToggle.setEnabled(admin == null);
- }
mSlider.setEnabled(admin == null);
mSlider.setEnforcedAdmin(admin);
}
@@ -157,26 +110,6 @@
}
/**
- * Sets the state of the {@link CompoundButton} if present
- * @param checked
- */
- public void setChecked(boolean checked) {
- if (mToggle != null) {
- mToggle.setChecked(checked);
- }
- }
-
- /**
- * @return the state of the {@link CompoundButton} if present, or {@code true} if not.
- */
- public boolean isChecked() {
- if (mToggle != null) {
- return mToggle.isChecked();
- }
- return true;
- }
-
- /**
* @return the maximum value of the {@link ToggleSeekBar}.
*/
public int getMax() {
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
index 71e4818..a988c7a 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
@@ -23,8 +23,7 @@
public interface ToggleSlider {
interface Listener {
- void onChanged(boolean tracking, boolean automatic, int value,
- boolean stopTracking);
+ void onChanged(boolean tracking, int value, boolean stopTracking);
}
void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin);
@@ -32,8 +31,6 @@
boolean mirrorTouchEvent(MotionEvent ev);
void setOnChangedListener(Listener l);
- default void setChecked(boolean checked) {}
- default boolean isChecked() { return false; }
void setMax(int max);
int getMax();
void setValue(int value);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
index 90c3dfc..f51fbed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
@@ -62,11 +62,6 @@
return mFlagReader.isEnabled(R.bool.flag_keyguard_layout);
}
- /** b/178485354 */
- public boolean useNewBrightnessSlider() {
- return mFlagReader.isEnabled(R.bool.flag_brightness_slider);
- }
-
public boolean useNewLockscreenAnimations() {
return mFlagReader.isEnabled(R.bool.flag_lockscreen_animations);
}
@@ -98,4 +93,8 @@
public boolean isChargingRippleEnabled() {
return mFlagReader.isEnabled(R.bool.flag_charging_ripple);
}
+
+ public boolean isOngoingCallStatusBarChipEnabled() {
+ return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java
index e090d0b..1c5df41 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java
@@ -161,22 +161,22 @@
private void sanitizeTopLineViews(ExpandableNotificationRow row) {
if (row.isSummaryWithChildren()) {
- sanitizeTopLine(row.getNotificationViewWrapper().getNotificationHeader());
+ sanitizeTopLine(row.getNotificationViewWrapper().getNotificationHeader(), row);
return;
}
final NotificationContentView layout = row.getPrivateLayout();
- sanitizeChild(layout.getContractedChild());
- sanitizeChild(layout.getHeadsUpChild());
- sanitizeChild(layout.getExpandedChild());
+ sanitizeChild(layout.getContractedChild(), row);
+ sanitizeChild(layout.getHeadsUpChild(), row);
+ sanitizeChild(layout.getExpandedChild(), row);
}
- private void sanitizeChild(View child) {
+ private void sanitizeChild(View child, ExpandableNotificationRow row) {
if (child != null) {
- sanitizeTopLine(child.findViewById(R.id.notification_top_line));
+ sanitizeTopLine(child.findViewById(R.id.notification_top_line), row);
}
}
- private void sanitizeTopLine(ViewGroup rowHeader) {
+ private void sanitizeTopLine(ViewGroup rowHeader, ExpandableNotificationRow row) {
if (rowHeader == null) {
return;
}
@@ -195,7 +195,7 @@
}
// in case no view is visible we make sure the time is visible
int timeVisibility = !hasVisibleText
- || mRow.getEntry().getSbn().getNotification().showsTime()
+ || row.getEntry().getSbn().getNotification().showsTime()
? View.VISIBLE : View.GONE;
time.setVisibility(timeVisibility);
View left = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
index 2f198d5..77b4186 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
@@ -20,13 +20,14 @@
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.content.Context
+import android.content.res.Configuration
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PointF
import android.util.AttributeSet
import android.view.View
-private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.4f
+private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.3f
/**
* Expanding ripple effect that shows when charging begins.
@@ -51,6 +52,16 @@
visibility = View.GONE
}
+ override fun onConfigurationChanged(newConfig: Configuration?) {
+ rippleShader.pixelDensity = resources.displayMetrics.density
+ super.onConfigurationChanged(newConfig)
+ }
+
+ override fun onAttachedToWindow() {
+ rippleShader.pixelDensity = resources.displayMetrics.density
+ super.onAttachedToWindow()
+ }
+
fun startRipple() {
if (rippleInProgress) {
return // Ignore if ripple effect is already playing
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
index 296868a..146046b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
@@ -42,6 +42,7 @@
uniform float in_fadeCircle;
uniform float in_fadeRing;
uniform float in_blur;
+ uniform float in_pixelDensity;
uniform vec4 in_color;
uniform float in_sparkle_strength;"""
private const val SHADER_LIB = """float triangleNoise(vec2 n) {
@@ -60,12 +61,13 @@
float n = triangleNoise(uv);
float s = 0.0;
for (float i = 0; i < 4; i += 1) {
- float l = i * 0.25;
- float h = l + 0.005;
- float o = abs(sin(0.1 * PI * (t + i)));
- s += threshold(n + o, l, h);
+ float l = i * 0.01;
+ float h = l + 0.1;
+ float o = smoothstep(n - l, h, n);
+ o *= abs(sin(PI * o * (t + 0.55 * i)));
+ s += o;
}
- return saturate(s);
+ return s;
}
float softCircle(vec2 uv, vec2 xy, float radius, float blur) {
@@ -96,10 +98,11 @@
// Draw shapes
float sparkleRing = softRing(p_distorted, in_origin, in_radius, in_blur);
- float sparkle = sparkles(p, in_time * 0.000033) * sparkleRing * in_fadeSparkle;
+ float sparkle = sparkles(p - mod(p, in_pixelDensity * 0.8), in_time * 0.00175)
+ * sparkleRing * in_fadeSparkle;
float circle = softCircle(p_distorted, in_origin, in_radius * 1.2, in_blur);
float rippleAlpha = max(circle * in_fadeCircle,
- softRing(p_distorted, in_origin, in_radius, in_blur) * in_fadeRing) * 0.36;
+ softRing(p_distorted, in_origin, in_radius, in_blur) * in_fadeRing) * 0.45;
vec4 ripple = in_color * rippleAlpha;
return mix(ripple, vec4(sparkle), sparkle * in_sparkle_strength);
}"""
@@ -139,12 +142,12 @@
field = value
setUniform("in_progress", value)
setUniform("in_radius",
- (1 - (1 - value) * (1 - value) * (1 - value))* 1.2f * radius)
+ (1 - (1 - value) * (1 - value) * (1 - value))* radius)
setUniform("in_blur", MathUtils.lerp(1.25f, 0.5f, value))
val fadeIn = subProgress(0f, 0.1f, value)
- val fadeOutNoise = subProgress(0.8f, 1f, value)
- val fadeOutRipple = subProgress(0.4f, 1f, value)
+ val fadeOutNoise = subProgress(0.4f, 1f, value)
+ val fadeOutRipple = subProgress(0.3f, 1f, value)
val fadeCircle = subProgress(0f, 0.2f, value)
setUniform("in_fadeSparkle", Math.min(fadeIn, 1 - fadeOutNoise))
setUniform("in_fadeCircle", 1 - fadeCircle)
@@ -191,4 +194,10 @@
setUniform("in_distort_radial", 75 * progress * value)
setUniform("in_distort_xy", 75 * value)
}
+
+ var pixelDensity: Float = 1.0f
+ set(value) {
+ field = value
+ setUniform("in_pixelDensity", value)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
index efd0519..14c73b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
@@ -49,6 +49,7 @@
import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ManagedProfileController;
@@ -57,6 +58,7 @@
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.tracing.ProtoTracer;
import com.android.systemui.util.DeviceConfigProxy;
@@ -226,4 +228,16 @@
@Binds
StatusBarIconController provideStatusBarIconController(
StatusBarIconControllerImpl controllerImpl);
+
+ /**
+ */
+ @Provides
+ @SysUISingleton
+ static OngoingCallController provideOngoingCallController(
+ CommonNotifCollection notifCollection, FeatureFlags featureFlags) {
+ OngoingCallController ongoingCallController =
+ new OngoingCallController(notifCollection, featureFlags);
+ ongoingCallController.init();
+ return ongoingCallController;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
index 91a4f94..50cbbd5d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
@@ -393,11 +393,6 @@
override fun onDozingChanged(isDozing: Boolean) {
if (isDozing) {
setNotificationsVisible(visible = false, animate = false, increaseSpeed = false)
- } else {
- // We only unset the flag once we fully went asleep. If the user interrupts the
- // animation in the middle, we have to abort the animation as well to make sure
- // the notifications are visible again.
- animatingScreenOff = false
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java
index 75d772e..db0c174 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java
@@ -57,7 +57,7 @@
* Called whenever a notification with the same key as an existing notification is posted. By
* the time this listener is called, the entry's SBN and Ranking will already have been updated.
*/
- default void onEntryUpdated(NotificationEntry entry) {
+ default void onEntryUpdated(@NonNull NotificationEntry entry) {
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index b4ab8cf..8ba036c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -346,9 +346,22 @@
}
private void bindIcon(boolean important) {
+ Drawable person = mIconFactory.getBaseIconDrawable(mShortcutInfo);
+ if (person == null) {
+ person = mContext.getDrawable(R.drawable.ic_person).mutate();
+ TypedArray ta = mContext.obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
+ int colorAccent = ta.getColor(0, 0);
+ ta.recycle();
+ person.setTint(colorAccent);
+ }
ImageView image = findViewById(R.id.conversation_icon);
- image.setImageDrawable(mIconFactory.getConversationDrawable(
- mShortcutInfo, mPackageName, mAppUid, important));
+ image.setImageDrawable(person);
+
+ ImageView app = findViewById(R.id.conversation_icon_badge_icon);
+ app.setImageDrawable(mIconFactory.getAppBadge(
+ mPackageName, UserHandle.getUserId(mSbn.getUid())));
+
+ findViewById(R.id.conversation_icon_badge_ring).setVisibility(important ? VISIBLE : GONE);
}
private void bindPackage() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index 1d30736..5f3933b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -105,7 +105,6 @@
private ViewGroup mCurrentHeader;
private boolean mIsConversation;
- private boolean mTintWithThemeAccent;
private boolean mShowGroupCountInExpander;
private boolean mShowDividersWhenExpanded;
private boolean mHideDividersDuringExpand;
@@ -149,8 +148,6 @@
com.android.internal.R.dimen.notification_content_margin);
mEnableShadowOnChildNotifications =
res.getBoolean(R.bool.config_enableShadowOnChildNotifications);
- mTintWithThemeAccent =
- res.getBoolean(com.android.internal.R.bool.config_tintNotificationsWithTheme);
mShowGroupCountInExpander =
res.getBoolean(R.bool.config_showNotificationGroupCountInExpander);
mShowDividersWhenExpanded =
@@ -1223,14 +1220,11 @@
return;
}
int color = mContainingNotification.getNotificationColor();
- if (mTintWithThemeAccent) {
- // We're using the theme accent, color with the accent color instead of the notif color
- Resources.Theme theme = new ContextThemeWrapper(mContext,
- com.android.internal.R.style.Theme_DeviceDefault_DayNight).getTheme();
- TypedArray ta = theme.obtainStyledAttributes(
- new int[]{com.android.internal.R.attr.colorAccent});
+ Resources.Theme theme = new ContextThemeWrapper(mContext,
+ com.android.internal.R.style.Theme_DeviceDefault_DayNight).getTheme();
+ try (TypedArray ta = theme.obtainStyledAttributes(
+ new int[]{com.android.internal.R.attr.colorAccent})) {
color = ta.getColor(0, color);
- ta.recycle();
}
mHybridGroupManager.setOverflowNumberColor(mOverflowNumber, color);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 562d0ec..f64a0e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -37,6 +37,7 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.EncryptionHelper;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.NetworkController;
@@ -45,6 +46,8 @@
import java.util.ArrayList;
import java.util.List;
+import javax.inject.Inject;
+
/**
* Contains the collapsed status bar and handles hiding/showing based on disable flags
* and keyguard state. Also manages lifecycle to make sure the views it contains are being
@@ -72,6 +75,7 @@
private DarkIconManager mDarkIconManager;
private View mOperatorNameFrame;
private CommandQueue mCommandQueue;
+ private OngoingCallController mOngoingCallController;
private List<String> mBlockedIcons = new ArrayList<>();
@@ -82,6 +86,11 @@
}
};
+ @Inject
+ public CollapsedStatusBarFragment(OngoingCallController ongoingCallController) {
+ mOngoingCallController = ongoingCallController;
+ }
+
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -110,7 +119,6 @@
mDarkIconManager.setShouldLog(true);
mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
- mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength));
mDarkIconManager.setBlockList(mBlockedIcons);
Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 6b69103..5ff9b703 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -555,6 +555,13 @@
pw.println(" mIsAnimatingAway: " + mIsAnimatingAway);
}
+ /** Update keyguard position based on a tapped X coordinate. */
+ public void updateKeyguardPosition(float x) {
+ if (mKeyguardViewController != null) {
+ mKeyguardViewController.updateKeyguardPosition(x);
+ }
+ }
+
public interface BouncerExpansionCallback {
void onFullyShown();
void onStartingToHide();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
index 242bd0a..707135c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
@@ -124,7 +124,7 @@
biometricSourceType: BiometricSourceType,
isStrongBiometric: Boolean
): Boolean {
- if (bypassEnabled) {
+ if (biometricSourceType == BiometricSourceType.FACE && bypassEnabled) {
val can = canBypass()
if (!can && (isPulseExpanding || qSExpanded)) {
pendingUnlock = PendingUnlock(biometricSourceType, isStrongBiometric)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 2d760e6..3f8e9d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -189,7 +189,6 @@
Resources r = getResources();
mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume));
mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock));
- mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_call_strength));
}
private void updateVisibilities() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index d7148b0..555df5c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -3494,6 +3494,12 @@
updateHorizontalPanelPosition(event.getX());
handled = true;
}
+
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyExpanded()
+ && mStatusBarKeyguardViewManager.isShowing()) {
+ mStatusBarKeyguardViewManager.updateKeyguardPosition(event.getX());
+ }
+
handled |= super.onTouch(v, event);
return !mDozing || mPulsing || handled || showingOrAnimatingAltAuth;
}
@@ -3537,7 +3543,8 @@
mStatusBarStateController,
mUpdateMonitor,
mAuthController,
- mStatusBarKeyguardViewManager);
+ mStatusBarKeyguardViewManager,
+ mKeyguardStateController);
mDisabledUdfpsController.init();
} else if (mDisabledUdfpsController != null && !udfpsEnrolled) {
mDisabledUdfpsController.destroy();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
index af595b6..72f1695 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
@@ -49,7 +49,6 @@
import android.view.WindowInsetsController;
import android.widget.FrameLayout;
-import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.view.FloatingActionMode;
import com.android.internal.widget.FloatingToolbar;
import com.android.systemui.R;
@@ -174,7 +173,11 @@
public boolean dispatchTouchEvent(MotionEvent ev) {
Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev);
- return result != null ? result : super.dispatchTouchEvent(ev);
+ result = result != null ? result : super.dispatchTouchEvent(ev);
+
+ mInteractionEventHandler.dispatchTouchEventComplete();
+
+ return result;
}
@Override
@@ -346,6 +349,12 @@
Boolean handleDispatchTouchEvent(MotionEvent ev);
/**
+ * Called after all dispatching is done.
+ */
+
+ void dispatchTouchEventComplete();
+
+ /**
* Returns if the view should intercept the touch event.
*
* The touch event may still be interecepted if
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 5595ae7..2ff7c99 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -292,6 +292,11 @@
}
@Override
+ public void dispatchTouchEventComplete() {
+ mFalsingCollector.onMotionEventComplete();
+ }
+
+ @Override
public boolean shouldInterceptTouchEvent(MotionEvent ev) {
if (mStatusBarStateController.isDozing() && !mService.isPulsing()
&& !mDockManager.isDocked()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 012439e..8ed9cd6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -225,6 +225,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -238,6 +239,7 @@
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
@@ -424,6 +426,7 @@
private final DismissCallbackRegistry mDismissCallbackRegistry;
private final DemoModeController mDemoModeController;
private NotificationsController mNotificationsController;
+ private final OngoingCallController mOngoingCallController;
// expanded notifications
// the sliding/resizing panel within the notification window
@@ -788,6 +791,8 @@
NotificationIconAreaController notificationIconAreaController,
BrightnessSlider.Factory brightnessSliderFactory,
WiredChargingRippleController chargingRippleAnimationController,
+ OngoingCallController ongoingCallController,
+ TunerService tunerService,
FeatureFlags featureFlags) {
super(context);
mNotificationsController = notificationsController;
@@ -867,8 +872,18 @@
mNotificationIconAreaController = notificationIconAreaController;
mBrightnessSliderFactory = brightnessSliderFactory;
mChargingRippleAnimationController = chargingRippleAnimationController;
+ mOngoingCallController = ongoingCallController;
mFeatureFlags = featureFlags;
+ tunerService.addTunable(
+ (key, newValue) -> {
+ if (key.equals(Settings.Secure.DOZE_ALWAYS_ON)) {
+ updateLightRevealScrimVisibility();
+ }
+ },
+ Settings.Secure.DOZE_ALWAYS_ON
+ );
+
mExpansionChangedListeners = new ArrayList<>();
mBubbleExpandListener =
@@ -1153,7 +1168,8 @@
checkBarModes();
}).getFragmentManager()
.beginTransaction()
- .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),
+ .replace(R.id.status_bar_container,
+ new CollapsedStatusBarFragment(mOngoingCallController),
CollapsedStatusBarFragment.TAG)
.commit();
@@ -1211,15 +1227,7 @@
mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim);
mChargingRippleAnimationController.setViewHost(mNotificationShadeWindowView);
-
-
- if (mFeatureFlags.useNewLockscreenAnimations()
- && (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) {
- mLightRevealScrim.setVisibility(View.VISIBLE);
- mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE);
- } else {
- mLightRevealScrim.setVisibility(View.GONE);
- }
+ updateLightRevealScrimVisibility();
mNotificationPanelViewController.initDependencies(
this,
@@ -2608,7 +2616,8 @@
" (auto: " + UiModeManager.MODE_NIGHT_AUTO +
", yes: " + UiModeManager.MODE_NIGHT_YES +
", no: " + UiModeManager.MODE_NIGHT_NO + ")");
- final boolean lightWpTheme = mContext.getThemeResId() == R.style.Theme_SystemUI_Light;
+ final boolean lightWpTheme = mContext.getThemeResId()
+ == R.style.Theme_SystemUI_LightWallpaper;
pw.println(" light wallpaper theme: " + lightWpTheme);
if (mKeyguardIndicationController != null) {
@@ -3489,7 +3498,8 @@
// Lock wallpaper defines the color of the majority of the views, hence we'll use it
// to set our default theme.
final boolean lockDarkText = mColorExtractor.getNeutralColors().supportsDarkText();
- final int themeResId = lockDarkText ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI;
+ final int themeResId = lockDarkText ? R.style.Theme_SystemUI_LightWallpaper
+ : R.style.Theme_SystemUI;
if (mContext.getThemeResId() != themeResId) {
mContext.setTheme(themeResId);
mConfigurationController.notifyThemeChanged();
@@ -4647,4 +4657,19 @@
public void removeExpansionChangedListener(@NonNull ExpansionChangedListener listener) {
mExpansionChangedListeners.remove(listener);
}
+
+ private void updateLightRevealScrimVisibility() {
+ if (mLightRevealScrim == null) {
+ // status bar may not be inflated yet
+ return;
+ }
+
+ if (mFeatureFlags.useNewLockscreenAnimations()
+ && (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) {
+ mLightRevealScrim.setVisibility(View.VISIBLE);
+ mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE);
+ } else {
+ mLightRevealScrim.setVisibility(View.GONE);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 93b83d3..89e7016 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -74,10 +74,6 @@
/**
* Display the no calling & SMS icons.
*/
- void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states);
- /**
- * Display the no calling & SMS icons.
- */
void setNoCallingIcons(String slot, List<CallIndicatorIconState> states);
public void setIconVisibility(String slot, boolean b);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 75900a2..068ded3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -224,33 +224,6 @@
}
/**
- * Accept a list of CallIndicatorIconStates, and show the call strength icons.
- * @param slot StatusBar slot for the call strength icons
- * @param states All of the no Calling & SMS icon states
- */
- @Override
- public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) {
- Slot callStrengthSlot = getSlot(slot);
- int callStrengthSlotIndex = getSlotIndex(slot);
- Collections.reverse(states);
- for (CallIndicatorIconState state : states) {
- if (!state.isNoCalling) {
- StatusBarIconHolder holder = callStrengthSlot.getHolderForTag(state.subId);
- if (holder == null) {
- holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state);
- setIcon(callStrengthSlotIndex, holder);
- } else {
- holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(),
- Icon.createWithResource(mContext, state.callStrengthResId), 0, 0,
- state.callStrengthDescription));
- setIcon(callStrengthSlotIndex, holder);
- }
- }
- setIconVisibility(slot, !state.isNoCalling, state.subId);
- }
- }
-
- /**
* Accept a list of CallIndicatorIconStates, and show the no calling icons.
* @param slot StatusBar slot for the no calling icons
* @param states All of the no Calling & SMS icon states
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
index af342dd..4ca71f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
@@ -86,11 +86,9 @@
Context context,
CallIndicatorIconState state) {
StatusBarIconHolder holder = new StatusBarIconHolder();
- int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId;
- String contentDescription = state.isNoCalling
- ? state.noCallingDescription : state.callStrengthDescription;
holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(),
- Icon.createWithResource(context, resId), 0, 0, contentDescription);
+ Icon.createWithResource(context, state.noCallingResId),
+ 0, 0, state.noCallingDescription);
holder.mTag = state.subId;
return holder;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 7ee7aa4..ef2444e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -479,7 +479,7 @@
if (mAlternateAuthInterceptor != null) {
mAfterKeyguardGoneAction = r;
mKeyguardGoneCancelAction = cancelAction;
- if (mAlternateAuthInterceptor.showAlternativeAuthMethod()) {
+ if (mAlternateAuthInterceptor.showAlternateAuthBouncer()) {
mStatusBar.updateScrimController();
}
return;
@@ -529,7 +529,8 @@
* Stop showing any alternate auth methods
*/
public void resetAlternateAuth() {
- if (mAlternateAuthInterceptor != null && mAlternateAuthInterceptor.resetForceShow()) {
+ if (mAlternateAuthInterceptor != null
+ && mAlternateAuthInterceptor.hideAlternateAuthBouncer()) {
mStatusBar.updateScrimController();
}
}
@@ -1141,15 +1142,22 @@
public boolean isShowingAlternateAuth() {
return mAlternateAuthInterceptor != null
- && mAlternateAuthInterceptor.isShowingAlternateAuth();
+ && mAlternateAuthInterceptor.isShowingAlternateAuthBouncer();
}
public boolean isShowingAlternateAuthOrAnimating() {
return mAlternateAuthInterceptor != null
- && (mAlternateAuthInterceptor.isShowingAlternateAuth()
+ && (mAlternateAuthInterceptor.isShowingAlternateAuthBouncer()
|| mAlternateAuthInterceptor.isAnimating());
}
+ /** Update keyguard position based on a tapped X coordinate. */
+ public void updateKeyguardPosition(float x) {
+ if (mBouncer != null) {
+ mBouncer.updateKeyguardPosition(x);
+ }
+ }
+
private static class DismissWithActionRequest {
final OnDismissAction dismissAction;
final Runnable cancelAction;
@@ -1167,24 +1175,25 @@
/**
* Delegate used to send show/reset events to an alternate authentication method instead of the
- * bouncer.
+ * regular pin/pattern/password bouncer.
*/
public interface AlternateAuthInterceptor {
/**
- * @return whether alternative auth method was newly shown
+ * Show alternate authentication bouncer.
+ * @return whether alternate auth method was newly shown
*/
- boolean showAlternativeAuthMethod();
+ boolean showAlternateAuthBouncer();
/**
- * reset the state to the default (only keyguard showing, no auth methods showing)
- * @return whether alternative auth method was newly hidden
+ * Hide alternate authentication bouncer
+ * @return whether the alternate auth method was newly hidden
*/
- boolean resetForceShow();
+ boolean hideAlternateAuthBouncer();
/**
- * @return true if alternative auth method is showing
+ * @return true if the alternate auth bouncer is showing
*/
- boolean isShowingAlternateAuth();
+ boolean isShowingAlternateAuthBouncer();
/**
* print information for the alternate auth interceptor registered
@@ -1192,12 +1201,12 @@
void dump(PrintWriter pw);
/**
- * @return true if the new auth method is currently animating in or out.
+ * @return true if the new auth method bouncer is currently animating in or out.
*/
boolean isAnimating();
/**
- * Set whether qs is currently expanded
+ * Set whether qs is currently expanded.
*/
void setQsExpanded(boolean expanded);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
index 3445826..b57d876 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -22,7 +22,6 @@
import android.util.ArraySet;
import android.util.Log;
-import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController;
@@ -50,7 +49,6 @@
private final String mSlotEthernet;
private final String mSlotVpn;
private final String mSlotNoCalling;
- private final String mSlotCallStrength;
private final Context mContext;
private final StatusBarIconController mIconController;
@@ -84,8 +82,6 @@
mSlotEthernet = mContext.getString(com.android.internal.R.string.status_bar_ethernet);
mSlotVpn = mContext.getString(com.android.internal.R.string.status_bar_vpn);
mSlotNoCalling = mContext.getString(com.android.internal.R.string.status_bar_no_calling);
- mSlotCallStrength =
- mContext.getString(com.android.internal.R.string.status_bar_call_strength);
mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity);
mIconController = iconController;
@@ -211,14 +207,9 @@
if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) {
state.isNoCalling = statusIcon.visible;
state.noCallingDescription = statusIcon.contentDescription;
- } else {
- state.callStrengthResId = statusIcon.icon;
- state.callStrengthDescription = statusIcon.contentDescription;
+ mIconController.setNoCallingIcons(mSlotNoCalling,
+ CallIndicatorIconState.copyStates(mCallIndicatorStates));
}
- mIconController.setCallStrengthIcons(mSlotCallStrength,
- CallIndicatorIconState.copyStates(mCallIndicatorStates));
- mIconController.setNoCallingIcons(mSlotNoCalling,
- CallIndicatorIconState.copyStates(mCallIndicatorStates));
}
@Override
@@ -305,7 +296,6 @@
mIconController.removeAllIconsForSlot(mSlotMobile);
mIconController.removeAllIconsForSlot(mSlotNoCalling);
- mIconController.removeAllIconsForSlot(mSlotCallStrength);
mMobileStates.clear();
List<CallIndicatorIconState> noCallingStates = new ArrayList<CallIndicatorIconState>();
noCallingStates.addAll(mCallIndicatorStates);
@@ -420,15 +410,12 @@
public static class CallIndicatorIconState {
public boolean isNoCalling;
public int noCallingResId;
- public int callStrengthResId;
public int subId;
public String noCallingDescription;
- public String callStrengthDescription;
private CallIndicatorIconState(int subId) {
this.subId = subId;
this.noCallingResId = R.drawable.ic_qs_no_calling_sms;
- this.callStrengthResId = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0];
}
@Override
@@ -440,26 +427,21 @@
CallIndicatorIconState that = (CallIndicatorIconState) o;
return isNoCalling == that.isNoCalling
&& noCallingResId == that.noCallingResId
- && callStrengthResId == that.callStrengthResId
&& subId == that.subId
- && noCallingDescription == that.noCallingDescription
- && callStrengthDescription == that.callStrengthDescription;
+ && noCallingDescription == that.noCallingDescription;
}
@Override
public int hashCode() {
- return Objects.hash(isNoCalling, noCallingResId,
- callStrengthResId, subId, noCallingDescription, callStrengthDescription);
+ return Objects.hash(isNoCalling, noCallingResId, subId, noCallingDescription);
}
private void copyTo(CallIndicatorIconState other) {
other.isNoCalling = isNoCalling;
other.noCallingResId = noCallingResId;
- other.callStrengthResId = callStrengthResId;
other.subId = subId;
other.noCallingDescription = noCallingDescription;
- other.callStrengthDescription = callStrengthDescription;
}
private static List<CallIndicatorIconState> copyStates(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index 4f32712..2c2779e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -90,6 +90,7 @@
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -99,6 +100,7 @@
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
@@ -206,6 +208,8 @@
NotificationIconAreaController notificationIconAreaController,
BrightnessSlider.Factory brightnessSliderFactory,
WiredChargingRippleController chargingRippleAnimationController,
+ OngoingCallController ongoingCallController,
+ TunerService tunerService,
FeatureFlags featureFlags) {
return new StatusBar(
context,
@@ -288,6 +292,8 @@
notificationIconAreaController,
brightnessSliderFactory,
chargingRippleAnimationController,
+ ongoingCallController,
+ tunerService,
featureFlags);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
new file mode 100644
index 0000000..60d3ea3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 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.ongoingcall
+
+import android.app.Notification
+import android.app.Notification.CallStyle.CALL_TYPE_ONGOING
+import android.util.Log
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.FeatureFlags
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
+import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
+import javax.inject.Inject
+
+/**
+ * A controller to handle the ongoing call chip in the collapsed status bar.
+ */
+@SysUISingleton
+class OngoingCallController @Inject constructor(
+ private val notifCollection: CommonNotifCollection,
+ private val featureFlags: FeatureFlags
+) {
+
+ private val notifListener = object : NotifCollectionListener {
+ override fun onEntryUpdated(entry: NotificationEntry) {
+ if (isOngoingCallNotification(entry) && DEBUG) {
+ Log.d(TAG, "Ongoing call notification updated")
+ }
+ }
+
+ override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
+ if (isOngoingCallNotification(entry) && DEBUG) {
+ Log.d(TAG, "Ongoing call notification removed")
+ }
+ }
+ }
+
+ fun init() {
+ if (featureFlags.isOngoingCallStatusBarChipEnabled) {
+ notifCollection.addCollectionListener(notifListener)
+ }
+ }
+}
+
+private fun isOngoingCallNotification(entry: NotificationEntry): Boolean {
+ val extras = entry.sbn.notification.extras
+ val callStyleTemplateName = Notification.CallStyle::class.java.name
+ return extras.getString(Notification.EXTRA_TEMPLATE) == callStyleTemplateName &&
+ extras.getInt(Notification.EXTRA_CALL_TYPE, -1) == CALL_TYPE_ONGOING
+}
+
+private const val TAG = "OngoingCallController"
+private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
index b96cb5e..7ac6d63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
@@ -21,6 +21,7 @@
import android.telephony.SubscriptionInfo;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
@@ -32,6 +33,8 @@
import java.util.ArrayList;
import java.util.List;
+import javax.inject.Inject;
+
/**
* Implements network listeners and forwards the calls along onto other listeners but on
@@ -60,12 +63,9 @@
private int mHistoryIndex;
private String mLastCallback;
- public CallbackHandler() {
- super(Looper.getMainLooper());
- }
-
+ @Inject
@VisibleForTesting
- CallbackHandler(Looper looper) {
+ CallbackHandler(@Main Looper looper) {
super(looper);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index 499d1e4..97d344a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -322,7 +322,7 @@
// Update text color based when shade scrim changes color.
public void onColorsChanged(boolean lightTheme) {
final Context context = new ContextThemeWrapper(mContext,
- lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI);
+ lightTheme ? R.style.Theme_SystemUI_LightWallpaper : R.style.Theme_SystemUI);
setTextColor(Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index cfaeb0e..f683603 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -85,6 +85,7 @@
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -171,6 +172,8 @@
private NetworkCapabilities mLastDefaultNetworkCapabilities;
// Handler that all broadcasts are received on.
private final Handler mReceiverHandler;
+ private final Looper mBgLooper;
+ private final Executor mBgExecutor;
// Handler that all callbacks are made on.
private final CallbackHandler mCallbackHandler;
@@ -198,6 +201,9 @@
public NetworkControllerImpl(
Context context,
@Background Looper bgLooper,
+ @Background Executor bgExecutor,
+ SubscriptionManager subscriptionManager,
+ CallbackHandler callbackHandler,
DeviceProvisionedController deviceProvisionedController,
BroadcastDispatcher broadcastDispatcher,
ConnectivityManager connectivityManager,
@@ -212,8 +218,11 @@
telephonyListenerManager,
wifiManager,
networkScoreManager,
- SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
- new CallbackHandler(),
+ subscriptionManager,
+ Config.readConfig(context),
+ bgLooper,
+ bgExecutor,
+ callbackHandler,
accessPointController,
new DataUsageController(context),
new SubscriptionDefaults(),
@@ -230,6 +239,7 @@
WifiManager wifiManager,
NetworkScoreManager networkScoreManager,
SubscriptionManager subManager, Config config, Looper bgLooper,
+ Executor bgExecutor,
CallbackHandler callbackHandler,
AccessPointControllerImpl accessPointController,
DataUsageController dataUsageController,
@@ -241,6 +251,8 @@
mTelephonyListenerManager = telephonyListenerManager;
mConfig = config;
mReceiverHandler = new Handler(bgLooper);
+ mBgLooper = bgLooper;
+ mBgExecutor = bgExecutor;
mCallbackHandler = callbackHandler;
mDataSaverController = new DataSaverControllerImpl(context);
mBroadcastDispatcher = broadcastDispatcher;
@@ -377,21 +389,23 @@
// TODO: Move off of the deprecated CONNECTIVITY_ACTION broadcast and rely on callbacks
// exclusively for status bar icons.
mConnectivityManager.registerDefaultNetworkCallback(callback, mReceiverHandler);
- // Register the listener on our bg looper
+ // Run the listener on our bg looper
mPhoneStateListener = subId -> {
- // For data switching from A to B, we assume B is validated for up to 2 seconds iff:
- // 1) A and B are in the same subscription group e.g. CBRS data switch. And
- // 2) A was validated before the switch.
- // This is to provide smooth transition for UI without showing cross during data
- // switch.
- if (keepCellularValidationBitInSwitch(mActiveMobileDataSubscription, subId)) {
- if (DEBUG) Log.d(TAG, ": mForceCellularValidated to true.");
- mForceCellularValidated = true;
- mReceiverHandler.removeCallbacks(mClearForceValidated);
- mReceiverHandler.postDelayed(mClearForceValidated, 2000);
- }
- mActiveMobileDataSubscription = subId;
- doUpdateMobileControllers();
+ mBgExecutor.execute(() -> {
+ // For data switching from A to B, we assume B is validated for up to 2 seconds if:
+ // 1) A and B are in the same subscription group e.g. CBRS data switch. And
+ // 2) A was validated before the switch.
+ // This is to provide smooth transition for UI without showing cross during data
+ // switch.
+ if (keepCellularValidationBitInSwitch(mActiveMobileDataSubscription, subId)) {
+ if (DEBUG) Log.d(TAG, ": mForceCellularValidated to true.");
+ mForceCellularValidated = true;
+ mReceiverHandler.removeCallbacks(mClearForceValidated);
+ mReceiverHandler.postDelayed(mClearForceValidated, 2000);
+ }
+ mActiveMobileDataSubscription = subId;
+ doUpdateMobileControllers();
+ });
};
mDemoModeController.addCallback(this);
@@ -428,7 +442,7 @@
mobileSignalController.registerListener();
}
if (mSubscriptionListener == null) {
- mSubscriptionListener = new SubListener();
+ mSubscriptionListener = new SubListener(mBgLooper);
}
mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
mTelephonyListenerManager.addActiveDataSubscriptionIdListener(mPhoneStateListener);
@@ -1336,6 +1350,10 @@
}
private class SubListener extends OnSubscriptionsChangedListener {
+ SubListener(Looper looper) {
+ super(looper);
+ }
+
@Override
public void onSubscriptionsChanged() {
updateMobileControllers();
@@ -1346,10 +1364,5 @@
* Used to register listeners from the BG Looper, this way the PhoneStateListeners that
* get created will also run on the BG Looper.
*/
- private final Runnable mRegisterListeners = new Runnable() {
- @Override
- public void run() {
- registerListeners();
- }
- };
+ private final Runnable mRegisterListeners = () -> registerListeners();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java
index 9eaee22..f42e388 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoControllerImpl.java
@@ -143,7 +143,7 @@
final int userId = userInfo.id;
final boolean isGuest = userInfo.isGuest();
final String userName = userInfo.name;
- final boolean lightIcon = mContext.getThemeResId() != R.style.Theme_SystemUI_Light;
+ final boolean lightIcon = mContext.getThemeResId() != R.style.Theme_SystemUI_LightWallpaper;
final Resources res = mContext.getResources();
final int avatarSize = Math.max(
diff --git a/packages/SystemUI/src/com/android/systemui/telephony/TelephonyCallback.java b/packages/SystemUI/src/com/android/systemui/telephony/TelephonyCallback.java
index 95216c5..728907f 100644
--- a/packages/SystemUI/src/com/android/systemui/telephony/TelephonyCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/telephony/TelephonyCallback.java
@@ -54,9 +54,11 @@
@Override
public void onActiveDataSubscriptionIdChanged(int subId) {
- mActiveDataSubscriptionIdListeners.forEach(listener -> {
- listener.onActiveDataSubscriptionIdChanged(subId);
- });
+ List<ActiveDataSubscriptionIdListener> listeners;
+ synchronized (mActiveDataSubscriptionIdListeners) {
+ listeners = new ArrayList<>(mActiveDataSubscriptionIdListeners);
+ }
+ listeners.forEach(listener -> listener.onActiveDataSubscriptionIdChanged(subId));
}
void addActiveDataSubscriptionIdListener(ActiveDataSubscriptionIdListener listener) {
@@ -69,9 +71,11 @@
@Override
public void onCallStateChanged(int state) {
- mCallStateListeners.forEach(listener -> {
- listener.onCallStateChanged(state);
- });
+ List<CallStateListener> listeners;
+ synchronized (mCallStateListeners) {
+ listeners = new ArrayList<>(mCallStateListeners);
+ }
+ listeners.forEach(listener -> listener.onCallStateChanged(state));
}
void addCallStateListener(CallStateListener listener) {
@@ -84,9 +88,11 @@
@Override
public void onServiceStateChanged(@NonNull ServiceState serviceState) {
- mServiceStateListeners.forEach(listener -> {
- listener.onServiceStateChanged(serviceState);
- });
+ List<ServiceStateListener> listeners;
+ synchronized (mServiceStateListeners) {
+ listeners = new ArrayList<>(mServiceStateListeners);
+ }
+ listeners.forEach(listener -> listener.onServiceStateChanged(serviceState));
}
void addServiceStateListener(ServiceStateListener listener) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 1026a5c..a8a3d79c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -301,11 +301,13 @@
// the volume dialog container itself, so this is fine.
for (int i = 0; i < mDialogView.getChildCount(); i++) {
final View view = mDialogView.getChildAt(i);
+ final int[] locInWindow = new int[2];
+ view.getLocationInWindow(locInWindow);
mTouchableRegion.op(
- view.getLeft(),
- view.getTop(),
- view.getRight(),
- view.getBottom(),
+ locInWindow[0],
+ locInWindow[1],
+ locInWindow[0] + view.getWidth(),
+ locInWindow[1] + view.getHeight(),
Region.Op.UNION);
}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java b/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java
new file mode 100644
index 0000000..c1f5516
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 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.wallet.dagger;
+
+import android.app.Activity;
+import android.content.Context;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
+
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.wallet.ui.WalletActivity;
+
+import dagger.Binds;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
+
+
+/**
+ * Module for injecting classes in Wallet.
+ */
+@Module
+public abstract class WalletModule {
+
+ /** */
+ @Binds
+ @IntoMap
+ @ClassKey(WalletActivity.class)
+ public abstract Activity provideWalletActivity(WalletActivity activity);
+
+ /** */
+ @SysUISingleton
+ @Provides
+ public static QuickAccessWalletClient provideQuickAccessWalletClient(Context context) {
+ return QuickAccessWalletClient.create(context);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
new file mode 100644
index 0000000..644addf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.text.TextPaint;
+import android.util.MathUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.ColorInt;
+import androidx.core.content.ContextCompat;
+import androidx.core.graphics.ColorUtils;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.R;
+
+final class DotIndicatorDecoration extends RecyclerView.ItemDecoration {
+ private final int mUnselectedRadius;
+ private final int mSelectedRadius;
+ private final int mDotMargin;
+ @ColorInt private final int mUnselectedColor;
+ @ColorInt private final int mSelectedColor;
+ private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
+ private WalletCardCarousel mCardCarousel;
+
+ DotIndicatorDecoration(Context context) {
+ super();
+
+ mUnselectedRadius =
+ context.getResources().getDimensionPixelSize(
+ R.dimen.card_carousel_dot_unselected_radius);
+ mSelectedRadius =
+ context.getResources().getDimensionPixelSize(
+ R.dimen.card_carousel_dot_selected_radius);
+ mDotMargin = context.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_margin);
+
+ TextView textView = new TextView(context);
+ mTextPaint.set(textView.getPaint());
+ // Text color is not copied from text appearance.
+ mTextPaint.setColor(ContextCompat.getColor(context, R.color.GM2_blue_600));
+
+ mUnselectedColor = ContextCompat.getColor(context, R.color.GM2_grey_300);
+ mSelectedColor = ContextCompat.getColor(context, R.color.GM2_blue_600);
+ }
+
+ @Override
+ public void getItemOffsets(
+ Rect rect, View view, RecyclerView recyclerView, RecyclerView.State state) {
+ super.getItemOffsets(rect, view, recyclerView, state);
+ if (recyclerView.getAdapter().getItemCount() > 1) {
+ rect.bottom =
+ view.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_offset);
+ }
+ }
+
+ @Override
+ public void onDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.State state) {
+ super.onDrawOver(canvas, recyclerView, state);
+
+ mCardCarousel = (WalletCardCarousel) recyclerView;
+ int itemCount = recyclerView.getAdapter().getItemCount();
+ if (itemCount <= 1) {
+ // Only shown if there are at least 2 items, and it's not a shimmer loader
+ return;
+ }
+ canvas.save();
+
+ float animationStartOffset = recyclerView.getWidth() / 6f;
+ // 0 when a card is still very prominent, ie. edgeToCenterDistance is greater than
+ // animationStartOffset
+ // 1 when the two cards are equidistant from the center ie. edgeToCenterDistance == 0
+ float interpolatedProgress =
+ 1 - Math.min(Math.abs(mCardCarousel.mEdgeToCenterDistance), animationStartOffset)
+ / animationStartOffset;
+
+ float totalWidth =
+ mDotMargin * (itemCount - 1)
+ + 2 * mUnselectedRadius * (itemCount - 2)
+ + 2 * mSelectedRadius;
+ // Translate the canvas so the drawing can always start at (0, 0) coordinates.
+ canvas.translate(
+ (recyclerView.getWidth() - totalWidth) / 2f,
+ recyclerView.getHeight() - mDotMargin);
+
+ int itemsDrawn = 0;
+ while (itemsDrawn < itemCount) {
+ // count up from 0 to itemCount - 1 if LTR; count down from itemCount - 1 to 0 if RTL.
+ int i = isLayoutLtr() ? itemsDrawn : itemCount - itemsDrawn - 1;
+
+ if (isSelectedItem(i)) {
+ drawSelectedDot(canvas, interpolatedProgress, i);
+ } else if (isNextItemInScrollingDirection(i)) {
+ drawFadingUnselectedDot(canvas, interpolatedProgress, i);
+ } else {
+ drawUnselectedDot(canvas);
+ }
+ canvas.translate(mDotMargin, 0);
+ itemsDrawn++;
+ }
+
+ canvas.restore();
+ this.mCardCarousel = null; // No need to hold a reference.
+ }
+
+ private void drawSelectedDot(Canvas canvas, float progress, int position) {
+ // Divide progress by 2 because the other half of the animation is done by
+ // drawFadingUnselectedDot.
+ mPaint.setColor(
+ getTransitionAdjustedColor(
+ ColorUtils.blendARGB(mSelectedColor, mUnselectedColor, progress / 2)));
+ float radius = MathUtils.lerp(mSelectedRadius, mUnselectedRadius, progress / 2);
+ canvas.drawCircle(radius, 0, radius, mPaint);
+ canvas.translate(radius * 2, 0);
+ }
+
+ private void drawFadingUnselectedDot(Canvas canvas, float progress, int position) {
+ // Divide progress by 2 because the first half of the animation is done by drawSelectedDot.
+ int blendedColor =
+ ColorUtils.blendARGB(
+ mUnselectedColor, mSelectedColor, progress / 2);
+ mPaint.setColor(getTransitionAdjustedColor(blendedColor));
+ float radius = MathUtils.lerp(mSelectedRadius, mUnselectedRadius, progress / 2);
+ canvas.drawCircle(radius, 0, radius, mPaint);
+ canvas.translate(radius * 2, 0);
+ }
+
+ private void drawUnselectedDot(Canvas canvas) {
+ mPaint.setColor(mUnselectedColor);
+ canvas.drawCircle(mUnselectedRadius, 0, mUnselectedRadius, mPaint);
+ canvas.translate(mUnselectedRadius * 2, 0);
+ }
+
+ private int getTransitionAdjustedColor(int color) {
+ int transitionAlphaOverride = 0xff;
+ return ColorUtils.setAlphaComponent(color, transitionAlphaOverride);
+ }
+
+ private boolean isSelectedItem(int position) {
+ return mCardCarousel.mCenteredAdapterPosition == position;
+ }
+
+ private boolean isNextItemInScrollingDirection(int position) {
+ if (isLayoutLtr()) {
+ return (mCardCarousel.mCenteredAdapterPosition + 1 == position
+ && mCardCarousel.mEdgeToCenterDistance >= 0f)
+ || (mCardCarousel.mCenteredAdapterPosition - 1 == position
+ && mCardCarousel.mEdgeToCenterDistance < 0f);
+ }
+ return (mCardCarousel.mCenteredAdapterPosition - 1 == position
+ && mCardCarousel.mEdgeToCenterDistance >= 0f)
+ || (mCardCarousel.mCenteredAdapterPosition + 1 == position
+ && mCardCarousel.mEdgeToCenterDistance < 0f);
+ }
+
+ private boolean isLayoutLtr() {
+ if (mCardCarousel == null) {
+ // Shouldn't happen, but assume LTR for now.
+ return true;
+ }
+ return mCardCarousel.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
new file mode 100644
index 0000000..ba063a8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.view.MenuItem;
+import android.view.Window;
+
+import androidx.annotation.NonNull;
+
+import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.settings.UserTracker;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.LifecycleActivity;
+
+import java.util.concurrent.Executor;
+
+import javax.inject.Inject;
+
+/**
+ * Displays Wallet carousel screen inside an activity.
+ */
+public class WalletActivity extends LifecycleActivity {
+
+ private final QuickAccessWalletClient mQuickAccessWalletClient;
+ private final KeyguardStateController mKeyguardStateController;
+ private final ActivityStarter mActivityStarter;
+ private final Executor mExecutor;
+ private final Handler mHandler;
+ private final UserTracker mUserTracker;
+ private WalletScreenController mWalletScreenController;
+
+ @Inject
+ public WalletActivity(
+ QuickAccessWalletClient quickAccessWalletClient,
+ KeyguardStateController keyguardStateController,
+ ActivityStarter activityStarter,
+ @Background Executor executor,
+ @Background Handler handler,
+ UserTracker userTracker) {
+ mQuickAccessWalletClient = quickAccessWalletClient;
+ mKeyguardStateController = keyguardStateController;
+ mActivityStarter = activityStarter;
+ mExecutor = executor;
+ mHandler = handler;
+ mUserTracker = userTracker;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.quick_access_wallet);
+
+ getWindow().getDecorView().setBackgroundColor(getColor(R.color.wallet_white));
+ setTitle("");
+ getActionBar().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ getActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
+ getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close);
+ WalletView walletView = requireViewById(R.id.wallet_view);
+ mWalletScreenController = new WalletScreenController(
+ this,
+ walletView,
+ mQuickAccessWalletClient,
+ mActivityStarter,
+ mExecutor,
+ mHandler,
+ mUserTracker,
+ !mKeyguardStateController.isUnlocked());
+ walletView.getWalletButton().setOnClickListener(
+ v -> mActivityStarter.startActivity(
+ mQuickAccessWalletClient.createWalletIntent(), true));
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ int itemId = item.getItemId();
+ if (itemId == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void onDestroy() {
+ mWalletScreenController.onDismissed();
+ super.onDestroy();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java
new file mode 100644
index 0000000..21e5549
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java
@@ -0,0 +1,473 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.HapticFeedbackConstants;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.cardview.widget.CardView;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.LinearSmoothScroller;
+import androidx.recyclerview.widget.PagerSnapHelper;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate;
+
+import com.android.systemui.R;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Card Carousel for displaying Quick Access Wallet cards.
+ */
+public class WalletCardCarousel extends RecyclerView {
+
+ // A negative card margin is required because card shrinkage pushes the cards too far apart
+ private static final float CARD_MARGIN_RATIO = -.03f;
+ // Size of the unselected card as a ratio to size of selected card.
+ private static final float UNSELECTED_CARD_SCALE = .83f;
+ private static final float CORNER_RADIUS_RATIO = 25f / 700f;
+ private static final float CARD_ASPECT_RATIO = 700f / 440f;
+ private static final float CARD_VIEW_WIDTH_RATIO = 0.69f;
+
+
+ static final int CARD_ANIM_ALPHA_DURATION = 100;
+ static final int CARD_ANIM_ALPHA_DELAY = 50;
+
+ private final Rect mSystemGestureExclusionZone = new Rect();
+ private WalletCardCarouselAdapter mWalletCardCarouselAdapter;
+ private int mExpectedViewWidth;
+ private int mCardMarginPx;
+ private int mCardWidthPx;
+ private int mCardHeightPx;
+ private float mCornerRadiusPx;
+ private int mTotalCardWidth;
+ private float mCardEdgeToCenterDistance;
+
+ private OnSelectionListener mSelectionListener;
+ private OnCardScrollListener mCardScrollListener;
+ // Adapter position of the child that is closest to the center of the recycler view, will also
+ // be used in DotIndicatorDecoration.
+ int mCenteredAdapterPosition = RecyclerView.NO_POSITION;
+ // Pixel distance, along y-axis, from the center of the recycler view to the nearest child, will
+ // also be used in DotIndicatorDecoration.
+ float mEdgeToCenterDistance = Float.MAX_VALUE;
+ private float mCardCenterToScreenCenterDistancePx = Float.MAX_VALUE;
+ // When card data is loaded, this many cards should be animated as data is bound to them.
+ private int mNumCardsToAnimate;
+ // When card data is loaded, this is the position of the leftmost card to be animated.
+ private int mCardAnimationStartPosition;
+ // When card data is loaded, the animations may be delayed so that other animations can complete
+ private int mExtraAnimationDelay;
+
+ interface OnSelectionListener {
+ /**
+ * The card was moved to the center, thus selecting it.
+ */
+ void onCardSelected(@NonNull WalletCardViewInfo card);
+
+ /**
+ * The card was clicked.
+ */
+ void onCardClicked(@NonNull WalletCardViewInfo card);
+
+ /**
+ * Cards should be re-queried due to a layout change
+ */
+ void queryWalletCards();
+ }
+
+ interface OnCardScrollListener {
+ void onCardScroll(WalletCardViewInfo centerCard, WalletCardViewInfo nextCard,
+ float percentDistanceFromCenter);
+ }
+
+ public WalletCardCarousel(Context context) {
+ this(context, null);
+ }
+
+ public WalletCardCarousel(Context context, @Nullable AttributeSet attributeSet) {
+ super(context, attributeSet);
+
+ setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
+ addOnScrollListener(new CardCarouselScrollListener());
+ new CarouselSnapHelper().attachToRecyclerView(this);
+ mWalletCardCarouselAdapter = new WalletCardCarouselAdapter();
+ mWalletCardCarouselAdapter.setHasStableIds(true);
+ setAdapter(mWalletCardCarouselAdapter);
+ ViewCompat.setAccessibilityDelegate(this, new CardCarouselAccessibilityDelegate(this));
+
+ addItemDecoration(new DotIndicatorDecoration(getContext()));
+ }
+
+ /**
+ * We need to know the card width before we query cards. Card width depends on layout width.
+ * But the carousel isn't laid out until set to visible, which only happens after cards are
+ * returned. Setting the expected view width breaks the chicken-and-egg problem.
+ */
+ void setExpectedViewWidth(int width) {
+ if (mExpectedViewWidth == width) {
+ return;
+ }
+ mExpectedViewWidth = width;
+ Resources res = getResources();
+ DisplayMetrics metrics = res.getDisplayMetrics();
+ int screenWidth = Math.min(metrics.widthPixels, metrics.heightPixels);
+ mCardWidthPx = Math.round(Math.min(width, screenWidth) * CARD_VIEW_WIDTH_RATIO);
+ mCardHeightPx = Math.round(mCardWidthPx / CARD_ASPECT_RATIO);
+ mCornerRadiusPx = mCardWidthPx * CORNER_RADIUS_RATIO;
+ mCardMarginPx = Math.round(mCardWidthPx * CARD_MARGIN_RATIO);
+ mTotalCardWidth = mCardWidthPx + res.getDimensionPixelSize(R.dimen.card_margin) * 2;
+ mCardEdgeToCenterDistance = mTotalCardWidth / 2f;
+ updatePadding(width);
+ if (mSelectionListener != null) {
+ mSelectionListener.queryWalletCards();
+ }
+ }
+
+ @Override
+ public void onViewAdded(View child) {
+ super.onViewAdded(child);
+ LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
+ layoutParams.leftMargin = mCardMarginPx;
+ layoutParams.rightMargin = mCardMarginPx;
+ child.addOnLayoutChangeListener((v, l, t, r, b, ol, ot, or, ob) -> updateCardView(child));
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ int width = getWidth();
+ if (mWalletCardCarouselAdapter.getItemCount() > 1 && width < mTotalCardWidth * 1.5) {
+ // When 2 or more cards are available but only one whole card can be shown on screen at
+ // a time, the entire carousel is opted out from system gesture to help users swipe
+ // between cards without accidentally performing the 'back' gesture. When there is only
+ // one card or when the carousel is large enough to accommodate several whole cards,
+ // there is no need to disable the back gesture since either the user can't swipe or has
+ // plenty of room with which to do so.
+ mSystemGestureExclusionZone.set(0, 0, width, getHeight());
+ setSystemGestureExclusionRects(Collections.singletonList(mSystemGestureExclusionZone));
+ }
+ if (width != mExpectedViewWidth) {
+ updatePadding(width);
+ }
+ }
+
+ void setExtraAnimationDelay(int extraAnimationDelay) {
+ mExtraAnimationDelay = extraAnimationDelay;
+ }
+
+ void setSelectionListener(OnSelectionListener selectionListener) {
+ mSelectionListener = selectionListener;
+ }
+
+ void setCardScrollListener(OnCardScrollListener scrollListener) {
+ mCardScrollListener = scrollListener;
+ }
+
+ int getCardWidthPx() {
+ return mCardWidthPx;
+ }
+
+ int getCardHeightPx() {
+ return mCardHeightPx;
+ }
+
+ /**
+ * Set card data. Returns true if carousel was empty, indicating that views will be animated
+ */
+ boolean setData(List<WalletCardViewInfo> data, int selectedIndex) {
+ boolean wasEmpty = mWalletCardCarouselAdapter.getItemCount() == 0;
+ mWalletCardCarouselAdapter.setData(data);
+ if (wasEmpty) {
+ scrollToPosition(selectedIndex);
+ mNumCardsToAnimate = numCardsOnScreen(data.size(), selectedIndex);
+ mCardAnimationStartPosition = Math.max(selectedIndex - 1, 0);
+ }
+ WalletCardViewInfo selectedCard = data.get(selectedIndex);
+ mCardScrollListener.onCardScroll(selectedCard, selectedCard, 0);
+ return wasEmpty;
+ }
+
+ @Override
+ public void scrollToPosition(int position) {
+ super.scrollToPosition(position);
+ mSelectionListener.onCardSelected(mWalletCardCarouselAdapter.mData.get(position));
+ }
+
+ /**
+ * The number of cards shown on screen when one of the cards is position in the center. This is
+ * also the num
+ */
+ private static int numCardsOnScreen(int numCards, int selectedIndex) {
+ if (numCards <= 2) {
+ return numCards;
+ }
+ // When there are 3 or more cards, 3 cards will be shown unless the first or last card is
+ // centered on screen.
+ return selectedIndex > 0 && selectedIndex < (numCards - 1) ? 3 : 2;
+ }
+
+ /**
+ * The padding pushes the first and last cards in the list to the center when they are
+ * selected.
+ */
+ private void updatePadding(int viewWidth) {
+ int paddingHorizontal = (viewWidth - mTotalCardWidth) / 2 - mCardMarginPx;
+ paddingHorizontal = Math.max(0, paddingHorizontal); // just in case
+ setPadding(paddingHorizontal, getPaddingTop(), paddingHorizontal, getPaddingBottom());
+
+ // re-center selected card after changing padding (if card is selected)
+ if (mWalletCardCarouselAdapter != null
+ && mWalletCardCarouselAdapter.getItemCount() > 0
+ && mCenteredAdapterPosition != NO_POSITION) {
+ ViewHolder viewHolder = findViewHolderForAdapterPosition(mCenteredAdapterPosition);
+ if (viewHolder != null) {
+ View cardView = viewHolder.itemView;
+ int cardCenter = (cardView.getLeft() + cardView.getRight()) / 2;
+ int viewCenter = (getLeft() + getRight()) / 2;
+ int scrollX = cardCenter - viewCenter;
+ scrollBy(scrollX, 0);
+ }
+ }
+ }
+
+ private void updateCardView(View view) {
+ WalletCardViewHolder viewHolder = (WalletCardViewHolder) view.getTag();
+ CardView cardView = viewHolder.mCardView;
+ float center = (float) getWidth() / 2f;
+ float viewCenter = (view.getRight() + view.getLeft()) / 2f;
+ float viewWidth = view.getWidth();
+ float position = (viewCenter - center) / viewWidth;
+ float scaleFactor = Math.max(UNSELECTED_CARD_SCALE, 1f - Math.abs(position));
+
+ cardView.setScaleX(scaleFactor);
+ cardView.setScaleY(scaleFactor);
+
+ // a card is the "centered card" until its edge has moved past the center of the recycler
+ // view. note that we also need to factor in the negative margin.
+ // Find the edge that is closer to the center.
+ int edgePosition =
+ viewCenter < center ? view.getRight() + mCardMarginPx
+ : view.getLeft() - mCardMarginPx;
+
+ if (Math.abs(viewCenter - center) < mCardCenterToScreenCenterDistancePx) {
+ int childAdapterPosition = getChildAdapterPosition(view);
+ if (childAdapterPosition == RecyclerView.NO_POSITION) {
+ return;
+ }
+ mCenteredAdapterPosition = getChildAdapterPosition(view);
+ mEdgeToCenterDistance = edgePosition - center;
+ mCardCenterToScreenCenterDistancePx = Math.abs(viewCenter - center);
+ }
+ }
+
+ private class CardCarouselScrollListener extends OnScrollListener {
+
+ private int mOldState = -1;
+
+ @Override
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ if (newState == RecyclerView.SCROLL_STATE_IDLE && newState != mOldState) {
+ performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ }
+ mOldState = newState;
+ }
+
+ /**
+ * Callback method to be invoked when the RecyclerView has been scrolled. This will be
+ * called after the scroll has completed.
+ *
+ * <p>This callback will also be called if visible item range changes after a layout
+ * calculation. In that case, dx and dy will be 0.
+ *
+ * @param recyclerView The RecyclerView which scrolled.
+ * @param dx The amount of horizontal scroll.
+ * @param dy The amount of vertical scroll.
+ */
+ @Override
+ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+ mCenteredAdapterPosition = RecyclerView.NO_POSITION;
+ mEdgeToCenterDistance = Float.MAX_VALUE;
+ mCardCenterToScreenCenterDistancePx = Float.MAX_VALUE;
+ for (int i = 0; i < getChildCount(); i++) {
+ updateCardView(getChildAt(i));
+ }
+ if (mCenteredAdapterPosition == RecyclerView.NO_POSITION || dx == 0) {
+ return;
+ }
+
+ int nextAdapterPosition =
+ mCenteredAdapterPosition + (mEdgeToCenterDistance > 0 ? 1 : -1);
+ if (nextAdapterPosition < 0
+ || nextAdapterPosition >= mWalletCardCarouselAdapter.mData.size()) {
+ return;
+ }
+
+ // Update the label text based on the currently selected card and the next one
+ WalletCardViewInfo centerCard =
+ mWalletCardCarouselAdapter.mData.get(mCenteredAdapterPosition);
+ WalletCardViewInfo nextCard = mWalletCardCarouselAdapter.mData.get(nextAdapterPosition);
+ float percentDistanceFromCenter =
+ Math.abs(mEdgeToCenterDistance) / mCardEdgeToCenterDistance;
+ mCardScrollListener.onCardScroll(centerCard, nextCard, percentDistanceFromCenter);
+ }
+ }
+
+ private class CarouselSnapHelper extends PagerSnapHelper {
+
+ private static final float MILLISECONDS_PER_INCH = 200.0F;
+ private static final int MAX_SCROLL_ON_FLING_DURATION = 80; // ms
+
+ @Override
+ public View findSnapView(LayoutManager layoutManager) {
+ View view = super.findSnapView(layoutManager);
+ if (view == null) {
+ // implementation decides not to snap
+ return null;
+ }
+ WalletCardViewHolder viewHolder = (WalletCardViewHolder) view.getTag();
+ WalletCardViewInfo card = viewHolder.mCardViewInfo;
+ mSelectionListener.onCardSelected(card);
+ mCardScrollListener.onCardScroll(card, card, 0);
+ return view;
+ }
+
+ /**
+ * The default SnapScroller is a little sluggish
+ */
+ @Override
+ protected LinearSmoothScroller createScroller(LayoutManager layoutManager) {
+ return new LinearSmoothScroller(getContext()) {
+ @Override
+ protected void onTargetFound(View targetView, State state, Action action) {
+ int[] snapDistances = calculateDistanceToFinalSnap(layoutManager, targetView);
+ final int dx = snapDistances[0];
+ final int dy = snapDistances[1];
+ final int time = calculateTimeForDeceleration(
+ Math.max(Math.abs(dx), Math.abs(dy)));
+ if (time > 0) {
+ action.update(dx, dy, time, mDecelerateInterpolator);
+ }
+ }
+
+ @Override
+ protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
+ return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
+ }
+
+ @Override
+ protected int calculateTimeForScrolling(int dx) {
+ return Math.min(MAX_SCROLL_ON_FLING_DURATION,
+ super.calculateTimeForScrolling(dx));
+ }
+ };
+ }
+ }
+
+ private class WalletCardCarouselAdapter extends Adapter<WalletCardViewHolder> {
+
+ private List<WalletCardViewInfo> mData = Collections.EMPTY_LIST;
+
+ @NonNull
+ @Override
+ public WalletCardViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
+ View view = inflater.inflate(R.layout.wallet_card_view, viewGroup, false);
+ WalletCardViewHolder viewHolder = new WalletCardViewHolder(view);
+ CardView cardView = viewHolder.mCardView;
+ cardView.setRadius(mCornerRadiusPx);
+ ViewGroup.LayoutParams layoutParams = cardView.getLayoutParams();
+ layoutParams.width = mCardWidthPx;
+ layoutParams.height = mCardHeightPx;
+ view.setTag(viewHolder);
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull WalletCardViewHolder viewHolder, int position) {
+ WalletCardViewInfo cardViewInfo = mData.get(position);
+ viewHolder.mCardViewInfo = cardViewInfo;
+ if (cardViewInfo.getCardId().isEmpty()) {
+ viewHolder.mImageView.setScaleType(ImageView.ScaleType.CENTER);
+ }
+ viewHolder.mImageView.setImageDrawable(cardViewInfo.getCardDrawable());
+ viewHolder.mCardView.setContentDescription(cardViewInfo.getContentDescription());
+ viewHolder.mCardView.setOnClickListener(
+ v -> {
+ if (position != mCenteredAdapterPosition) {
+ smoothScrollToPosition(position);
+ } else {
+ mSelectionListener.onCardClicked(cardViewInfo);
+ }
+ });
+ if (mNumCardsToAnimate > 0 && (position - mCardAnimationStartPosition < 2)) {
+ mNumCardsToAnimate--;
+ int startDelay = (position - mCardAnimationStartPosition) * CARD_ANIM_ALPHA_DELAY
+ + mExtraAnimationDelay;
+ viewHolder.itemView.setAlpha(0f);
+ viewHolder.itemView.animate().alpha(1f)
+ .setStartDelay(Math.max(0, startDelay))
+ .setDuration(CARD_ANIM_ALPHA_DURATION).start();
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return mData.get(position).getCardId().hashCode();
+ }
+
+ void setData(List<WalletCardViewInfo> data) {
+ mData = data;
+ notifyDataSetChanged();
+ }
+ }
+
+ private class CardCarouselAccessibilityDelegate extends RecyclerViewAccessibilityDelegate {
+
+ private CardCarouselAccessibilityDelegate(@NonNull RecyclerView recyclerView) {
+ super(recyclerView);
+ }
+
+ @Override
+ public boolean onRequestSendAccessibilityEvent(
+ ViewGroup viewGroup, View view, AccessibilityEvent accessibilityEvent) {
+ int eventType = accessibilityEvent.getEventType();
+ if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
+ scrollToPosition(getChildAdapterPosition(view));
+ }
+ return super.onRequestSendAccessibilityEvent(viewGroup, view, accessibilityEvent);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java
new file mode 100644
index 0000000..fc1adc3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.cardview.widget.CardView;
+
+import com.android.systemui.R;
+
+/** Customized card view of the wallet card carousel. */
+public class WalletCardView extends CardView {
+ private final Paint mBorderPaint;
+
+ public WalletCardView(@NonNull Context context) {
+ this(context, null);
+ }
+
+ public WalletCardView(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ mBorderPaint = new Paint();
+ mBorderPaint.setColor(context.getColor(R.color.wallet_card_border));
+ mBorderPaint.setStrokeWidth(
+ context.getResources().getDimension(R.dimen.wallet_card_border_width));
+ mBorderPaint.setStyle(Paint.Style.STROKE);
+ mBorderPaint.setAntiAlias(true);
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ float radius = getRadius();
+ canvas.drawRoundRect(0, 0, getWidth(), getHeight(), radius, radius, mBorderPaint);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java
new file mode 100644
index 0000000..3197976
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.cardview.widget.CardView;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.R;
+
+/**
+ * View holder for the quick access wallet card.
+ */
+class WalletCardViewHolder extends RecyclerView.ViewHolder {
+
+ final CardView mCardView;
+ final ImageView mImageView;
+ WalletCardViewInfo mCardViewInfo;
+
+ WalletCardViewHolder(View view) {
+ super(view);
+ mCardView = view.requireViewById(R.id.card);
+ mImageView = mCardView.requireViewById(R.id.card_image);
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java
new file mode 100644
index 0000000..669d666
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+interface WalletCardViewInfo {
+ String getCardId();
+
+ /**
+ * Image of the card.
+ */
+ @NonNull
+ Drawable getCardDrawable();
+
+ /**
+ * Content description for the card.
+ */
+ @Nullable
+ CharSequence getContentDescription();
+
+ /**
+ * Icon shown above the card.
+ */
+ @Nullable
+ Drawable getIcon();
+
+ /**
+ * Text shown above the card.
+ */
+ @NonNull
+ CharSequence getLabel();
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java
new file mode 100644
index 0000000..a93f0f0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.os.Handler;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsRequest;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.service.quickaccesswallet.SelectWalletCardRequest;
+import android.service.quickaccesswallet.WalletCard;
+import android.service.quickaccesswallet.WalletServiceEvent;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.settings.UserTracker;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+/** Controller for the wallet card carousel screen. */
+public class WalletScreenController implements
+ WalletCardCarousel.OnSelectionListener,
+ QuickAccessWalletClient.OnWalletCardsRetrievedCallback,
+ QuickAccessWalletClient.WalletServiceEventListener {
+
+ private static final String TAG = "WalletScreenCtrl";
+ private static final String PREFS_HAS_CARDS = "has_cards";
+ private static final String PREFS_WALLET_VIEW_HEIGHT = "wallet_view_height";
+ private static final int MAX_CARDS = 10;
+ private static final long SELECTION_DELAY_MILLIS = TimeUnit.SECONDS.toMillis(30);
+
+ private Context mContext;
+ private final QuickAccessWalletClient mWalletClient;
+ private final ActivityStarter mActivityStarter;
+ private final Executor mExecutor;
+ private final Handler mHandler;
+ private final Runnable mSelectionRunnable = this::selectCard;
+ private final SharedPreferences mPrefs;
+ private final WalletView mWalletView;
+ private final WalletCardCarousel mCardCarousel;
+
+ @VisibleForTesting String mSelectedCardId;
+ @VisibleForTesting boolean mIsDismissed;
+ private boolean mIsDeviceLocked;
+ private boolean mHasRegisteredListener;
+
+ public WalletScreenController(
+ Context context,
+ WalletView walletView,
+ QuickAccessWalletClient walletClient,
+ ActivityStarter activityStarter,
+ Executor executor,
+ Handler handler,
+ UserTracker userTracker,
+ boolean isDeviceLocked) {
+ mContext = context;
+ mWalletClient = walletClient;
+ mActivityStarter = activityStarter;
+ mExecutor = executor;
+ mHandler = handler;
+ mPrefs = userTracker.getUserContext().getSharedPreferences(TAG, Context.MODE_PRIVATE);
+ mWalletView = walletView;
+ mWalletView.setMinimumHeight(getExpectedMinHeight());
+ mWalletView.setLayoutParams(
+ new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+ mCardCarousel = mWalletView.getCardCarousel();
+ if (mCardCarousel != null) {
+ mCardCarousel.setSelectionListener(this);
+ }
+
+ if (!mPrefs.getBoolean(PREFS_HAS_CARDS, false)) {
+ // The empty state view is shown preemptively when cards were not returned last time
+ // to decrease perceived latency.
+ showEmptyStateView();
+ }
+ mIsDeviceLocked = isDeviceLocked;
+ }
+
+ /**
+ * Implements {@link QuickAccessWalletClient.OnWalletCardsRetrievedCallback}. Called when cards
+ * are retrieved successfully from the service. This is called on {@link #mExecutor}.
+ */
+ @Override
+ public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
+ if (mIsDismissed) {
+ return;
+ }
+ List<WalletCard> walletCards = response.getWalletCards();
+ List<WalletCardViewInfo> data = new ArrayList<>(walletCards.size());
+ for (WalletCard card : walletCards) {
+ data.add(new QAWalletCardViewInfo(mContext, card));
+ }
+ mHandler.post(() -> {
+ if (data.isEmpty()) {
+ showEmptyStateView();
+ } else {
+ mWalletView.showCardCarousel(data, response.getSelectedIndex(), mIsDeviceLocked);
+ }
+ // The empty state view will not be shown preemptively next time if cards were returned
+ mPrefs.edit().putBoolean(PREFS_HAS_CARDS, !data.isEmpty()).apply();
+ removeMinHeightAndRecordHeightOnLayout();
+ });
+ }
+
+ /**
+ * Implements {@link QuickAccessWalletClient.OnWalletCardsRetrievedCallback}. Called when there
+ * is an error during card retrieval. This will be run on the {@link #mExecutor}.
+ */
+ @Override
+ public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
+ if (mIsDismissed) {
+ return;
+ }
+ mHandler.post(() -> {
+ mWalletView.showErrorMessage(error.getMessage());
+ });
+ }
+
+ /**
+ * Implements {@link QuickAccessWalletClient.WalletServiceEventListener}. Called when the wallet
+ * application propagates an event, such as an NFC tap, to the quick access wallet view.
+ */
+ @Override
+ public void onWalletServiceEvent(WalletServiceEvent event) {
+ if (mIsDismissed) {
+ return;
+ }
+ switch (event.getEventType()) {
+ case WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED:
+ onDismissed();
+ break;
+ case WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED:
+ queryWalletCards();
+ break;
+ default:
+ Log.w(TAG, "onWalletServiceEvent: Unknown event type");
+ }
+ }
+
+ @Override
+ public void onCardSelected(@NonNull WalletCardViewInfo card) {
+ if (mIsDismissed) {
+ return;
+ }
+ mSelectedCardId = card.getCardId();
+ selectCard();
+ }
+
+ private void selectCard() {
+ mHandler.removeCallbacks(mSelectionRunnable);
+ String selectedCardId = mSelectedCardId;
+ if (mIsDismissed || selectedCardId == null) {
+ return;
+ }
+ mWalletClient.selectWalletCard(new SelectWalletCardRequest(selectedCardId));
+ // Re-selecting the card keeps the connection bound so we continue to get service events
+ // even if the user keeps it open for a long time.
+ mHandler.postDelayed(mSelectionRunnable, SELECTION_DELAY_MILLIS);
+ }
+
+
+
+ @Override
+ public void onCardClicked(@NonNull WalletCardViewInfo cardInfo) {
+ if (!(cardInfo instanceof QAWalletCardViewInfo)
+ || ((QAWalletCardViewInfo) cardInfo).mWalletCard == null
+ || ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent() == null) {
+ return;
+ }
+ mActivityStarter.startActivity(
+ ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent().getIntent(),
+ true);
+ }
+
+ @Override
+ public void queryWalletCards() {
+ if (mIsDismissed) {
+ return;
+ }
+ if (!mHasRegisteredListener) {
+ // Listener is registered even when device is locked. Should only be registered once.
+ mWalletClient.addWalletServiceEventListener(this);
+ mHasRegisteredListener = true;
+ }
+
+ mWalletView.show();
+ mWalletView.hideErrorMessage();
+ int iconSizePx = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_icon_size);
+ int cardWidthPx = mCardCarousel.getCardWidthPx();
+ int cardHeightPx = mCardCarousel.getCardHeightPx();
+ GetWalletCardsRequest request =
+ new GetWalletCardsRequest(cardWidthPx, cardHeightPx, iconSizePx, MAX_CARDS);
+ mWalletClient.getWalletCards(mExecutor, request, this);
+ }
+
+ void onDismissed() {
+ if (mIsDismissed) {
+ return;
+ }
+ mIsDismissed = true;
+ mSelectedCardId = null;
+ mHandler.removeCallbacks(mSelectionRunnable);
+ mWalletClient.notifyWalletDismissed();
+ mWalletClient.removeWalletServiceEventListener(this);
+ mWalletView.animateDismissal();
+ // clear refs to the Wallet Activity
+ mContext = null;
+ }
+
+ private void showEmptyStateView() {
+ Drawable logo = mWalletClient.getLogo();
+ CharSequence logoContentDesc = mWalletClient.getServiceLabel();
+ CharSequence label = mWalletClient.getShortcutLongLabel();
+ Intent intent = mWalletClient.createWalletIntent();
+ if (logo == null
+ || TextUtils.isEmpty(logoContentDesc)
+ || TextUtils.isEmpty(label)
+ || intent == null) {
+ Log.w(TAG, "QuickAccessWalletService manifest entry mis-configured");
+ // Issue is not likely to be resolved until manifest entries are enabled.
+ // Hide wallet feature until then.
+ mWalletView.hide();
+ mPrefs.edit().putInt(PREFS_WALLET_VIEW_HEIGHT, 0).apply();
+ } else {
+ logo.setTint(mContext.getColor(R.color.GM2_grey_900));
+ mWalletView.showEmptyStateView(
+ logo,
+ logoContentDesc,
+ label,
+ v -> mActivityStarter.startActivity(intent, true));
+ }
+ }
+
+ private int getExpectedMinHeight() {
+ int expectedHeight = mPrefs.getInt(PREFS_WALLET_VIEW_HEIGHT, -1);
+ if (expectedHeight == -1) {
+ Resources res = mContext.getResources();
+ expectedHeight = res.getDimensionPixelSize(R.dimen.min_wallet_empty_height);
+ }
+ return expectedHeight;
+ }
+
+ private void removeMinHeightAndRecordHeightOnLayout() {
+ mWalletView.setMinimumHeight(0);
+ mWalletView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ mWalletView.removeOnLayoutChangeListener(this);
+ mPrefs.edit().putInt(PREFS_WALLET_VIEW_HEIGHT, bottom - top).apply();
+ }
+ });
+ }
+
+ @VisibleForTesting
+ static class QAWalletCardViewInfo implements WalletCardViewInfo {
+
+ private final WalletCard mWalletCard;
+ private final Drawable mCardDrawable;
+ private final Drawable mIconDrawable;
+
+ /**
+ * Constructor is called on background executor, so it is safe to load drawables
+ * synchronously.
+ */
+ QAWalletCardViewInfo(Context context, WalletCard walletCard) {
+ mWalletCard = walletCard;
+ mCardDrawable = mWalletCard.getCardImage().loadDrawable(context);
+ Icon icon = mWalletCard.getCardIcon();
+ mIconDrawable = icon == null ? null : icon.loadDrawable(context);
+ }
+
+ @Override
+ public String getCardId() {
+ return mWalletCard.getCardId();
+ }
+
+ @Override
+ public Drawable getCardDrawable() {
+ return mCardDrawable;
+ }
+
+ @Override
+ public CharSequence getContentDescription() {
+ return mWalletCard.getContentDescription();
+ }
+
+ @Override
+ public Drawable getIcon() {
+ return mIconDrawable;
+ }
+
+ @Override
+ public CharSequence getLabel() {
+ return mWalletCard.getCardLabel();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java
new file mode 100644
index 0000000..d2f0720
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import static com.android.systemui.wallet.ui.WalletCardCarousel.CARD_ANIM_ALPHA_DELAY;
+import static com.android.systemui.wallet.ui.WalletCardCarousel.CARD_ANIM_ALPHA_DURATION;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+
+import java.util.List;
+
+/** Layout for the wallet screen. */
+public class WalletView extends FrameLayout implements WalletCardCarousel.OnCardScrollListener {
+
+ private static final int CAROUSEL_IN_ANIMATION_DURATION = 300;
+ private static final int CAROUSEL_OUT_ANIMATION_DURATION = 200;
+ private static final int CARD_LABEL_ANIM_DELAY = 133;
+ private static final int CONTACTLESS_ICON_SIZE = 90;
+
+ private final WalletCardCarousel mCardCarousel;
+ private final ImageView mIcon;
+ private final TextView mCardLabel;
+ private final Button mWalletButton;
+ private final Interpolator mInInterpolator;
+ private final Interpolator mOutInterpolator;
+ private final float mAnimationTranslationX;
+ private final ViewGroup mCardCarouselContainer;
+ private final TextView mErrorView;
+ private final ViewGroup mEmptyStateView;
+ private CharSequence mCenterCardText;
+
+ public WalletView(Context context) {
+ this(context, null);
+ }
+
+ public WalletView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ inflate(context, R.layout.wallet_fullscreen, this);
+ mCardCarouselContainer = requireViewById(R.id.card_carousel_container);
+ mCardCarousel = requireViewById(R.id.card_carousel);
+ mCardCarousel.setCardScrollListener(this);
+ mIcon = requireViewById(R.id.icon);
+ mCardLabel = requireViewById(R.id.label);
+ mWalletButton = requireViewById(R.id.wallet_button);
+ mErrorView = requireViewById(R.id.error_view);
+ mEmptyStateView = requireViewById(R.id.wallet_empty_state);
+ mInInterpolator =
+ AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in);
+ mOutInterpolator =
+ AnimationUtils.loadInterpolator(context, android.R.interpolator.accelerate_cubic);
+ mAnimationTranslationX = mCardCarousel.getCardWidthPx() / 4f;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ mCardCarousel.setExpectedViewWidth(getWidth());
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // Forward touch events to card carousel to allow for swiping outside carousel bounds.
+ return mCardCarousel.onTouchEvent(event) || super.onTouchEvent(event);
+ }
+
+ @Override
+ public void onCardScroll(WalletCardViewInfo centerCard, WalletCardViewInfo nextCard,
+ float percentDistanceFromCenter) {
+ CharSequence centerCardText = centerCard.getLabel();
+ Drawable icon = centerCard.getIcon();
+ if (icon != null) {
+ mIcon.setImageDrawable(resizeDrawable(getResources(), icon));
+ mIcon.setVisibility(VISIBLE);
+ } else {
+ mIcon.setVisibility(INVISIBLE);
+ }
+ if (!TextUtils.equals(mCenterCardText, centerCardText)) {
+ mCenterCardText = centerCardText;
+ mCardLabel.setText(centerCardText);
+ }
+ if (TextUtils.equals(centerCardText, nextCard.getLabel())) {
+ mCardLabel.setAlpha(1f);
+ } else {
+ mCardLabel.setAlpha(percentDistanceFromCenter);
+ mIcon.setAlpha(percentDistanceFromCenter);
+ }
+ }
+
+ void showCardCarousel(
+ List<WalletCardViewInfo> data, int selectedIndex, boolean isDeviceLocked) {
+ boolean shouldAnimate = mCardCarousel.setData(data, selectedIndex);
+ mCardCarouselContainer.setVisibility(VISIBLE);
+ mErrorView.setVisibility(GONE);
+ if (isDeviceLocked) {
+ // TODO(b/182964813): Add click action to prompt device unlock.
+ mWalletButton.setText(R.string.wallet_button_label_device_locked);
+ } else {
+ mWalletButton.setText(R.string.wallet_button_label_device_unlocked);
+ }
+ if (shouldAnimate) {
+ // If the empty state is visible, animate it away and delay the card carousel animation
+ int emptyStateAnimDelay = 0;
+ if (mEmptyStateView.getVisibility() == VISIBLE) {
+ emptyStateAnimDelay = CARD_ANIM_ALPHA_DURATION;
+ mEmptyStateView.animate()
+ .alpha(0)
+ .setDuration(emptyStateAnimDelay)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mEmptyStateView.setVisibility(GONE);
+ }
+ })
+ .start();
+ }
+ mCardLabel.setAlpha(0f);
+ mCardLabel.animate().alpha(1f)
+ .setStartDelay(CARD_LABEL_ANIM_DELAY + emptyStateAnimDelay)
+ .setDuration(CARD_ANIM_ALPHA_DURATION)
+ .start();
+ mCardCarousel.setExtraAnimationDelay(emptyStateAnimDelay);
+ mCardCarousel.setTranslationX(mAnimationTranslationX);
+ mCardCarousel.animate().translationX(0)
+ .setInterpolator(mInInterpolator)
+ .setDuration(CAROUSEL_IN_ANIMATION_DURATION)
+ .setStartDelay(emptyStateAnimDelay)
+ .start();
+ }
+ }
+
+ void animateDismissal() {
+ if (mCardCarouselContainer.getVisibility() != VISIBLE) {
+ return;
+ }
+ mCardCarousel.animate().translationX(mAnimationTranslationX)
+ .setInterpolator(mOutInterpolator)
+ .setDuration(CAROUSEL_OUT_ANIMATION_DURATION)
+ .start();
+ mCardCarouselContainer.animate()
+ .alpha(0f)
+ .setDuration(CARD_ANIM_ALPHA_DURATION)
+ .setStartDelay(CARD_ANIM_ALPHA_DELAY)
+ .start();
+ }
+
+ void showEmptyStateView(Drawable logo, CharSequence logoContentDescription, CharSequence label,
+ OnClickListener clickListener) {
+ mEmptyStateView.setVisibility(VISIBLE);
+ mErrorView.setVisibility(GONE);
+ mCardCarouselContainer.setVisibility(GONE);
+ ImageView logoView = mEmptyStateView.requireViewById(R.id.empty_state_icon);
+ logoView.setImageDrawable(logo);
+ logoView.setContentDescription(logoContentDescription);
+ mEmptyStateView.<TextView>requireViewById(R.id.empty_state_title).setText(label);
+ mEmptyStateView.setOnClickListener(clickListener);
+ }
+
+ void showErrorMessage(@Nullable CharSequence message) {
+ if (TextUtils.isEmpty(message)) {
+ message = getResources().getText(R.string.wallet_error_generic);
+ }
+ mErrorView.setText(message);
+ mErrorView.setVisibility(VISIBLE);
+ mCardCarouselContainer.setVisibility(GONE);
+ mEmptyStateView.setVisibility(GONE);
+ }
+
+ void hide() {
+ setVisibility(GONE);
+ }
+
+ void show() {
+ setVisibility(VISIBLE);
+ }
+
+ void hideErrorMessage() {
+ mErrorView.setVisibility(GONE);
+ }
+
+ WalletCardCarousel getCardCarousel() {
+ return mCardCarousel;
+ }
+
+ Button getWalletButton() {
+ return mWalletButton;
+ }
+
+ @VisibleForTesting
+ TextView getErrorView() {
+ return mErrorView;
+ }
+
+ @VisibleForTesting
+ ViewGroup getEmptyStateView() {
+ return mEmptyStateView;
+ }
+
+ @VisibleForTesting
+ ViewGroup getCardCarouselContainer() {
+ return mCardCarouselContainer;
+ }
+
+ private static Drawable resizeDrawable(Resources resources, Drawable drawable) {
+ Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
+ return new BitmapDrawable(resources, Bitmap.createScaledBitmap(
+ bitmap, CONTACTLESS_ICON_SIZE, CONTACTLESS_ICON_SIZE, true));
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java
index 82dad68..2216a91 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java
@@ -34,6 +34,7 @@
import com.android.wm.shell.pip.PipBoundsAlgorithm;
import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController;
+import com.android.wm.shell.pip.PipSnapAlgorithm;
import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
import com.android.wm.shell.pip.PipTaskOrganizer;
import com.android.wm.shell.pip.PipTransitionController;
@@ -85,9 +86,15 @@
@WMSingleton
@Provides
- static PipBoundsAlgorithm providePipBoundsHandler(Context context,
- PipBoundsState pipBoundsState) {
- return new PipBoundsAlgorithm(context, pipBoundsState);
+ static PipSnapAlgorithm providePipSnapAlgorithm() {
+ return new PipSnapAlgorithm();
+ }
+
+ @WMSingleton
+ @Provides
+ static PipBoundsAlgorithm providePipBoundsAlgorithm(Context context,
+ PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) {
+ return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm);
}
@WMSingleton
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
index af94876..33b2d67 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
@@ -43,6 +43,7 @@
import com.android.wm.shell.pip.PipBoundsAlgorithm;
import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController;
+import com.android.wm.shell.pip.PipSnapAlgorithm;
import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
import com.android.wm.shell.pip.PipTaskOrganizer;
import com.android.wm.shell.pip.PipTransition;
@@ -51,6 +52,7 @@
import com.android.wm.shell.pip.phone.PhonePipMenuController;
import com.android.wm.shell.pip.phone.PipAppOpsListener;
import com.android.wm.shell.pip.phone.PipController;
+import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.transition.Transitions;
@@ -140,9 +142,15 @@
@WMSingleton
@Provides
- static PipBoundsAlgorithm providesPipBoundsHandler(Context context,
- PipBoundsState pipBoundsState) {
- return new PipBoundsAlgorithm(context, pipBoundsState);
+ static PipSnapAlgorithm providePipSnapAlgorithm() {
+ return new PipSnapAlgorithm();
+ }
+
+ @WMSingleton
+ @Provides
+ static PipBoundsAlgorithm providesPipBoundsAlgorithm(Context context,
+ PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) {
+ return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm);
}
// Handler is used by Icon.loadDrawableAsync
@@ -162,12 +170,12 @@
PhonePipMenuController menuPhoneController, PipBoundsAlgorithm pipBoundsAlgorithm,
PipBoundsState pipBoundsState,
PipTaskOrganizer pipTaskOrganizer,
- PipTransitionController pipTransitionController,
+ PipMotionHelper pipMotionHelper,
FloatingContentCoordinator floatingContentCoordinator,
PipUiEventLogger pipUiEventLogger,
@ShellMainThread ShellExecutor mainExecutor) {
return new PipTouchHandler(context, menuPhoneController, pipBoundsAlgorithm,
- pipBoundsState, pipTaskOrganizer, pipTransitionController,
+ pipBoundsState, pipTaskOrganizer, pipMotionHelper,
floatingContentCoordinator, pipUiEventLogger, mainExecutor);
}
@@ -208,4 +216,16 @@
return new PipTransition(context, pipBoundsState, pipMenuController,
pipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer);
}
+
+ @WMSingleton
+ @Provides
+ static PipMotionHelper providePipMotionHelper(Context context,
+ PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer,
+ PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm,
+ PipTransitionController pipTransitionController,
+ FloatingContentCoordinator floatingContentCoordinator) {
+ return new PipMotionHelper(context, pipBoundsState, pipTaskOrganizer,
+ menuController, pipSnapAlgorithm, pipTransitionController,
+ floatingContentCoordinator);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
index 714f1f2..4d52650 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
@@ -124,4 +124,11 @@
((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
}
+
+ @Test
+ public void testUpdateKeyguardPositionDelegatesToSecurityContainer() {
+ mKeyguardHostViewController.updateKeyguardPosition(1.0f);
+
+ verify(mKeyguardSecurityContainerController).updateKeyguardPosition(1.0f);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
index 99b3f6f..ca857c5 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
@@ -177,4 +177,10 @@
mKeyguardSecurityContainerController.updateResources();
verify(mView, times(1)).updateLayoutForSecurityMode(any());
}
+
+ @Test
+ public void updateKeyguardPosition_callsThroughToView() {
+ mKeyguardSecurityContainerController.updateKeyguardPosition(1.0f);
+ verify(mView).updateKeyguardPosition(1.0f);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index 104318e..9557d5c 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
@@ -19,6 +19,9 @@
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.systemBars;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -198,6 +201,46 @@
verify(mSecurityViewFlipper).measure(FAKE_MEASURE_SPEC, expectedHeightMeasureSpec);
}
+ private void setupForUpdateKeyguardPosition(SecurityMode securityMode) {
+ setUpKeyguard(
+ /* deviceConfigCanUseOneHandedKeyguard= */true,
+ /* sysuiResourceCanUseOneHandedKeyguard= */ true,
+ securityMode);
+
+ mKeyguardSecurityContainer.measure(FAKE_MEASURE_SPEC, FAKE_MEASURE_SPEC);
+ mKeyguardSecurityContainer.layout(0, 0, SCREEN_WIDTH, SCREEN_WIDTH);
+
+ // Start off left-aligned. This should happen anyway, but just do this to ensure
+ // definitely move to the left.
+ mKeyguardSecurityContainer.updateKeyguardPosition(0.0f);
+
+ // Clear any interactions with the mock so we know the interactions definitely come from the
+ // below testing.
+ reset(mSecurityViewFlipper);
+ }
+
+ @Test
+ public void updateKeyguardPosition_movesKeyguard() {
+ setupForUpdateKeyguardPosition(ONE_HANDED_SECURITY_MODE);
+
+ mKeyguardSecurityContainer.updateKeyguardPosition((SCREEN_WIDTH / 4f) * 3f);
+ verify(mSecurityViewFlipper).setTranslationX(SCREEN_WIDTH / 2.0f);
+
+ mKeyguardSecurityContainer.updateKeyguardPosition(0.0f);
+ verify(mSecurityViewFlipper).setTranslationX(0.0f);
+ }
+
+ @Test
+ public void updateKeyguardPosition_doesntMoveTwoHandedKeyguard() {
+ setupForUpdateKeyguardPosition(TWO_HANDED_SECURITY_MODE);
+
+ mKeyguardSecurityContainer.updateKeyguardPosition((SCREEN_WIDTH / 4f) * 3f);
+ verify(mSecurityViewFlipper, never()).setTranslationX(anyInt());
+
+ mKeyguardSecurityContainer.updateKeyguardPosition(0.0f);
+ verify(mSecurityViewFlipper, never()).setTranslationX(anyInt());
+ }
+
private void setUpKeyguard(
boolean deviceConfigCanUseOneHandedKeyguard,
boolean sysuiResourceCanUseOneHandedKeyguard,
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 44c3b26..d544f73 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -881,6 +881,51 @@
}
@Test
+ public void testShouldNotListenForUdfps_whenTrustEnabled() {
+ // GIVEN a "we should listen for udfps" state
+ setKeyguardBouncerVisibility(false /* isVisible */);
+ mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+ when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+ // WHEN trust is enabled (ie: via smartlock)
+ mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */,
+ KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */);
+
+ // THEN we shouldn't listen for udfps
+ assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+ }
+
+ @Test
+ public void testShouldNotListenForUdfps_whenFaceAuthenticated() {
+ // GIVEN a "we should listen for udfps" state
+ setKeyguardBouncerVisibility(false /* isVisible */);
+ mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+ when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+ // WHEN face authenticated
+ mKeyguardUpdateMonitor.onFaceAuthenticated(
+ KeyguardUpdateMonitor.getCurrentUser(), false);
+
+ // THEN we shouldn't listen for udfps
+ assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+ }
+
+ @Test
+ public void testShouldNotListenForUdfps_whenInLockDown() {
+ // GIVEN a "we should listen for udfps" state
+ setKeyguardBouncerVisibility(false /* isVisible */);
+ mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+ when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+ // WHEN device in lock down
+ when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn(
+ KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
+
+ // THEN we shouldn't listen for udfps
+ assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+ }
+
+ @Test
public void testRequireUnlockForNfc_Broadcast() {
KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class);
mKeyguardUpdateMonitor.registerCallback(callback);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
index 8683dd6..814f073 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
@@ -31,6 +31,7 @@
import android.content.Context;
import android.content.res.Resources;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
@@ -40,6 +41,7 @@
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
@@ -78,6 +80,8 @@
private RecyclerView mListView;
+ private Rect mAvailableBounds = new Rect(100, 200, 300, 400);
+
private int mMenuHalfWidth;
private int mMenuHalfHeight;
private int mScreenHalfWidth;
@@ -339,6 +343,66 @@
assertThat(mMenuView.mShapeType).isEqualTo(/* halfOval */ 1);
}
+ @Test
+ public void getAccessibilityActionList_matchResult() {
+ final AccessibilityNodeInfo infos = new AccessibilityNodeInfo();
+ mMenuView.onInitializeAccessibilityNodeInfo(infos);
+
+ assertThat(infos.getActionList().size()).isEqualTo(4);
+ }
+
+ @Test
+ public void accessibilityActionMove_moveTopLeft_success() {
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext));
+ doReturn(mAvailableBounds).when(menuView).getAvailableBounds();
+
+ final boolean isActionPerformed =
+ menuView.performAccessibilityAction(R.id.action_move_top_left, null);
+
+ assertThat(isActionPerformed).isTrue();
+ verify(menuView).snapToLocation(mAvailableBounds.left, mAvailableBounds.top);
+ }
+
+ @Test
+ public void accessibilityActionMove_moveTopRight_success() {
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext));
+ doReturn(mAvailableBounds).when(menuView).getAvailableBounds();
+
+ final boolean isActionPerformed =
+ menuView.performAccessibilityAction(R.id.action_move_top_right, null);
+
+ assertThat(isActionPerformed).isTrue();
+ verify(menuView).snapToLocation(mAvailableBounds.right, mAvailableBounds.top);
+ }
+
+ @Test
+ public void accessibilityActionMove_moveBottomLeft_success() {
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext));
+ doReturn(mAvailableBounds).when(menuView).getAvailableBounds();
+
+ final boolean isActionPerformed =
+ menuView.performAccessibilityAction(R.id.action_move_bottom_left, null);
+
+ assertThat(isActionPerformed).isTrue();
+ verify(menuView).snapToLocation(mAvailableBounds.left, mAvailableBounds.bottom);
+ }
+
+ @Test
+ public void accessibilityActionMove_moveBottomRight_success() {
+ final AccessibilityFloatingMenuView menuView =
+ spy(new AccessibilityFloatingMenuView(mContext));
+ doReturn(mAvailableBounds).when(menuView).getAvailableBounds();
+
+ final boolean isActionPerformed =
+ menuView.performAccessibilityAction(R.id.action_move_bottom_right, null);
+
+ assertThat(isActionPerformed).isTrue();
+ verify(menuView).snapToLocation(mAvailableBounds.right, mAvailableBounds.bottom);
+ }
+
@After
public void tearDown() {
mInterceptMotionEvent = null;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
index 1565dee..36a031a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
@@ -26,11 +26,7 @@
import static org.mockito.Mockito.verify;
import android.content.Context;
-import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.PromptInfo;
-import android.hardware.biometrics.SensorProperties;
-import android.hardware.fingerprint.FingerprintSensorProperties;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
@@ -50,9 +46,6 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.util.ArrayList;
-import java.util.List;
-
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
@@ -334,86 +327,6 @@
verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL);
}
- @Test
- public void testUdfpsBottomSpacerHeightForPortrait() {
- final int displayHeightPx = 3000;
- final int navbarHeightPx = 10;
- final int dialogBottomMarginPx = 20;
- final int buttonBarHeightPx = 100;
- final int textIndicatorHeightPx = 200;
-
- final int sensorLocationX = 540;
- final int sensorLocationY = 1600;
- final int sensorRadius = 100;
-
- final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
- componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
- "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
- "00000001" /* serialNumber */, "" /* softwareVersion */));
- componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
- "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
- "vendor/version/revision" /* softwareVersion */));
-
- final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
- 0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
- componentInfo,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
- true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
- sensorRadius);
-
- assertEquals(970,
- AuthBiometricUdfpsView.calculateBottomSpacerHeightForPortrait(
- props, displayHeightPx, textIndicatorHeightPx, buttonBarHeightPx,
- dialogBottomMarginPx, navbarHeightPx
- ));
- }
-
- @Test
- public void testUdfpsBottomSpacerHeightForLandscape() {
- final int titleHeightPx = 320;
- final int subtitleHeightPx = 240;
- final int descriptionHeightPx = 200;
- final int topSpacerHeightPx = 550;
- final int textIndicatorHeightPx = 190;
- final int buttonBarHeightPx = 160;
- final int navbarBottomInsetPx = 75;
-
- assertEquals(885,
- AuthBiometricUdfpsView.calculateBottomSpacerHeightForLandscape(
- titleHeightPx, subtitleHeightPx, descriptionHeightPx, topSpacerHeightPx,
- textIndicatorHeightPx, buttonBarHeightPx, navbarBottomInsetPx));
- }
-
- @Test
- public void testUdfpsHorizontalSpacerWidthForLandscape() {
- final int displayWidthPx = 3000;
- final int dialogMarginPx = 20;
- final int navbarHorizontalInsetPx = 75;
-
- final int sensorLocationX = 540;
- final int sensorLocationY = 1600;
- final int sensorRadius = 100;
-
- final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
- componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
- "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
- "00000001" /* serialNumber */, "" /* softwareVersion */));
- componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
- "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
- "vendor/version/revision" /* softwareVersion */));
-
- final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
- 0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
- componentInfo,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
- true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
- sensorRadius);
-
- assertEquals(1205,
- AuthBiometricUdfpsView.calculateHorizontalSpacerWidthForLandscape(
- props, displayWidthPx, dialogMarginPx, navbarHorizontalInsetPx));
- }
-
private PromptInfo buildPromptInfo(boolean allowDeviceCredential) {
PromptInfo promptInfo = new PromptInfo();
promptInfo.setTitle("Title");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index d3694dd..9504970 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -43,9 +43,11 @@
import androidx.test.filters.SmallTest;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -100,6 +102,10 @@
@Mock
private AuthRippleController mAuthRippleController;
@Mock
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @Mock
+ private KeyguardViewMediator mKeyguardViewMediator;
+ @Mock
private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback;
private FakeExecutor mFgExecutor;
@@ -151,7 +157,9 @@
mStatusBar,
mStatusBarKeyguardViewManager,
mDumpManager,
- mAuthRippleController);
+ mAuthRippleController,
+ mKeyguardUpdateMonitor,
+ mKeyguardViewMediator);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java
new file mode 100644
index 0000000..ee13d23
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2021 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.biometrics;
+
+import static org.junit.Assert.assertEquals;
+
+import android.hardware.biometrics.ComponentInfoInternal;
+import android.hardware.biometrics.SensorProperties;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class UdfpsDialogMeasureAdapterTest extends SysuiTestCase {
+ @Test
+ public void testUdfpsBottomSpacerHeightForPortrait() {
+ final int displayHeightPx = 3000;
+ final int navbarHeightPx = 10;
+ final int dialogBottomMarginPx = 20;
+ final int buttonBarHeightPx = 100;
+ final int textIndicatorHeightPx = 200;
+
+ final int sensorLocationX = 540;
+ final int sensorLocationY = 1600;
+ final int sensorRadius = 100;
+
+ final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+ componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
+ "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
+ "00000001" /* serialNumber */, "" /* softwareVersion */));
+ componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
+ "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
+ "vendor/version/revision" /* softwareVersion */));
+
+ final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
+ 0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
+ componentInfo,
+ FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
+ true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
+ sensorRadius);
+
+ assertEquals(970,
+ UdfpsDialogMeasureAdapter.calculateBottomSpacerHeightForPortrait(
+ props, displayHeightPx, textIndicatorHeightPx, buttonBarHeightPx,
+ dialogBottomMarginPx, navbarHeightPx
+ ));
+ }
+
+ @Test
+ public void testUdfpsBottomSpacerHeightForLandscape() {
+ final int titleHeightPx = 320;
+ final int subtitleHeightPx = 240;
+ final int descriptionHeightPx = 200;
+ final int topSpacerHeightPx = 550;
+ final int textIndicatorHeightPx = 190;
+ final int buttonBarHeightPx = 160;
+ final int navbarBottomInsetPx = 75;
+
+ assertEquals(885,
+ UdfpsDialogMeasureAdapter.calculateBottomSpacerHeightForLandscape(
+ titleHeightPx, subtitleHeightPx, descriptionHeightPx, topSpacerHeightPx,
+ textIndicatorHeightPx, buttonBarHeightPx, navbarBottomInsetPx));
+ }
+
+ @Test
+ public void testUdfpsHorizontalSpacerWidthForLandscape() {
+ final int displayWidthPx = 3000;
+ final int dialogMarginPx = 20;
+ final int navbarHorizontalInsetPx = 75;
+
+ final int sensorLocationX = 540;
+ final int sensorLocationY = 1600;
+ final int sensorRadius = 100;
+
+ final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+ componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
+ "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
+ "00000001" /* serialNumber */, "" /* softwareVersion */));
+ componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
+ "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
+ "vendor/version/revision" /* softwareVersion */));
+
+ final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
+ 0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
+ componentInfo,
+ FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
+ true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
+ sensorRadius);
+
+ assertEquals(1205,
+ UdfpsDialogMeasureAdapter.calculateHorizontalSpacerWidthForLandscape(
+ props, displayWidthPx, dialogMarginPx, navbarHorizontalInsetPx));
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
index 4410992..2383c7b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
@@ -18,7 +18,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -27,12 +27,15 @@
import androidx.test.filters.SmallTest;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.util.concurrency.DelayableExecutor;
import org.junit.Before;
import org.junit.Test;
@@ -42,7 +45,6 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.util.List;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -59,12 +61,17 @@
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock
private DumpManager mDumpManager;
+ @Mock
+ private DelayableExecutor mExecutor;
+ @Mock
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @Mock
+ private KeyguardViewMediator mKeyguardViewMediator;
private UdfpsKeyguardViewController mController;
// Capture listeners so that they can be used to send events
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor;
- private StatusBarStateController.StateListener mParentStatusBarStateListener;
private StatusBarStateController.StateListener mStatusBarStateListener;
@Captor private ArgumentCaptor<StatusBar.ExpansionChangedListener> mExpansionListenerCaptor;
@@ -77,12 +84,16 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
mController = new UdfpsKeyguardViewController(
mView,
mStatusBarStateController,
mStatusBar,
mStatusBarKeyguardViewManager,
- mDumpManager);
+ mKeyguardUpdateMonitor,
+ mExecutor,
+ mDumpManager,
+ mKeyguardViewMediator);
}
@Test
@@ -100,7 +111,7 @@
@Test
public void testViewControllerQueriesSBStateOnAttached() {
mController.onViewAttached();
- verify(mStatusBarStateController, times(2)).getState();
+ verify(mStatusBarStateController).getState();
verify(mStatusBarStateController).getDozeAmount();
final float dozeAmount = .88f;
@@ -109,7 +120,7 @@
captureStatusBarStateListeners();
mController.onViewAttached();
- verify(mView).setPauseAuth(true);
+ verify(mView, atLeast(1)).setPauseAuth(true);
verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount);
}
@@ -120,7 +131,6 @@
captureExpansionListener();
mController.onViewDetached();
- verify(mStatusBarStateController).removeCallback(mParentStatusBarStateListener);
verify(mStatusBarStateController).removeCallback(mStatusBarStateListener);
verify(mStatusBar).removeExpansionChangedListener(mExpansionListener);
}
@@ -160,6 +170,47 @@
}
@Test
+ public void testShouldPauseAuthOnShade() {
+ mController.onViewAttached();
+ captureStatusBarStateListeners();
+ captureExpansionListener();
+
+ // WHEN not on keyguard yet (shade = home)
+ sendStatusBarStateChanged(StatusBarState.SHADE);
+
+ // THEN pause auth
+ assertTrue(mController.shouldPauseAuth());
+ }
+
+ @Test
+ public void testShouldPauseAuthAnimatingScreenOffFromShade() {
+ mController.onViewAttached();
+ captureStatusBarStateListeners();
+ captureExpansionListener();
+
+ // WHEN transitioning from home/shade => keyguard + animating screen off
+ mStatusBarStateListener.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD);
+ when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
+
+ // THEN pause auth
+ assertTrue(mController.shouldPauseAuth());
+ }
+
+ @Test
+ public void testDoNotPauseAuthAnimatingScreenOffFromLS() {
+ mController.onViewAttached();
+ captureStatusBarStateListeners();
+ captureExpansionListener();
+
+ // WHEN animating screen off transition from LS => AOD
+ sendStatusBarStateChanged(StatusBarState.KEYGUARD);
+ when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
+
+ // THEN don't pause auth
+ assertFalse(mController.shouldPauseAuth());
+ }
+
+ @Test
public void testOverrideShouldPauseAuthOnShadeLocked() {
mController.onViewAttached();
captureStatusBarStateListeners();
@@ -168,13 +219,13 @@
sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED);
assertTrue(mController.shouldPauseAuth());
- mAltAuthInterceptor.showAlternativeAuthMethod(); // force show
+ mAltAuthInterceptor.showAlternateAuthBouncer(); // force show
assertFalse(mController.shouldPauseAuth());
- assertTrue(mAltAuthInterceptor.isShowingAlternateAuth());
+ assertTrue(mAltAuthInterceptor.isShowingAlternateAuthBouncer());
- mAltAuthInterceptor.resetForceShow(); // stop force show
+ mAltAuthInterceptor.hideAlternateAuthBouncer(); // stop force show
assertTrue(mController.shouldPauseAuth());
- assertFalse(mAltAuthInterceptor.isShowingAlternateAuth());
+ assertFalse(mAltAuthInterceptor.isShowingAlternateAuthBouncer());
}
@Test
@@ -184,26 +235,22 @@
captureStatusBarStateListeners();
captureAltAuthInterceptor();
- mAltAuthInterceptor.showAlternativeAuthMethod(); // alt auth force show
+ mAltAuthInterceptor.showAlternateAuthBouncer(); // alt auth force show
// WHEN view is detached
mController.onViewDetached();
// THEN alt auth state reports not showing
- assertFalse(mAltAuthInterceptor.isShowingAlternateAuth());
+ assertFalse(mAltAuthInterceptor.isShowingAlternateAuthBouncer());
}
private void sendStatusBarStateChanged(int statusBarState) {
mStatusBarStateListener.onStateChanged(statusBarState);
- mParentStatusBarStateListener.onStateChanged(statusBarState);
}
private void captureStatusBarStateListeners() {
- verify(mStatusBarStateController, times(2)).addCallback(mStateListenerCaptor.capture());
- List<StatusBarStateController.StateListener> stateListeners =
- mStateListenerCaptor.getAllValues();
- mParentStatusBarStateListener = stateListeners.get(0);
- mStatusBarStateListener = stateListeners.get(1);
+ verify(mStatusBarStateController).addCallback(mStateListenerCaptor.capture());
+ mStatusBarStateListener = mStateListenerCaptor.getValue();
}
private void captureExpansionListener() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/camera/CameraIntentsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/camera/CameraIntentsTest.kt
new file mode 100644
index 0000000..feaedc5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/camera/CameraIntentsTest.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 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.camera
+
+import android.content.Intent
+import android.test.suitebuilder.annotation.SmallTest
+import android.testing.AndroidTestingRunner
+import com.android.systemui.SysuiTestCase
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class CameraIntentsTest : SysuiTestCase() {
+ companion object {
+ val VALID_SECURE_INTENT = Intent(CameraIntents.DEFAULT_SECURE_CAMERA_INTENT_ACTION)
+ val VALID_INSECURE_INTENT = Intent(CameraIntents.DEFAULT_INSECURE_CAMERA_INTENT_ACTION)
+ }
+
+ @Test
+ fun testIsSecureCameraIntent() {
+ assertTrue(CameraIntents.isSecureCameraIntent(VALID_SECURE_INTENT))
+ // an intent with a specific package is still a valid secure camera intent
+ assertTrue(CameraIntents.isSecureCameraIntent(
+ Intent(VALID_SECURE_INTENT).setPackage("com.example")))
+ assertFalse(CameraIntents.isSecureCameraIntent(null))
+ assertFalse(CameraIntents.isSecureCameraIntent(Intent()))
+ assertFalse(CameraIntents.isSecureCameraIntent(Intent(Intent.ACTION_MAIN)))
+ }
+ @Test
+ fun testIsInsecureCameraIntent() {
+ assertTrue(CameraIntents.isInsecureCameraIntent(VALID_INSECURE_INTENT))
+ // an intent with a specific package is still a valid secure camera intent
+ assertTrue(CameraIntents.isInsecureCameraIntent(
+ Intent(VALID_INSECURE_INTENT).setPackage("com.example")))
+ assertFalse(CameraIntents.isInsecureCameraIntent(null))
+ assertFalse(CameraIntents.isInsecureCameraIntent(Intent()))
+ assertFalse(CameraIntents.isInsecureCameraIntent(Intent(Intent.ACTION_MAIN)))
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
index ebdda67..42387bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
@@ -16,9 +16,12 @@
package com.android.systemui.classifier;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.Matchers.closeTo;
-import static org.junit.Assert.assertThat;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import android.testing.AndroidTestingRunner;
import android.util.DisplayMetrics;
@@ -26,6 +29,7 @@
import androidx.test.filters.SmallTest;
+import com.android.systemui.classifier.FalsingDataProvider.GestureFinalizedListener;
import com.android.systemui.utils.leaks.FakeBatteryController;
import org.junit.After;
@@ -67,19 +71,19 @@
mDataProvider.onMotionEvent(appendUpEvent(6, 5));
List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents();
- assertThat(motionEventList.size(), is(3));
- assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_DOWN));
- assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(2).getActionMasked(), is(MotionEvent.ACTION_UP));
- assertThat(motionEventList.get(0).getEventTime(), is(1L));
- assertThat(motionEventList.get(1).getEventTime(), is(2L));
- assertThat(motionEventList.get(2).getEventTime(), is(3L));
- assertThat(motionEventList.get(0).getX(), is(2f));
- assertThat(motionEventList.get(1).getX(), is(4f));
- assertThat(motionEventList.get(2).getX(), is(6f));
- assertThat(motionEventList.get(0).getY(), is(9f));
- assertThat(motionEventList.get(1).getY(), is(7f));
- assertThat(motionEventList.get(2).getY(), is(5f));
+ assertThat(motionEventList.size()).isEqualTo(3);
+ assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_DOWN);
+ assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(2).getActionMasked()).isEqualTo(MotionEvent.ACTION_UP);
+ assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L);
+ assertThat(motionEventList.get(1).getEventTime()).isEqualTo(2L);
+ assertThat(motionEventList.get(2).getEventTime()).isEqualTo(3L);
+ assertThat(motionEventList.get(0).getX()).isEqualTo(2f);
+ assertThat(motionEventList.get(1).getX()).isEqualTo(4f);
+ assertThat(motionEventList.get(2).getX()).isEqualTo(6f);
+ assertThat(motionEventList.get(0).getY()).isEqualTo(9f);
+ assertThat(motionEventList.get(1).getY()).isEqualTo(7f);
+ assertThat(motionEventList.get(2).getY()).isEqualTo(5f);
}
@Test
@@ -88,28 +92,28 @@
mDataProvider.onMotionEvent(appendMoveEvent(4, 7, 800));
List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents();
- assertThat(motionEventList.size(), is(2));
- assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_DOWN));
- assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(0).getEventTime(), is(1L));
- assertThat(motionEventList.get(1).getEventTime(), is(800L));
- assertThat(motionEventList.get(0).getX(), is(2f));
- assertThat(motionEventList.get(1).getX(), is(4f));
- assertThat(motionEventList.get(0).getY(), is(9f));
- assertThat(motionEventList.get(1).getY(), is(7f));
+ assertThat(motionEventList.size()).isEqualTo(2);
+ assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_DOWN);
+ assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L);
+ assertThat(motionEventList.get(1).getEventTime()).isEqualTo(800L);
+ assertThat(motionEventList.get(0).getX()).isEqualTo(2f);
+ assertThat(motionEventList.get(1).getX()).isEqualTo(4f);
+ assertThat(motionEventList.get(0).getY()).isEqualTo(9f);
+ assertThat(motionEventList.get(1).getY()).isEqualTo(7f);
mDataProvider.onMotionEvent(appendUpEvent(6, 5, 1200));
// Still two events, but event a is gone.
- assertThat(motionEventList.size(), is(2));
- assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_UP));
- assertThat(motionEventList.get(0).getEventTime(), is(800L));
- assertThat(motionEventList.get(1).getEventTime(), is(1200L));
- assertThat(motionEventList.get(0).getX(), is(4f));
- assertThat(motionEventList.get(1).getX(), is(6f));
- assertThat(motionEventList.get(0).getY(), is(7f));
- assertThat(motionEventList.get(1).getY(), is(5f));
+ assertThat(motionEventList.size()).isEqualTo(2);
+ assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_UP);
+ assertThat(motionEventList.get(0).getEventTime()).isEqualTo(800L);
+ assertThat(motionEventList.get(1).getEventTime()).isEqualTo(1200L);
+ assertThat(motionEventList.get(0).getX()).isEqualTo(4f);
+ assertThat(motionEventList.get(1).getX()).isEqualTo(6f);
+ assertThat(motionEventList.get(0).getY()).isEqualTo(7f);
+ assertThat(motionEventList.get(1).getY()).isEqualTo(5f);
}
@Test
@@ -126,19 +130,19 @@
mDataProvider.onMotionEvent(motionEventA);
List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents();
- assertThat(motionEventList.size(), is(3));
- assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(2).getActionMasked(), is(MotionEvent.ACTION_MOVE));
- assertThat(motionEventList.get(0).getEventTime(), is(1L));
- assertThat(motionEventList.get(1).getEventTime(), is(2L));
- assertThat(motionEventList.get(2).getEventTime(), is(3L));
- assertThat(motionEventList.get(0).getX(), is(2f));
- assertThat(motionEventList.get(1).getX(), is(4f));
- assertThat(motionEventList.get(2).getX(), is(6f));
- assertThat(motionEventList.get(0).getY(), is(9f));
- assertThat(motionEventList.get(1).getY(), is(7f));
- assertThat(motionEventList.get(2).getY(), is(5f));
+ assertThat(motionEventList.size()).isEqualTo(3);
+ assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(2).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE);
+ assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L);
+ assertThat(motionEventList.get(1).getEventTime()).isEqualTo(2L);
+ assertThat(motionEventList.get(2).getEventTime()).isEqualTo(3L);
+ assertThat(motionEventList.get(0).getX()).isEqualTo(2f);
+ assertThat(motionEventList.get(1).getX()).isEqualTo(4f);
+ assertThat(motionEventList.get(2).getX()).isEqualTo(6f);
+ assertThat(motionEventList.get(0).getY()).isEqualTo(9f);
+ assertThat(motionEventList.get(1).getY()).isEqualTo(7f);
+ assertThat(motionEventList.get(2).getY()).isEqualTo(5f);
}
@Test
@@ -147,18 +151,18 @@
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(1, 1));
- assertThat((double) mDataProvider.getAngle(), closeTo(Math.PI / 4, .001));
+ assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(Math.PI / 4);
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(-1, -1));
- assertThat((double) mDataProvider.getAngle(), closeTo(5 * Math.PI / 4, .001));
+ assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(5 * Math.PI / 4);
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(2, 0));
- assertThat((double) mDataProvider.getAngle(), closeTo(0, .001));
+ assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(0);
mDataProvider.onSessionEnd();
}
@@ -168,17 +172,17 @@
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(1, 1));
- assertThat(mDataProvider.isHorizontal(), is(false));
+ assertThat(mDataProvider.isHorizontal()).isFalse();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(2, 1));
- assertThat(mDataProvider.isHorizontal(), is(true));
+ assertThat(mDataProvider.isHorizontal()).isTrue();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(-3, -1));
- assertThat(mDataProvider.isHorizontal(), is(true));
+ assertThat(mDataProvider.isHorizontal()).isTrue();
mDataProvider.onSessionEnd();
}
@@ -188,17 +192,17 @@
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(1, 0));
- assertThat(mDataProvider.isVertical(), is(false));
+ assertThat(mDataProvider.isVertical()).isFalse();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(0, 1));
- assertThat(mDataProvider.isVertical(), is(true));
+ assertThat(mDataProvider.isVertical()).isTrue();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(-3, -10));
- assertThat(mDataProvider.isVertical(), is(true));
+ assertThat(mDataProvider.isVertical()).isTrue();
mDataProvider.onSessionEnd();
}
@@ -208,17 +212,17 @@
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(1, 1));
- assertThat(mDataProvider.isRight(), is(true));
+ assertThat(mDataProvider.isRight()).isTrue();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(0, 1));
- assertThat(mDataProvider.isRight(), is(false));
+ assertThat(mDataProvider.isRight()).isFalse();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(-3, -10));
- assertThat(mDataProvider.isRight(), is(false));
+ assertThat(mDataProvider.isRight()).isFalse();
mDataProvider.onSessionEnd();
}
@@ -230,25 +234,60 @@
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(1, -1));
- assertThat(mDataProvider.isUp(), is(true));
+ assertThat(mDataProvider.isUp()).isTrue();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(0, 0));
- assertThat(mDataProvider.isUp(), is(false));
+ assertThat(mDataProvider.isUp()).isFalse();
mDataProvider.onSessionEnd();
mDataProvider.onMotionEvent(motionEventOrigin);
mDataProvider.onMotionEvent(appendMoveEvent(-3, 10));
- assertThat(mDataProvider.isUp(), is(false));
+ assertThat(mDataProvider.isUp()).isFalse();
mDataProvider.onSessionEnd();
}
@Test
public void test_isWirelessCharging() {
- assertThat(mDataProvider.isWirelessCharging(), is(false));
+ assertThat(mDataProvider.isWirelessCharging()).isFalse();
mFakeBatteryController.setWirelessCharging(true);
- assertThat(mDataProvider.isWirelessCharging(), is(true));
+ assertThat(mDataProvider.isWirelessCharging()).isTrue();
+ }
+
+ @Test
+ public void test_GestureFinalizedListener() {
+ GestureFinalizedListener listener = mock(GestureFinalizedListener.class);
+
+ mDataProvider.addGestureCompleteListener(listener);
+
+ mDataProvider.onMotionEvent(appendDownEvent(0, 0));
+ mDataProvider.onMotionEventComplete();
+ verify(listener, never()).onGestureFinalized(anyLong());
+ mDataProvider.onMotionEvent(appendMoveEvent(0, 0));
+ mDataProvider.onMotionEventComplete();
+ verify(listener, never()).onGestureFinalized(anyLong());
+ mDataProvider.onMotionEvent(appendUpEvent(0, 0, 100));
+ verify(listener, never()).onGestureFinalized(anyLong());
+
+ mDataProvider.onMotionEventComplete();
+ verify(listener).onGestureFinalized(100);
+ }
+
+ @Test
+ public void test_GestureFinalizedListener_SkipCompletion() {
+ GestureFinalizedListener listener = mock(GestureFinalizedListener.class);
+
+ mDataProvider.addGestureCompleteListener(listener);
+
+ mDataProvider.onMotionEvent(appendDownEvent(0, 0));
+ mDataProvider.onMotionEvent(appendMoveEvent(0, 0));
+ mDataProvider.onMotionEvent(appendUpEvent(0, 0, 100));
+ verify(listener, never()).onGestureFinalized(anyLong());
+
+ // The start of a new gesture should finalized the prior one.
+ mDataProvider.onMotionEvent(appendDownEvent(0, 200));
+ verify(listener).onGestureFinalized(100);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
new file mode 100644
index 0000000..80716f9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
@@ -0,0 +1,289 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.globalactions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.IActivityManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.UserManager;
+import android.service.dreams.IDreamManager;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.IWindowManager;
+import android.view.WindowManagerPolicyConstants;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.colorextraction.ColorExtractor;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.model.SysUiState;
+import com.android.systemui.plugins.GlobalActions;
+import com.android.systemui.settings.UserContextProvider;
+import com.android.systemui.statusbar.NotificationShadeDepthController;
+import com.android.systemui.statusbar.NotificationShadeWindowController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.RingerModeLiveData;
+import com.android.systemui.util.RingerModeTracker;
+import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.util.settings.SecureSettings;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+public class GlobalActionsDialogLiteTest extends SysuiTestCase {
+ private GlobalActionsDialogLite mGlobalActionsDialogLite;
+
+ @Mock private GlobalActions.GlobalActionsManager mWindowManagerFuncs;
+ @Mock private AudioManager mAudioManager;
+ @Mock private IDreamManager mDreamManager;
+ @Mock private DevicePolicyManager mDevicePolicyManager;
+ @Mock private LockPatternUtils mLockPatternUtils;
+ @Mock private BroadcastDispatcher mBroadcastDispatcher;
+ @Mock private TelephonyListenerManager mTelephonyListenerManager;
+ @Mock private GlobalSettings mGlobalSettings;
+ @Mock private SecureSettings mSecureSettings;
+ @Mock private Resources mResources;
+ @Mock private ConfigurationController mConfigurationController;
+ @Mock private KeyguardStateController mKeyguardStateController;
+ @Mock private UserManager mUserManager;
+ @Mock private TrustManager mTrustManager;
+ @Mock private IActivityManager mActivityManager;
+ @Mock private MetricsLogger mMetricsLogger;
+ @Mock private NotificationShadeDepthController mDepthController;
+ @Mock private SysuiColorExtractor mColorExtractor;
+ @Mock private IStatusBarService mStatusBarService;
+ @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
+ @Mock private IWindowManager mWindowManager;
+ @Mock private Executor mBackgroundExecutor;
+ @Mock private UiEventLogger mUiEventLogger;
+ @Mock private RingerModeTracker mRingerModeTracker;
+ @Mock private RingerModeLiveData mRingerModeLiveData;
+ @Mock private SysUiState mSysUiState;
+ @Mock private Handler mHandler;
+ @Mock private UserContextProvider mUserContextProvider;
+
+ private TestableLooper mTestableLooper;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mTestableLooper = TestableLooper.get(this);
+ allowTestableLooperAsMainThread();
+
+ when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
+ when(mUserContextProvider.getUserContext()).thenReturn(mContext);
+
+ mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext,
+ mWindowManagerFuncs,
+ mAudioManager,
+ mDreamManager,
+ mDevicePolicyManager,
+ mLockPatternUtils,
+ mBroadcastDispatcher,
+ mTelephonyListenerManager,
+ mGlobalSettings,
+ mSecureSettings,
+ null,
+ mResources,
+ mConfigurationController,
+ mKeyguardStateController,
+ mUserManager,
+ mTrustManager,
+ mActivityManager,
+ null,
+ mMetricsLogger,
+ mDepthController,
+ mColorExtractor,
+ mStatusBarService,
+ mNotificationShadeWindowController,
+ mWindowManager,
+ mBackgroundExecutor,
+ mUiEventLogger,
+ mRingerModeTracker,
+ mSysUiState,
+ mHandler
+ );
+ mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();
+
+ ColorExtractor.GradientColors backdropColors = new ColorExtractor.GradientColors();
+ backdropColors.setMainColor(Color.BLACK);
+ when(mColorExtractor.getNeutralColors()).thenReturn(backdropColors);
+ when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
+ }
+
+ @Test
+ public void testShouldLogShow() {
+ mGlobalActionsDialogLite.onShow(null);
+ mTestableLooper.processAllMessages();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_POWER_MENU_OPEN);
+ }
+
+ @Test
+ public void testShouldLogDismiss() {
+ mGlobalActionsDialogLite.onDismiss(mGlobalActionsDialogLite.mDialog);
+ mTestableLooper.processAllMessages();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_POWER_MENU_CLOSE);
+ }
+
+ @Test
+ public void testShouldLogBugreportPress() throws InterruptedException {
+ GlobalActionsDialog.BugReportAction bugReportAction =
+ mGlobalActionsDialogLite.makeBugReportActionForTesting();
+ bugReportAction.onPress();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_BUGREPORT_PRESS);
+ }
+
+ @Test
+ public void testShouldLogBugreportLongPress() {
+ GlobalActionsDialog.BugReportAction bugReportAction =
+ mGlobalActionsDialogLite.makeBugReportActionForTesting();
+ bugReportAction.onLongPress();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_BUGREPORT_LONG_PRESS);
+ }
+
+ @Test
+ public void testShouldLogEmergencyDialerPress() {
+ GlobalActionsDialog.EmergencyDialerAction emergencyDialerAction =
+ mGlobalActionsDialogLite.makeEmergencyDialerActionForTesting();
+ emergencyDialerAction.onPress();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_EMERGENCY_DIALER_PRESS);
+ }
+
+ @Test
+ public void testShouldLogScreenshotPress() {
+ GlobalActionsDialog.ScreenshotAction screenshotAction =
+ mGlobalActionsDialogLite.makeScreenshotActionForTesting();
+ screenshotAction.onPress();
+ verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_SCREENSHOT_PRESS);
+ }
+
+ @Test
+ public void testShouldShowScreenshot() {
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.integer.config_navBarInteractionMode,
+ WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON);
+
+ GlobalActionsDialog.ScreenshotAction screenshotAction =
+ mGlobalActionsDialogLite.makeScreenshotActionForTesting();
+ assertThat(screenshotAction.shouldShow()).isTrue();
+ }
+
+ @Test
+ public void testShouldNotShowScreenshot() {
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.integer.config_navBarInteractionMode,
+ WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON);
+
+ GlobalActionsDialog.ScreenshotAction screenshotAction =
+ mGlobalActionsDialogLite.makeScreenshotActionForTesting();
+ assertThat(screenshotAction.shouldShow()).isFalse();
+ }
+
+ private void verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent event) {
+ mTestableLooper.processAllMessages();
+ verify(mUiEventLogger, times(1))
+ .log(event);
+ }
+
+ @SafeVarargs
+ private static <T> void assertItemsOfType(List<T> stuff, Class<? extends T>... classes) {
+ assertThat(stuff).hasSize(classes.length);
+ for (int i = 0; i < stuff.size(); i++) {
+ assertThat(stuff.get(i)).isInstanceOf(classes[i]);
+ }
+ }
+
+ @Test
+ public void testCreateActionItems_lockdownEnabled_doesShowLockdown() {
+ mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite);
+ doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems();
+ doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any());
+ doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any());
+ String[] actions = {
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+ };
+ doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions();
+ mGlobalActionsDialogLite.createActionItems();
+
+ assertItemsOfType(mGlobalActionsDialogLite.mItems,
+ GlobalActionsDialog.EmergencyAction.class,
+ GlobalActionsDialog.LockDownAction.class,
+ GlobalActionsDialog.ShutDownAction.class,
+ GlobalActionsDialog.RestartAction.class);
+ assertThat(mGlobalActionsDialogLite.mOverflowItems).isEmpty();
+ assertThat(mGlobalActionsDialogLite.mPowerItems).isEmpty();
+ }
+
+ @Test
+ public void testCreateActionItems_lockdownDisabled_doesNotShowLockdown() {
+ mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite);
+ doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems();
+ // make sure lockdown action will NOT be shown
+ doReturn(false).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any());
+ String[] actions = {
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
+ // lockdown action not allowed
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+ };
+ doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions();
+ mGlobalActionsDialogLite.createActionItems();
+
+ assertItemsOfType(mGlobalActionsDialogLite.mItems,
+ GlobalActionsDialog.EmergencyAction.class,
+ GlobalActionsDialog.ShutDownAction.class,
+ GlobalActionsDialog.RestartAction.class);
+ assertThat(mGlobalActionsDialogLite.mOverflowItems).isEmpty();
+ assertThat(mGlobalActionsDialogLite.mPowerItems).isEmpty();
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
index 8add930..93769c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
@@ -33,12 +33,10 @@
import android.app.IActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
-import android.content.ContentResolver;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Color;
import android.media.AudioManager;
-import android.net.ConnectivityManager;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserManager;
@@ -77,6 +75,7 @@
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.util.RingerModeLiveData;
import com.android.systemui.util.RingerModeTracker;
+import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.settings.SecureSettings;
import org.junit.Before;
@@ -105,9 +104,8 @@
@Mock private DevicePolicyManager mDevicePolicyManager;
@Mock private LockPatternUtils mLockPatternUtils;
@Mock private BroadcastDispatcher mBroadcastDispatcher;
- @Mock private ConnectivityManager mConnectivityManager;
@Mock private TelephonyListenerManager mTelephonyListenerManager;
- @Mock private ContentResolver mContentResolver;
+ @Mock private GlobalSettings mGlobalSettings;
@Mock private Resources mResources;
@Mock private ConfigurationController mConfigurationController;
@Mock private ActivityStarter mActivityStarter;
@@ -166,9 +164,9 @@
mDevicePolicyManager,
mLockPatternUtils,
mBroadcastDispatcher,
- mConnectivityManager,
mTelephonyListenerManager,
- mContentResolver,
+ mGlobalSettings,
+ mSecureSettings,
null,
mResources,
mConfigurationController,
@@ -520,7 +518,8 @@
mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
- GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ GlobalActionsDialog.ActionsDialog dialog =
+ (GlobalActionsDialog.ActionsDialog) mGlobalActionsDialog.mDialog;
assertThat(dialog).isNotNull();
assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.VISIBLE);
@@ -543,7 +542,8 @@
mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
- GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ GlobalActionsDialog.ActionsDialog dialog =
+ (GlobalActionsDialog.ActionsDialog) mGlobalActionsDialog.mDialog;
assertThat(dialog).isNotNull();
assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.GONE);
@@ -568,7 +568,8 @@
mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
- GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ GlobalActionsDialog.ActionsDialog dialog =
+ (GlobalActionsDialog.ActionsDialog) mGlobalActionsDialog.mDialog;
assertThat(dialog).isNotNull();
assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.GONE);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/KeyButtonViewTest.java
index fa29fd4f..853684a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/KeyButtonViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/KeyButtonViewTest.java
@@ -24,6 +24,7 @@
import static android.view.KeyEvent.KEYCODE_APP_SWITCH;
import static android.view.KeyEvent.KEYCODE_BACK;
import static android.view.KeyEvent.KEYCODE_HOME;
+import static android.view.KeyEvent.KEYCODE_UNKNOWN;
import static com.android.systemui.navigationbar.buttons.KeyButtonView.NavBarButtonEvent.NAVBAR_BACK_BUTTON_LONGPRESS;
import static com.android.systemui.navigationbar.buttons.KeyButtonView.NavBarButtonEvent.NAVBAR_BACK_BUTTON_TAP;
@@ -88,7 +89,7 @@
}
@Test
- public void testLogOverviewPress() {
+ public void testLogOverviewPress() {
checkmetrics(KEYCODE_APP_SWITCH, ACTION_UP, 0, NAVBAR_OVERVIEW_BUTTON_TAP);
}
@@ -134,6 +135,22 @@
checkmetrics(KEYCODE_0, ACTION_UP, 0, null);
}
+ @Test
+ public void testEventInjectedOnAbortGesture() {
+ mKeyButtonView.setCode(KEYCODE_HOME);
+ mKeyButtonView.abortCurrentGesture();
+ verify(mInputManager, times(1))
+ .injectInputEvent(any(KeyEvent.class), any(Integer.class));
+ }
+
+ @Test
+ public void testNoEventInjectedOnAbortUnknownGesture() {
+ mKeyButtonView.setCode(KEYCODE_UNKNOWN);
+ mKeyButtonView.abortCurrentGesture();
+ verify(mInputManager, never())
+ .injectInputEvent(any(KeyEvent.class), any(Integer.class));
+ }
+
private void checkmetrics(int code, int action, int flag,
KeyButtonView.NavBarButtonEvent expected) {
mKeyButtonView.setCode(code);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
index d40e6a4..650ee50 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
@@ -38,6 +38,7 @@
import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.globalactions.GlobalActionsDialogLite;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.MultiUserSwitch;
@@ -91,6 +92,8 @@
private MultiUserSwitch mMultiUserSwitch;
@Mock
private View mPowerMenuLiteView;
+ @Mock
+ private GlobalActionsDialogLite mGlobalActionsDialog;
private QSFooterViewController mController;
@@ -118,7 +121,7 @@
mController = new QSFooterViewController(mView, mUserManager, mUserInfoController,
mActivityStarter, mDeviceProvisionedController, mUserTracker, mQSPanelController,
new QSDetailDisplayer(), mQuickQSPanelController, mFakeTunerService,
- mMetricsLogger, false);
+ mMetricsLogger, false, mGlobalActionsDialog);
mController.init();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index a2113b9..1f066d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -131,7 +131,7 @@
when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
when(mQSTile.getTileSpec()).thenReturn("dnd");
when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
- when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
+ when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
when(mQSTileRevealControllerFactory.create(any(), any()))
.thenReturn(mQSTileRevealController);
when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
index a2a179e..bacc493 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
@@ -108,7 +108,7 @@
when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
- when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
+ when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
when(mToggleSliderViewControllerFactory.create(any(), any()))
.thenReturn(mBrightnessSlider);
when(mBrightnessControllerFactory.create(any(ToggleSlider.class)))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 3e12c89..acedf59 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -89,7 +89,7 @@
when(dndTile.getTileSpec()).thenReturn("dnd");
when(mHost.getTiles()).thenReturn(Collections.emptyList());
- when(mHost.createTileView(any(), anyBoolean())).thenReturn(mQSTileView);
+ when(mHost.createTileView(any(), any(), anyBoolean())).thenReturn(mQSTileView);
mQsPanel.addTile(mDndTileRecord);
mQsPanel.setCallback(mCallback);
});
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index 5422ae8..e4b95af 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -196,7 +196,7 @@
}
@Test
- public void testNetworkLoggingEnabled() {
+ public void testNetworkLoggingEnabled_deviceOwner() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
mFooter.refreshState();
@@ -222,6 +222,18 @@
}
@Test
+ public void testNetworkLoggingEnabled_managedProfileOwner() {
+ when(mSecurityController.hasWorkProfile()).thenReturn(true);
+ when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+ mFooter.refreshState();
+
+ TestableLooper.get(this).processAllMessages();
+ assertEquals(mContext.getString(
+ R.string.quick_settings_disclosure_managed_profile_network_activity),
+ mFooterText.getText());
+ }
+
+ @Test
public void testManagedCACertsInstalled() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.hasCACertInCurrentUser()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
index cb380d5..0604e1b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
@@ -75,7 +75,7 @@
`when`(quickQSPanel.tileLayout).thenReturn(tileLayout)
`when`(quickQSPanel.dumpableTag).thenReturn("")
- `when`(qsTileHost.createTileView(any(), anyBoolean())).thenReturn(tileView)
+ `when`(qsTileHost.createTileView(any(), any(), anyBoolean())).thenReturn(tileView)
controller = QuickQSPanelController(
quickQSPanel,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index 33166cc..96d7979 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -19,21 +19,36 @@
import static android.content.pm.PackageManager.FEATURE_NFC_HOST_CARD_EMULATION;
import static android.provider.Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertNull;
import static junit.framework.TestCase.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Icon;
import android.os.Handler;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsRequest;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.service.quickaccesswallet.QuickAccessWalletService;
+import android.service.quickaccesswallet.WalletCard;
import android.service.quicksettings.Tile;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -56,17 +71,30 @@
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.settings.SecureSettings;
+import com.google.common.util.concurrent.MoreExecutors;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.Collections;
+
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
public class QuickAccessWalletTileTest extends SysuiTestCase {
+ private static final String CARD_ID = "card_id";
+ private static final Icon CARD_IMAGE =
+ Icon.createWithBitmap(Bitmap.createBitmap(70, 50, Bitmap.Config.ARGB_8888));
+
+ private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
+ .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
+
@Mock
private QSTileHost mHost;
@Mock
@@ -88,6 +116,10 @@
private SecureSettings mSecureSettings;
@Mock
private FeatureFlags mFeatureFlags;
+ @Captor
+ ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
+ @Captor
+ ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
private TestableLooper mTestableLooper;
private QuickAccessWalletTile mTile;
@@ -115,6 +147,7 @@
mKeyguardStateController,
mPackageManager,
mSecureSettings,
+ MoreExecutors.directExecutor(),
mFeatureFlags);
}
@@ -204,4 +237,112 @@
assertEquals(Tile.STATE_UNAVAILABLE, state.state);
}
+
+ @Test
+ public void testHandleSetListening_queryCards() {
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient)
+ .getWalletCards(any(), mRequestCaptor.capture(), mCallbackCaptor.capture());
+
+ GetWalletCardsRequest request = mRequestCaptor.getValue();
+ assertEquals(
+ mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width),
+ request.getCardWidthPx());
+ assertEquals(
+ mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height),
+ request.getCardHeightPx());
+ assertEquals(2, request.getMaxCards());
+ assertThat(mCallbackCaptor.getValue()).isInstanceOf(
+ QuickAccessWalletClient.OnWalletCardsRetrievedCallback.class);
+ }
+
+ @Test
+ public void testHandleSetListening_queryCards_hasCards_updateSideViewDrawable() {
+ GetWalletCardsResponse response =
+ new GetWalletCardsResponse(
+ Collections.singletonList(createWalletCard(mContext)), 0);
+
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertNotNull(mTile.getState().sideViewDrawable);
+ }
+
+ @Test
+ public void testState_queryCards_hasCards_then_noCards() {
+ GetWalletCardsResponse responseWithCards =
+ new GetWalletCardsResponse(
+ Collections.singletonList(createWalletCard(mContext)), 0);
+ GetWalletCardsResponse responseWithoutCards =
+ new GetWalletCardsResponse(Collections.EMPTY_LIST, 0);
+
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ // query wallet cards, has cards
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(responseWithCards);
+ mTestableLooper.processAllMessages();
+
+ assertNotNull(mTile.getState().sideViewDrawable);
+
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient, times(2))
+ .getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ // query wallet cards, has no cards
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(responseWithoutCards);
+ mTestableLooper.processAllMessages();
+
+ assertNull(mTile.getState().sideViewDrawable);
+ }
+
+ @Test
+ public void testHandleSetListening_queryCards_noCards_notUpdateSideViewDrawable() {
+ QSTile.State state = new QSTile.State();
+ GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.EMPTY_LIST, 0);
+
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertNull(mTile.getState().sideViewDrawable);
+ }
+
+ @Test
+ public void testHandleSetListening_queryCards_error_notUpdateSideViewDrawable() {
+ String errorMessage = "getWalletCardsError";
+ GetWalletCardsError error = new GetWalletCardsError(CARD_IMAGE, errorMessage);
+
+ mTile.handleSetListening(true);
+
+ verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardRetrievalError(error);
+ mTestableLooper.processAllMessages();
+
+ assertNull(mTile.getState().sideViewDrawable);
+ }
+
+ @Test
+ public void testHandleSetListening_notListening_notQueryCards() {
+ mTile.handleSetListening(false);
+
+ verifyZeroInteractions(mQuickAccessWalletClient);
+ }
+
+ private WalletCard createWalletCard(Context context) {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
+ return new WalletCard.Builder(CARD_ID, CARD_IMAGE, "description", pendingIntent).build();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java
new file mode 100644
index 0000000..9c68f0d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2021 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.screenshot;
+
+import static android.util.MathUtils.constrain;
+
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import static java.lang.Math.abs;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+
+import android.graphics.Rect;
+import android.hardware.HardwareBuffer;
+import android.media.Image;
+import android.util.Log;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * A flexible test double for {@link ScrollCaptureClient.Session}.
+ * <p>
+ * FakeSession provides the ability to emulate both the available scrollable content range as well
+ * as the current visible bounds. Visible bounds may vary because the target view itself may be
+ * slid vertically during capture, with portions may become clipped by parent views. This scenario
+ * frequently occurs with UIs constructed from nested scrolling views or collapsing headers.
+ */
+class FakeSession implements ScrollCaptureClient.Session {
+ private static final String TAG = "FakeSession";
+ // Available range of content
+ private final Rect mAvailable;
+
+ /** bounds for scrollDelta (y), range with bottom adjusted to account for page height. */
+ private final Rect mAvailableTop;
+
+ private final Rect mVisiblePage;
+ private final int mTileHeight;
+ private final int mMaxTiles;
+
+ private int mScrollDelta;
+ private int mPageHeight;
+
+ FakeSession(int pageHeight, float maxPages, int tileHeight, int visiblePageTop,
+ int visiblePageBottom, int availableTop, int availableBottom) {
+ mPageHeight = pageHeight;
+ mTileHeight = tileHeight;
+ mAvailable = new Rect(0, availableTop, getPageWidth(), availableBottom);
+ mAvailableTop = new Rect(mAvailable);
+ mAvailableTop.inset(0, 0, 0, pageHeight);
+ mVisiblePage = new Rect(0, visiblePageTop, getPageWidth(), visiblePageBottom);
+ mMaxTiles = (int) Math.ceil((pageHeight * maxPages) / mTileHeight);
+ }
+
+ private static Image mockImage() {
+ Image image = mock(Image.class);
+ when(image.getHardwareBuffer()).thenReturn(mock(HardwareBuffer.class));
+ return image;
+ }
+
+ public int getScrollDelta() {
+ return mScrollDelta;
+ }
+
+ @Override
+ public ListenableFuture<ScrollCaptureClient.CaptureResult> requestTile(int requestedTop) {
+ Rect requested = new Rect(0, requestedTop, getPageWidth(), requestedTop + getTileHeight());
+ Log.d(TAG, "requested: " + requested);
+ Rect page = new Rect(0, 0, getPageWidth(), mPageHeight);
+ page.offset(0, mScrollDelta);
+ Log.d(TAG, "page: " + page);
+ // Simulate behavior from lower levels by replicating 'requestChildRectangleOnScreen'
+ if (!page.contains(requested)) {
+ Log.d(TAG, "requested not within page, scrolling");
+ // distance+direction needed to scroll to align each edge of request with
+ // corresponding edge of the page
+ int distTop = requested.top - page.top; // positive means already visible
+ int distBottom = requested.bottom - page.bottom; // negative means already visible
+ Log.d(TAG, "distTop = " + distTop);
+ Log.d(TAG, "distBottom = " + distBottom);
+
+ boolean scrollUp = false;
+ if (distTop < 0 && distBottom > 0) {
+ scrollUp = abs(distTop) < distBottom;
+ } else if (distTop < 0) {
+ scrollUp = true;
+ }
+
+ // determine which edges are currently clipped
+ if (scrollUp) {
+ Log.d(TAG, "trying to scroll up by " + -distTop + " px");
+ // need to scroll up to align top edge to visible-top
+ mScrollDelta += distTop;
+ Log.d(TAG, "new scrollDelta = " + mScrollDelta);
+ } else {
+ Log.d(TAG, "trying to scroll down by " + distBottom + " px");
+ // scroll down to align bottom edge with visible bottom, but keep top visible
+ int topEdgeDistance = max(0, requestedTop - page.top);
+ mScrollDelta += min(distBottom, topEdgeDistance);
+ Log.d(TAG, "new scrollDelta = " + mScrollDelta);
+ }
+
+ // Clamp to available content
+ mScrollDelta = constrain(mScrollDelta, mAvailableTop.top, mAvailableTop.bottom);
+ Log.d(TAG, "scrollDelta, adjusted to available range = " + mScrollDelta);
+
+ // Reset to apply a changed scroll delta possibly.
+ page.offsetTo(0, 0);
+ page.offset(0, mScrollDelta);
+
+ Log.d(TAG, "page (after scroll): " + page);
+ Log.d(TAG, "requested (after scroll): " + requested);
+ }
+ Log.d(TAG, "mVisiblePage = " + mVisiblePage);
+ Log.d(TAG, "scrollDelta = " + mScrollDelta);
+
+ Rect target = new Rect(requested);
+ Rect visible = new Rect(mVisiblePage);
+ visible.offset(0, mScrollDelta);
+
+ Log.d(TAG, "target: " + target);
+ Log.d(TAG, "visible: " + visible);
+
+ // if any of the requested rect is available to scroll into the view:
+ if (target.intersect(page) && target.intersect(visible)) {
+ Log.d(TAG, "returning captured = " + target);
+ ScrollCaptureClient.CaptureResult result =
+ new ScrollCaptureClient.CaptureResult(mockImage(), requested, target);
+ return immediateFuture(result);
+ }
+ Log.d(TAG, "no part of requested rect is within page, returning empty");
+ ScrollCaptureClient.CaptureResult result =
+ new ScrollCaptureClient.CaptureResult(null, requested, new Rect());
+ return immediateFuture(result);
+ }
+
+
+ @Override
+ public int getMaxTiles() {
+ return mMaxTiles;
+ }
+
+ @Override
+ public int getTileHeight() {
+ return mTileHeight;
+ }
+
+ @Override
+ public int getPageWidth() {
+ return 100;
+ }
+
+ @Override
+ public int getPageHeight() {
+ return mPageHeight;
+ }
+
+ @Override
+ public Rect getWindowBounds() {
+ throw new IllegalStateException("Not implemented");
+ }
+
+ @Override
+ public ListenableFuture<Void> end() {
+ return Futures.immediateVoidFuture();
+ }
+
+ @Override
+ public void release() {
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java
new file mode 100644
index 0000000..2520af9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2021 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.screenshot;
+
+import static com.google.common.util.concurrent.Futures.getUnchecked;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link FakeSession}, a a test double for a ScrollCaptureClient.Session.
+ * <p>
+ * These tests verify a single tile request behaves similarly to a live scroll capture
+ * client/connection.
+ */
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class FakeSessionTest extends SysuiTestCase {
+ @Test
+ public void testMaxTiles() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 2.25f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -250,
+ /* availableBottom */ 250);
+
+ // (pageHeight * maxPages) / tileHeight
+ assertEquals("getMaxTiles()", 23, session.getMaxTiles());
+ }
+
+ @Test
+ public void testNonEmptyResult_hasImage() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 1.0f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ 0,
+ /* availableBottom */ 100);
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0));
+ assertNotNull("result.image", result.image);
+ assertNotNull("result.image.getHardwareBuffer()", result.image.getHardwareBuffer());
+ }
+
+ @Test
+ public void testEmptyResult_hasNullImage() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 1.0f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ 0,
+ /* availableBottom */ 100);
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-100));
+ assertNull("result.image", result.image);
+ }
+
+ @Test
+ public void testCaptureAtZero() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 2.5f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -250,
+ /* availableBottom */ 250);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0));
+ assertEquals("requested top", 0, result.requested.top);
+ assertEquals("requested bottom", 10, result.requested.bottom);
+ assertEquals("captured top", 0, result.captured.top);
+ assertEquals("captured bottom", 10, result.captured.bottom);
+ assertEquals("scroll delta", 0, session.getScrollDelta());
+ }
+
+ @Test
+ public void testCaptureAtPageBottom() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 2.5f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -250,
+ /* availableBottom */ 250);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(90));
+ assertEquals("requested top", 90, result.requested.top);
+ assertEquals("requested bottom", 100, result.requested.bottom);
+ assertEquals("captured top", 90, result.captured.top);
+ assertEquals("captured bottom", 100, result.captured.bottom);
+ assertEquals("scroll delta", 0, session.getScrollDelta());
+ }
+
+ @Test
+ public void testCaptureFromPreviousPage() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 2.5f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -250,
+ /* availableBottom */ 250);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-100));
+ assertEquals("requested top", -100, result.requested.top);
+ assertEquals("requested bottom", -90, result.requested.bottom);
+ assertEquals("captured top", -100, result.captured.top);
+ assertEquals("captured bottom", -90, result.captured.bottom);
+ assertEquals("scroll delta", -100, session.getScrollDelta());
+ }
+
+ @Test
+ public void testCaptureFromNextPage() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 2.5f,
+ /* tileHeight */ 10,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -250,
+ /* availableBottom */ 250);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(150));
+ assertEquals("requested top", 150, result.requested.top);
+ assertEquals("requested bottom", 160, result.requested.bottom);
+ assertEquals("captured top", 150, result.captured.top);
+ assertEquals("captured bottom", 160, result.captured.bottom);
+ assertEquals("scroll delta", 60, session.getScrollDelta());
+ }
+
+ @Test
+ public void testCaptureTopPartiallyUnavailable() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -100,
+ /* availableBottom */ 100);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-125));
+ assertEquals("requested top", -125, result.requested.top);
+ assertEquals("requested bottom", -75, result.requested.bottom);
+ assertEquals("captured top", -100, result.captured.top);
+ assertEquals("captured bottom", -75, result.captured.bottom);
+ assertEquals("scroll delta", -100, session.getScrollDelta());
+ }
+
+ @Test
+ public void testCaptureBottomPartiallyUnavailable() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -100,
+ /* availableBottom */ 100);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(75));
+ assertEquals("requested top", 75, result.requested.top);
+ assertEquals("requested bottom", 125, result.requested.bottom);
+ assertEquals("captured top", 75, result.captured.top);
+ assertEquals("captured bottom", 100, result.captured.bottom);
+ assertEquals("scroll delta", 0, session.getScrollDelta());
+ }
+
+ /**
+ * Set visiblePageTop > 0 to cause the returned request's top edge to be cropped.
+ */
+ @Test
+ public void testCaptureTopPartiallyInvisible() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 25, // <<--
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -150,
+ /* availableBottom */ 150);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-150));
+ assertEquals("requested top", -150, result.requested.top);
+ assertEquals("requested bottom", -100, result.requested.bottom);
+ assertEquals("captured top", -125, result.captured.top);
+ assertEquals("captured bottom", -100, result.captured.bottom);
+ assertEquals("scroll delta", -150, session.getScrollDelta());
+ }
+
+ /**
+ * Set visiblePageBottom < pageHeight to cause the returned request's bottom edge to be cropped.
+ */
+ @Test
+ public void testCaptureBottomPartiallyInvisible() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 75,
+ /* availableTop */ -150,
+ /* availableBottom */ 150);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(50));
+ assertEquals("requested top", 50, result.requested.top);
+ assertEquals("requested bottom", 100, result.requested.bottom);
+ assertEquals("captured top", 50, result.captured.top);
+ assertEquals("captured bottom", 75, result.captured.bottom);
+ assertEquals("scroll delta", 0, session.getScrollDelta());
+ }
+
+ @Test
+ public void testEmptyResult_aboveAvailableTop() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3.0f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -100,
+ /* availableBottom */ 200);
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-150));
+ assertTrue("captured rect is empty", result.captured.isEmpty());
+ }
+
+ @Test
+ public void testEmptyResult_belowAvailableBottom() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3.0f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 0,
+ /* visiblePageBottom */ 100,
+ /* availableTop */ -100,
+ /* availableBottom */ 200);
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(200));
+ assertTrue("captured rect is empty", result.captured.isEmpty());
+ }
+
+ @Test
+ public void testEmptyResult_notVisible() {
+ FakeSession session = new FakeSession(
+ /* pageHeight */ 100,
+ /* maxPages */ 3f,
+ /* tileHeight */ 50,
+ /* visiblePageTop */ 60, // <<---
+ /* visiblePageBottom */ 0,
+ /* availableTop */ -150,
+ /* availableBottom */ 150);
+
+ ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0));
+ assertEquals("requested top", 0, result.requested.top);
+ assertEquals("requested bottom", 50, result.requested.bottom);
+ assertEquals("captured top", 0, result.captured.top);
+ assertEquals("captured bottom", 0, result.captured.bottom);
+ assertEquals("scroll delta", 0, session.getScrollDelta());
+ }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java
index 7fe178c..5bab1bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java
@@ -16,35 +16,30 @@
package com.android.systemui.screenshot;
+import static com.google.common.util.concurrent.Futures.getUnchecked;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static java.lang.Math.abs;
+
import android.content.Context;
-import android.graphics.Rect;
-import android.hardware.HardwareBuffer;
-import android.media.Image;
import android.testing.AndroidTestingRunner;
import android.view.ScrollCaptureResponse;
import androidx.test.filters.SmallTest;
-import androidx.test.platform.app.InstrumentationRegistry;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.screenshot.ScrollCaptureClient.Session;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.concurrent.ExecutionException;
-
/**
* Tests for ScrollCaptureController which manages sequential image acquisition for long
* screenshots.
@@ -53,169 +48,229 @@
@RunWith(AndroidTestingRunner.class)
public class ScrollCaptureControllerTest extends SysuiTestCase {
- private static class FakeSession implements ScrollCaptureClient.Session {
- public int availableTop = Integer.MIN_VALUE;
- public int availableBottom = Integer.MAX_VALUE;
- // If true, return an empty rect any time a partial result would have been returned.
- public boolean emptyInsteadOfPartial = false;
- private int mPreviousTopRequested = 0;
+ private static final ScrollCaptureResponse EMPTY_RESPONSE =
+ new ScrollCaptureResponse.Builder().build();
- @Override
- public ListenableFuture<ScrollCaptureClient.CaptureResult> requestTile(int top) {
- // Ensure we don't request a tile more than a tile away.
- assertTrue(Math.abs(top - mPreviousTopRequested) <= getTileHeight());
- mPreviousTopRequested = top;
- Rect requested = new Rect(0, top, getPageWidth(), top + getTileHeight());
- Rect fullContent = new Rect(0, availableTop, getPageWidth(), availableBottom);
- Rect captured = new Rect(requested);
- assertTrue(captured.intersect(fullContent));
- if (emptyInsteadOfPartial && captured.height() != getTileHeight()) {
- captured = new Rect();
+ @Test
+ public void testInfinite() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withMaxPages(2.5f)
+ .withTileHeight(10)
+ .withAvailableRange(Integer.MIN_VALUE, Integer.MAX_VALUE)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ assertEquals("top", -90, screenshot.getTop());
+ assertEquals("bottom", 160, screenshot.getBottom());
+
+ // Test that top portion is >= getTargetTopSizeRatio()
+ // (Due to tileHeight, top will almost always be larger than the target)
+ float topPortion = abs(screenshot.getTop()) / abs((float) screenshot.getBottom());
+ if (topPortion < controller.getTargetTopSizeRatio()) {
+ fail("expected top portion > "
+ + (controller.getTargetTopSizeRatio() * 100) + "%"
+ + " but was " + (topPortion * 100));
+ }
+ }
+
+ @Test
+ public void testInfiniteWithPartialResultsTop() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withPageVisibleRange(5, 100) // <-- simulate 5px of invisible top
+ .withMaxPages(2.5f)
+ .withTileHeight(50)
+ .withAvailableRange(Integer.MIN_VALUE, Integer.MAX_VALUE)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ // Each tile is cropped to the visible page size, which is inset 5px from the TOP
+ // requested result
+ // 0, 50 5, 50
+ // -45, 5 -40, 5 <-- clear previous / top
+ // 5, 55 5, 55 (not cropped, target is positioned fully within visible range)
+ // 55, 105 55, 105
+ // 105, 155 105, 155
+ // 155, 205 155, 205 <-- bottom
+
+ assertEquals("top", -40, screenshot.getTop());
+ assertEquals("bottom", 205, screenshot.getBottom());
+ }
+
+ @Test
+ public void testInfiniteWithPartialResultsBottom() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withPageVisibleRange(0, 95) // <-- simulate 5px of invisible bottom
+ .withMaxPages(2.5f)
+ .withTileHeight(50)
+ .withAvailableRange(Integer.MIN_VALUE, Integer.MAX_VALUE)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ // Each tile is cropped to the visible page size, which is inset 5px from the BOTTOM
+ // requested result
+ // 0, 50 0, 50 // not cropped, positioned within visible range
+ // -50, 0 -50, 0 <-- clear previous/reverse
+ // 0, 50 - 0, 45 // target now positioned at page bottom, bottom cropped
+ // 45, 95, 45, 90
+ // 90, 140, 140, 135
+ // 135, 185 185, 180 <-- bottom
+
+ assertEquals("top", -50, screenshot.getTop());
+ assertEquals("bottom", 180, screenshot.getBottom());
+ }
+
+ @Test
+ public void testLimitedBottom() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withMaxPages(2.5f)
+ .withTileHeight(10)
+ .withAvailableRange(Integer.MIN_VALUE, 150)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ assertEquals("top", -100, screenshot.getTop());
+ assertEquals("bottom", 150, screenshot.getBottom());
+ }
+
+ @Test
+ public void testLimitedTopAndBottom() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withMaxPages(2.5f)
+ .withTileHeight(10)
+ .withAvailableRange(-50, 150)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ assertEquals("top", -50, screenshot.getTop());
+ assertEquals("bottom", 150, screenshot.getBottom());
+ }
+
+ @Test
+ public void testVeryLimitedTopInfiniteBottom() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withMaxPages(2.5f)
+ .withTileHeight(10)
+ .withAvailableRange(-10, Integer.MAX_VALUE)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ assertEquals("top", -10, screenshot.getTop());
+ assertEquals("bottom", 240, screenshot.getBottom());
+ }
+
+ @Test
+ public void testVeryLimitedTopLimitedBottom() {
+ ScrollCaptureController controller = new TestScenario()
+ .withPageHeight(100)
+ .withMaxPages(2.5f)
+ .withTileHeight(10)
+ .withAvailableRange(-10, 200)
+ .createController(mContext);
+
+ ScrollCaptureController.LongScreenshot screenshot =
+ getUnchecked(controller.run(EMPTY_RESPONSE));
+
+ assertEquals("top", -10, screenshot.getTop());
+ assertEquals("bottom", 200, screenshot.getBottom());
+ }
+
+ /**
+ * Build and configure a stubbed controller for each test case.
+ */
+ private static class TestScenario {
+ private int mPageHeight = -1;
+ private int mTileHeight = -1;
+ private boolean mAvailableRangeSet;
+ private int mAvailableTop;
+ private int mAvailableBottom;
+ private int mLocalVisibleTop;
+ private int mLocalVisibleBottom = -1;
+ private float mMaxPages = -1;
+
+ TestScenario withPageHeight(int pageHeight) {
+ if (pageHeight < 0) {
+ throw new IllegalArgumentException("pageHeight must be positive");
}
- Image image = mock(Image.class);
- when(image.getHardwareBuffer()).thenReturn(mock(HardwareBuffer.class));
- ScrollCaptureClient.CaptureResult result =
- new ScrollCaptureClient.CaptureResult(image, requested, captured);
- return Futures.immediateFuture(result);
+ mPageHeight = pageHeight;
+ return this;
}
- public int getMaxHeight() {
- return getTileHeight() * getMaxTiles();
+ TestScenario withTileHeight(int tileHeight) {
+ if (tileHeight < 0) {
+ throw new IllegalArgumentException("tileHeight must be positive");
+ }
+ mTileHeight = tileHeight;
+ return this;
}
- @Override
- public int getMaxTiles() {
- return 10;
+ TestScenario withAvailableRange(int top, int bottom) {
+ mAvailableRangeSet = true;
+ mAvailableTop = top;
+ mAvailableBottom = bottom;
+ return this;
}
- @Override
- public int getTileHeight() {
- return 50;
+ TestScenario withMaxPages(float maxPages) {
+ if (maxPages < 0) {
+ throw new IllegalArgumentException("maxPages must be positive");
+ }
+ mMaxPages = maxPages;
+ return this;
}
- @Override
- public int getPageHeight() {
- return 100;
+ TestScenario withPageVisibleRange(int top, int bottom) {
+ if (top < 0 || bottom < 0) {
+ throw new IllegalArgumentException("top and bottom must be positive");
+ }
+ mLocalVisibleTop = top;
+ mLocalVisibleBottom = bottom;
+ return this;
}
- @Override
- public int getPageWidth() {
- return 100;
+
+ ScrollCaptureController createController(Context context) {
+ if (mTileHeight < 0) {
+ throw new IllegalArgumentException("tileHeight not set");
+ }
+ if (!mAvailableRangeSet) {
+ throw new IllegalArgumentException("availableRange not set");
+ }
+ if (mPageHeight < 0) {
+ throw new IllegalArgumentException("pageHeight not set");
+ }
+
+ if (mMaxPages < 0) {
+ throw new IllegalArgumentException("maxPages not set");
+ }
+ // Default: page fully visible
+ if (mLocalVisibleBottom < 0) {
+ mLocalVisibleBottom = mPageHeight;
+ }
+ Session session = new FakeSession(mPageHeight, mMaxPages, mTileHeight,
+ mLocalVisibleTop, mLocalVisibleBottom, mAvailableTop, mAvailableBottom);
+ ScrollCaptureClient client = mock(ScrollCaptureClient.class);
+ when(client.start(/* response */ any(), /* maxPages */ anyFloat()))
+ .thenReturn(immediateFuture(session));
+ return new ScrollCaptureController(context, context.getMainExecutor(),
+ client, new ImageTileSet(context.getMainThreadHandler()));
}
-
- @Override
- public Rect getWindowBounds() {
- return null;
- }
-
- @Override
- public ListenableFuture<Void> end() {
- return Futures.immediateVoidFuture();
- }
-
- @Override
- public void release() {
- }
- }
-
- private ScrollCaptureController mController;
- private FakeSession mSession;
- private ScrollCaptureClient mScrollCaptureClient;
-
- @Before
- public void setUp() {
- Context context = InstrumentationRegistry.getInstrumentation().getContext();
- mSession = new FakeSession();
- mScrollCaptureClient = mock(ScrollCaptureClient.class);
- when(mScrollCaptureClient.request(anyInt(), anyInt())).thenReturn(
- Futures.immediateFuture(new ScrollCaptureResponse.Builder().build()));
- when(mScrollCaptureClient.start(any(), anyFloat())).thenReturn(
- Futures.immediateFuture(mSession));
- mController = new ScrollCaptureController(context, context.getMainExecutor(),
- mScrollCaptureClient, new ImageTileSet(context.getMainThreadHandler()));
- }
-
- @Test
- public void testInfinite() throws ExecutionException, InterruptedException {
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- assertEquals(mSession.getMaxHeight(), screenshot.getHeight());
- // TODO: the top and bottom ratio in the infinite case should be extracted and tested.
- assertEquals(-150, screenshot.getTop());
- assertEquals(350, screenshot.getBottom());
- }
-
- @Test
- public void testLimitedBottom() throws ExecutionException, InterruptedException {
- // We hit the bottom of the content, so expect it to scroll back up and go above the -150
- // default top position
- mSession.availableBottom = 275;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- // Bottom tile will be 25px tall, 10 tiles total
- assertEquals(mSession.getMaxHeight() - 25, screenshot.getHeight());
- assertEquals(-200, screenshot.getTop());
- assertEquals(mSession.availableBottom, screenshot.getBottom());
- }
-
- @Test
- public void testLimitedTopAndBottom() throws ExecutionException, InterruptedException {
- mSession.availableBottom = 275;
- mSession.availableTop = -200;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- assertEquals(mSession.availableBottom - mSession.availableTop, screenshot.getHeight());
- assertEquals(mSession.availableTop, screenshot.getTop());
- assertEquals(mSession.availableBottom, screenshot.getBottom());
- }
-
- @Test
- public void testVeryLimitedTopInfiniteBottom() throws ExecutionException, InterruptedException {
- // Hit the boundary before the "headroom" is hit in the up direction, then go down
- // infinitely.
- mSession.availableTop = -55;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- // The top tile will be 5px tall, so subtract 45px from the theoretical max.
- assertEquals(mSession.getMaxHeight() - 45, screenshot.getHeight());
- assertEquals(mSession.availableTop, screenshot.getTop());
- assertEquals(mSession.availableTop + mSession.getMaxHeight() - 45, screenshot.getBottom());
- }
-
- @Test
- public void testVeryLimitedTopLimitedBottom() throws ExecutionException, InterruptedException {
- mSession.availableBottom = 275;
- mSession.availableTop = -55;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- assertEquals(mSession.availableBottom - mSession.availableTop, screenshot.getHeight());
- assertEquals(mSession.availableTop, screenshot.getTop());
- assertEquals(mSession.availableBottom, screenshot.getBottom());
- }
-
- @Test
- public void testLimitedTopAndBottomWithEmpty() throws ExecutionException, InterruptedException {
- mSession.emptyInsteadOfPartial = true;
- mSession.availableBottom = 275;
- mSession.availableTop = -167;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- // Expecting output from -150 to 250
- assertEquals(400, screenshot.getHeight());
- assertEquals(-150, screenshot.getTop());
- assertEquals(250, screenshot.getBottom());
- }
-
- @Test
- public void testVeryLimitedTopWithEmpty() throws ExecutionException, InterruptedException {
- // Hit the boundary before the "headroom" is hit in the up direction, then go down
- // infinitely.
- mSession.availableTop = -55;
- mSession.emptyInsteadOfPartial = true;
- ScrollCaptureController.LongScreenshot screenshot =
- mController.run(new ScrollCaptureResponse.Builder().build()).get();
- assertEquals(mSession.getMaxHeight(), screenshot.getHeight());
- assertEquals(-50, screenshot.getTop());
- assertEquals(-50 + mSession.getMaxHeight(), screenshot.getBottom());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureFrameworkSmokeTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureFrameworkSmokeTest.java
index 06b39ab..54d9732 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureFrameworkSmokeTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureFrameworkSmokeTest.java
@@ -82,7 +82,11 @@
latch.await(1000, TimeUnit.MILLISECONDS);
assertNotNull(mResponse);
- assertTrue(mResponse.isConnected());
- assertTrue(mResponse.getWindowTitle().contains(ScrollViewActivity.class.getSimpleName()));
+ if (!mResponse.isConnected()) {
+ Log.e(TAG, "Received response with no connection: " + mResponse);
+ fail("expected response.isConnected() == true");
+ }
+ assertTrue("expected a connection to ScrollViewActivity",
+ mResponse.getWindowTitle().contains(ScrollViewActivity.class.getSimpleName()));
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
index 6d293b5..3ed8ecf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
@@ -20,7 +20,6 @@
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
-import android.widget.CompoundButton
import android.widget.SeekBar
import androidx.test.filters.SmallTest
import com.android.settingslib.RestrictedLockUtils
@@ -37,14 +36,12 @@
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyBoolean
-import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.isNull
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.notNull
-import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.`when` as whenever
@@ -72,10 +69,6 @@
private lateinit var seekBarChangeCaptor: ArgumentCaptor<SeekBar.OnSeekBarChangeListener>
@Mock
private lateinit var seekBar: SeekBar
- @Captor
- private lateinit var checkedChangeCaptor: ArgumentCaptor<CompoundButton.OnCheckedChangeListener>
- @Mock
- private lateinit var compoundButton: CompoundButton
private var mFalsingManager: FalsingManagerFake = FalsingManagerFake()
private lateinit var mController: BrightnessSlider
@@ -101,7 +94,6 @@
fun testListenersAddedOnAttach() {
mController.onViewAttached()
- verify(brightnessSliderView).setOnCheckedChangeListener(notNull())
verify(brightnessSliderView).setOnSeekBarChangeListener(notNull())
}
@@ -111,7 +103,6 @@
mController.onViewDetached()
verify(brightnessSliderView).setOnSeekBarChangeListener(isNull())
- verify(brightnessSliderView).setOnCheckedChangeListener(isNull())
verify(brightnessSliderView).setOnDispatchTouchEventListener(isNull())
}
@@ -127,7 +118,6 @@
verify(brightnessSliderView, never()).max
verify(brightnessSliderView, never()).value
- verify(brightnessSliderView, never()).isChecked
verify(brightnessSliderView).setOnDispatchTouchEventListener(isNull())
}
@@ -139,7 +129,6 @@
verify(brightnessSliderView, never()).max
verify(brightnessSliderView, never()).value
- verify(brightnessSliderView, never()).isChecked
verify(brightnessSliderView).setOnDispatchTouchEventListener(isNull())
}
@@ -150,40 +139,15 @@
val checked = true
whenever(brightnessSliderView.max).thenReturn(maxValue)
whenever(brightnessSliderView.value).thenReturn(progress)
- whenever(brightnessSliderView.isChecked).thenReturn(checked)
mController.setMirrorControllerAndMirror(mirrorController)
verify(mirror).max = maxValue
- verify(mirror).isChecked = checked
verify(mirror).value = progress
verify(brightnessSliderView).setOnDispatchTouchEventListener(notNull())
}
@Test
- fun testSetCheckedRelayed_true() {
- mController.isChecked = true
- verify(brightnessSliderView).isChecked = true
- }
-
- @Test
- fun testSetCheckedRelayed_false() {
- mController.isChecked = false
- verify(brightnessSliderView).isChecked = false
- }
-
- @Test
- fun testGetChecked() {
- whenever(brightnessSliderView.isChecked).thenReturn(true)
-
- assertThat(mController.isChecked).isTrue()
-
- whenever(brightnessSliderView.isChecked).thenReturn(false)
-
- assertThat(mController.isChecked).isFalse()
- }
-
- @Test
fun testSetMaxRelayed() {
mController.max = 120
verify(brightnessSliderView).max = 120
@@ -229,13 +193,12 @@
@Test
fun testSeekBarProgressChanged() {
mController.onViewAttached()
- whenever(brightnessSliderView.isChecked).thenReturn(true)
verify(brightnessSliderView).setOnSeekBarChangeListener(capture(seekBarChangeCaptor))
seekBarChangeCaptor.value.onProgressChanged(seekBar, 23, true)
- verify(listener).onChanged(anyBoolean(), eq(true), eq(23), eq(false))
+ verify(listener).onChanged(anyBoolean(), eq(23), eq(false))
}
@Test
@@ -243,7 +206,6 @@
val parent = mock(ViewGroup::class.java)
whenever(brightnessSliderView.value).thenReturn(42)
whenever(brightnessSliderView.parent).thenReturn(parent)
- whenever(brightnessSliderView.isChecked).thenReturn(true)
mController.onViewAttached()
mController.setMirrorControllerAndMirror(mirrorController)
@@ -251,7 +213,7 @@
seekBarChangeCaptor.value.onStartTrackingTouch(seekBar)
- verify(listener).onChanged(eq(true), eq(true), eq(42), eq(false))
+ verify(listener).onChanged(eq(true), eq(42), eq(false))
verify(mirrorController).showMirror()
verify(mirrorController).setLocation(parent)
}
@@ -259,7 +221,6 @@
@Test
fun testSeekBarTrackingStopped() {
whenever(brightnessSliderView.value).thenReturn(23)
- whenever(brightnessSliderView.isChecked).thenReturn(true)
mController.onViewAttached()
mController.setMirrorControllerAndMirror(mirrorController)
@@ -267,38 +228,7 @@
seekBarChangeCaptor.value.onStopTrackingTouch(seekBar)
- verify(listener).onChanged(eq(false), eq(true), eq(23), eq(true))
+ verify(listener).onChanged(eq(false), eq(23), eq(true))
verify(mirrorController).hideMirror()
}
-
- @Test
- fun testButtonCheckedChanged_false() {
- val checked = false
-
- mController.onViewAttached()
- mController.setMirrorControllerAndMirror(mirrorController)
- verify(brightnessSliderView).setOnCheckedChangeListener(capture(checkedChangeCaptor))
-
- checkedChangeCaptor.value.onCheckedChanged(compoundButton, checked)
-
- verify(brightnessSliderView).enableSlider(!checked)
- verify(listener).onChanged(anyBoolean(), eq(checked), anyInt(), eq(false))
- // Called once with false when the mirror is set
- verify(mirror, times(2)).isChecked = checked
- }
-
- @Test
- fun testButtonCheckedChanged_true() {
- val checked = true
-
- mController.onViewAttached()
- mController.setMirrorControllerAndMirror(mirrorController)
- verify(brightnessSliderView).setOnCheckedChangeListener(capture(checkedChangeCaptor))
-
- checkedChangeCaptor.value.onCheckedChanged(compoundButton, checked)
-
- verify(brightnessSliderView).enableSlider(!checked)
- verify(listener).onChanged(anyBoolean(), eq(checked), anyInt(), eq(false))
- verify(mirror).isChecked = checked
- }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java
index 2784568..f2e7081 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java
@@ -28,8 +28,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.app.Notification;
-import android.os.Bundle;
+import android.graphics.Color;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.testing.AndroidTestingRunner;
@@ -120,7 +119,8 @@
mEntryBuilder
.setFlag(mContext, FLAG_FOREGROUND_SERVICE, true)
.setImportance(IMPORTANCE_DEFAULT)
- .modifyNotification(mContext).setColorized(true);
+ .modifyNotification(mContext)
+ .setColorized(true).setColor(Color.WHITE);
// THEN the entry is in the fgs section
assertTrue(mFgsSection.isInSection(mEntryBuilder.build()));
@@ -132,7 +132,8 @@
mEntryBuilder
.setFlag(mContext, FLAG_FOREGROUND_SERVICE, true)
.setImportance(IMPORTANCE_MIN)
- .modifyNotification(mContext).setColorized(true);
+ .modifyNotification(mContext)
+ .setColorized(true).setColor(Color.WHITE);
// THEN the entry is NOT in the fgs section
assertFalse(mFgsSection.isInSection(mEntryBuilder.build()));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
index d4b21c6f..12e341a5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
@@ -199,8 +199,7 @@
when(mShortcutInfo.getLabel()).thenReturn("Convo name");
List<ShortcutInfo> shortcuts = Arrays.asList(mShortcutInfo);
when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
- when(mIconFactory.getConversationDrawable(
- any(ShortcutInfo.class), anyString(), anyInt(), anyBoolean()))
+ when(mIconFactory.getBaseIconDrawable(any(ShortcutInfo.class)))
.thenReturn(mIconDrawable);
mNotificationChannel = new NotificationChannel(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 18481bca..bfce2a5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -51,6 +51,7 @@
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager;
+import android.graphics.Color;
import android.os.Binder;
import android.os.Handler;
import android.provider.Settings;
@@ -486,7 +487,7 @@
Notification.Builder nb = new Notification.Builder(mContext,
mTestNotificationChannel.getId())
.setContentTitle("foo")
- .setColorized(true)
+ .setColorized(true).setColor(Color.RED)
.setFlag(Notification.FLAG_CAN_COLORIZE, true)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 781f875..96cdaf9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -23,7 +23,10 @@
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.when;
+import android.app.Fragment;
import android.app.StatusBarManager;
+import android.content.Context;
+import android.os.Bundle;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
@@ -34,6 +37,7 @@
import com.android.systemui.R;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import org.junit.Before;
import org.junit.Test;
@@ -157,4 +161,9 @@
Mockito.verify(mStatusBarStateController).isDozing();
Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
}
+
+ @Override
+ protected Fragment instantiate(Context context, String className, Bundle arguments) {
+ return new CollapsedStatusBarFragment(mock(OngoingCallController.class));
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index d9e9389..e5f2aa7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -441,4 +441,12 @@
// mKeyguardViewController.init(), only updateResources above.
verify(mKeyguardHostViewController).updateResources();
}
+
+ @Test
+ public void testUpdateKeyguardPosition_delegatesToRootView() {
+ mBouncer.ensureView();
+ mBouncer.updateKeyguardPosition(1.0f);
+
+ verify(mKeyguardHostViewController).updateKeyguardPosition(1.0f);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 45b7917..20261e06 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -283,4 +283,11 @@
verify(mBouncer).updateResources();
}
+
+ @Test
+ public void updateKeyguardPosition_delegatesToBouncer() {
+ mStatusBarKeyguardViewManager.updateKeyguardPosition(1.0f);
+
+ verify(mBouncer).updateKeyguardPosition(1.0f);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 781cde6c..98a4487 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -132,6 +132,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -142,6 +143,7 @@
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.volume.VolumeComponent;
@@ -263,6 +265,8 @@
@Mock private Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy;
@Mock private BrightnessSlider.Factory mBrightnessSliderFactory;
@Mock private WiredChargingRippleController mWiredChargingRippleController;
+ @Mock private OngoingCallController mOngoingCallController;
+ @Mock private TunerService mTunerService;
@Mock private FeatureFlags mFeatureFlags;
private ShadeController mShadeController;
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
@@ -296,7 +300,7 @@
when(mCommandQueue.asBinder()).thenReturn(new Binder());
- mContext.setTheme(R.style.Theme_SystemUI_Light);
+ mContext.setTheme(R.style.Theme_SystemUI_LightWallpaper);
when(mStackScroller.getController()).thenReturn(mStackScrollerController);
when(mStackScrollerController.getView()).thenReturn(mStackScroller);
@@ -427,6 +431,8 @@
mNotificationIconAreaController,
mBrightnessSliderFactory,
mWiredChargingRippleController,
+ mOngoingCallController,
+ mTunerService,
mFeatureFlags);
when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index ef33172..4471778 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -77,6 +77,8 @@
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
import org.junit.After;
import org.junit.Before;
@@ -123,10 +125,12 @@
protected DeviceProvisionedListener mUserCallback;
protected Instrumentation mInstrumentation;
protected DemoModeController mDemoModeController;
+ protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
protected int mSubId;
private NetworkCapabilities mNetCapabilities;
+ private Network mNetwork;
private ConnectivityManager.NetworkCallback mDefaultCallbackInWifiTracker;
private ConnectivityManager.NetworkCallback mDefaultCallbackInNetworkController;
private ConnectivityManager.NetworkCallback mNetworkCallback;
@@ -171,8 +175,10 @@
mMockCm = mock(ConnectivityManager.class);
mMockBd = mock(BroadcastDispatcher.class);
mMockNsm = mock(NetworkScoreManager.class);
+ mNetwork = mock(Network.class);
mMockSubDefaults = mock(SubscriptionDefaults.class);
mNetCapabilities = new NetworkCapabilities();
+ when(mNetwork.getNetId()).thenReturn(0);
when(mMockTm.isDataCapable()).thenReturn(true);
when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);
doAnswer(invocation -> {
@@ -222,6 +228,7 @@
mMockSm,
mConfig,
TestableLooper.get(this).getLooper(),
+ mFakeExecutor,
mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class),
@@ -291,7 +298,8 @@
NetworkControllerImpl networkControllerNoMobile =
new NetworkControllerImpl(mContext, mMockCm, mMockTm, mTelephonyListenerManager,
mMockWm, mMockNsm, mMockSm,
- mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler,
+ mConfig, TestableLooper.get(this).getLooper(), mFakeExecutor,
+ mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController);
@@ -318,7 +326,7 @@
mNetCapabilities.setTransportInfo(info);
setConnectivityCommon(networkType, validated, isConnected);
mDefaultCallbackInNetworkController.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
}
public void setConnectivityViaCallbackInNetworkController(
@@ -328,7 +336,7 @@
}
setConnectivityCommon(networkType, validated, isConnected);
mDefaultCallbackInNetworkController.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
}
public void setConnectivityViaCallbackInWifiTracker(
@@ -339,12 +347,12 @@
setConnectivityCommon(networkType, validated, isConnected);
if (networkType == NetworkCapabilities.TRANSPORT_WIFI) {
if (isConnected) {
- mNetworkCallback.onAvailable(mock(Network.class),
+ mNetworkCallback.onAvailable(mNetwork,
new NetworkCapabilities(mNetCapabilities), new LinkProperties(), false);
mNetworkCallback.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
} else {
- mNetworkCallback.onLost(mock(Network.class));
+ mNetworkCallback.onLost(mNetwork);
}
}
}
@@ -355,14 +363,14 @@
setConnectivityCommon(networkType, validated, isConnected);
if (networkType == NetworkCapabilities.TRANSPORT_CELLULAR) {
if (isConnected) {
- mNetworkCallback.onAvailable(mock(Network.class),
+ mNetworkCallback.onAvailable(mNetwork,
new NetworkCapabilities(mNetCapabilities), new LinkProperties(), false);
mNetworkCallback.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
mDefaultCallbackInWifiTracker.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
} else {
- mNetworkCallback.onLost(mock(Network.class));
+ mNetworkCallback.onLost(mNetwork);
}
}
}
@@ -374,7 +382,7 @@
}
setConnectivityCommon(networkType, validated, isConnected);
mDefaultCallbackInWifiTracker.onCapabilitiesChanged(
- mock(Network.class), new NetworkCapabilities(mNetCapabilities));
+ mNetwork, new NetworkCapabilities(mNetCapabilities));
}
private void setConnectivityCommon(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index f4ad819..6219faf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -108,7 +108,7 @@
mConfig.show4gForLte = true;
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm,
mTelephonyListenerManager, mMockWm,
- mMockNsm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler,
+ mMockNsm, mMockSm, mConfig, Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 3c5cbb6..8d3e403 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -63,7 +63,7 @@
// Create a new NetworkController as this is currently handled in constructor.
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm,
mTelephonyListenerManager, mMockWm, mMockNsm, mMockSm, mConfig,
- Looper.getMainLooper(), mCallbackHandler,
+ Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController);
@@ -83,7 +83,7 @@
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm,
mTelephonyListenerManager, mMockWm, mMockNsm, mMockSm, mConfig,
- Looper.getMainLooper(), mCallbackHandler,
+ Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController);
@@ -151,7 +151,7 @@
// Create a new NetworkController as this is currently handled in constructor.
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm,
mTelephonyListenerManager, mMockWm, mMockNsm, mMockSm, mConfig,
- Looper.getMainLooper(), mCallbackHandler,
+ Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
index 8ad6271..64127b9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
@@ -66,10 +66,6 @@
}
@Override
- public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) {
- }
-
- @Override
public void setNoCallingIcons(String slot, List<CallIndicatorIconState> states) {
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java
new file mode 100644
index 0000000..f85962b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2021 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.wallet.ui;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.os.Handler;
+import android.service.quickaccesswallet.GetWalletCardsError;
+import android.service.quickaccesswallet.GetWalletCardsRequest;
+import android.service.quickaccesswallet.GetWalletCardsResponse;
+import android.service.quickaccesswallet.QuickAccessWalletClient;
+import android.service.quickaccesswallet.QuickAccessWalletService;
+import android.service.quickaccesswallet.WalletCard;
+import android.service.quickaccesswallet.WalletServiceEvent;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.settings.UserTracker;
+
+import com.google.common.util.concurrent.MoreExecutors;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+@SmallTest
+public class WalletScreenControllerTest extends SysuiTestCase {
+
+ private static final int MAX_CARDS = 10;
+ private static final String CARD_ID = "card_id";
+ private static final CharSequence SHORTCUT_SHORT_LABEL = "View all";
+ private static final CharSequence SHORTCUT_LONG_LABEL = "Add a payment method";
+ private static final CharSequence SERVICE_LABEL = "Wallet app";
+ private final WalletView mWalletView = new WalletView(mContext);
+ private final Drawable mWalletLogo = mContext.getDrawable(android.R.drawable.ic_lock_lock);
+ private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
+ .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
+
+ @Mock
+ QuickAccessWalletClient mWalletClient;
+ @Mock
+ ActivityStarter mActivityStarter;
+ @Mock
+ UserTracker mUserTracker;
+ @Captor
+ ArgumentCaptor<Intent> mIntentCaptor;
+ @Captor
+ ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
+ @Captor
+ ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
+ @Captor
+ ArgumentCaptor<QuickAccessWalletClient.WalletServiceEventListener> mListenerCaptor;
+ private WalletScreenController mController;
+ private TestableLooper mTestableLooper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mTestableLooper = TestableLooper.get(this);
+ when(mUserTracker.getUserContext()).thenReturn(mContext);
+ when(mWalletClient.getLogo()).thenReturn(mWalletLogo);
+ when(mWalletClient.getShortcutLongLabel()).thenReturn(SHORTCUT_LONG_LABEL);
+ when(mWalletClient.getShortcutShortLabel()).thenReturn(SHORTCUT_SHORT_LABEL);
+ when(mWalletClient.getServiceLabel()).thenReturn(SERVICE_LABEL);
+ when(mWalletClient.createWalletIntent()).thenReturn(mWalletIntent);
+ mController = new WalletScreenController(
+ mContext,
+ mWalletView,
+ mWalletClient,
+ mActivityStarter,
+ MoreExecutors.directExecutor(),
+ new Handler(mTestableLooper.getLooper()),
+ mUserTracker,
+ /* isDeviceLocked= */false);
+ }
+
+ @Test
+ public void queryCards_hasCards_showCarousel() {
+ GetWalletCardsResponse response =
+ new GetWalletCardsResponse(
+ Collections.singletonList(createWalletCard(mContext)), 0);
+
+ mController.queryWalletCards();
+ mTestableLooper.processAllMessages();
+
+ verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility());
+ assertEquals(GONE, mWalletView.getErrorView().getVisibility());
+ }
+
+ @Test
+ public void queryCards_noCards_showEmptyState() {
+ GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.EMPTY_LIST, 0);
+
+ mController.queryWalletCards();
+ mTestableLooper.processAllMessages();
+
+ verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility());
+ assertEquals(VISIBLE, mWalletView.getEmptyStateView().getVisibility());
+ assertEquals(GONE, mWalletView.getErrorView().getVisibility());
+ }
+
+ @Test
+ public void queryCards_error_showErrorView() {
+ String errorMessage = "getWalletCardsError";
+ GetWalletCardsError error = new GetWalletCardsError(createIcon(), errorMessage);
+
+ mController.queryWalletCards();
+ mTestableLooper.processAllMessages();
+
+ verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());
+
+ mCallbackCaptor.getValue().onWalletCardRetrievalError(error);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility());
+ assertEquals(GONE, mWalletView.getEmptyStateView().getVisibility());
+ assertEquals(VISIBLE, mWalletView.getErrorView().getVisibility());
+ assertEquals(errorMessage, mWalletView.getErrorView().getText().toString());
+ }
+
+ @Test
+ public void onWalletServiceEvent_nfcPaymentStart_dismiss() {
+ WalletServiceEvent event =
+ new WalletServiceEvent(WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED);
+
+ mController.onWalletServiceEvent(event);
+ mTestableLooper.processAllMessages();
+
+ assertNull(mController.mSelectedCardId);
+ assertTrue(mController.mIsDismissed);
+ verify(mWalletClient).notifyWalletDismissed();
+ }
+
+ @Test
+ public void onWalletServiceEvent_walletCardsUpdate_queryCards() {
+ mController.queryWalletCards();
+
+ verify(mWalletClient).addWalletServiceEventListener(mListenerCaptor.capture());
+
+ WalletServiceEvent event =
+ new WalletServiceEvent(WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED);
+
+ QuickAccessWalletClient.WalletServiceEventListener listener = mListenerCaptor.getValue();
+ listener.onWalletServiceEvent(event);
+ mTestableLooper.processAllMessages();
+
+ verify(mWalletClient, times(2))
+ .getWalletCards(any(), mRequestCaptor.capture(), mCallbackCaptor.capture());
+
+ GetWalletCardsRequest request = mRequestCaptor.getValue();
+
+ assertEquals(MAX_CARDS, request.getMaxCards());
+ }
+
+ @Test
+ public void onCardSelected() {
+ mController.onCardSelected(createCardViewInfo());
+
+ assertEquals(CARD_ID, mController.mSelectedCardId);
+ }
+
+ @Test
+ public void onCardClicked_startIntent() {
+ WalletCardViewInfo walletCardViewInfo = createCardViewInfo();
+
+ mController.onCardClicked(walletCardViewInfo);
+
+ verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true));
+
+ assertEquals(mWalletIntent.getAction(), mIntentCaptor.getValue().getAction());
+ assertEquals(mWalletIntent.getComponent(), mIntentCaptor.getValue().getComponent());
+ }
+
+ @Test
+ public void onWalletCardsRetrieved_cardDataEmpty_intentIsNull_hidesWallet() {
+ when(mWalletClient.createWalletIntent()).thenReturn(null);
+ GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0);
+
+ mController.onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(GONE, mWalletView.getVisibility());
+ }
+
+ @Test
+ public void onWalletCardsRetrieved_cardDataEmpty_logoIsNull_hidesWallet() {
+ when(mWalletClient.getLogo()).thenReturn(null);
+ GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0);
+
+ mController.onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(GONE, mWalletView.getVisibility());
+ }
+
+ @Test
+ public void onWalletCardsRetrieved_cardDataEmpty_labelIsEmpty_hidesWallet() {
+ when(mWalletClient.getShortcutLongLabel()).thenReturn("");
+ GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0);
+
+ mController.onWalletCardsRetrieved(response);
+ mTestableLooper.processAllMessages();
+
+ assertEquals(GONE, mWalletView.getVisibility());
+ }
+
+ private WalletCard createWalletCard(Context context) {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE);
+ return new WalletCard.Builder(CARD_ID, createIcon(), "description", pendingIntent).build();
+ }
+
+ private static Icon createIcon() {
+ return Icon.createWithBitmap(Bitmap.createBitmap(70, 44, Bitmap.Config.ARGB_8888));
+ }
+
+ private WalletCardViewInfo createCardViewInfo() {
+ return new WalletScreenController.QAWalletCardViewInfo(
+ mContext, createWalletCard(mContext));
+ }
+}
diff --git a/packages/WAPPushManager/AndroidManifest.xml b/packages/WAPPushManager/AndroidManifest.xml
index a75fb2d..15f01e6 100644
--- a/packages/WAPPushManager/AndroidManifest.xml
+++ b/packages/WAPPushManager/AndroidManifest.xml
@@ -27,7 +27,8 @@
<original-package android:name="com.android.smspush" />
<application
- android:allowClearUserData="false">
+ android:allowClearUserData="false"
+ android:directBootAware="true">
<service android:name=".WapPushManager"
android:permission="com.android.smspush.WAPPUSH_MANAGER_BIND"
android:exported="true">
diff --git a/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java b/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
index dc2707b..951e64f 100755
--- a/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
+++ b/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
@@ -26,17 +26,21 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
-import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteException;
+import android.os.UserManager;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.IWapPushManager;
import com.android.internal.telephony.WapPushManagerParams;
+import java.io.File;
+
/**
* The WapPushManager service is implemented to process incoming
* WAP Push messages and to maintain the Receiver Application/Application
@@ -67,8 +71,13 @@
/**
* Inner class that deals with application ID table
*/
- private class WapPushManDBHelper extends SQLiteOpenHelper {
- WapPushManDBHelper(Context context) {
+ @VisibleForTesting
+ public static class WapPushManDBHelper extends SQLiteOpenHelper {
+ /**
+ * Constructor
+ */
+ @VisibleForTesting
+ public WapPushManDBHelper(Context context) {
super(context, DATABASE_NAME, null, WAP_PUSH_MANAGER_VERSION);
if (LOCAL_LOGV) Log.v(LOG_TAG, "helper instance created.");
}
@@ -269,10 +278,6 @@
int app_type, boolean need_signature, boolean further_processing) {
WapPushManDBHelper dbh = getDatabase(mContext);
SQLiteDatabase db = dbh.getWritableDatabase();
- WapPushManDBHelper.queryData lastapp = dbh.queryLastApp(db, x_app_id, content_type);
- boolean ret = false;
- boolean insert = false;
- int sq = 0;
if (!appTypeCheck(app_type)) {
Log.w(LOG_TAG, "invalid app_type " + app_type + ". app_type must be "
@@ -280,34 +285,8 @@
+ WapPushManagerParams.APP_TYPE_SERVICE);
return false;
}
-
- if (lastapp == null) {
- insert = true;
- sq = 0;
- } else if (!lastapp.packageName.equals(package_name) ||
- !lastapp.className.equals(class_name)) {
- insert = true;
- sq = lastapp.installOrder + 1;
- }
-
- if (insert) {
- ContentValues values = new ContentValues();
-
- values.put("x_wap_application", x_app_id);
- values.put("content_type", content_type);
- values.put("package_name", package_name);
- values.put("class_name", class_name);
- values.put("app_type", app_type);
- values.put("need_signature", need_signature ? 1 : 0);
- values.put("further_processing", further_processing ? 1 : 0);
- values.put("install_order", sq);
- db.insert(APPID_TABLE_NAME, null, values);
- if (LOCAL_LOGV) Log.v(LOG_TAG, "add:" + x_app_id + ":" + content_type
- + " " + package_name + "." + class_name
- + ", newsq:" + sq);
- ret = true;
- }
-
+ boolean ret = insertPackage(dbh, db, x_app_id, content_type, package_name, class_name,
+ app_type, need_signature, further_processing);
db.close();
return ret;
@@ -404,11 +383,91 @@
protected WapPushManDBHelper getDatabase(Context context) {
if (mDbHelper == null) {
if (LOCAL_LOGV) Log.v(LOG_TAG, "create new db inst.");
- mDbHelper = new WapPushManDBHelper(context);
+ mDbHelper = new WapPushManDBHelper(context.createDeviceProtectedStorageContext());
}
+ // Migrate existing legacy database into the device encrypted storage.
+ migrateWapPushManDBIfNeeded(context);
return mDbHelper;
}
+ /**
+ * Inserts a package information into a database
+ */
+ @VisibleForTesting
+ public boolean insertPackage(WapPushManDBHelper dbh, SQLiteDatabase db, String appId,
+ String contentType, String packageName, String className, int appType,
+ boolean needSignature, boolean furtherProcessing) {
+
+ WapPushManDBHelper.queryData lastapp = dbh.queryLastApp(db, appId, contentType);
+ boolean insert = false;
+ int sq = 0;
+
+ if (lastapp == null) {
+ insert = true;
+ sq = 0;
+ } else if (!lastapp.packageName.equals(packageName)
+ || !lastapp.className.equals(className)) {
+ insert = true;
+ sq = lastapp.installOrder + 1;
+ }
+
+ if (insert) {
+ ContentValues values = new ContentValues();
+
+ values.put("x_wap_application", appId);
+ values.put("content_type", contentType);
+ values.put("package_name", packageName);
+ values.put("class_name", className);
+ values.put("app_type", appType);
+ values.put("need_signature", needSignature ? 1 : 0);
+ values.put("further_processing", furtherProcessing ? 1 : 0);
+ values.put("install_order", sq);
+ db.insert(APPID_TABLE_NAME, null, values);
+ if (LOCAL_LOGV) {
+ Log.v(LOG_TAG, "add:" + appId + ":" + contentType + " " + packageName
+ + "." + className + ", newsq:" + sq);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Migrates a legacy database into the device encrypted storage
+ */
+ private void migrateWapPushManDBIfNeeded(Context context) {
+ UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ File file = context.getDatabasePath(DATABASE_NAME);
+ if (!userManager.isUserUnlocked() || !file.exists()) {
+ // Check if the device is unlocked because a legacy database can't access during
+ // DirectBoot.
+ return;
+ }
+
+ // Migration steps below:
+ // 1. Merge the package info to legacy database if there is any package info which is
+ // registered during DirectBoot.
+ // 2. Move the data base to the device encryped storage.
+ WapPushManDBHelper legacyDbHelper = new WapPushManDBHelper(context);
+ SQLiteDatabase legacyDb = legacyDbHelper.getWritableDatabase();
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ Cursor cur = db.query(APPID_TABLE_NAME, null, null, null, null, null, null);
+ while (cur.moveToNext()) {
+ insertPackage(legacyDbHelper, legacyDb,
+ cur.getString(cur.getColumnIndex("x_wap_application")),
+ cur.getString(cur.getColumnIndex("content_type")),
+ cur.getString(cur.getColumnIndex("package_name")),
+ cur.getString(cur.getColumnIndex("class_name")),
+ cur.getInt(cur.getColumnIndex("app_type")),
+ cur.getInt(cur.getColumnIndex("need_signature")) == 1,
+ cur.getInt(cur.getColumnIndex("further_processing")) == 1);
+ }
+ cur.close();
+ legacyDb.close();
+ db.close();
+ context.createDeviceProtectedStorageContext().moveDatabaseFrom(context, DATABASE_NAME);
+ Log.i(LOG_TAG, "Migrated the legacy database.");
+ }
/**
* This method is used for testing
diff --git a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java
index f7afc57..b9dac4e 100644
--- a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java
+++ b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.Telephony.Sms.Intents;
@@ -33,7 +34,9 @@
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.util.HexDump;
import com.android.smspush.WapPushManager;
+import com.android.smspush.WapPushManager.WapPushManDBHelper;
+import java.io.File;
import java.util.Random;
/**
@@ -467,8 +470,9 @@
try {
super.setUp();
// get verifier
- getContext().bindService(new Intent(IDataVerify.class.getName()),
- mConn, Context.BIND_AUTO_CREATE);
+ Intent intent = new Intent(IDataVerify.class.getName());
+ intent.setPackage("com.android.smspush.unitTests");
+ getContext().bindService(intent, mConn, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.w(LOG_TAG, "super exception");
}
@@ -552,15 +556,15 @@
}
/**
- * Add sqlite injection test
+ * Sqlite injection test
*/
- public void testAddPackage0() {
+ public void testSqliteInjection() {
String inject = "' union select 0,'com.android.settings','com.android.settings.Settings',0,0,0--";
- // insert new data
+ // update data
IWapPushManager iwapman = getInterface();
try {
- assertFalse(iwapman.addPackage(
+ assertFalse(iwapman.updatePackage(
inject,
Integer.toString(mContentTypeValue),
mPackageName, mClassName,
@@ -2528,4 +2532,45 @@
mMessageBody = originalMessageBody;
}
+ /**
+ * DataBase migration test.
+ */
+ public void testDataBaseMigration() {
+ IWapPushManager iwapman = getInterface();
+ WapPushManager wpman = getService();
+ Context context = getContext();
+
+ addPackageToLegacyDB(mAppIdValue, mContentTypeValue, mPackageName, mClassName,
+ WapPushManagerParams.APP_TYPE_SERVICE, true, true);
+ addPackageToLegacyDB(mAppIdValue + 10, mContentTypeValue, mPackageName, mClassName,
+ WapPushManagerParams.APP_TYPE_SERVICE, true, true);
+
+ File oldDbFile = context.getDatabasePath("wappush.db");
+ assertTrue(oldDbFile.exists());
+ assertTrue(wpman.verifyData(Integer.toString(mAppIdValue),
+ Integer.toString(mContentTypeValue),
+ mPackageName, mClassName,
+ WapPushManagerParams.APP_TYPE_SERVICE, true, true));
+ assertFalse(oldDbFile.exists());
+
+ // Clean up DB
+ try {
+ iwapman.deletePackage(Integer.toString(mAppIdValue),
+ Integer.toString(mContentTypeValue), mPackageName, mClassName);
+ iwapman.deletePackage(Integer.toString(mAppIdValue + 10),
+ Integer.toString(mContentTypeValue), mPackageName, mClassName);
+ } catch (RemoteException e) {
+ assertTrue(false);
+ }
+ }
+
+ private void addPackageToLegacyDB(int appId, int contextType, String packagename,
+ String classnName, int appType, boolean signature, boolean furtherProcessing) {
+ WapPushManager wpman = getService();
+ WapPushManDBHelper dbh = new WapPushManDBHelper(getContext());
+ SQLiteDatabase db = dbh.getWritableDatabase();
+
+ wpman.insertPackage(dbh, db, Integer.toString(appId), Integer.toString(contextType),
+ packagename, classnName, appType, signature, furtherProcessing);
+ }
}
diff --git a/rs/java/Android.bp b/rs/java/Android.bp
index 9f854f7..1c2b575 100644
--- a/rs/java/Android.bp
+++ b/rs/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-rs-sources",
srcs: ["**/*.java"],
diff --git a/sax/java/Android.bp b/sax/java/Android.bp
index 9775189..0ed69e4 100644
--- a/sax/java/Android.bp
+++ b/sax/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-sax-sources",
srcs: ["**/*.java"],
diff --git a/services/Android.bp b/services/Android.bp
index c160842..25b270e 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -66,6 +66,11 @@
visibility: ["//visibility:private"],
}
+java_library {
+ name: "Slogf",
+ srcs: ["core/java/com/android/server/utils/Slogf.java"],
+}
+
// merge all required services into one jar
// ============================================================
java_library {
@@ -118,6 +123,7 @@
libs: [
"android.hidl.manager-V1.0-java",
"framework-tethering.stubs.module_lib",
+ "service-art.stubs.system_server",
],
// Uncomment to enable output of certain warnings (deprecated, unchecked)
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 88e6b66..e9c9899 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -22,6 +22,7 @@
import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP;
import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
+import static android.view.accessibility.AccessibilityInteractionClient.CALL_STACK;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
@@ -1979,4 +1980,15 @@
"strokeWidth=" + strokeWidth + ";color=" + color);
}
}
+
+ @Override
+ public void logTrace(long timestamp, String where, String callingParams, int processId,
+ long threadId, int callingUid, Bundle callingStack) {
+ if (mTrace.isA11yTracingEnabled()) {
+ ArrayList<StackTraceElement> list =
+ (ArrayList<StackTraceElement>) callingStack.getSerializable(CALL_STACK);
+ mTrace.logTrace(timestamp, where, callingParams, processId, threadId, callingUid,
+ list.toArray(new StackTraceElement[list.size()]));
+ }
+ }
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index e7ffb1a..8e803b36 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1409,7 +1409,9 @@
}
private int getClientStateLocked(AccessibilityUserState userState) {
- return userState.getClientStateLocked(mUiAutomationManager.isUiAutomationRunningLocked());
+ return userState.getClientStateLocked(
+ mUiAutomationManager.isUiAutomationRunningLocked(),
+ mA11yController.isAccessibilityTracingEnabled());
}
private InteractionBridge getInteractionBridge() {
@@ -3322,7 +3324,7 @@
mConnectionId = service.mId;
- mClient = AccessibilityInteractionClient.getInstance();
+ mClient = AccessibilityInteractionClient.getInstance(mContext);
mClient.addConnection(mConnectionId, service);
//TODO: (multi-display) We need to support multiple displays.
@@ -3866,6 +3868,24 @@
}
@Override
+ public void startTrace() {
+ if (!mA11yController.isAccessibilityTracingEnabled()) {
+ mA11yController.startTrace();
+ final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM);
+ scheduleUpdateClientsIfNeededLocked(userState);
+ }
+ }
+
+ @Override
+ public void stopTrace() {
+ if (mA11yController.isAccessibilityTracingEnabled()) {
+ mA11yController.stopTrace();
+ final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM);
+ scheduleUpdateClientsIfNeededLocked(userState);
+ }
+ }
+
+ @Override
public void logTrace(String where) {
logTrace(where, "");
}
@@ -3875,4 +3895,13 @@
mA11yController.logTrace(where, callingParams, "".getBytes(),
Binder.getCallingUid(), Thread.currentThread().getStackTrace());
}
+
+ @Override
+ public void logTrace(long timestamp, String where, String callingParams, int processId,
+ long threadId, int callingUid, StackTraceElement[] callStack) {
+ if (mA11yController.isAccessibilityTracingEnabled()) {
+ mA11yController.logTrace(where, callingParams, "".getBytes(), callingUid, callStack,
+ timestamp, processId, threadId);
+ }
+ }
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
index 0d323fb..16ce177 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
@@ -108,16 +108,12 @@
}
private int startTrace() {
- WindowManagerInternal.AccessibilityControllerInternal ac =
- mWindowManagerService.getAccessibilityController();
- ac.startTrace();
+ mService.startTrace();
return 0;
}
private int stopTrace() {
- WindowManagerInternal.AccessibilityControllerInternal ac =
- mWindowManagerService.getAccessibilityController();
- ac.stopTrace();
+ mService.stopTrace();
return 0;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityTrace.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityTrace.java
index 0c03877..0391413 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityTrace.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityTrace.java
@@ -25,6 +25,16 @@
boolean isA11yTracingEnabled();
/**
+ * Start tracing.
+ */
+ void startTrace();
+
+ /**
+ * Stop tracing.
+ */
+ void stopTrace();
+
+ /**
* Log one trace entry.
* @param where A string to identify this log entry, which can be used to filter/search
* through the tracing file.
@@ -38,4 +48,19 @@
* @param callingParams The parameters for the method to be logged.
*/
void logTrace(String where, String callingParams);
+
+ /**
+ * Log one trace entry. Accessibility services using AccessibilityInteractionClient to
+ * make screen content related requests use this API to log entry when receive callback.
+ * @param timestamp The timestamp when a callback is received.
+ * @param where A string to identify this log entry, which can be used to filter/search
+ * through the tracing file.
+ * @param callingParams The parameters for the callback.
+ * @param processId The process id of the calling component.
+ * @param threadId The threadId of the calling component.
+ * @param callingUid The calling uid of the callback.
+ * @param callStack The call stack of the callback.
+ */
+ void logTrace(long timestamp, String where, String callingParams, int processId,
+ long threadId, int callingUid, StackTraceElement[] callStack);
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index eb30fde..df349c8 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -391,7 +391,7 @@
return mBoundServices;
}
- int getClientStateLocked(boolean isUiAutomationRunning) {
+ int getClientStateLocked(boolean isUiAutomationRunning, boolean isTracingEnabled) {
int clientState = 0;
final boolean a11yEnabled = isUiAutomationRunning
|| isHandlingAccessibilityEventsLocked();
@@ -407,6 +407,9 @@
if (mIsTextHighContrastEnabled) {
clientState |= AccessibilityManager.STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED;
}
+ if (isTracingEnabled) {
+ clientState |= AccessibilityManager.STATE_FLAG_ACCESSIBILITY_TRACING_ENABLED;
+ }
return clientState;
}
diff --git a/services/backup/OWNERS b/services/backup/OWNERS
index ba2a63a..cc36b47 100644
--- a/services/backup/OWNERS
+++ b/services/backup/OWNERS
@@ -9,4 +9,3 @@
niamhfw@google.com
philippov@google.com
rthakohov@google.com
-tobiast@google.com
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 483f67a..e9b2ed3 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -637,6 +637,8 @@
return association;
}
}));
+
+ restartBleScan();
}
@Override
@@ -1118,11 +1120,18 @@
}
ComponentName componentName = packageResolveInfos.get(0).serviceInfo.getComponentName();
Slog.i(LOG_TAG, "Initializing CompanionDeviceService binding for " + componentName);
- return new ServiceConnector.Impl<>(getContext(),
+ return new ServiceConnector.Impl<ICompanionDeviceService>(getContext(),
new Intent(CompanionDeviceService.SERVICE_INTERFACE).setComponent(componentName),
BIND_IMPORTANT,
a.getUserId(),
- ICompanionDeviceService.Stub::asInterface);
+ ICompanionDeviceService.Stub::asInterface) {
+
+ @Override
+ protected long getAutoDisconnectTimeoutMs() {
+ // Service binding is managed manually based on corresponding device being nearby
+ return Long.MAX_VALUE;
+ }
+ };
}
private class BleScanCallback extends ScanCallback {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 57a93fa..185cdfc 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1294,14 +1294,22 @@
mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
+ mUserAllContext = mContext.createContextAsUser(UserHandle.ALL, 0 /* flags */);
// Listen for user add/removes to inform PermissionMonitor.
// Should run on mHandler to avoid any races.
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intent.ACTION_USER_ADDED);
- intentFilter.addAction(Intent.ACTION_USER_REMOVED);
+ final IntentFilter userIntentFilter = new IntentFilter();
+ userIntentFilter.addAction(Intent.ACTION_USER_ADDED);
+ userIntentFilter.addAction(Intent.ACTION_USER_REMOVED);
+ mUserAllContext.registerReceiver(mUserIntentReceiver, userIntentFilter,
+ null /* broadcastPermission */, mHandler);
- mUserAllContext = mContext.createContextAsUser(UserHandle.ALL, 0 /* flags */);
- mUserAllContext.registerReceiver(mIntentReceiver, intentFilter,
+ // Listen to package add/removes for netd
+ final IntentFilter packageIntentFilter = new IntentFilter();
+ packageIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+ packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ packageIntentFilter.addDataScheme("package");
+ mUserAllContext.registerReceiver(mPackageIntentReceiver, packageIntentFilter,
null /* broadcastPermission */, mHandler);
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNetd);
@@ -1914,6 +1922,10 @@
newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact());
}
newNc.setAdministratorUids(new int[0]);
+ if (!checkAnyPermissionOf(
+ callerPid, callerUid, android.Manifest.permission.NETWORK_FACTORY)) {
+ newNc.setSubIds(Collections.emptySet());
+ }
return newNc;
}
@@ -4052,7 +4064,7 @@
}
}
}
- decrementRequestCount(nri);
+ nri.decrementRequestCount();
mNetworkRequestInfoLogs.log("RELEASE " + nri);
if (null != nri.getActiveRequest()) {
@@ -4163,14 +4175,6 @@
? mSystemNetworkRequestCounter : mNetworkRequestCounter;
}
- private void incrementRequestCountOrThrow(NetworkRequestInfo nri) {
- getRequestCounter(nri).incrementCountOrThrow(nri.mUid);
- }
-
- private void decrementRequestCount(NetworkRequestInfo nri) {
- getRequestCounter(nri).decrementCount(nri.mUid);
- }
-
@Override
public void setAcceptUnvalidated(Network network, boolean accept, boolean always) {
enforceNetworkStackSettingsOrSetup();
@@ -4981,7 +4985,7 @@
}
@Override
- public void setGlobalProxy(final ProxyInfo proxyProperties) {
+ public void setGlobalProxy(@Nullable final ProxyInfo proxyProperties) {
PermissionUtils.enforceNetworkStackPermission(mContext);
mProxyTracker.setGlobalProxy(proxyProperties);
}
@@ -5326,14 +5330,14 @@
}
}
- private void onUserAdded(UserHandle user) {
+ private void onUserAdded(@NonNull final UserHandle user) {
mPermissionMonitor.onUserAdded(user);
if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) {
handleSetOemNetworkPreference(mOemNetworkPreferences, null);
}
}
- private void onUserRemoved(UserHandle user) {
+ private void onUserRemoved(@NonNull final UserHandle user) {
mPermissionMonitor.onUserRemoved(user);
// If there was a network preference for this user, remove it.
handleSetProfileNetworkPreference(new ProfileNetworkPreferences.Preference(user, null),
@@ -5343,7 +5347,18 @@
}
}
- private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ private void onPackageChanged(@NonNull final String packageName) {
+ // This is necessary in case a package is added or removed, but also when it's replaced to
+ // run as a new UID by its manifest rules. Also, if a separate package shares the same UID
+ // as one in the preferences, then it should follow the same routing as that other package,
+ // which means updating the rules is never to be needed in this case (whether it joins or
+ // leaves a UID with a preference).
+ if (isMappedInOemNetworkPreference(packageName)) {
+ handleSetOemNetworkPreference(mOemNetworkPreferences, null);
+ }
+ }
+
+ private final BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ensureRunningOnConnectivityServiceThread();
@@ -5366,6 +5381,22 @@
}
};
+ private final BroadcastReceiver mPackageIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ensureRunningOnConnectivityServiceThread();
+ switch (intent.getAction()) {
+ case Intent.ACTION_PACKAGE_ADDED:
+ case Intent.ACTION_PACKAGE_REMOVED:
+ case Intent.ACTION_PACKAGE_REPLACED:
+ onPackageChanged(intent.getData().getSchemeSpecificPart());
+ break;
+ default:
+ Log.wtf(TAG, "received unexpected intent: " + intent.getAction());
+ }
+ }
+ };
+
private final HashMap<Messenger, NetworkProviderInfo> mNetworkProviderInfos = new HashMap<>();
private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = new HashMap<>();
@@ -5458,6 +5489,9 @@
@Nullable
final String mCallingAttributionTag;
+ // Counter keeping track of this NRI.
+ final PerUidCounter mPerUidCounter;
+
// Effective UID of this request. This is different from mUid when a privileged process
// files a request on behalf of another UID. This UID is used to determine blocked status,
// UID matching, and so on. mUid above is used for permission checks and to enforce the
@@ -5508,7 +5542,8 @@
mPid = getCallingPid();
mUid = mDeps.getCallingUid();
mAsUid = asUid;
- incrementRequestCountOrThrow(this);
+ mPerUidCounter = getRequestCounter(this);
+ mPerUidCounter.incrementCountOrThrow(mUid);
/**
* Location sensitive data not included in pending intent. Only included in
* {@link NetworkCallback}.
@@ -5540,7 +5575,8 @@
mUid = mDeps.getCallingUid();
mAsUid = asUid;
mPendingIntent = null;
- incrementRequestCountOrThrow(this);
+ mPerUidCounter = getRequestCounter(this);
+ mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = callbackFlags;
mCallingAttributionTag = callingAttributionTag;
linkDeathRecipient();
@@ -5578,7 +5614,8 @@
mUid = nri.mUid;
mAsUid = nri.mAsUid;
mPendingIntent = nri.mPendingIntent;
- incrementRequestCountOrThrow(this);
+ mPerUidCounter = getRequestCounter(this);
+ mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = nri.mCallbackFlags;
mCallingAttributionTag = nri.mCallingAttributionTag;
linkDeathRecipient();
@@ -5610,6 +5647,10 @@
return Collections.unmodifiableList(tempRequests);
}
+ void decrementRequestCount() {
+ mPerUidCounter.decrementCount(mUid);
+ }
+
void linkDeathRecipient() {
if (null != mBinder) {
try {
@@ -5667,6 +5708,10 @@
"Insufficient permissions to request a specific signal strength");
}
mAppOpsManager.checkPackage(callerUid, callerPackageName);
+
+ if (!nc.getSubIds().isEmpty()) {
+ enforceNetworkFactoryPermission();
+ }
}
private int[] getSignalStrengthThresholds(@NonNull final NetworkAgentInfo nai) {
@@ -6188,6 +6233,15 @@
@NonNull
private ProfileNetworkPreferences mProfileNetworkPreferences = new ProfileNetworkPreferences();
+ /**
+ * Determine whether a given package has a mapping in the current OemNetworkPreferences.
+ * @param packageName the package name to check existence of a mapping for.
+ * @return true if a mapping exists, false otherwise
+ */
+ private boolean isMappedInOemNetworkPreference(@NonNull final String packageName) {
+ return mOemNetworkPreferences.getNetworkPreferences().containsKey(packageName);
+ }
+
// The always-on request for an Internet-capable network that apps without a specific default
// fall back to.
@VisibleForTesting
@@ -6208,7 +6262,7 @@
* @return the NetworkRequestInfo tracking the given uid.
*/
@NonNull
- private NetworkRequestInfo getDefaultRequestTrackingUid(@NonNull final int uid) {
+ private NetworkRequestInfo getDefaultRequestTrackingUid(final int uid) {
for (final NetworkRequestInfo nri : mDefaultNetworkRequests) {
if (nri == mDefaultRequest) {
continue;
@@ -6726,7 +6780,7 @@
mDeps.reportNetworkInterfaceForTransports(mContext, iface,
caps.getTransportTypes());
} catch (Exception e) {
- loge("Exception adding interface: " + e);
+ logw("Exception adding interface: " + e);
}
}
}
@@ -8875,7 +8929,7 @@
// Decrement the reference count for this NetworkRequestInfo. The reference count is
// incremented when the NetworkRequestInfo is created as part of
// enforceRequestCountLimit().
- decrementRequestCount(nri);
+ nri.decrementRequestCount();
return;
}
@@ -8941,7 +8995,7 @@
// Decrement the reference count for this NetworkRequestInfo. The reference count is
// incremented when the NetworkRequestInfo is created as part of
// enforceRequestCountLimit().
- decrementRequestCount(nri);
+ nri.decrementRequestCount();
iCb.unlinkToDeath(cbInfo, 0);
}
@@ -9517,14 +9571,8 @@
throw new IllegalArgumentException("Must explicitly specify a user handle ("
+ "UserHandle.CURRENT not supported)");
}
- final UserManager um;
- try {
- um = mContext.createContextAsUser(profile, 0 /* flags */)
- .getSystemService(UserManager.class);
- } catch (IllegalStateException e) {
- throw new IllegalArgumentException("Profile does not exist");
- }
- if (!um.isManagedProfile()) {
+ final UserManager um = mContext.getSystemService(UserManager.class);
+ if (!um.isManagedProfile(profile.getIdentifier())) {
throw new IllegalArgumentException("Profile must be a managed profile");
}
// Strictly speaking, mOemNetworkPreferences should only be touched on the
@@ -9691,7 +9739,6 @@
new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences(preference);
replaceDefaultNetworkRequestsForPreference(nris);
mOemNetworkPreferences = preference;
- // TODO http://b/176496396 persist data to shared preferences.
if (null != listener) {
try {
@@ -9848,7 +9895,6 @@
// packages are sent on a network preference as the system will watch for
// package installations associated with this network preference and update
// accordingly. This is done so as to minimize race conditions on app install.
- // TODO b/177092163 add app install watching.
continue;
}
}
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index d66d82d1..ed77147 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -16,6 +16,8 @@
package com.android.server;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_NOT_CONFIGURED;
@@ -35,12 +37,13 @@
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
+import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.net.vcn.IVcnManagementService;
import android.net.vcn.IVcnStatusCallback;
import android.net.vcn.IVcnUnderlyingNetworkPolicyListener;
import android.net.vcn.VcnConfig;
-import android.net.vcn.VcnManager;
import android.net.vcn.VcnManager.VcnErrorCode;
import android.net.vcn.VcnManager.VcnStatusCode;
import android.net.vcn.VcnUnderlyingNetworkPolicy;
@@ -162,6 +165,9 @@
@NonNull private final VcnContext mVcnContext;
@NonNull private final BroadcastReceiver mPkgChangeReceiver;
+ @NonNull
+ private final TrackingNetworkCallback mTrackingNetworkCallback = new TrackingNetworkCallback();
+
/** Can only be assigned when {@link #systemReady()} is called, since it uses AppOpsManager. */
@Nullable private LocationPermissionChecker mLocationPermissionChecker;
@@ -357,6 +363,10 @@
public void systemReady() {
mContext.getSystemService(ConnectivityManager.class)
.registerNetworkProvider(mNetworkProvider);
+ mContext.getSystemService(ConnectivityManager.class)
+ .registerNetworkCallback(
+ new NetworkRequest.Builder().clearCapabilities().build(),
+ mTrackingNetworkCallback);
mTelephonySubscriptionTracker.register();
mLocationPermissionChecker = mDeps.newLocationPermissionChecker(mVcnContext.getContext());
}
@@ -531,15 +541,7 @@
if (mVcns.containsKey(subscriptionGroup)) {
final Vcn vcn = mVcns.get(subscriptionGroup);
- final boolean isActive = vcn.isActive();
vcn.updateConfig(config);
-
- // Only notify VcnStatusCallbacks if this VCN was previously in Safe Mode
- if (!isActive) {
- // TODO(b/181789060): invoke asynchronously after Vcn notifies through VcnCallback
- notifyAllPermissionedStatusCallbacksLocked(
- subscriptionGroup, VCN_STATUS_CODE_ACTIVE);
- }
} else {
startVcnLocked(subscriptionGroup, config);
}
@@ -768,7 +770,7 @@
synchronized (mLock) {
final Vcn vcn = mVcns.get(subGrp);
if (vcn != null) {
- if (vcn.isActive()) {
+ if (vcn.getStatus() == VCN_STATUS_CODE_ACTIVE) {
isVcnManagedNetwork = true;
}
@@ -791,8 +793,9 @@
NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
}
+ final NetworkCapabilities result = ncBuilder.build();
return new VcnUnderlyingNetworkPolicy(
- false /* isTearDownRequested */, ncBuilder.build());
+ mTrackingNetworkCallback.requiresRestartForCarrierWifi(result), result);
});
}
@@ -879,20 +882,23 @@
// now that callback is registered, send it the VCN's current status
final VcnConfig vcnConfig = mConfigs.get(subGroup);
final Vcn vcn = mVcns.get(subGroup);
- final int vcnStatus;
+ final int vcnStatus =
+ vcn == null ? VCN_STATUS_CODE_NOT_CONFIGURED : vcn.getStatus();
+ final int resultStatus;
if (vcnConfig == null || !isCallbackPermissioned(cbInfo, subGroup)) {
- vcnStatus = VcnManager.VCN_STATUS_CODE_NOT_CONFIGURED;
+ resultStatus = VCN_STATUS_CODE_NOT_CONFIGURED;
} else if (vcn == null) {
- vcnStatus = VcnManager.VCN_STATUS_CODE_INACTIVE;
- } else if (vcn.isActive()) {
- vcnStatus = VcnManager.VCN_STATUS_CODE_ACTIVE;
+ resultStatus = VCN_STATUS_CODE_INACTIVE;
+ } else if (vcnStatus == VCN_STATUS_CODE_ACTIVE
+ || vcnStatus == VCN_STATUS_CODE_SAFE_MODE) {
+ resultStatus = vcnStatus;
} else {
- // TODO(b/181789060): create Vcn.getStatus() and Log.WTF() for unknown status
- vcnStatus = VcnManager.VCN_STATUS_CODE_SAFE_MODE;
+ Slog.wtf(TAG, "Unknown VCN status: " + vcnStatus);
+ resultStatus = VCN_STATUS_CODE_NOT_CONFIGURED;
}
try {
- cbInfo.mCallback.onVcnStatusChanged(vcnStatus);
+ cbInfo.mCallback.onVcnStatusChanged(resultStatus);
} catch (RemoteException e) {
Slog.d(TAG, "VcnStatusCallback threw on VCN status change", e);
}
@@ -925,17 +931,60 @@
// TODO(b/180452282): Make name more generic and implement directly with VcnManagementService
/** Callback for Vcn signals sent up to VcnManagementService. */
public interface VcnCallback {
- /** Called by a Vcn to signal that it has entered safe mode. */
- void onEnteredSafeMode();
+ /** Called by a Vcn to signal that its safe mode status has changed. */
+ void onSafeModeStatusChanged(boolean isInSafeMode);
/** Called by a Vcn to signal that an error occurred. */
void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable String exceptionClass,
@Nullable String exceptionMessage);
}
+ /**
+ * TrackingNetworkCallback tracks all active networks
+ *
+ * <p>This is used to ensure that no underlying networks have immutable capabilities changed
+ * without requiring a Network restart.
+ */
+ private class TrackingNetworkCallback extends ConnectivityManager.NetworkCallback {
+ private final Map<Network, NetworkCapabilities> mCaps = new ArrayMap<>();
+
+ @Override
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities caps) {
+ synchronized (mCaps) {
+ mCaps.put(network, caps);
+ }
+ }
+
+ @Override
+ public void onLost(Network network) {
+ synchronized (mCaps) {
+ mCaps.remove(network);
+ }
+ }
+
+ private boolean requiresRestartForCarrierWifi(NetworkCapabilities caps) {
+ if (!caps.hasTransport(TRANSPORT_WIFI) || caps.getSubIds() == null) {
+ return false;
+ }
+
+ synchronized (mCaps) {
+ for (NetworkCapabilities existing : mCaps.values()) {
+ if (existing.hasTransport(TRANSPORT_WIFI)
+ && caps.getSubIds().equals(existing.getSubIds())) {
+ // Restart if any immutable capabilities have changed
+ return existing.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)
+ != caps.hasCapability(NET_CAPABILITY_NOT_RESTRICTED);
+ }
+ }
+ }
+
+ return false;
+ }
+ }
+
/** VcnCallbackImpl for Vcn signals sent up to VcnManagementService. */
private class VcnCallbackImpl implements VcnCallback {
@NonNull private final ParcelUuid mSubGroup;
@@ -945,21 +994,24 @@
}
@Override
- public void onEnteredSafeMode() {
+ public void onSafeModeStatusChanged(boolean isInSafeMode) {
synchronized (mLock) {
// Ignore if this subscription group doesn't exist anymore
if (!mVcns.containsKey(mSubGroup)) {
return;
}
+ final int status =
+ isInSafeMode ? VCN_STATUS_CODE_SAFE_MODE : VCN_STATUS_CODE_ACTIVE;
+
notifyAllPolicyListenersLocked();
- notifyAllPermissionedStatusCallbacksLocked(mSubGroup, VCN_STATUS_CODE_SAFE_MODE);
+ notifyAllPermissionedStatusCallbacksLocked(mSubGroup, status);
}
}
@Override
public void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable String exceptionClass,
@Nullable String exceptionMessage) {
@@ -975,7 +1027,7 @@
Binder.withCleanCallingIdentity(
() ->
cbInfo.mCallback.onGatewayConnectionError(
- networkCapabilities,
+ gatewayConnectionName,
errorCode,
exceptionClass,
exceptionMessage));
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index c360190..5c2fd26 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -279,7 +279,7 @@
mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
mHandler = new MessageHandler(injector.getMessageHandlerLooper());
mAuthenticatorCache = mInjector.getAccountAuthenticatorCache();
- mAuthenticatorCache.setListener(this, mHandler);
+ mAuthenticatorCache.setListener(this, null /* Handler */);
sThis.set(this);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index b1543ee..c1ab6cc 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -24,6 +24,8 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST;
import static android.os.PowerExemptionManager.REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD;
+import static android.os.PowerExemptionManager.REASON_OP_ACTIVATE_PLATFORM_VPN;
+import static android.os.PowerExemptionManager.REASON_OP_ACTIVATE_VPN;
import static android.os.PowerWhitelistManager.REASON_ACTIVITY_STARTER;
import static android.os.PowerWhitelistManager.REASON_ALLOWLISTED_PACKAGE;
import static android.os.PowerWhitelistManager.REASON_BACKGROUND_ACTIVITY_PERMISSION;
@@ -189,6 +191,15 @@
// calling startForeground() before we ANR + stop it.
static final int SERVICE_START_FOREGROUND_TIMEOUT = 10 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
+ // Foreground service types that always get immediate notification display,
+ // expressed in the same bitmask format that ServiceRecord.foregroundServiceType
+ // uses.
+ static final int FGS_IMMEDIATE_DISPLAY_MASK =
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
+ | ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL
+ | ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
+ | ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION;
+
final ActivityManagerService mAm;
// Maximum number of services that we allow to start in the background
@@ -2018,15 +2029,12 @@
}
// or is this an type of FGS that always shows immediately?
if (!showNow) {
- switch (r.foregroundServiceType) {
- case ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK:
- case ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL:
- case ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION:
- if (DEBUG_FOREGROUND_SERVICE) {
- Slog.d(TAG_SERVICE, "FGS " + r
- + " type gets immediate display");
- }
- showNow = true;
+ if ((r.foregroundServiceType & FGS_IMMEDIATE_DISPLAY_MASK) != 0) {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG_SERVICE, "FGS " + r
+ + " type gets immediate display");
+ }
+ showNow = true;
}
}
} else {
@@ -5865,6 +5873,17 @@
}
}
+ if (ret == REASON_DENIED) {
+ final AppOpsManager appOpsManager = mAm.getAppOpsManager();
+ if (appOpsManager.checkOpNoThrow(AppOpsManager.OP_ACTIVATE_VPN, callingUid,
+ callingPackage) == AppOpsManager.MODE_ALLOWED) {
+ ret = REASON_OP_ACTIVATE_VPN;
+ } else if (appOpsManager.checkOpNoThrow(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN,
+ callingUid, callingPackage) == AppOpsManager.MODE_ALLOWED) {
+ ret = REASON_OP_ACTIVATE_PLATFORM_VPN;
+ }
+ }
+
return ret;
}
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 7f2eae8..a5474d0b 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -638,6 +638,7 @@
+ filter);
skip = true;
}
+ // Check that the sender has permission to send to this receiver
if (filter.requiredPermission != null) {
int perm = mService.checkComponentPermission(filter.requiredPermission,
r.callingPid, r.callingUid, -1, true);
@@ -666,6 +667,46 @@
}
}
}
+
+ if (!skip && (filter.receiverList.app == null || filter.receiverList.app.isKilled()
+ || filter.receiverList.app.mErrorState.isCrashing())) {
+ Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
+ + " to " + filter.receiverList + ": process gone or crashing");
+ skip = true;
+ }
+
+ // Ensure that broadcasts are only sent to other Instant Apps if they are marked as
+ // visible to Instant Apps.
+ final boolean visibleToInstantApps =
+ (r.intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) != 0;
+
+ if (!skip && !visibleToInstantApps && filter.instantApp
+ && filter.receiverList.uid != r.callingUid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent.toString()
+ + " to " + filter.receiverList.app
+ + " (pid=" + filter.receiverList.pid
+ + ", uid=" + filter.receiverList.uid + ")"
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")"
+ + " not specifying FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS");
+ skip = true;
+ }
+
+ if (!skip && !filter.visibleToInstantApp && r.callerInstantApp
+ && filter.receiverList.uid != r.callingUid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent.toString()
+ + " to " + filter.receiverList.app
+ + " (pid=" + filter.receiverList.pid
+ + ", uid=" + filter.receiverList.uid + ")"
+ + " requires receiver be visible to instant apps"
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")");
+ skip = true;
+ }
+
+ // Check that the receiver has the required permission(s) to receive this broadcast.
if (!skip && r.requiredPermissions != null && r.requiredPermissions.length > 0) {
for (int i = 0; i < r.requiredPermissions.length; i++) {
String requiredPermission = r.requiredPermissions[i];
@@ -717,6 +758,7 @@
skip = true;
}
}
+ // If the broadcast also requires an app op check that as well.
if (!skip && r.appOp != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(r.appOp,
filter.receiverList.uid, filter.packageName, filter.featureId,
@@ -733,44 +775,6 @@
skip = true;
}
- if (!skip && (filter.receiverList.app == null || filter.receiverList.app.isKilled()
- || filter.receiverList.app.mErrorState.isCrashing())) {
- Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
- + " to " + filter.receiverList + ": process gone or crashing");
- skip = true;
- }
-
- // Ensure that broadcasts are only sent to other Instant Apps if they are marked as
- // visible to Instant Apps.
- final boolean visibleToInstantApps =
- (r.intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) != 0;
-
- if (!skip && !visibleToInstantApps && filter.instantApp
- && filter.receiverList.uid != r.callingUid) {
- Slog.w(TAG, "Instant App Denial: receiving "
- + r.intent.toString()
- + " to " + filter.receiverList.app
- + " (pid=" + filter.receiverList.pid
- + ", uid=" + filter.receiverList.uid + ")"
- + " due to sender " + r.callerPackage
- + " (uid " + r.callingUid + ")"
- + " not specifying FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS");
- skip = true;
- }
-
- if (!skip && !filter.visibleToInstantApp && r.callerInstantApp
- && filter.receiverList.uid != r.callingUid) {
- Slog.w(TAG, "Instant App Denial: receiving "
- + r.intent.toString()
- + " to " + filter.receiverList.app
- + " (pid=" + filter.receiverList.pid
- + ", uid=" + filter.receiverList.uid + ")"
- + " requires receiver be visible to instant apps"
- + " due to sender " + r.callerPackage
- + " (uid " + r.callingUid + ")");
- skip = true;
- }
-
if (skip) {
r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED;
return;
@@ -1415,43 +1419,6 @@
skip = true;
}
}
- if (!skip && info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
- r.requiredPermissions != null && r.requiredPermissions.length > 0) {
- for (int i = 0; i < r.requiredPermissions.length; i++) {
- String requiredPermission = r.requiredPermissions[i];
- try {
- perm = AppGlobals.getPackageManager().
- checkPermission(requiredPermission,
- info.activityInfo.applicationInfo.packageName,
- UserHandle
- .getUserId(info.activityInfo.applicationInfo.uid));
- } catch (RemoteException e) {
- perm = PackageManager.PERMISSION_DENIED;
- }
- if (perm != PackageManager.PERMISSION_GRANTED) {
- Slog.w(TAG, "Permission Denial: receiving "
- + r.intent + " to "
- + component.flattenToShortString()
- + " requires " + requiredPermission
- + " due to sender " + r.callerPackage
- + " (uid " + r.callingUid + ")");
- skip = true;
- break;
- }
- int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
- if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp) {
- if (!noteOpForManifestReceiver(appOp, r, info, component)) {
- skip = true;
- break;
- }
- }
- }
- }
- if (!skip && r.appOp != AppOpsManager.OP_NONE) {
- if (!noteOpForManifestReceiver(r.appOp, r, info, component)) {
- skip = true;
- }
- }
boolean isSingleton = false;
try {
isSingleton = mService.isSingleton(info.activityInfo.processName,
@@ -1586,6 +1553,44 @@
+ info.activityInfo.applicationInfo.uid + " : user is not running");
}
+ if (!skip && info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
+ r.requiredPermissions != null && r.requiredPermissions.length > 0) {
+ for (int i = 0; i < r.requiredPermissions.length; i++) {
+ String requiredPermission = r.requiredPermissions[i];
+ try {
+ perm = AppGlobals.getPackageManager().
+ checkPermission(requiredPermission,
+ info.activityInfo.applicationInfo.packageName,
+ UserHandle
+ .getUserId(info.activityInfo.applicationInfo.uid));
+ } catch (RemoteException e) {
+ perm = PackageManager.PERMISSION_DENIED;
+ }
+ if (perm != PackageManager.PERMISSION_GRANTED) {
+ Slog.w(TAG, "Permission Denial: receiving "
+ + r.intent + " to "
+ + component.flattenToShortString()
+ + " requires " + requiredPermission
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")");
+ skip = true;
+ break;
+ }
+ int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
+ if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp) {
+ if (!noteOpForManifestReceiver(appOp, r, info, component)) {
+ skip = true;
+ break;
+ }
+ }
+ }
+ }
+ if (!skip && r.appOp != AppOpsManager.OP_NONE) {
+ if (!noteOpForManifestReceiver(r.appOp, r, info, component)) {
+ skip = true;
+ }
+ }
+
if (skip) {
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Skipping delivery of ordered [" + mQueueName + "] "
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 1839e2a..e4cb15f 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -23,6 +23,8 @@
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ApplicationExitInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
@@ -80,6 +82,8 @@
"compact_full_delta_rss_throttle_kb";
@VisibleForTesting static final String KEY_COMPACT_PROC_STATE_THROTTLE =
"compact_proc_state_throttle";
+ @VisibleForTesting static final String KEY_FREEZER_DEBOUNCE_TIMEOUT =
+ "freeze_debounce_timeout";
// Phenotype sends int configurations and we map them to the strings we'll use on device,
// preventing a weird string value entering the kernel.
@@ -116,6 +120,10 @@
// Format of this string should be a comma separated list of integers.
@VisibleForTesting static final String DEFAULT_COMPACT_PROC_STATE_THROTTLE =
String.valueOf(ActivityManager.PROCESS_STATE_RECEIVER);
+ @VisibleForTesting static final long DEFAULT_FREEZER_DEBOUNCE_TIMEOUT = 600_000L;
+
+ @VisibleForTesting static final Uri CACHED_APP_FREEZER_ENABLED_URI = Settings.Global.getUriFor(
+ Settings.Global.CACHED_APPS_FREEZER_ENABLED);
@VisibleForTesting
interface PropertyChangedCallbackForTest {
@@ -141,9 +149,6 @@
static final int SET_FROZEN_PROCESS_MSG = 3;
static final int REPORT_UNFREEZE_MSG = 4;
- //TODO:change this static definition into a configurable flag.
- static final long FREEZE_TIMEOUT_MS = 600000;
-
static final int DO_FREEZE = 1;
static final int REPORT_UNFREEZE = 2;
@@ -198,6 +203,8 @@
updateMinOomAdjThrottle();
} else if (KEY_COMPACT_THROTTLE_MAX_OOM_ADJ.equals(name)) {
updateMaxOomAdjThrottle();
+ } else if (KEY_FREEZER_DEBOUNCE_TIMEOUT.equals(name)) {
+ updateFreezerDebounceTimeout();
}
}
}
@@ -207,6 +214,23 @@
}
};
+ private final class SettingsContentObserver extends ContentObserver {
+ SettingsContentObserver() {
+ super(mAm.mHandler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ if (CACHED_APP_FREEZER_ENABLED_URI.equals(uri)) {
+ synchronized (mPhenotypeFlagLock) {
+ updateUseFreezer();
+ }
+ }
+ }
+ }
+
+ private final SettingsContentObserver mSettingsObserver;
+
private final Object mPhenotypeFlagLock = new Object();
// Configured by phenotype. Updates from the server take effect immediately.
@@ -259,6 +283,8 @@
@GuardedBy("mProcLock")
private boolean mFreezerOverride = false;
+ @VisibleForTesting volatile long mFreezerDebounceTimeout = DEFAULT_FREEZER_DEBOUNCE_TIMEOUT;
+
// Maps process ID to last compaction statistics for processes that we've fully compacted. Used
// when evaluating throttles that we only consider for "full" compaction, so we don't store
// data for "some" compactions. Uses LinkedHashMap to ensure insertion order is kept and
@@ -293,6 +319,7 @@
mProcStateThrottle = new HashSet<>();
mProcessDependencies = processDependencies;
mTestCallback = callback;
+ mSettingsObserver = new SettingsContentObserver();
}
/**
@@ -303,6 +330,8 @@
// TODO: initialize flags to default and only update them if values are set in DeviceConfig
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
ActivityThread.currentApplication().getMainExecutor(), mOnFlagsChangedListener);
+ mAm.mContext.getContentResolver().registerContentObserver(
+ CACHED_APP_FREEZER_ENABLED_URI, false, mSettingsObserver);
synchronized (mPhenotypeFlagLock) {
updateUseCompaction();
updateCompactionActions();
@@ -315,6 +344,7 @@
updateUseFreezer();
updateMinOomAdjThrottle();
updateMaxOomAdjThrottle();
+ updateFreezerDebounceTimeout();
}
}
@@ -367,6 +397,7 @@
+ " processes.");
pw.println(" " + KEY_USE_FREEZER + "=" + mUseFreezer);
pw.println(" " + KEY_FREEZER_STATSD_SAMPLE_RATE + "=" + mFreezerStatsdSampleRate);
+ pw.println(" " + KEY_FREEZER_DEBOUNCE_TIMEOUT + "=" + mFreezerDebounceTimeout);
if (DEBUG_COMPACTION) {
for (Map.Entry<Integer, LastCompactionStats> entry
: mLastCompactionStats.entrySet()) {
@@ -627,21 +658,28 @@
mUseFreezer = isFreezerSupported();
}
- if (mUseFreezer && mFreezeHandler == null) {
- Slog.d(TAG_AM, "Freezer enabled");
- enableFreezer(true);
+ final boolean useFreezer = mUseFreezer;
+ // enableFreezer() would need the global ActivityManagerService lock, post it.
+ mAm.mHandler.post(() -> {
+ if (useFreezer) {
+ Slog.d(TAG_AM, "Freezer enabled");
+ enableFreezer(true);
- if (!mCachedAppOptimizerThread.isAlive()) {
- mCachedAppOptimizerThread.start();
+ if (!mCachedAppOptimizerThread.isAlive()) {
+ mCachedAppOptimizerThread.start();
+ }
+
+ if (mFreezeHandler == null) {
+ mFreezeHandler = new FreezeHandler();
+ }
+
+ Process.setThreadGroupAndCpuset(mCachedAppOptimizerThread.getThreadId(),
+ Process.THREAD_GROUP_SYSTEM);
+ } else {
+ Slog.d(TAG_AM, "Freezer disabled");
+ enableFreezer(false);
}
-
- mFreezeHandler = new FreezeHandler();
-
- Process.setThreadGroupAndCpuset(mCachedAppOptimizerThread.getThreadId(),
- Process.THREAD_GROUP_SYSTEM);
- } else {
- enableFreezer(false);
- }
+ });
}
@GuardedBy("mPhenotypeFlagLock")
@@ -794,6 +832,16 @@
}
}
+ @GuardedBy("mPhenotypeFlagLock")
+ private void updateFreezerDebounceTimeout() {
+ mFreezerDebounceTimeout = DeviceConfig.getLong(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_FREEZER_DEBOUNCE_TIMEOUT, DEFAULT_FREEZER_DEBOUNCE_TIMEOUT);
+
+ if (mFreezerDebounceTimeout < 0) {
+ mFullDeltaRssThrottleKb = DEFAULT_FREEZER_DEBOUNCE_TIMEOUT;
+ }
+ }
+
private boolean parseProcStateThrottle(String procStateThrottleString) {
String[] procStates = TextUtils.split(procStateThrottleString, ",");
mProcStateThrottle.clear();
@@ -818,7 +866,7 @@
return COMPACT_ACTION_STRING[action];
}
- // This will ensure app will be out of the freezer for at least FREEZE_TIMEOUT_MS
+ // This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout.
@GuardedBy("mAm")
void unfreezeTemporarily(ProcessRecord app) {
if (mUseFreezer) {
@@ -838,7 +886,7 @@
mFreezeHandler.sendMessageDelayed(
mFreezeHandler.obtainMessage(
SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),
- FREEZE_TIMEOUT_MS);
+ mFreezerDebounceTimeout);
}
@GuardedBy({"mAm", "mProcLock"})
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 8ad11d1..c8721cc 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1864,6 +1864,7 @@
}
int capabilityFromFGS = 0; // capability from foreground service.
+ boolean scheduleLikeTopApp = false;
for (int is = psr.numberOfRunningServices() - 1;
is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
@@ -1975,6 +1976,8 @@
int clientAdj = cstate.getCurRawAdj();
int clientProcState = cstate.getCurRawProcState();
+ final boolean clientIsSystem = clientProcState < PROCESS_STATE_TOP;
+
// pass client's mAllowStartFgs to the app if client is not persistent process.
if (cstate.getAllowedStartFgs() != REASON_DENIED
&& cstate.getMaxAdj() >= ProcessList.FOREGROUND_APP_ADJ) {
@@ -2014,6 +2017,10 @@
}
String adjType = null;
if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) {
+ // Similar to BIND_WAIVE_PRIORITY, keep it unfrozen.
+ if (clientAdj < ProcessList.CACHED_APP_MIN_ADJ) {
+ app.mOptRecord.setShouldNotFreeze(true);
+ }
// Not doing bind OOM management, so treat
// this guy more like a started service.
if (state.hasShownUi() && !state.getCachedIsHomeProcess()) {
@@ -2170,8 +2177,10 @@
}
if (schedGroup < ProcessList.SCHED_GROUP_TOP_APP
- && (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0) {
+ && (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0
+ && clientIsSystem) {
schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
+ scheduleLikeTopApp = true;
}
if (!trackedProcState) {
@@ -2438,7 +2447,8 @@
// Put bound foreground services in a special sched group for additional
// restrictions on screen off
if (procState >= PROCESS_STATE_BOUND_FOREGROUND_SERVICE
- && mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) {
+ && mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
+ && !scheduleLikeTopApp) {
if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) {
schedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
}
diff --git a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
index f4ce723..026c1d3 100644
--- a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
+++ b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
@@ -28,6 +29,9 @@
private final ActivityManagerGlobalLock mProcLock;
+ @VisibleForTesting
+ static final String IS_FROZEN = "isFrozen";
+
/**
* The last time that this process was compacted.
*/
@@ -169,5 +173,6 @@
void dump(PrintWriter pw, String prefix, long nowUptime) {
pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
+ pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
}
}
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 57de708..b103def 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -34,7 +34,7 @@
import android.app.GameManager;
import android.app.GameManager.GameMode;
import android.app.IGameManagerService;
-import android.compat.Compatibility;
+import android.app.compat.PackageOverride;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -61,13 +61,12 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.compat.CompatibilityChangeConfig;
+import com.android.internal.compat.CompatibilityOverrideConfig;
import com.android.internal.compat.IPlatformCompat;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
import java.io.FileDescriptor;
-import java.util.HashSet;
import java.util.List;
/**
@@ -87,6 +86,10 @@
static final int REMOVE_SETTINGS = 2;
static final int POPULATE_GAME_MODE_SETTINGS = 3;
static final int WRITE_SETTINGS_DELAY = 10 * 1000; // 10 seconds
+ static final PackageOverride COMPAT_ENABLED = new PackageOverride.Builder().setEnabled(true)
+ .build();
+ static final PackageOverride COMPAT_DISABLED = new PackageOverride.Builder().setEnabled(false)
+ .build();
private final Context mContext;
private final Object mLock = new Object();
@@ -578,17 +581,14 @@
private void disableCompatScale(String packageName) {
final long uid = Binder.clearCallingIdentity();
try {
- final HashSet<Long> disabledSet = new HashSet<>();
- disabledSet.add(DOWNSCALED);
- final CompatibilityChangeConfig changeConfig = new CompatibilityChangeConfig(
- new Compatibility.ChangeConfig(new HashSet<>(), disabledSet));
- // TODO: switch to new API provided by aosp/1599153 once merged
+ final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>();
+ overrides.put(DOWNSCALED, COMPAT_DISABLED);
+ final CompatibilityOverrideConfig changeConfig = new CompatibilityOverrideConfig(
+ overrides);
try {
- mPlatformCompat.setOverridesForTest(changeConfig, packageName);
- } catch (SecurityException e) {
- Slog.e(TAG, "Missing compat override permission", e);
+ mPlatformCompat.setOverridesOnReleaseBuilds(changeConfig, packageName);
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to call IPlatformCompat#setOverridesForTest", e);
+ Slog.e(TAG, "Failed to call IPlatformCompat#setOverridesOnReleaseBuilds", e);
}
} finally {
Binder.restoreCallingIdentity(uid);
@@ -598,25 +598,20 @@
private void enableCompatScale(String packageName, long scaleId) {
final long uid = Binder.clearCallingIdentity();
try {
- final HashSet<Long> disabledSet = new HashSet<>();
- final HashSet<Long> enabledSet = new HashSet<>();
- disabledSet.add(DOWNSCALE_50);
- disabledSet.add(DOWNSCALE_60);
- disabledSet.add(DOWNSCALE_70);
- disabledSet.add(DOWNSCALE_80);
- disabledSet.add(DOWNSCALE_90);
- disabledSet.remove(scaleId);
- enabledSet.add(DOWNSCALED);
- enabledSet.add(scaleId);
- final CompatibilityChangeConfig changeConfig = new CompatibilityChangeConfig(
- new Compatibility.ChangeConfig(enabledSet, disabledSet));
- // TODO: switch to new API provided by aosp/1599153 once merged
+ final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>();
+ overrides.put(DOWNSCALED, COMPAT_ENABLED);
+ overrides.put(DOWNSCALE_50, COMPAT_DISABLED);
+ overrides.put(DOWNSCALE_60, COMPAT_DISABLED);
+ overrides.put(DOWNSCALE_70, COMPAT_DISABLED);
+ overrides.put(DOWNSCALE_80, COMPAT_DISABLED);
+ overrides.put(DOWNSCALE_90, COMPAT_DISABLED);
+ overrides.put(scaleId, COMPAT_ENABLED);
+ final CompatibilityOverrideConfig changeConfig = new CompatibilityOverrideConfig(
+ overrides);
try {
- mPlatformCompat.setOverridesForTest(changeConfig, packageName);
- } catch (SecurityException e) {
- Slog.e(TAG, "Missing compat override permission", e);
+ mPlatformCompat.setOverridesOnReleaseBuilds(changeConfig, packageName);
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to call IPlatformCompat#setOverridesForTest", e);
+ Slog.e(TAG, "Failed to call IPlatformCompat#setOverridesOnReleaseBuilds", e);
}
} finally {
Binder.restoreCallingIdentity(uid);
diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java
index e16a6cc..232005b 100644
--- a/services/core/java/com/android/server/appop/DiscreteRegistry.java
+++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java
@@ -89,6 +89,10 @@
private static final String PROPERTY_DISCRETE_HISTORY_CUTOFF = "discrete_history_cutoff_millis";
private static final String PROPERTY_DISCRETE_HISTORY_QUANTIZATION =
"discrete_history_quantization_millis";
+ private static final String PROPERTY_DISCRETE_FLAGS = "discrete_history_op_flags";
+ private static final String PROPERTY_DISCRETE_OPS_LIST = "discrete_history_ops_cslist";
+ private static final String DEFAULT_DISCRETE_OPS = OP_CAMERA + "," + OP_RECORD_AUDIO + ","
+ + OP_FINE_LOCATION + "," + OP_COARSE_LOCATION;
private static final long DEFAULT_DISCRETE_HISTORY_CUTOFF = Duration.ofHours(24).toMillis();
private static final long MAXIMUM_DISCRETE_HISTORY_CUTOFF = Duration.ofDays(30).toMillis();
private static final long DEFAULT_DISCRETE_HISTORY_QUANTIZATION =
@@ -96,6 +100,9 @@
private static long sDiscreteHistoryCutoff;
private static long sDiscreteHistoryQuantization;
+ private static int[] sDiscreteOps;
+ private static int sDiscreteFlags;
+
private static final String TAG_HISTORY = "h";
private static final String ATTR_VERSION = "v";
@@ -155,6 +162,10 @@
PROPERTY_DISCRETE_HISTORY_CUTOFF, DEFAULT_DISCRETE_HISTORY_CUTOFF);
sDiscreteHistoryQuantization = DeviceConfig.getLong(DeviceConfig.NAMESPACE_PRIVACY,
PROPERTY_DISCRETE_HISTORY_QUANTIZATION, DEFAULT_DISCRETE_HISTORY_QUANTIZATION);
+ sDiscreteFlags = DeviceConfig.getInt(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_DISCRETE_FLAGS, OP_FLAGS_DISCRETE);
+ sDiscreteOps = parseOpsList(DeviceConfig.getString(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_DISCRETE_OPS_LIST, DEFAULT_DISCRETE_OPS));
}
private void setDiscreteHistoryParameters(DeviceConfig.Properties p) {
@@ -174,6 +185,13 @@
sDiscreteHistoryQuantization);
}
}
+ if (p.getKeyset().contains(PROPERTY_DISCRETE_FLAGS)) {
+ sDiscreteFlags = p.getInt(PROPERTY_DISCRETE_FLAGS, OP_FLAGS_DISCRETE);
+ }
+ if (p.getKeyset().contains(PROPERTY_DISCRETE_OPS_LIST)) {
+ sDiscreteOps = parseOpsList(p.getString(PROPERTY_DISCRETE_OPS_LIST,
+ DEFAULT_DISCRETE_OPS));
+ }
}
private void createDiscreteAccessDir() {
@@ -323,30 +341,15 @@
}
public static boolean isDiscreteOp(int op, int uid, @AppOpsManager.OpFlags int flags) {
- if (!isDiscreteOp(op)) {
+ if (!ArrayUtils.contains(sDiscreteOps, op)) {
return false;
}
- if (!isDiscreteUid(uid)) {
- return false;
- }
- if ((flags & (OP_FLAGS_DISCRETE)) == 0) {
- return false;
- }
- return true;
- }
-
- static boolean isDiscreteOp(int op) {
- if (op != OP_CAMERA && op != OP_RECORD_AUDIO && op != OP_FINE_LOCATION
- && op != OP_COARSE_LOCATION) {
- return false;
- }
- return true;
- }
-
- static boolean isDiscreteUid(int uid) {
if (uid < Process.FIRST_APPLICATION_UID) {
return false;
}
+ if ((flags & (sDiscreteFlags)) == 0) {
+ return false;
+ }
return true;
}
@@ -876,6 +879,26 @@
}
}
+ private static int[] parseOpsList(String opsList) {
+ String[] strArr;
+ if (opsList.isEmpty()) {
+ strArr = new String[0];
+ } else {
+ strArr = opsList.split(",");
+ }
+ int nOps = strArr.length;
+ int[] result = new int[nOps];
+ try {
+ for (int i = 0; i < nOps; i++) {
+ result[i] = Integer.parseInt(strArr[i]);
+ }
+ } catch (NumberFormatException e) {
+ Slog.e(TAG, "Failed to parse Discrete ops list: " + e.getMessage());
+ return parseOpsList(DEFAULT_DISCRETE_OPS);
+ }
+ return result;
+ }
+
private static List<DiscreteOpEvent> stableListMerge(List<DiscreteOpEvent> a,
List<DiscreteOpEvent> b) {
int nA = a.size();
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 16a9626..2de2fdf 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -128,6 +128,7 @@
import android.os.UserManager;
import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.os.VibratorManager;
import android.provider.Settings;
import android.provider.Settings.System;
import android.service.notification.ZenModeConfig;
@@ -1092,6 +1093,33 @@
}
}
+ private void updateVibratorInfos() {
+ VibratorManager vibratorManager = mContext.getSystemService(VibratorManager.class);
+ if (vibratorManager == null) {
+ Slog.e(TAG, "Vibrator manager is not found");
+ return;
+ }
+ int[] vibratorIds = vibratorManager.getVibratorIds();
+ if (vibratorIds.length == 0) {
+ Slog.d(TAG, "No vibrator found");
+ return;
+ }
+ List<Vibrator> vibrators = new ArrayList<>(vibratorIds.length);
+ for (int id : vibratorIds) {
+ Vibrator vibrator = vibratorManager.getVibrator(id);
+ if (vibrator != null) {
+ vibrators.add(vibrator);
+ } else {
+ Slog.w(TAG, "Vibrator(" + id + ") is not found");
+ }
+ }
+ if (vibrators.isEmpty()) {
+ Slog.w(TAG, "Cannot find any available vibrator");
+ return;
+ }
+ AudioSystem.setVibratorInfos(vibrators);
+ }
+
public void onSystemReady() {
mSystemReady = true;
scheduleLoadSoundEffects();
@@ -1149,6 +1177,8 @@
setMicMuteFromSwitchInput();
initMinStreamVolumeWithoutModifyAudioSettings();
+
+ updateVibratorInfos();
}
RoleObserver mRoleObserver;
@@ -1231,7 +1261,7 @@
// Restore call state
synchronized (mDeviceBroker.mSetModeLock) {
onUpdateAudioMode(AudioSystem.MODE_CURRENT, android.os.Process.myPid(),
- mContext.getPackageName());
+ mContext.getPackageName(), true /*force*/);
}
final int forSys;
synchronized (mSettingsLock) {
@@ -1341,6 +1371,9 @@
setMicrophoneMuteNoCallerCheck(getCurrentUserId()); // will also update the mic mute cache
setMicMuteFromSwitchInput();
+
+ // Restore vibrator info
+ updateVibratorInfos();
}
private void onReinitVolumes(@NonNull String caller) {
@@ -4614,7 +4647,8 @@
}
@GuardedBy("mDeviceBroker.mSetModeLock")
- void onUpdateAudioMode(int requestedMode, int requesterPid, String requesterPackage) {
+ void onUpdateAudioMode(int requestedMode, int requesterPid, String requesterPackage,
+ boolean force) {
if (requestedMode == AudioSystem.MODE_CURRENT) {
requestedMode = getMode();
}
@@ -4631,7 +4665,7 @@
Log.v(TAG, "onUpdateAudioMode() new mode: " + mode + ", current mode: "
+ mMode.get() + " requested mode: " + requestedMode);
}
- if (mode != mMode.get()) {
+ if (mode != mMode.get() || force) {
final long identity = Binder.clearCallingIdentity();
int status = mAudioSystem.setPhoneState(mode, uid);
Binder.restoreCallingIdentity(identity);
@@ -7402,8 +7436,8 @@
h.setPlaybackActive(mPlaybackMonitor.isPlaybackActiveForUid(h.getUid()));
h.setRecordingActive(mRecordMonitor.isRecordingActiveForUid(h.getUid()));
if (wasActive != h.isActive()) {
- onUpdateAudioMode(AudioSystem.MODE_CURRENT,
- android.os.Process.myPid(), mContext.getPackageName());
+ onUpdateAudioMode(AudioSystem.MODE_CURRENT, android.os.Process.myPid(),
+ mContext.getPackageName(), false /*force*/);
}
}
break;
@@ -7428,7 +7462,7 @@
case MSG_UPDATE_AUDIO_MODE:
synchronized (mDeviceBroker.mSetModeLock) {
- onUpdateAudioMode(msg.arg1, msg.arg2, (String) msg.obj);
+ onUpdateAudioMode(msg.arg1, msg.arg2, (String) msg.obj, false /*force*/);
}
break;
}
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index 7296679..88e47a0 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -48,10 +48,12 @@
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.iris.IIrisService;
import android.os.Binder;
+import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Slog;
import com.android.internal.R;
@@ -70,6 +72,9 @@
public class AuthService extends SystemService {
private static final String TAG = "AuthService";
private static final boolean DEBUG = false;
+ private static final String SETTING_HIDL_DISABLED =
+ "com.android.server.biometrics.AuthService.hidlDisabled";
+ private static final int DEFAULT_HIDL_DISABLED = 0;
private final Injector mInjector;
@@ -142,6 +147,18 @@
public AppOpsManager getAppOps(Context context) {
return context.getSystemService(AppOpsManager.class);
}
+
+ /**
+ * Allows to ignore HIDL HALs on debug builds based on a secure setting.
+ */
+ @VisibleForTesting
+ public boolean isHidlDisabled(Context context) {
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
+ return Settings.Secure.getIntForUser(context.getContentResolver(),
+ SETTING_HIDL_DISABLED, DEFAULT_HIDL_DISABLED, UserHandle.USER_CURRENT) == 1;
+ }
+ return false;
+ }
}
private final class AuthServiceImpl extends IAuthService.Stub {
@@ -561,12 +578,14 @@
public void onStart() {
mBiometricService = mInjector.getBiometricService();
- final String[] configs = mInjector.getConfiguration(getContext());
- for (String config : configs) {
- try {
- registerAuthenticator(new SensorConfig(config));
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
+ if (!mInjector.isHidlDisabled(getContext())) {
+ final String[] configs = mInjector.getConfiguration(getContext());
+ for (String config : configs) {
+ try {
+ registerAuthenticator(new SensorConfig(config));
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Remote exception", e);
+ }
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
index a5e6ddb..ca9be67 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
@@ -48,7 +48,7 @@
*/
public class BiometricTestSessionImpl extends ITestSession.Stub {
- private static final String TAG = "BiometricTestSessionImpl";
+ private static final String TAG = "face/aidl/BiometricTestSessionImpl";
@NonNull private final Context mContext;
private final int mSensorId;
@@ -230,10 +230,12 @@
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
+ Slog.d(TAG, "cleanupInternalState: " + userId);
mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {
+ Slog.d(TAG, "onClientStarted: " + clientMonitor);
mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
@@ -244,6 +246,7 @@
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
try {
+ Slog.d(TAG, "onClientFinished: " + clientMonitor);
mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index a9be8e1..4fb71ff 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -49,7 +49,6 @@
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
-import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -443,7 +442,7 @@
mContext.getOpPackageName(), sensorId, enrolledList,
FaceUtils.getInstance(sensorId),
mSensors.get(sensorId).getAuthenticatorIds());
- scheduleForSensor(sensorId, client);
+ scheduleForSensor(sensorId, client, callback);
});
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
index 20b3254..1c88d67 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
@@ -45,7 +45,7 @@
*/
class BiometricTestSessionImpl extends ITestSession.Stub {
- private static final String TAG = "BiometricTestSessionImpl";
+ private static final String TAG = "fp/aidl/BiometricTestSessionImpl";
@NonNull private final Context mContext;
private final int mSensorId;
@@ -198,10 +198,12 @@
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
+ Slog.d(TAG, "cleanupInternalState: " + userId);
mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
@Override
public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
try {
+ Slog.d(TAG, "onClientStarted: " + clientMonitor);
mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
@@ -212,6 +214,7 @@
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
boolean success) {
try {
+ Slog.d(TAG, "onClientFinished: " + clientMonitor);
mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception", e);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index 972071c..01fd641 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -52,7 +52,6 @@
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
-import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.InvalidationRequesterClient;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -153,7 +152,10 @@
prop.commonProps.maxEnrollmentsPerUser,
componentInfo,
prop.sensorType,
- true /* resetLockoutRequiresHardwareAuthToken */);
+ true /* resetLockoutRequiresHardwareAuthToken */,
+ prop.sensorLocations[0].sensorLocationX,
+ prop.sensorLocations[0].sensorLocationY,
+ prop.sensorLocations[0].sensorRadius);
final Sensor sensor = new Sensor(getTag() + "/" + sensorId, this, mContext, mHandler,
internalProp, gestureAvailabilityDispatcher);
@@ -388,7 +390,7 @@
public void scheduleRemove(int sensorId, @NonNull IBinder token,
@NonNull IFingerprintServiceReceiver receiver, int fingerId, int userId,
@NonNull String opPackageName) {
- scheduleRemoveSpecifiedIds(sensorId, token, new int[] {fingerId}, userId, receiver,
+ scheduleRemoveSpecifiedIds(sensorId, token, new int[]{fingerId}, userId, receiver,
opPackageName);
}
@@ -430,7 +432,7 @@
mContext.getOpPackageName(), sensorId, enrolledList,
FingerprintUtils.getInstance(sensorId),
mSensors.get(sensorId).getAuthenticatorIds());
- scheduleForSensor(sensorId, client);
+ scheduleForSensor(sensorId, client, callback);
});
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index e149ca9..243cc7c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -119,6 +119,7 @@
private int mCurrentUserId = UserHandle.USER_NULL;
private final boolean mIsUdfps;
private final int mSensorId;
+ private boolean mIsPowerbuttonFps;
private final class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -345,9 +346,18 @@
mIsUdfps = !ArrayUtils.isEmpty(
mContext.getResources().getIntArray(R.array.config_udfps_sensor_props));
- final @FingerprintSensorProperties.SensorType int sensorType =
- mIsUdfps ? FingerprintSensorProperties.TYPE_UDFPS_OPTICAL
- : FingerprintSensorProperties.TYPE_REAR;
+ // config_is_powerbutton_fps indicates whether device has a power button fingerprint sensor.
+ mIsPowerbuttonFps = mContext.getResources().getBoolean(R.bool.config_is_powerbutton_fps);
+
+ final @FingerprintSensorProperties.SensorType int sensorType;
+ if (mIsUdfps) {
+ sensorType = FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
+ } else if (mIsPowerbuttonFps) {
+ sensorType = FingerprintSensorProperties.TYPE_POWER_BUTTON;
+ } else {
+ sensorType = FingerprintSensorProperties.TYPE_REAR;
+ }
+
// IBiometricsFingerprint@2.1 does not manage timeout below the HAL, so the Gatekeeper HAT
// cannot be checked
final boolean resetLockoutRequiresHardwareAuthToken = false;
@@ -835,6 +845,7 @@
try {
dump.put("service", TAG);
dump.put("isUdfps", mIsUdfps);
+ dump.put("isPowerbuttonFps", mIsPowerbuttonFps);
JSONArray sets = new JSONArray();
for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index cd24576..1bbcede 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -528,8 +528,13 @@
} catch (RemoteException e) {
Log.e(TAG, "Failed to register task stack listener!");
}
+ }
- CameraStatsJobService.schedule(mContext);
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == PHASE_BOOT_COMPLETED) {
+ CameraStatsJobService.schedule(mContext);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index 75aa6c9..2bc81cb 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -234,7 +234,6 @@
private final AppOpsManager mAppOps;
private final ContentCaptureManagerInternal mContentCaptureInternal;
private final AutofillManagerInternal mAutofillInternal;
- private final TextClassificationManager mTextClassificationManager;
private final IBinder mPermissionOwner;
private final HostClipboardMonitor mHostClipboardMonitor;
private final Handler mWorkerHandler;
@@ -265,8 +264,6 @@
mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
mContentCaptureInternal = LocalServices.getService(ContentCaptureManagerInternal.class);
mAutofillInternal = LocalServices.getService(AutofillManagerInternal.class);
- mTextClassificationManager = (TextClassificationManager)
- getContext().getSystemService(Context.TEXT_CLASSIFICATION_SERVICE);
final IBinder permOwner = mUgmInternal.newUriPermissionOwner("clipboard");
mPermissionOwner = permOwner;
if (IS_EMULATOR) {
@@ -659,12 +656,12 @@
}
}
+ final int userId = UserHandle.getUserId(uid);
if (clip != null) {
- startClassificationLocked(clip);
+ startClassificationLocked(clip, userId);
}
// Update this user
- final int userId = UserHandle.getUserId(uid);
setPrimaryClipInternalLocked(getClipboardLocked(userId), clip, uid, sourcePackage);
// Update related users
@@ -763,14 +760,15 @@
}
@GuardedBy("mLock")
- private void startClassificationLocked(@NonNull ClipData clip) {
+ private void startClassificationLocked(@NonNull ClipData clip, @UserIdInt int userId) {
TextClassifier classifier;
final long ident = Binder.clearCallingIdentity();
try {
- classifier = mTextClassificationManager.createTextClassificationSession(
- new TextClassificationContext.Builder(
- getContext().getPackageName(),
- TextClassifier.WIDGET_TYPE_CLIPBOARD
+ classifier = createTextClassificationManagerAsUser(userId)
+ .createTextClassificationSession(
+ new TextClassificationContext.Builder(
+ getContext().getPackageName(),
+ TextClassifier.WIDGET_TYPE_CLIPBOARD
).build()
);
} finally {
@@ -1125,4 +1123,8 @@
&& item.getIntent() == null;
}
+ private TextClassificationManager createTextClassificationManagerAsUser(@UserIdInt int userId) {
+ Context context = getContext().createContextAsUser(UserHandle.of(userId), /* flags= */ 0);
+ return context.getSystemService(TextClassificationManager.class);
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 820198c..33224f4 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -102,7 +102,6 @@
import android.provider.Settings;
import android.security.Credentials;
import android.security.KeyStore2;
-import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.KeyProperties;
import android.system.keystore2.Domain;
import android.system.keystore2.KeyDescriptor;
@@ -2057,10 +2056,6 @@
if (alias == null) {
return null;
}
- // If Keystore 2.0 is not enabled the legacy private key prefix is used.
- if (!AndroidKeyStoreProvider.isKeystore2Enabled()) {
- return Credentials.USER_PRIVATE_KEY + alias;
- }
final KeyStore2 keystore2 = KeyStore2.getInstance();
KeyDescriptor key = new KeyDescriptor();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 3ac11da..ed8ea18 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -3541,15 +3541,16 @@
InputBindResult res = null;
// We shows the IME when the system allows the IME focused target window to restore the
// IME visibility (e.g. switching to the app task when last time the IME is visible).
- if (isTextEditor && mWindowManagerInternal.shouldRestoreImeVisibility(windowToken)) {
- if (attribute != null) {
- res = startInputUncheckedLocked(cs, inputContext, missingMethods,
- attribute, startInputFlags, startInputReason);
- showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null,
- SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY);
- } else {
- res = InputBindResult.NULL_EDITOR_INFO;
- }
+ // Note that we don't restore IME visibility for some cases (e.g. when the soft input
+ // state is ALWAYS_HIDDEN or STATE_HIDDEN with forward navigation).
+ // Because the app might leverage these flags to hide soft-keyboard with showing their own
+ // UI for input.
+ if (isTextEditor && attribute != null
+ && shouldRestoreImeVisibility(windowToken, softInputMode)) {
+ res = startInputUncheckedLocked(cs, inputContext, missingMethods, attribute,
+ startInputFlags, startInputReason);
+ showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null,
+ SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY);
return res;
}
@@ -3673,6 +3674,19 @@
return res;
}
+ private boolean shouldRestoreImeVisibility(IBinder windowToken,
+ @SoftInputModeFlags int softInputMode) {
+ switch (softInputMode & LayoutParams.SOFT_INPUT_MASK_STATE) {
+ case LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
+ return false;
+ case LayoutParams.SOFT_INPUT_STATE_HIDDEN:
+ if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+ return false;
+ }
+ }
+ return mWindowManagerInternal.shouldRestoreImeVisibility(windowToken);
+ }
+
private boolean isImeVisible() {
return (mImeWindowVis & InputMethodService.IME_VISIBLE) != 0;
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 22a9a47..71a5d1c 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -98,6 +98,7 @@
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.WrappedApplicationKey;
+import android.security.keystore2.AndroidKeyStoreProvider;
import android.service.gatekeeper.GateKeeperResponse;
import android.service.gatekeeper.IGateKeeperService;
import android.text.TextUtils;
@@ -261,7 +262,7 @@
@Override
public void onStart() {
- android.security.keystore2.AndroidKeyStoreProvider.install();
+ AndroidKeyStoreProvider.install();
mLockSettingsService = new LockSettingsService(getContext());
publishBinderService("lock_settings", mLockSettingsService);
}
@@ -788,10 +789,6 @@
// Notify keystore that a new user was added.
final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
AndroidKeyStoreMaintenance.onUserAdded(userHandle);
- final KeyStore ks = KeyStore.getInstance();
- final UserInfo parentInfo = mUserManager.getProfileParent(userHandle);
- final int parentHandle = parentInfo != null ? parentInfo.id : -1;
- ks.onUserAdded(userHandle, parentHandle);
} else if (Intent.ACTION_USER_STARTING.equals(intent.getAction())) {
final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
mStorage.prefetchUser(userHandle);
@@ -1260,19 +1257,11 @@
private void setKeystorePassword(byte[] password, int userHandle) {
AndroidKeyStoreMaintenance.onUserPasswordChanged(userHandle, password);
- final KeyStore ks = KeyStore.getInstance();
- // TODO(b/120484642): Update keystore to accept byte[] passwords
- String passwordString = password == null ? null : new String(password);
- ks.onUserPasswordChanged(userHandle, passwordString);
}
private void unlockKeystore(byte[] password, int userHandle) {
if (DEBUG) Slog.v(TAG, "Unlock keystore for user: " + userHandle);
Authorization.onLockScreenEvent(false, userHandle, password);
- // TODO(b/120484642): Update keystore to accept byte[] passwords
- String passwordString = password == null ? null : new String(password);
- final KeyStore ks = KeyStore.getInstance();
- ks.unlock(userHandle, passwordString);
}
@VisibleForTesting /** Note: this method is overridden in unit tests */
@@ -2287,8 +2276,6 @@
mStrongAuth.removeUser(userId);
AndroidKeyStoreMaintenance.onUserRemoved(userId);
- final KeyStore ks = KeyStore.getInstance();
- ks.onUserRemoved(userId);
mManagedProfilePasswordCache.removePassword(userId);
gateKeeperClearSecureUserId(userId);
diff --git a/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java b/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
index 7950fcf..fa477c8 100644
--- a/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
+++ b/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
@@ -20,10 +20,10 @@
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
-import android.security.keystore.AndroidKeyStoreSpi;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import android.security.keystore.UserNotAuthenticatedException;
+import android.security.keystore2.AndroidKeyStoreSpi;
import android.util.Slog;
import android.util.SparseArray;
diff --git a/services/core/java/com/android/server/locksettings/RebootEscrowKeyStoreManager.java b/services/core/java/com/android/server/locksettings/RebootEscrowKeyStoreManager.java
index bae029c..da29368 100644
--- a/services/core/java/com/android/server/locksettings/RebootEscrowKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/RebootEscrowKeyStoreManager.java
@@ -16,11 +16,10 @@
package com.android.server.locksettings;
-import android.security.keystore.AndroidKeyStoreSpi;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import android.security.keystore2.AndroidKeyStoreLoadStoreParameter;
-import android.security.keystore2.AndroidKeyStoreProvider;
+import android.security.keystore2.AndroidKeyStoreSpi;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -67,9 +66,7 @@
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER);
KeyStore.LoadStoreParameter loadStoreParameter = null;
// Load from the specific namespace if keystore2 is enabled.
- if (AndroidKeyStoreProvider.isInstalled()) {
- loadStoreParameter = new AndroidKeyStoreLoadStoreParameter(KEY_STORE_NAMESPACE);
- }
+ loadStoreParameter = new AndroidKeyStoreLoadStoreParameter(KEY_STORE_NAMESPACE);
keyStore.load(loadStoreParameter);
return (SecretKey) keyStore.getKey(REBOOT_ESCROW_KEY_STORE_ENCRYPTION_KEY_NAME,
null);
@@ -91,9 +88,7 @@
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER);
KeyStore.LoadStoreParameter loadStoreParameter = null;
// Load from the specific namespace if keystore2 is enabled.
- if (AndroidKeyStoreProvider.isInstalled()) {
- loadStoreParameter = new AndroidKeyStoreLoadStoreParameter(KEY_STORE_NAMESPACE);
- }
+ loadStoreParameter = new AndroidKeyStoreLoadStoreParameter(KEY_STORE_NAMESPACE);
keyStore.load(loadStoreParameter);
keyStore.deleteEntry(REBOOT_ESCROW_KEY_STORE_ENCRYPTION_KEY_NAME);
} catch (IOException | GeneralSecurityException e) {
@@ -119,9 +114,7 @@
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE);
// Generate the key with the correct namespace if keystore2 is enabled.
- if (AndroidKeyStoreProvider.isInstalled()) {
- parameterSpecBuilder.setNamespace(KEY_STORE_NAMESPACE);
- }
+ parameterSpecBuilder.setNamespace(KEY_STORE_NAMESPACE);
generator.init(parameterSpecBuilder.build());
return generator.generateKey();
} catch (GeneralSecurityException e) {
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
index 2398f56..8582c67 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
@@ -20,8 +20,6 @@
import android.annotation.Nullable;
import android.os.ServiceSpecificException;
-import android.security.Credentials;
-import android.security.KeyStore;
import android.security.KeyStore2;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
@@ -75,13 +73,7 @@
public @Nullable String getGrantAlias(int userId, int uid, String alias) {
Log.i(TAG, String.format(Locale.US, "Get %d/%d/%s", userId, uid, alias));
String keystoreAlias = getInternalAlias(userId, uid, alias);
- if (useKeyStore2()) {
- return makeKeystoreEngineGrantString(uid, keystoreAlias);
- } else {
- // Aliases used by {@link KeyStore} are different than used by public API.
- // {@code USER_PRIVATE_KEY} prefix is used secret keys.
- return KeyStore.getInstance().grant(Credentials.USER_PRIVATE_KEY + keystoreAlias, uid);
- }
+ return makeKeystoreEngineGrantString(uid, keystoreAlias);
}
public void setSymmetricKeyEntry(int userId, int uid, String alias, byte[] secretKey)
@@ -148,9 +140,4 @@
}
return String.format("%s%016X", APPLICATION_KEY_GRANT_PREFIX, key.nspace);
}
-
- private static boolean useKeyStore2() {
- return android.security.keystore2.AndroidKeyStoreProvider.isInstalled();
- }
-
}
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 31edf43..5286bce 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -113,6 +113,22 @@
////////////////////////////////////////////////////////////////
@NonNull
+ public void checkModifyAudioRoutingPermission() {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ try {
+ if (mContext.checkPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING, pid, uid)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold the MODIFY_AUDIO_ROUTING permission.");
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @NonNull
public List<MediaRoute2Info> getSystemRoutes() {
final int uid = Binder.getCallingUid();
final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index b6d6cc4..3d19b70 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -438,6 +438,12 @@
// Binder call
@Override
+ public void checkModifyAudioRoutingPermission() {
+ mService2.checkModifyAudioRoutingPermission();
+ }
+
+ // Binder call
+ @Override
public List<MediaRoute2Info> getSystemRoutes() {
return mService2.getSystemRoutes();
}
@@ -722,7 +728,7 @@
clientRecord.mGroupId = groupId;
if (groupId != null) {
userRecord.addToGroup(groupId, clientRecord);
- userRecord.mHandler.obtainMessage(UserHandler.MSG_UPDATE_SELECTED_ROUTE, groupId)
+ userRecord.mHandler.obtainMessage(UserHandler.MSG_NOTIFY_GROUP_ROUTE_SELECTED, groupId)
.sendToTarget();
}
}
@@ -803,7 +809,7 @@
if (group != null) {
group.mSelectedRouteId = routeId;
clientRecord.mUserRecord.mHandler.obtainMessage(
- UserHandler.MSG_UPDATE_SELECTED_ROUTE, clientRecord.mGroupId)
+ UserHandler.MSG_NOTIFY_GROUP_ROUTE_SELECTED, clientRecord.mGroupId)
.sendToTarget();
}
}
@@ -1073,7 +1079,7 @@
public static final int MSG_REQUEST_UPDATE_VOLUME = 7;
private static final int MSG_UPDATE_CLIENT_STATE = 8;
private static final int MSG_CONNECTION_TIMED_OUT = 9;
- private static final int MSG_UPDATE_SELECTED_ROUTE = 10;
+ private static final int MSG_NOTIFY_GROUP_ROUTE_SELECTED = 10;
private static final int TIMEOUT_REASON_NOT_AVAILABLE = 1;
private static final int TIMEOUT_REASON_CONNECTION_LOST = 2;
@@ -1150,8 +1156,8 @@
connectionTimedOut();
break;
}
- case MSG_UPDATE_SELECTED_ROUTE: {
- updateSelectedRoute((String) msg.obj);
+ case MSG_NOTIFY_GROUP_ROUTE_SELECTED: {
+ notifyGroupRouteSelected((String) msg.obj);
break;
}
}
@@ -1477,9 +1483,9 @@
}
}
- private void updateSelectedRoute(String groupId) {
+ private void notifyGroupRouteSelected(String groupId) {
try {
- String selectedRouteId = null;
+ String selectedRouteId;
synchronized (mService.mLock) {
ClientGroup group = mUserRecord.mClientGroupMap.get(groupId);
if (group == null) {
@@ -1498,7 +1504,7 @@
final int count = mTempClients.size();
for (int i = 0; i < count; i++) {
try {
- mTempClients.get(i).onSelectedRouteChanged(selectedRouteId);
+ mTempClients.get(i).onGroupRouteSelected(selectedRouteId);
} catch (RemoteException ex) {
Slog.w(TAG, "Failed to call onSelectedRouteChanged. Client probably died.");
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 40eefca..2494816 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -643,6 +643,20 @@
@GuardedBy("mUidRulesFirstLock")
private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray();
+ /**
+ * Map of uid -> UidStateCallbackInfo objects holding the data received from
+ * {@link IUidObserver#onUidStateChanged(int, int, long, int)} callbacks. In order to avoid
+ * creating a new object for every callback received, we hold onto the object created for each
+ * uid and reuse it.
+ *
+ * Note that the lock used for accessing this object should not be used for anything else and we
+ * should not be acquiring new locks or doing any heavy work while this lock is held since this
+ * will be used in the callback from ActivityManagerService.
+ */
+ @GuardedBy("mUidStateCallbackInfos")
+ private final SparseArray<UidStateCallbackInfo> mUidStateCallbackInfos =
+ new SparseArray<>();
+
private RestrictedModeObserver mRestrictedModeObserver;
// TODO: keep allowlist of system-critical services that should never have
@@ -1022,11 +1036,18 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
@ProcessCapability int capability) {
- // TODO: Avoid creating a new UidStateCallbackInfo object every time
- // we get a callback for an uid
- mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED,
- new UidStateCallbackInfo(uid, procState, procStateSeq, capability))
+ synchronized (mUidStateCallbackInfos) {
+ UidStateCallbackInfo callbackInfo = mUidStateCallbackInfos.get(uid);
+ if (callbackInfo == null) {
+ callbackInfo = new UidStateCallbackInfo();
+ mUidStateCallbackInfos.put(uid, callbackInfo);
+ }
+ callbackInfo.update(uid, procState, procStateSeq, capability);
+ if (!callbackInfo.isPending) {
+ mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED, callbackInfo)
.sendToTarget();
+ }
+ }
}
@Override public void onUidGone(int uid, boolean disabled) {
@@ -1044,14 +1065,14 @@
};
private static final class UidStateCallbackInfo {
- public final int uid;
- public final int procState;
- public final long procStateSeq;
+ public int uid;
+ public int procState;
+ public long procStateSeq;
@ProcessCapability
- public final int capability;
+ public int capability;
+ public boolean isPending;
- UidStateCallbackInfo(int uid, int procState, long procStateSeq,
- @ProcessCapability int capability) {
+ public void update(int uid, int procState, long procStateSeq, int capability) {
this.uid = uid;
this.procState = procState;
this.procStateSeq = procStateSeq;
@@ -3198,23 +3219,19 @@
// Verify they're not lying about package name
mAppOps.checkPackage(callingUid, callingPackage);
- final SubscriptionManager sm;
- final SubscriptionInfo si;
final PersistableBundle config;
+ final TelephonyManager tm;
final long token = Binder.clearCallingIdentity();
try {
- sm = mContext.getSystemService(SubscriptionManager.class);
- si = sm.getActiveSubscriptionInfo(subId);
config = mCarrierConfigManager.getConfigForSubId(subId);
+ tm = mContext.getSystemService(TelephonyManager.class);
} finally {
Binder.restoreCallingIdentity(token);
}
- // First check: is caller the CarrierService?
- if (si != null) {
- if (si.isEmbedded() && sm.canManageSubscription(si, callingPackage)) {
- return;
- }
+ // First check: does caller have carrier privilege?
+ if (tm != null && tm.hasCarrierPrivileges(subId)) {
+ return;
}
// Second check: has the CarrierService delegated access?
@@ -4499,6 +4516,9 @@
mPowerSaveTempWhitelistAppIds.delete(uid);
mAppIdleTempWhitelistAppIds.delete(uid);
mUidFirewallRestrictedModeRules.delete(uid);
+ synchronized (mUidStateCallbackInfos) {
+ mUidStateCallbackInfos.remove(uid);
+ }
// ...then update iptables asynchronously.
mHandler.obtainMessage(MSG_RESET_FIREWALL_RULES_BY_UID, uid, 0).sendToTarget();
@@ -5132,10 +5152,17 @@
case UID_MSG_STATE_CHANGED: {
final UidStateCallbackInfo uidStateCallbackInfo =
(UidStateCallbackInfo) msg.obj;
- final int uid = uidStateCallbackInfo.uid;
- final int procState = uidStateCallbackInfo.procState;
- final long procStateSeq = uidStateCallbackInfo.procStateSeq;
- final int capability = uidStateCallbackInfo.capability;
+ final int uid;
+ final int procState;
+ final long procStateSeq;
+ final int capability;
+ synchronized (mUidStateCallbackInfos) {
+ uid = uidStateCallbackInfo.uid;
+ procState = uidStateCallbackInfo.procState;
+ procStateSeq = uidStateCallbackInfo.procStateSeq;
+ capability = uidStateCallbackInfo.capability;
+ uidStateCallbackInfo.isPending = false;
+ }
handleUidChanged(uid, procState, procStateSeq, capability);
return true;
@@ -5579,17 +5606,6 @@
}
@Override
- public boolean checkUidNetworkingBlocked(int uid, int uidRules,
- boolean isNetworkMetered, boolean isBackgroundRestricted) {
- mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG);
- // Log of invoking this function is disabled because it will be called very frequently. And
- // metrics are unlikely needed on this method because the callers are external and this
- // method doesn't take any locks or perform expensive operations.
- return isUidNetworkingBlockedInternal(uid, uidRules, isNetworkMetered,
- isBackgroundRestricted, null);
- }
-
- @Override
public boolean isUidRestrictedOnMeteredNetworks(int uid) {
mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG);
final int uidRules;
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index b9984a5..8bd3b1e 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -175,6 +175,11 @@
mFileWriteHandler.post(rcr);
}
+ public void deleteNotificationChannel(String pkg, String channelId) {
+ RemoveChannelRunnable rcr = new RemoveChannelRunnable(pkg, channelId);
+ mFileWriteHandler.post(rcr);
+ }
+
public void addNotification(final HistoricalNotification notification) {
synchronized (mLock) {
mBuffer.addNewNotificationToWrite(notification);
@@ -505,4 +510,47 @@
}
}
}
+
+ final class RemoveChannelRunnable implements Runnable {
+ private String mPkg;
+ private String mChannelId;
+ private NotificationHistory mNotificationHistory;
+
+ RemoveChannelRunnable(String pkg, String channelId) {
+ mPkg = pkg;
+ mChannelId = channelId;
+ }
+
+ @VisibleForTesting
+ void setNotificationHistory(NotificationHistory nh) {
+ mNotificationHistory = nh;
+ }
+
+ @Override
+ public void run() {
+ if (DEBUG) Slog.d(TAG, "RemoveChannelRunnable");
+ synchronized (mLock) {
+ // Remove from pending history
+ mBuffer.removeChannelFromWrite(mPkg, mChannelId);
+
+ Iterator<AtomicFile> historyFileItr = mHistoryFiles.iterator();
+ while (historyFileItr.hasNext()) {
+ final AtomicFile af = historyFileItr.next();
+ try {
+ NotificationHistory notificationHistory = mNotificationHistory != null
+ ? mNotificationHistory
+ : new NotificationHistory();
+ readLocked(af, notificationHistory,
+ new NotificationHistoryFilter.Builder().build());
+ if (notificationHistory.removeChannelFromWrite(mPkg, mChannelId)) {
+ writeLocked(af, notificationHistory);
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Cannot clean up file on channel removal "
+ + af.getBaseFile().getName(), e);
+ }
+ }
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryManager.java b/services/core/java/com/android/server/notification/NotificationHistoryManager.java
index cf3530b..6da898a 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryManager.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryManager.java
@@ -183,6 +183,22 @@
}
}
+ public void deleteNotificationChannel(String pkg, int uid, String channelId) {
+ synchronized (mLock) {
+ int userId = UserHandle.getUserId(uid);
+ final NotificationHistoryDatabase userHistory =
+ getUserHistoryAndInitializeIfNeededLocked(userId);
+ // TODO: it shouldn't be possible to delete a notification entry while the user is
+ // locked but we should handle it
+ if (userHistory == null) {
+ Slog.w(TAG, "Attempted to remove channel for locked/gone/disabled user "
+ + userId);
+ return;
+ }
+ userHistory.deleteNotificationChannel(pkg, channelId);
+ }
+ }
+
public void triggerWriteToDisk() {
synchronized (mLock) {
final int userCount = mUserState.size();
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 4ee90d6..02809ff 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -3623,6 +3623,7 @@
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true,
callingUser, REASON_CHANNEL_REMOVED, null);
mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId);
+ mHistoryManager.deleteNotificationChannel(pkg, callingUid, channelId);
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(callingUid),
mPreferencesHelper.getNotificationChannel(pkg, callingUid, channelId, true),
@@ -4342,6 +4343,49 @@
}
/**
+ * Allows an app to set an initial notification listener filter
+ *
+ * @param token The binder for the listener, to check that the caller is allowed
+ */
+ @Override
+ public void migrateNotificationFilter(INotificationListener token, int defaultTypes,
+ List<String> disallowedApps) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mNotificationLock) {
+ final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
+
+ Pair key = Pair.create(info.component, info.userid);
+
+ NotificationListenerFilter nlf = mListeners.getNotificationListenerFilter(key);
+ if (nlf == null) {
+ nlf = new NotificationListenerFilter();
+ }
+ if (nlf.getDisallowedPackages().isEmpty() && disallowedApps != null) {
+ for (String pkg : disallowedApps) {
+ // block the current user's version and any work profile versions
+ for (int userId : mUm.getProfileIds(info.userid, false)) {
+ try {
+ int uid = getUidForPackageAndUser(pkg, UserHandle.of(userId));
+ VersionedPackage vp = new VersionedPackage(pkg, uid);
+ nlf.addPackage(vp);
+ } catch (Exception e) {
+ // pkg doesn't exist on that user; skip
+ }
+ }
+ }
+ }
+ if (nlf.areAllTypesAllowed()) {
+ nlf.setTypes(defaultTypes);
+ }
+ mListeners.setNotificationListenerFilter(key, nlf);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Allow an INotificationListener to simulate clearing (dismissing) a single notification.
*
* {@see com.android.server.StatusBarManagerService.NotificationCallbacks#onNotificationClear}
@@ -5239,7 +5283,7 @@
}
private int getUidForPackageAndUser(String pkg, UserHandle user) throws RemoteException {
- int uid = 0;
+ int uid = INVALID_UID;
final long identity = Binder.clearCallingIdentity();
try {
uid = mPackageManager.getPackageUid(pkg, 0, user.getIdentifier());
diff --git a/services/core/java/com/android/server/pm/IncrementalStates.java b/services/core/java/com/android/server/pm/IncrementalStates.java
index ecafdfd..4fd360b 100644
--- a/services/core/java/com/android/server/pm/IncrementalStates.java
+++ b/services/core/java/com/android/server/pm/IncrementalStates.java
@@ -293,11 +293,11 @@
Slog.i(TAG, "received progress update: " + progress);
}
mLoadingState.setProgress(progress);
- if (1 - progress < 0.001) {
+ if (Math.abs(1.0f - progress) < 0.00000001f) {
if (DEBUG) {
Slog.i(TAG, "package is fully loaded");
}
- mLoadingState.setProgress(1);
+ mLoadingState.setProgress(1.0f);
if (mLoadingState.isLoading()) {
mLoadingState.adoptNewLoadingStateLocked(false);
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 671fccf..4eafe51 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -309,23 +309,24 @@
private final String mOriginalInstallerPackageName;
/** Uid of the owner of the installer session */
- @GuardedBy("mLock")
- private int mInstallerUid;
+ private volatile int mInstallerUid;
/** Where this install request came from */
@GuardedBy("mLock")
private InstallSource mInstallSource;
- @GuardedBy("mLock")
+ private final Object mProgressLock = new Object();
+
+ @GuardedBy("mProgressLock")
private float mClientProgress = 0;
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private float mInternalProgress = 0;
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private float mProgress = 0;
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private float mReportedProgress = -1;
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private float mIncrementalProgress = 0;
/** State of the session. */
@@ -571,7 +572,7 @@
*/
@Override
public void installSession(IntentSender statusReceiver) {
- assertCallerIsOwnerOrRootOrSystemLocked();
+ assertCallerIsOwnerOrRootOrSystem();
assertNotChildLocked("StagedSession#installSession");
Preconditions.checkArgument(isCommitted() && isSessionReady());
@@ -670,7 +671,7 @@
final Runnable r;
synchronized (mLock) {
assertNotChildLocked("StagedSession#abandon");
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
if (isInTerminalState()) {
// We keep the session in the database if it's in a finalized state. It will be
// removed by PackageInstallerService when the last update time is old enough.
@@ -744,7 +745,7 @@
*/
@Override
public void verifySession() {
- assertCallerIsOwnerOrRootOrSystemLocked();
+ assertCallerIsOwnerOrRootOrSystem();
Preconditions.checkArgument(isCommitted());
Preconditions.checkArgument(!mSessionApplied && !mSessionFailed);
verify();
@@ -1229,7 +1230,7 @@
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private void setClientProgressLocked(float progress) {
// Always publish first staging movement
final boolean forcePublish = (mClientProgress == 0);
@@ -1239,21 +1240,21 @@
@Override
public void setClientProgress(float progress) {
- synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
+ synchronized (mProgressLock) {
setClientProgressLocked(progress);
}
}
@Override
public void addClientProgress(float progress) {
- synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
+ synchronized (mProgressLock) {
setClientProgressLocked(mClientProgress + progress);
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mProgressLock")
private void computeProgressLocked(boolean forcePublish) {
if (!mCommitted) {
mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f)
@@ -1278,8 +1279,8 @@
@Override
public String[] getNames() {
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotCommittedOrDestroyedLocked("getNames");
return getNamesLocked();
@@ -1362,8 +1363,8 @@
}
}
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotCommittedOrDestroyedLocked("addChecksums");
if (mChecksums.containsKey(name)) {
@@ -1384,8 +1385,8 @@
throw new IllegalStateException("Must specify package name to remove a split");
}
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotCommittedOrDestroyedLocked("removeSplit");
try {
@@ -1431,8 +1432,8 @@
throw new IllegalStateException(
"Cannot write regular files in a data loader installation session.");
}
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotSealedLocked("assertCanWrite");
}
if (reverseMode) {
@@ -1605,8 +1606,8 @@
throw new IllegalStateException(
"Cannot read regular files in a data loader installation session.");
}
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotCommittedOrDestroyedLocked("openRead");
try {
return openReadInternalLocked(name);
@@ -1634,8 +1635,7 @@
* Check if the caller is the owner of this session. Otherwise throw a
* {@link SecurityException}.
*/
- @GuardedBy("mLock")
- private void assertCallerIsOwnerOrRootLocked() {
+ private void assertCallerIsOwnerOrRoot() {
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid) {
throw new SecurityException("Session does not belong to uid " + callingUid);
@@ -1646,8 +1646,7 @@
* Check if the caller is the owner of this session. Otherwise throw a
* {@link SecurityException}.
*/
- @GuardedBy("mLock")
- private void assertCallerIsOwnerOrRootOrSystemLocked() {
+ private void assertCallerIsOwnerOrRootOrSystem() {
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid
&& callingUid != Process.SYSTEM_UID) {
@@ -1929,9 +1928,9 @@
*/
private boolean markAsSealed(@NonNull IntentSender statusReceiver, boolean forTransfer) {
Objects.requireNonNull(statusReceiver);
+ assertCallerIsOwnerOrRoot();
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotDestroyedLocked("commit of session " + sessionId);
assertNoWriteFileTransfersOpenLocked();
@@ -2004,9 +2003,11 @@
"Session destroyed");
}
if (!isIncrementalInstallation()) {
- // For non-incremental installs, client staging is fully done at this point
- mClientProgress = 1f;
- computeProgressLocked(true);
+ synchronized (mProgressLock) {
+ // For non-incremental installs, client staging is fully done at this point
+ mClientProgress = 1f;
+ computeProgressLocked(true);
+ }
}
// This ongoing commit should keep session active, even though client
@@ -2191,7 +2192,7 @@
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
assertPreparedAndNotSealedLocked("transfer");
try {
@@ -2376,8 +2377,10 @@
PackageLite result = parseApkLite();
if (result != null) {
mPackageLite = result;
- mInternalProgress = 0.5f;
- computeProgressLocked(true);
+ synchronized (mProgressLock) {
+ mInternalProgress = 0.5f;
+ computeProgressLocked(true);
+ }
extractNativeLibraries(
mPackageLite, stageDir, params.abiOverride, mayInheritNativeLibs());
@@ -3554,7 +3557,7 @@
int activeCount;
synchronized (mLock) {
if (checkCaller) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
}
activeCount = mActiveCount.decrementAndGet();
@@ -3593,7 +3596,7 @@
private void abandonNonStaged() {
synchronized (mLock) {
assertNotChildLocked("abandonNonStaged");
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
if (mRelinquished) {
if (LOGD) Slog.d(TAG, "Ignoring abandon after commit relinquished control");
return;
@@ -3659,7 +3662,7 @@
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
assertPreparedAndNotSealedLocked("addFile");
if (!mFiles.add(new FileEntry(mFiles.size(),
@@ -3680,7 +3683,7 @@
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
assertPreparedAndNotSealedLocked("removeFile");
if (!mFiles.add(new FileEntry(mFiles.size(),
@@ -3893,7 +3896,7 @@
new IPackageLoadingProgressCallback.Stub() {
@Override
public void onPackageLoadingProgressChanged(float progress) {
- synchronized (mLock) {
+ synchronized (mProgressLock) {
mIncrementalProgress = progress;
computeProgressLocked(true);
}
@@ -3993,7 +3996,7 @@
+ " as it is in an invalid state.");
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
assertPreparedAndNotSealedLocked("addChildSessionId");
final int indexOfSession = mChildSessions.indexOfKey(childSessionId);
@@ -4012,7 +4015,7 @@
@Override
public void removeChildSessionId(int sessionId) {
synchronized (mLock) {
- assertCallerIsOwnerOrRootLocked();
+ assertCallerIsOwnerOrRoot();
assertPreparedAndNotSealedLocked("removeChildSessionId");
final int indexOfSession = mChildSessions.indexOfKey(sessionId);
@@ -4132,6 +4135,7 @@
}
private void destroyInternal() {
+ final IncrementalFileStorages incrementalFileStorages;
synchronized (mLock) {
mSealed = true;
if (!params.isStaged) {
@@ -4144,16 +4148,17 @@
for (FileBridge bridge : mBridges) {
bridge.forceClose();
}
- if (mIncrementalFileStorages != null) {
- mIncrementalFileStorages.cleanUp();
- mIncrementalFileStorages = null;
- }
+ incrementalFileStorages = mIncrementalFileStorages;
+ mIncrementalFileStorages = null;
}
// For staged sessions, we don't delete the directory where the packages have been copied,
// since these packages are supposed to be read on reboot.
// Those dirs are deleted when the staged session has reached a final state.
if (stageDir != null && !params.isStaged) {
try {
+ if (incrementalFileStorages != null) {
+ incrementalFileStorages.cleanUp();
+ }
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
} catch (InstallerException ignored) {
}
@@ -4171,13 +4176,15 @@
}
private void cleanStageDir() {
+ final IncrementalFileStorages incrementalFileStorages;
synchronized (mLock) {
- if (mIncrementalFileStorages != null) {
- mIncrementalFileStorages.cleanUp();
- mIncrementalFileStorages = null;
- }
+ incrementalFileStorages = mIncrementalFileStorages;
+ mIncrementalFileStorages = null;
}
try {
+ if (incrementalFileStorages != null) {
+ incrementalFileStorages.cleanUp();
+ }
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
} catch (InstallerException ignored) {
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 228293b..29b17ff 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -7198,7 +7198,7 @@
updateSharedLibrariesLocked(pkg, stubPkgSetting, null, null,
Collections.unmodifiableMap(mPackages));
} catch (PackageManagerException e) {
- Slog.e(TAG, "updateAllSharedLibrariesLPw failed: ", e);
+ Slog.w(TAG, "updateAllSharedLibrariesLPw failed: ", e);
}
final int[] userIds = mUserManager.getUserIds();
for (final int userId : userIds) {
@@ -7450,7 +7450,7 @@
if (matches.size() == 1) {
return matches.get(0).getComponentInfo().packageName;
} else if (matches.size() == 0) {
- Log.e(TAG, "There should probably be a verifier, but, none were found");
+ Log.w(TAG, "There should probably be a verifier, but, none were found");
return null;
}
throw new RuntimeException("There must be exactly one verifier; found " + matches);
@@ -8203,9 +8203,10 @@
// 11. Free storage service cache
StorageManagerInternal smInternal =
mInjector.getLocalService(StorageManagerInternal.class);
- // TODO(b/170481432): Decide what value of bytes needs to be sent instead of
- // sending the bytes parameter of freeStorage
- smInternal.freeCache(volumeUuid, bytes);
+ long freeBytesRequired = bytes - file.getUsableSpace();
+ if (freeBytesRequired > 0) {
+ smInternal.freeCache(volumeUuid, freeBytesRequired);
+ }
if (file.getUsableSpace() >= bytes) return;
} else {
try {
@@ -12579,10 +12580,21 @@
@GuardedBy("mInstallLock")
void removeCodePathLI(File codePath) {
if (codePath.isDirectory()) {
- File codePathParent = codePath.getParentFile();
+ final File codePathParent = codePath.getParentFile();
+ final boolean needRemoveParent = codePathParent.getName().startsWith(RANDOM_DIR_PREFIX);
try {
+ final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath(
+ codePath.getAbsolutePath()));
+ if (isIncremental) {
+ if (needRemoveParent) {
+ mIncrementalManager.rmPackageDir(codePathParent);
+ } else {
+ mIncrementalManager.rmPackageDir(codePath);
+ }
+ }
+
mInstaller.rmPackageDir(codePath.getAbsolutePath());
- if (codePathParent.getName().startsWith(RANDOM_DIR_PREFIX)) {
+ if (needRemoveParent) {
mInstaller.rmPackageDir(codePathParent.getAbsolutePath());
removeCachedResult(codePathParent);
}
@@ -18125,16 +18137,7 @@
if (codeFile == null || !codeFile.exists()) {
return false;
}
-
- final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath(
- codeFile.getAbsolutePath()));
-
removeCodePathLI(codeFile);
-
- if (isIncremental) {
- mIncrementalManager.onPackageRemoved(codeFile);
- }
-
return true;
}
@@ -22824,7 +22827,7 @@
if (matches.size() == 1) {
return matches.get(0).getComponentInfo().packageName;
} else {
- Slog.e(TAG, "There should probably be exactly one storage manager; found "
+ Slog.w(TAG, "There should probably be exactly one storage manager; found "
+ matches.size() + ": matches=" + matches);
return null;
}
@@ -24775,7 +24778,7 @@
final int fileToDeleteCount = filesToDelete.size();
for (int i = 0; i < fileToDeleteCount; i++) {
File fileToDelete = filesToDelete.get(i);
- logCriticalInfo(Log.WARN, "Destroying orphaned" + fileToDelete);
+ logCriticalInfo(Log.WARN, "Destroying orphaned at " + fileToDelete);
synchronized (mInstallLock) {
removeCodePathLI(fileToDelete);
}
@@ -25016,7 +25019,7 @@
// already held, since it's invoked as a side-effect of
// executeBatchLI()
if (e != null) {
- logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName
+ logCriticalInfo(Log.WARN, "Failed to create app data for " + packageName
+ ", but trying to recover: " + e);
destroyAppDataLeafLIF(pkg, userId, flags);
try {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index b51b833..4823c29 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -1229,7 +1229,7 @@
size++;
}
if (mAppIds.get(index) != null) {
- PackageManagerService.reportSettingsProblem(Log.ERROR,
+ PackageManagerService.reportSettingsProblem(Log.WARN,
"Adding duplicate app id: " + appId
+ " name=" + name);
return false;
@@ -1237,7 +1237,7 @@
mAppIds.set(index, obj);
} else {
if (mOtherAppIds.get(appId) != null) {
- PackageManagerService.reportSettingsProblem(Log.ERROR,
+ PackageManagerService.reportSettingsProblem(Log.WARN,
"Adding duplicate shared id: " + appId
+ " name=" + name);
return false;
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index b02a21d..19c56f8 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -19,33 +19,18 @@
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.Person;
-import android.app.appsearch.AppSearchManager;
-import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSession;
-import android.app.appsearch.GenericDocument;
-import android.app.appsearch.GetByUriRequest;
import android.app.appsearch.PackageIdentifier;
-import android.app.appsearch.PutDocumentsRequest;
-import android.app.appsearch.RemoveByUriRequest;
-import android.app.appsearch.ReportUsageRequest;
-import android.app.appsearch.SearchResult;
-import android.app.appsearch.SearchResults;
-import android.app.appsearch.SearchSpec;
-import android.app.appsearch.SetSchemaRequest;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.LocusId;
-import android.content.pm.AppSearchPerson;
-import android.content.pm.AppSearchShortcutInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.graphics.drawable.Icon;
-import android.os.Binder;
import android.os.PersistableBundle;
-import android.os.StrictMode;
import android.text.format.Formatter;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -58,10 +43,8 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.infra.AndroidFuture;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
-import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.pm.ShortcutService.DumpFilter;
@@ -81,17 +64,13 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
-import java.util.function.Function;
import java.util.function.Predicate;
/**
@@ -158,9 +137,9 @@
private static final String KEY_BITMAP_BYTES = "bitmapBytes";
/**
- * An temp in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs.
+ * All the shortcuts from the package, keyed on IDs.
*/
- final ArraySet<ShortcutInfo> mShortcuts = new ArraySet<>();
+ private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>();
/**
* All the share targets from the package
@@ -220,9 +199,7 @@
}
public int getShortcutCount() {
- final int[] count = new int[1];
- forEachShortcut(si -> count[0]++);
- return count[0];
+ return mShortcuts.size();
}
@Override
@@ -236,20 +213,17 @@
// - Unshadow all shortcuts.
// - Set disabled reason.
// - Disable if needed.
- forEachShortcutMutateIf(si -> {
- if (!si.hasFlags(ShortcutInfo.FLAG_SHADOW)
- && si.getDisabledReason() == restoreBlockReason
- && restoreBlockReason == ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
- return false;
- }
- si.clearFlags(ShortcutInfo.FLAG_SHADOW);
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ ShortcutInfo si = mShortcuts.valueAt(i);
+ mutateShortcut(si.getId(), si, shortcut -> {
+ shortcut.clearFlags(ShortcutInfo.FLAG_SHADOW);
- si.setDisabledReason(restoreBlockReason);
- if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
- si.addFlags(ShortcutInfo.FLAG_DISABLED);
- }
- return true;
- });
+ shortcut.setDisabledReason(restoreBlockReason);
+ if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
+ shortcut.addFlags(ShortcutInfo.FLAG_DISABLED);
+ }
+ });
+ }
// Because some launchers may not have been restored (e.g. allowBackup=false),
// we need to re-calculate the pinned shortcuts.
refreshPinnedFlags();
@@ -260,7 +234,7 @@
*/
@Nullable
public ShortcutInfo findShortcutById(String id) {
- return getShortcutById(id);
+ return mShortcuts.get(id);
}
public boolean isShortcutExistsAndInvisibleToPublisher(String id) {
@@ -326,9 +300,8 @@
* Delete a shortcut by ID. This will *always* remove it even if it's immutable or invisible.
*/
private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) {
- final ShortcutInfo shortcut = getShortcutById(id);
+ final ShortcutInfo shortcut = mShortcuts.remove(id);
if (shortcut != null) {
- removeShortcut(id);
mShortcutUser.mService.removeIconLocked(shortcut);
shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_PINNED
| ShortcutInfo.FLAG_MANIFEST | ShortcutInfo.FLAG_CACHED_ALL);
@@ -345,10 +318,10 @@
forceDeleteShortcutInner(newShortcut.getId());
+ // Extract Icon and update the icon res ID and the bitmap path.
s.saveIconAndFixUpShortcutLocked(newShortcut);
s.fixUpShortcutResourceNamesAndValues(newShortcut);
-
- saveShortcut(newShortcut);
+ mShortcuts.put(newShortcut.getId(), newShortcut);
}
/**
@@ -437,16 +410,6 @@
}
forceReplaceShortcutInner(newShortcut);
- // TODO: Report usage can be filed async
- runInAppSearch(session -> {
- final AndroidFuture<Boolean> future = new AndroidFuture<>();
- session.reportUsage(
- new ReportUsageRequest.Builder(getPackageName())
- .setUri(newShortcut.getId()).build(),
- mShortcutUser.mExecutor, result -> future.complete(result.isSuccess()));
- return future;
- });
-
return deleted;
}
@@ -456,12 +419,19 @@
* @return List of removed shortcuts.
*/
private List<ShortcutInfo> removeOrphans() {
- final List<ShortcutInfo> removeList = new ArrayList<>(1);
- forEachShortcut(si -> {
- if (si.isAlive()) return;
+ List<ShortcutInfo> removeList = null;
+
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
+
+ if (si.isAlive()) continue;
+
+ if (removeList == null) {
+ removeList = new ArrayList<>();
+ }
removeList.add(si);
- });
- if (!removeList.isEmpty()) {
+ }
+ if (removeList != null) {
for (int i = removeList.size() - 1; i >= 0; i--) {
forceDeleteShortcutInner(removeList.get(i).getId());
}
@@ -478,19 +448,20 @@
public List<ShortcutInfo> deleteAllDynamicShortcuts(boolean ignoreInvisible) {
final long now = mShortcutUser.mService.injectCurrentTimeMillis();
- final boolean[] changed = new boolean[1];
- forEachShortcutMutateIf(si -> {
+ boolean changed = false;
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (si.isDynamic() && (!ignoreInvisible || si.isVisibleToPublisher())) {
- changed[0] = true;
+ changed = true;
- si.setTimestamp(now);
- si.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
- si.setRank(0); // It may still be pinned, so clear the rank.
- return true;
+ mutateShortcut(si.getId(), si, shortcut -> {
+ shortcut.setTimestamp(now);
+ shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
+ shortcut.setRank(0); // It may still be pinned, so clear the rank.
+ });
}
- return false;
- });
- if (changed[0]) {
+ }
+ if (changed) {
return removeOrphans();
}
return null;
@@ -635,6 +606,11 @@
* <p>Then remove all shortcuts that are not dynamic and no longer pinned either.
*/
public void refreshPinnedFlags() {
+ final List<ShortcutInfo> shortcuts = new ArrayList<>(mShortcuts.values());
+ final Map<String, ShortcutInfo> shortcutMap = new ArrayMap<>(shortcuts.size());
+ for (ShortcutInfo si : shortcuts) {
+ shortcutMap.put(si.getId(), si);
+ }
final Set<String> pinnedShortcuts = new ArraySet<>();
// First, for the pinned set for each launcher, keep track of their id one by one.
@@ -644,20 +620,31 @@
if (pinned == null || pinned.size() == 0) {
return;
}
- pinnedShortcuts.addAll(pinned);
+ for (int i = pinned.size() - 1; i >= 0; i--) {
+ final String id = pinned.valueAt(i);
+ final ShortcutInfo si = shortcutMap.get(id);
+ if (si == null) {
+ // This happens if a launcher pinned shortcuts from this package, then backup&
+ // restored, but this package doesn't allow backing up.
+ // In that case the launcher ends up having a dangling pinned shortcuts.
+ // That's fine, when the launcher is restored, we'll fix it.
+ continue;
+ }
+ pinnedShortcuts.add(si.getId());
+ }
});
// Then, update the pinned state if necessary
- forEachShortcutMutateIf(si -> {
+ for (int i = shortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = shortcuts.get(i);
if (pinnedShortcuts.contains(si.getId()) && !si.isPinned()) {
- si.addFlags(ShortcutInfo.FLAG_PINNED);
- return true;
+ mutateShortcut(si.getId(), si,
+ shortcut -> shortcut.addFlags(ShortcutInfo.FLAG_PINNED));
}
if (!pinnedShortcuts.contains(si.getId()) && si.isPinned()) {
- si.clearFlags(ShortcutInfo.FLAG_PINNED);
- return true;
+ mutateShortcut(si.getId(), si, shortcut ->
+ shortcut.clearFlags(ShortcutInfo.FLAG_PINNED));
}
- return false;
- });
+ }
// Lastly, remove the ones that are no longer pinned, cached nor dynamic.
removeOrphans();
@@ -772,7 +759,9 @@
final ArraySet<String> pinnedByCallerSet = (callingLauncher == null) ? null
: s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId)
.getPinnedShortcutIds(getPackageName(), getPackageUserId());
- forEachShortcut(si -> {
+
+ for (int i = 0; i < mShortcuts.size(); i++) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
// Need to adjust PINNED flag depending on the caller.
// Basically if the caller is a launcher (callingLauncher != null) and the launcher
// isn't pinning it, then we need to clear PINNED for this caller.
@@ -782,7 +771,7 @@
if (!getPinnedByAnyLauncher) {
if (si.isFloating() && !si.isCached()) {
if (!isPinnedByCaller) {
- return;
+ continue;
}
}
}
@@ -802,7 +791,7 @@
}
result.add(clone);
}
- });
+ }
}
public void resetThrottling() {
@@ -872,7 +861,7 @@
* the app's Xml resource.
*/
int getSharingShortcutCount() {
- if (getShortcutCount() == 0 || mShareTargets.isEmpty()) {
+ if (mShortcuts.isEmpty() || mShareTargets.isEmpty()) {
return 0;
}
@@ -910,12 +899,14 @@
* Return the filenames (excluding path names) of icon bitmap files from this package.
*/
public ArraySet<String> getUsedBitmapFiles() {
- final ArraySet<String> usedFiles = new ArraySet<>(1);
- forEachShortcut(si -> {
+ final ArraySet<String> usedFiles = new ArraySet<>(mShortcuts.size());
+
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (si.getBitmapPath() != null) {
usedFiles.add(getFileName(si.getBitmapPath()));
}
- });
+ }
return usedFiles;
}
@@ -932,29 +923,30 @@
* @return false if any of the target activities are no longer enabled.
*/
private boolean areAllActivitiesStillEnabled() {
+ if (mShortcuts.size() == 0) {
+ return true;
+ }
final ShortcutService s = mShortcutUser.mService;
// Normally the number of target activities is 1 or so, so no need to use a complex
// structure like a set.
final ArrayList<ComponentName> checked = new ArrayList<>(4);
- final boolean[] reject = new boolean[1];
- forEachShortcutStopWhen(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
final ComponentName activity = si.getActivity();
if (checked.contains(activity)) {
- return false; // Already checked.
+ continue; // Already checked.
}
checked.add(activity);
if ((activity != null)
&& !s.injectIsActivityEnabledAndExported(activity, getOwnerUserId())) {
- reject[0] = true;
- return true; // Found at least 1 activity is disabled, so skip the rest.
+ return false;
}
- return false;
- });
- return !reject[0];
+ }
+ return true;
}
/**
@@ -1037,32 +1029,32 @@
// See if there are any shortcuts that were prevented restoring because the app was of a
// lower version, and re-enable them.
- forEachShortcutMutateIf(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_VERSION_LOWER) {
- return false;
+ continue;
}
if (getPackageInfo().getBackupSourceVersionCode() > newVersionCode) {
if (ShortcutService.DEBUG) {
Slog.d(TAG, String.format("Shortcut %s require version %s, still not restored.",
si.getId(), getPackageInfo().getBackupSourceVersionCode()));
}
- return false;
+ continue;
}
Slog.i(TAG, String.format("Restoring shortcut: %s", si.getId()));
- if (si.hasFlags(ShortcutInfo.FLAG_DISABLED)
- || si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) {
- si.clearFlags(ShortcutInfo.FLAG_DISABLED);
- si.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED);
- return true;
- }
- return false;
- });
+ mutateShortcut(si.getId(), si, shortcut -> {
+ shortcut.clearFlags(ShortcutInfo.FLAG_DISABLED);
+ shortcut.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED);
+ });
+ }
// For existing shortcuts, update timestamps if they have any resources.
// Also check if shortcuts' activities are still main activities. Otherwise, disable them.
if (!isNewApp) {
- final Resources publisherRes = getPackageResources();
- forEachShortcutMutateIf(si -> {
+ Resources publisherRes = null;
+
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
// Disable dynamic shortcuts whose target activity is gone.
if (si.isDynamic()) {
if (si.getActivity() == null) {
@@ -1075,26 +1067,33 @@
getPackageName(), si.getId()));
if (disableDynamicWithId(si.getId(), /*ignoreInvisible*/ false,
ShortcutInfo.DISABLED_REASON_APP_CHANGED) != null) {
- return false; // Actually removed.
+ continue; // Actually removed.
}
// Still pinned, so fall-through and possibly update the resources.
}
}
- if (!si.hasAnyResources() || publisherRes == null) {
- return false;
- }
+ if (si.hasAnyResources()) {
+ if (publisherRes == null) {
+ publisherRes = getPackageResources();
+ if (publisherRes == null) {
+ break; // Resources couldn't be loaded.
+ }
+ }
- if (!si.isOriginallyFromManifest()) {
- si.lookupAndFillInResourceIds(publisherRes);
- }
+ final Resources res = publisherRes;
+ mutateShortcut(si.getId(), si, shortcut -> {
+ if (!shortcut.isOriginallyFromManifest()) {
+ shortcut.lookupAndFillInResourceIds(res);
+ }
- // If this shortcut is not from a manifest, then update all resource IDs
- // from resource names. (We don't allow resource strings for
- // non-manifest at the moment, but icons can still be resources.)
- si.setTimestamp(s.injectCurrentTimeMillis());
- return true;
- });
+ // If this shortcut is not from a manifest, then update all resource IDs
+ // from resource names. (We don't allow resource strings for
+ // non-manifest at the moment, but icons can still be resources.)
+ shortcut.setTimestamp(s.injectCurrentTimeMillis());
+ });
+ }
+ }
}
// (Re-)publish manifest shortcut.
@@ -1120,12 +1119,17 @@
boolean changed = false;
// Keep the previous IDs.
- final ArraySet<String> toDisableList = new ArraySet<>(1);
- forEachShortcut(si -> {
+ ArraySet<String> toDisableList = null;
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
+
if (si.isManifestShortcut()) {
+ if (toDisableList == null) {
+ toDisableList = new ArraySet<>();
+ }
toDisableList.add(si.getId());
}
- });
+ }
// Publish new ones.
if (newManifestShortcutList != null) {
@@ -1165,7 +1169,7 @@
// regardless.
forceReplaceShortcutInner(newShortcut); // This will clean up the old one too.
- if (!newDisabled && !toDisableList.isEmpty()) {
+ if (!newDisabled && toDisableList != null) {
// Still alive, don't remove.
toDisableList.remove(id);
}
@@ -1173,7 +1177,7 @@
}
// Disable the previous manifest shortcuts that are no longer in the manifest.
- if (!toDisableList.isEmpty()) {
+ if (toDisableList != null) {
if (ShortcutService.DEBUG) {
Slog.d(TAG, String.format(
"Package %s: disabling %d stale shortcuts", getPackageName(),
@@ -1188,8 +1192,8 @@
/* overrideImmutable=*/ true, /*ignoreInvisible=*/ false,
ShortcutInfo.DISABLED_REASON_APP_CHANGED);
}
+ removeOrphans();
}
- removeOrphans();
adjustRanks();
return changed;
@@ -1262,21 +1266,25 @@
private ArrayMap<ComponentName, ArrayList<ShortcutInfo>> sortShortcutsToActivities() {
final ArrayMap<ComponentName, ArrayList<ShortcutInfo>> activitiesToShortcuts
= new ArrayMap<>();
- forEachShortcut(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (si.isFloating()) {
- return; // Ignore floating shortcuts, which are not tied to any activities.
+ continue; // Ignore floating shortcuts, which are not tied to any activities.
}
final ComponentName activity = si.getActivity();
if (activity == null) {
mShortcutUser.mService.wtf("null activity detected.");
- return;
+ continue;
}
- ArrayList<ShortcutInfo> list = activitiesToShortcuts.computeIfAbsent(activity,
- k -> new ArrayList<>());
+ ArrayList<ShortcutInfo> list = activitiesToShortcuts.get(activity);
+ if (list == null) {
+ list = new ArrayList<>();
+ activitiesToShortcuts.put(activity, list);
+ }
list.add(si);
- });
+ }
return activitiesToShortcuts;
}
@@ -1312,13 +1320,14 @@
// (If it's for update, then don't count dynamic shortcuts, since they'll be replaced
// anyway.)
final ArrayMap<ComponentName, Integer> counts = new ArrayMap<>(4);
- forEachShortcut(shortcut -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo shortcut = mShortcuts.valueAt(i);
if (shortcut.isManifestShortcut()) {
incrementCountForActivity(counts, shortcut.getActivity(), 1);
} else if (shortcut.isDynamic() && (operation != ShortcutService.OPERATION_SET)) {
incrementCountForActivity(counts, shortcut.getActivity(), 1);
}
- });
+ }
for (int i = newList.size() - 1; i >= 0; i--) {
final ShortcutInfo newShortcut = newList.get(i);
@@ -1331,7 +1340,7 @@
continue; // Activity can be null for update.
}
- final ShortcutInfo original = findShortcutById(newShortcut.getId());
+ final ShortcutInfo original = mShortcuts.get(newShortcut.getId());
if (original == null) {
if (operation == ShortcutService.OPERATION_UPDATE) {
continue; // When updating, ignore if there's no target.
@@ -1370,17 +1379,31 @@
public void resolveResourceStrings() {
final ShortcutService s = mShortcutUser.mService;
- final Resources publisherRes = getPackageResources();
- final List<ShortcutInfo> changedShortcuts = new ArrayList<>(1);
+ List<ShortcutInfo> changedShortcuts = null;
- if (publisherRes != null) {
- forEachShortcutMutateIf(si -> {
- if (!si.hasStringResources()) return false;
- si.resolveResourceStrings(publisherRes);
- si.setTimestamp(s.injectCurrentTimeMillis());
+ Resources publisherRes = null;
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
+
+ if (si.hasStringResources()) {
+ if (publisherRes == null) {
+ publisherRes = getPackageResources();
+ if (publisherRes == null) {
+ break; // Resources couldn't be loaded.
+ }
+ }
+
+ final Resources res = publisherRes;
+ mutateShortcut(si.getId(), si, shortcut -> {
+ shortcut.resolveResourceStrings(res);
+ shortcut.setTimestamp(s.injectCurrentTimeMillis());
+ });
+
+ if (changedShortcuts == null) {
+ changedShortcuts = new ArrayList<>(1);
+ }
changedShortcuts.add(si);
- return true;
- });
+ }
}
if (!CollectionUtils.isEmpty(changedShortcuts)) {
s.packageShortcutsChanged(getPackageName(), getPackageUserId(), changedShortcuts, null);
@@ -1389,7 +1412,10 @@
/** Clears the implicit ranks for all shortcuts. */
public void clearAllImplicitRanks() {
- forEachShortcutMutate(ShortcutInfo::clearImplicitRankAndRankChangedFlag);
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
+ mutateShortcut(si.getId(), si, ShortcutInfo::clearImplicitRankAndRankChangedFlag);
+ }
}
/**
@@ -1429,16 +1455,17 @@
final long now = s.injectCurrentTimeMillis();
// First, clear ranks for floating shortcuts.
- forEachShortcutMutateIf(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (si.isFloating()) {
if (si.getRank() != 0) {
- si.setTimestamp(now);
- si.setRank(0);
- return true;
+ mutateShortcut(si.getId(), si, shortcut -> {
+ shortcut.setTimestamp(now);
+ shortcut.setRank(0);
+ });
}
}
- return false;
- });
+ }
// Then adjust ranks. Ranks are unique for each activity, so we first need to sort
// shortcuts to each activity.
@@ -1463,7 +1490,7 @@
}
// At this point, it must be dynamic.
if (!si.isDynamic()) {
- s.wtf("Non-dynamic shortcut found.: " + si.toInsecureString());
+ s.wtf("Non-dynamic shortcut found.");
continue;
}
final int thisRank = rank++;
@@ -1480,14 +1507,13 @@
/** @return true if there's any shortcuts that are not manifest shortcuts. */
public boolean hasNonManifestShortcuts() {
final boolean[] condition = new boolean[1];
- forEachShortcutStopWhen(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (!si.isDeclaredInManifest()) {
- condition[0] = true;
return true;
}
- return false;
- });
- return condition[0];
+ }
+ return false;
}
public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) {
@@ -1527,8 +1553,11 @@
pw.print(prefix);
pw.println(" Shortcuts:");
- final long[] totalBitmapSize = new long[1];
- forEachShortcut(si -> {
+ long totalBitmapSize = 0;
+ final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
+ final int size = shortcuts.size();
+ for (int i = 0; i < size; i++) {
+ final ShortcutInfo si = shortcuts.valueAt(i);
pw.println(si.toDumpString(prefix + " "));
if (si.getBitmapPath() != null) {
final long len = new File(si.getBitmapPath()).length();
@@ -1537,15 +1566,15 @@
pw.print("bitmap size=");
pw.println(len);
- totalBitmapSize[0] += len;
+ totalBitmapSize += len;
}
- });
+ }
pw.print(prefix);
pw.print(" ");
pw.print("Total bitmap size: ");
- pw.print(totalBitmapSize[0]);
+ pw.print(totalBitmapSize);
pw.print(" (");
- pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize[0]));
+ pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize));
pw.println(")");
}
@@ -1560,39 +1589,46 @@
| (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0)
| (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0);
- forEachShortcut(si -> {
+ final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
+ final int size = shortcuts.size();
+ for (int i = 0; i < size; i++) {
+ final ShortcutInfo si = shortcuts.valueAt(i);
if ((si.getFlags() & shortcutFlags) != 0) {
pw.println(si.toDumpString(""));
}
- });
+ }
}
@Override
public JSONObject dumpCheckin(boolean clear) throws JSONException {
final JSONObject result = super.dumpCheckin(clear);
- final int[] numDynamic = new int[1];
- final int[] numPinned = new int[1];
- final int[] numManifest = new int[1];
- final int[] numBitmaps = new int[1];
- final long[] totalBitmapSize = new long[1];
+ int numDynamic = 0;
+ int numPinned = 0;
+ int numManifest = 0;
+ int numBitmaps = 0;
+ long totalBitmapSize = 0;
- forEachShortcut(si -> {
- if (si.isDynamic()) numDynamic[0]++;
- if (si.isDeclaredInManifest()) numManifest[0]++;
- if (si.isPinned()) numPinned[0]++;
+ final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts;
+ final int size = shortcuts.size();
+ for (int i = 0; i < size; i++) {
+ final ShortcutInfo si = shortcuts.valueAt(i);
+
+ if (si.isDynamic()) numDynamic++;
+ if (si.isDeclaredInManifest()) numManifest++;
+ if (si.isPinned()) numPinned++;
if (si.getBitmapPath() != null) {
- numBitmaps[0]++;
- totalBitmapSize[0] += new File(si.getBitmapPath()).length();
+ numBitmaps++;
+ totalBitmapSize += new File(si.getBitmapPath()).length();
}
- });
+ }
- result.put(KEY_DYNAMIC, numDynamic[0]);
- result.put(KEY_MANIFEST, numManifest[0]);
- result.put(KEY_PINNED, numPinned[0]);
- result.put(KEY_BITMAPS, numBitmaps[0]);
- result.put(KEY_BITMAP_BYTES, totalBitmapSize[0]);
+ result.put(KEY_DYNAMIC, numDynamic);
+ result.put(KEY_MANIFEST, numManifest);
+ result.put(KEY_PINNED, numPinned);
+ result.put(KEY_BITMAPS, numBitmaps);
+ result.put(KEY_BITMAP_BYTES, totalBitmapSize);
// TODO Log update frequency too.
@@ -1616,15 +1652,9 @@
ShortcutService.writeAttr(out, ATTR_LAST_RESET, mLastResetTime);
getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup);
- if (forBackup) {
- // Shortcuts are persisted in AppSearch, xml is only needed for backup.
- forEachShortcut(si -> {
- try {
- saveShortcut(out, si, forBackup, getPackageInfo().isBackupAllowed());
- } catch (IOException | XmlPullParserException e) {
- throw new RuntimeException(e);
- }
- });
+ for (int j = 0; j < size; j++) {
+ saveShortcut(out, mShortcuts.valueAt(j), forBackup,
+ getPackageInfo().isBackupAllowed());
}
if (!forBackup) {
@@ -1741,14 +1771,12 @@
}
final Intent[] intentsNoExtras = si.getIntentsNoExtras();
final PersistableBundle[] intentsExtras = si.getIntentPersistableExtrases();
- if (intentsNoExtras != null && intentsExtras != null) {
- final int numIntents = intentsNoExtras.length;
- for (int i = 0; i < numIntents; i++) {
- out.startTag(null, TAG_INTENT);
- ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
- ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
- out.endTag(null, TAG_INTENT);
- }
+ final int numIntents = intentsNoExtras.length;
+ for (int i = 0; i < numIntents; i++) {
+ out.startTag(null, TAG_INTENT);
+ ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
+ ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
+ out.endTag(null, TAG_INTENT);
}
ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras());
@@ -1836,7 +1864,7 @@
final ShortcutInfo si = parseShortcut(parser, packageName,
shortcutUser.getUserId(), fromBackup);
// Don't use addShortcut(), we don't need to save the icon.
- ret.mShortcuts.add(si);
+ ret.mShortcuts.put(si.getId(), si);
continue;
case TAG_SHARE_TARGET:
ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser));
@@ -2032,9 +2060,7 @@
@VisibleForTesting
List<ShortcutInfo> getAllShortcutsForTest() {
- final List<ShortcutInfo> ret = new ArrayList<>(1);
- forEachShortcut(ret::add);
- return ret;
+ return new ArrayList<>(mShortcuts.values());
}
@VisibleForTesting
@@ -2046,7 +2072,7 @@
public void verifyStates() {
super.verifyStates();
- final boolean[] failed = new boolean[1];
+ boolean failed = false;
final ShortcutService s = mShortcutUser.mService;
@@ -2057,7 +2083,7 @@
for (int outer = all.size() - 1; outer >= 0; outer--) {
final ArrayList<ShortcutInfo> list = all.valueAt(outer);
if (list.size() > mShortcutUser.mService.getMaxActivityShortcuts()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": activity " + all.keyAt(outer)
+ " has " + all.valueAt(outer).size() + " shortcuts.");
}
@@ -2077,60 +2103,61 @@
}
// Verify each shortcut's status.
- forEachShortcut(si -> {
+ for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+ final ShortcutInfo si = mShortcuts.valueAt(i);
if (!(si.isDeclaredInManifest() || si.isDynamic() || si.isPinned() || si.isCached())) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is not manifest, dynamic or pinned.");
}
if (si.isDeclaredInManifest() && si.isDynamic()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is both dynamic and manifest at the same time.");
}
if (si.getActivity() == null && !si.isFloating()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has null activity, but not floating.");
}
if ((si.isDynamic() || si.isManifestShortcut()) && !si.isEnabled()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is not floating, but is disabled.");
}
if (si.isFloating() && si.getRank() != 0) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " is floating, but has rank=" + si.getRank());
}
if (si.getIcon() != null) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " still has an icon");
}
if (si.hasAdaptiveBitmap() && !(si.hasIconFile() || si.hasIconUri())) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has adaptive bitmap but was not saved to a file nor has icon uri.");
}
if (si.hasIconFile() && si.hasIconResource()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both resource and bitmap icons");
}
if (si.hasIconFile() && si.hasIconUri()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both url and bitmap icons");
}
if (si.hasIconUri() && si.hasIconResource()) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has both url and resource icons");
}
if (si.isEnabled()
!= (si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_NOT_DISABLED)) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " isEnabled() and getDisabledReason() disagree: "
+ si.isEnabled() + " vs " + si.getDisabledReason());
@@ -2138,18 +2165,18 @@
if ((si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_VERSION_LOWER)
&& (getPackageInfo().getBackupSourceVersionCode()
== ShortcutInfo.VERSION_CODE_UNKNOWN)) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " RESTORED_VERSION_LOWER with no backup source version code.");
}
if (s.isDummyMainActivity(si.getActivity())) {
- failed[0] = true;
+ failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has a dummy target activity");
}
- });
+ }
- if (failed[0]) {
+ if (failed) {
throw new IllegalStateException("See logcat for errors");
}
}
@@ -2160,7 +2187,6 @@
} else {
mPackageIdentifiers.remove(packageName);
}
- resetAppSearch(session -> AndroidFuture.completedFuture(true));
}
void mutateShortcut(@NonNull final String id, @Nullable final ShortcutInfo shortcut,
@@ -2170,302 +2196,23 @@
synchronized (mLock) {
if (shortcut != null) {
transform.accept(shortcut);
+ } else {
+ transform.accept(findShortcutById(id));
}
- final ShortcutInfo si = getShortcutById(id);
- if (si == null) {
- return;
- }
- transform.accept(si);
- saveShortcut(si);
+ // TODO: Load ShortcutInfo from AppSearch, apply transformation logic and save
}
}
- private void saveShortcut(@NonNull final ShortcutInfo... shortcuts) {
- Objects.requireNonNull(shortcuts);
- saveShortcut(Arrays.asList(shortcuts));
- }
-
- private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) {
- Objects.requireNonNull(shortcuts);
- if (shortcuts.isEmpty()) {
- // No need to invoke AppSearch when there's nothing to save.
- return;
- }
- ConcurrentUtils.waitForFutureNoInterrupt(
- runInAppSearch(session -> {
- final AndroidFuture<Boolean> future = new AndroidFuture<>();
- session.put(new PutDocumentsRequest.Builder()
- .addGenericDocuments(
- AppSearchShortcutInfo.toGenericDocuments(shortcuts))
- .build(),
- mShortcutUser.mExecutor,
- result -> {
- if (!result.isSuccess()) {
- for (AppSearchResult<Void> k : result.getFailures().values()) {
- Slog.e(TAG, k.getErrorMessage());
- }
- future.completeExceptionally(new RuntimeException(
- "failed to save shortcuts"));
- return;
- }
- future.complete(true);
- });
- return future;
- }),
- "saving shortcut");
- }
-
/**
* Removes shortcuts from AppSearch.
*/
void removeShortcuts() {
- awaitInAppSearch("removing shortcuts", session -> {
- final AndroidFuture<Boolean> future = new AndroidFuture<>();
- session.remove("",
- new SearchSpec.Builder()
- .addFilterSchemas(AppSearchShortcutInfo.SCHEMA_TYPE)
- .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
- .build(),
- mShortcutUser.mExecutor, result -> {
- if (!result.isSuccess()) {
- future.completeExceptionally(new RuntimeException(
- "Failed to cleanup shortcuts " + result.getErrorMessage()));
- return;
- }
- future.complete(true);
- });
- return future;
- });
- }
-
- private void removeShortcut(@NonNull final String id) {
- Objects.requireNonNull(id);
- awaitInAppSearch("removing shortcut with id=" + id, session -> {
- final AndroidFuture<Boolean> future = new AndroidFuture<>();
- session.remove(new RemoveByUriRequest.Builder(getPackageName()).addUris(id).build(),
- mShortcutUser.mExecutor, result -> {
- if (!result.isSuccess()) {
- final Map<String, AppSearchResult<Void>> failures =
- result.getFailures();
- for (String key : failures.keySet()) {
- Slog.e(TAG, "Failed deleting " + key + ", error message:"
- + failures.get(key).getErrorMessage());
- }
- future.completeExceptionally(new RuntimeException(
- "Failed to delete shortcut: " + id));
- return;
- }
- future.complete(true);
- });
- return future;
- });
- }
-
- private ShortcutInfo getShortcutById(String id) {
- return awaitInAppSearch("getting shortcut with id=" + id, session -> {
- final AndroidFuture<ShortcutInfo> future = new AndroidFuture<>();
- session.getByUri(
- new GetByUriRequest.Builder(getPackageName()).addUris(id).build(),
- mShortcutUser.mExecutor,
- results -> {
- if (results.isSuccess()) {
- Map<String, GenericDocument> documents = results.getSuccesses();
- for (GenericDocument doc : documents.values()) {
- final ShortcutInfo info = new AppSearchShortcutInfo(doc)
- .toShortcutInfo(mShortcutUser.getUserId());
- future.complete(info);
- return;
- }
- }
- future.complete(null);
- });
- return future;
- });
- }
-
- private void forEachShortcut(
- @NonNull final Consumer<ShortcutInfo> cb) {
- forEachShortcutStopWhen(si -> {
- cb.accept(si);
- return false;
- });
- }
-
- private void forEachShortcutMutate(@NonNull final Consumer<ShortcutInfo> cb) {
- forEachShortcutMutateIf(si -> {
- cb.accept(si);
- return true;
- });
- }
-
- private void forEachShortcutMutateIf(@NonNull final Function<ShortcutInfo, Boolean> cb) {
- final SearchResults res = awaitInAppSearch("mutating shortcuts", session ->
- AndroidFuture.completedFuture(session.search("", new SearchSpec.Builder()
- .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY).build())));
- if (res == null) return;
- List<ShortcutInfo> shortcuts = getNextPage(res);
- while (!shortcuts.isEmpty()) {
- final List<ShortcutInfo> changed = new ArrayList<>(1);
- for (ShortcutInfo si : shortcuts) {
- if (cb.apply(si)) changed.add(si);
- }
- saveShortcut(changed);
- shortcuts = getNextPage(res);
- }
- }
-
- private void forEachShortcutStopWhen(
- @NonNull final Function<ShortcutInfo, Boolean> cb) {
- forEachShortcutStopWhen("", cb);
- }
-
- private void forEachShortcutStopWhen(
- @NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) {
- final SearchResults res = awaitInAppSearch("iterating shortcuts", session ->
- AndroidFuture.completedFuture(session.search(query, new SearchSpec.Builder()
- .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY).build())));
- if (res == null) return;
- List<ShortcutInfo> shortcuts = getNextPage(res);
- while (!shortcuts.isEmpty()) {
- for (ShortcutInfo si : shortcuts) {
- if (cb.apply(si)) return;
- }
- shortcuts = getNextPage(res);
- }
- }
-
- private List<ShortcutInfo> getNextPage(@NonNull final SearchResults res) {
- final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>();
- final List<ShortcutInfo> ret = new ArrayList<>();
- final long callingIdentity = Binder.clearCallingIdentity();
- try {
- res.getNextPage(mShortcutUser.mExecutor, nextPage -> {
- if (!nextPage.isSuccess()) {
- future.complete(ret);
- return;
- }
- final List<SearchResult> results = nextPage.getResultValue();
- if (results.isEmpty()) {
- future.complete(ret);
- return;
- }
- final List<ShortcutInfo> page = new ArrayList<>(results.size());
- for (SearchResult result : results) {
- final ShortcutInfo si = new AppSearchShortcutInfo(result.getGenericDocument())
- .toShortcutInfo(mShortcutUser.getUserId());
- page.add(si);
- }
- ret.addAll(page);
- future.complete(ret);
- });
- return ConcurrentUtils.waitForFutureNoInterrupt(future,
- "getting next batch of shortcuts");
- } finally {
- Binder.restoreCallingIdentity(callingIdentity);
- }
- }
-
- @Nullable
- private <T> T awaitInAppSearch(
- @NonNull final String description,
- @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
- return ConcurrentUtils.waitForFutureNoInterrupt(runInAppSearch(cb), description);
- }
-
- @Nullable
- private <T> CompletableFuture<T> runInAppSearch(
- @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
- synchronized (mLock) {
- final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
- try {
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
- .detectAll()
- .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site
- .build());
- if (mAppSearchSession != null) {
- final long callingIdentity = Binder.clearCallingIdentity();
- try {
- return AndroidFuture.supply(() -> mAppSearchSession).thenCompose(cb);
- } finally {
- Binder.restoreCallingIdentity(callingIdentity);
- }
- } else {
- return resetAppSearch(cb);
- }
- } finally {
- StrictMode.setThreadPolicy(oldPolicy);
- }
- }
- }
-
- private <T> CompletableFuture<T> resetAppSearch(
- @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
- final long callingIdentity = Binder.clearCallingIdentity();
- final AppSearchManager.SearchContext searchContext =
- new AppSearchManager.SearchContext.Builder(getPackageName()).build();
- final AppSearchSession session;
- try {
- session = ConcurrentUtils.waitForFutureNoInterrupt(
- mShortcutUser.getAppSearch(searchContext), "resetting app search");
- ConcurrentUtils.waitForFutureNoInterrupt(setupSchema(session), "setting up schema");
- mAppSearchSession = session;
- return cb.apply(mAppSearchSession);
- } catch (Exception e) {
- Slog.e(TAG, "Failed to initiate app search for shortcut package "
- + getPackageName() + " user " + mShortcutUser.getUserId(), e);
- return AndroidFuture.completedFuture(null);
- } finally {
- Binder.restoreCallingIdentity(callingIdentity);
- }
- }
-
- void closeAppSearchSession() {
- synchronized (mLock) {
- if (mAppSearchSession != null) {
- final long callingIdentity = Binder.clearCallingIdentity();
- try {
- mAppSearchSession.close();
- } finally {
- Binder.restoreCallingIdentity(callingIdentity);
- }
- }
- mAppSearchSession = null;
- }
- }
-
- @NonNull
- private AndroidFuture<AppSearchSession> setupSchema(
- @NonNull final AppSearchSession session) {
- SetSchemaRequest.Builder schemaBuilder = new SetSchemaRequest.Builder()
- .addSchemas(AppSearchPerson.SCHEMA, AppSearchShortcutInfo.SCHEMA);
- for (PackageIdentifier pi : mPackageIdentifiers.values()) {
- schemaBuilder = schemaBuilder
- .setSchemaTypeVisibilityForPackage(
- AppSearchPerson.SCHEMA_TYPE, true, pi)
- .setSchemaTypeVisibilityForPackage(
- AppSearchShortcutInfo.SCHEMA_TYPE, true, pi);
- }
- final AndroidFuture<AppSearchSession> future = new AndroidFuture<>();
- session.setSchema(
- schemaBuilder.build(), mShortcutUser.mExecutor, mShortcutUser.mExecutor, result -> {
- if (!result.isSuccess()) {
- future.completeExceptionally(
- new IllegalArgumentException(result.getErrorMessage()));
- return;
- }
- future.complete(session);
- });
- return future;
}
/**
* Merge/replace shortcuts parsed from xml file.
*/
void restoreParsedShortcuts(final boolean replace) {
- if (replace) {
- removeShortcuts();
- }
- saveShortcut(mShortcuts);
}
private boolean verifyRanksSequential(List<ShortcutInfo> list) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 4cfa353..8e999de 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -1051,8 +1051,6 @@
}
final ShortcutUser user = getUserShortcutsLocked(userId);
- // Close AppSearchSession to flush pending changes.
- user.forAllPackages(ShortcutPackage::closeAppSearchSession);
user.logSharingShortcutStats(mMetricsLogger);
}
@@ -5083,17 +5081,6 @@
}
@VisibleForTesting
- void updatePackageShortcutForTest(String packageName, String shortcutId, int userId,
- Consumer<ShortcutInfo> cb) {
- synchronized (mLock) {
- final ShortcutPackage pkg = getPackageShortcutForTest(packageName, userId);
- if (pkg == null) return;
-
- pkg.mutateShortcut(shortcutId, null, cb);
- }
- }
-
- @VisibleForTesting
ShortcutLauncher getLauncherShortcutForTest(String packageName, int userId) {
synchronized (mLock) {
final ShortcutUser user = mUsers.get(userId);
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 7e3911a..4f74d5f 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -258,8 +258,7 @@
private final PermissionRegistry mRegistry = new PermissionRegistry();
@NonNull
- private final AttributionSourceRegistry mAttributionSourceRegistry =
- new AttributionSourceRegistry();
+ private final AttributionSourceRegistry mAttributionSourceRegistry;
@GuardedBy("mLock")
@Nullable
@@ -379,6 +378,7 @@
mSystemPermissions = systemConfig.getSystemPermissions();
mGlobalGids = systemConfig.getGlobalGids();
mOnPermissionChangeListeners = new OnPermissionChangeListeners(FgThread.get().getLooper());
+ mAttributionSourceRegistry = new AttributionSourceRegistry(context);
// propagate permission configuration
final ArrayMap<String, SystemConfig.PermissionEntry> permConfig =
@@ -5294,6 +5294,12 @@
private static final class AttributionSourceRegistry {
private final Object mLock = new Object();
+ private final Context mContext;
+
+ AttributionSourceRegistry(@NonNull Context context) {
+ mContext = context;
+ }
+
private final WeakHashMap<IBinder, AttributionSource> mAttributions = new WeakHashMap<>();
public @NonNull AttributionSource registerAttributionSource(
@@ -5321,7 +5327,9 @@
// app passing the source, in which case you must trust the other side;
final int callingUid = Binder.getCallingUid();
- if (source.getUid() != callingUid) {
+ if (source.getUid() != callingUid && mContext.checkPermission(
+ Manifest.permission.UPDATE_APP_OPS_STATS, /*pid*/ -1, callingUid)
+ != PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Cannot register attribution source for uid:"
+ source.getUid() + " from uid:" + callingUid);
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index f931df8..c7789ee 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1092,7 +1092,7 @@
break;
case LONG_PRESS_POWER_ASSISTANT:
mPowerKeyHandled = true;
- performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
+ performHapticFeedback(HapticFeedbackConstants.ASSISTANT_BUTTON, false,
"Power - Long Press - Go To Assistant");
final int powerKeyDeviceId = Integer.MIN_VALUE;
launchAssistAction(null, powerKeyDeviceId, eventTime);
@@ -5073,6 +5073,18 @@
pattern = mSafeModeEnabledVibePattern;
break;
+ case HapticFeedbackConstants.ASSISTANT_BUTTON:
+ if (mVibrator.areAllPrimitivesSupported(
+ VibrationEffect.Composition.PRIMITIVE_QUICK_RISE)) {
+ // quiet ramp, short pause, then sharp tick
+ return VibrationEffect.startComposition()
+ .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, 0.25f)
+ .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 1f, 50)
+ .compose();
+ }
+ // fallback for devices without composition support
+ return VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+
default:
return null;
}
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 91231c3..a7e2d1d 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -51,6 +51,9 @@
import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.internal.util.FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER__OPPORTUNISTIC_DATA_SUB__NOT_OPPORTUNISTIC;
import static com.android.internal.util.FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER__OPPORTUNISTIC_DATA_SUB__OPPORTUNISTIC;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__GEO;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__MANUAL;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__TELEPHONY;
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs;
import static com.android.server.stats.pull.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs;
@@ -185,6 +188,8 @@
import com.android.server.stats.pull.netstats.SubInfo;
import com.android.server.storage.DiskStatsFileLogger;
import com.android.server.storage.DiskStatsLoggingService;
+import com.android.server.timezonedetector.MetricsTimeZoneDetectorState;
+import com.android.server.timezonedetector.TimeZoneDetectorInternal;
import libcore.io.IoUtils;
@@ -410,6 +415,7 @@
private final Object mBuildInformationLock = new Object();
private final Object mRoleHolderLock = new Object();
private final Object mTimeZoneDataInfoLock = new Object();
+ private final Object mTimeZoneDetectionInfoLock = new Object();
private final Object mExternalStorageInfoLock = new Object();
private final Object mAppsOnExternalStorageInfoLock = new Object();
private final Object mFaceSettingsLock = new Object();
@@ -644,6 +650,10 @@
synchronized (mTimeZoneDataInfoLock) {
return pullTimeZoneDataInfoLocked(atomTag, data);
}
+ case FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE:
+ synchronized (mTimeZoneDetectionInfoLock) {
+ return pullTimeZoneDetectorStateLocked(atomTag, data);
+ }
case FrameworkStatsLog.EXTERNAL_STORAGE_INFO:
synchronized (mExternalStorageInfoLock) {
return pullExternalStorageInfoLocked(atomTag, data);
@@ -849,6 +859,7 @@
registerBuildInformation();
registerRoleHolder();
registerTimeZoneDataInfo();
+ registerTimeZoneDetectorState();
registerExternalStorageInfo();
registerAppsOnExternalStorageInfo();
registerFaceSettings();
@@ -3254,6 +3265,57 @@
return StatsManager.PULL_SUCCESS;
}
+ private void registerTimeZoneDetectorState() {
+ int tagId = FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE;
+ mStatsManager.setPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl
+ );
+ }
+
+ int pullTimeZoneDetectorStateLocked(int atomTag, List<StatsEvent> pulledData) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ TimeZoneDetectorInternal timeZoneDetectorInternal =
+ LocalServices.getService(TimeZoneDetectorInternal.class);
+ MetricsTimeZoneDetectorState metricsState =
+ timeZoneDetectorInternal.generateMetricsState();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag,
+ metricsState.isTelephonyDetectionSupported(),
+ metricsState.isGeoDetectionSupported(),
+ metricsState.isUserLocationEnabled(),
+ metricsState.getAutoDetectionEnabledSetting(),
+ metricsState.getGeoDetectionEnabledSetting(),
+ convertToMetricsDetectionMode(metricsState.getDetectionMode()),
+ metricsState.getDeviceTimeZoneIdOrdinal(),
+ metricsState.getLatestManualSuggestionProtoBytes(),
+ metricsState.getLatestTelephonySuggestionProtoBytes(),
+ metricsState.getLatestGeolocationSuggestionProtoBytes()
+ ));
+ } catch (RuntimeException e) {
+ Slog.e(TAG, "Getting time zone detection state failed: ", e);
+ return StatsManager.PULL_SKIP;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ private int convertToMetricsDetectionMode(int detectionMode) {
+ switch (detectionMode) {
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_MANUAL:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__MANUAL;
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_GEO:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__GEO;
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_TELEPHONY:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__TELEPHONY;
+ default:
+ throw new IllegalArgumentException("" + detectionMode);
+ }
+ }
+
private void registerExternalStorageInfo() {
int tagId = FrameworkStatsLog.EXTERNAL_STORAGE_INFO;
mStatsManager.setPullAtomCallback(
diff --git a/services/core/java/com/android/server/timedetector/ServerFlags.java b/services/core/java/com/android/server/timedetector/ServerFlags.java
index 8819b37..52ff48b 100644
--- a/services/core/java/com/android/server/timedetector/ServerFlags.java
+++ b/services/core/java/com/android/server/timedetector/ServerFlags.java
@@ -64,7 +64,7 @@
@interface DeviceConfigKey {}
/**
- * Controls whether the location time zone manager service will started. Only observed if
+ * Controls whether the location time zone manager service will be started. Only observed if
* the device build is configured to support location-based time zone detection. See
* {@link ServiceConfigAccessor#isGeoTimeZoneDetectionFeatureSupportedInConfig()} and {@link
* ServiceConfigAccessor#isGeoTimeZoneDetectionFeatureSupported()}.
diff --git a/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java b/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
index dfff6f2..e19ec84 100644
--- a/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
+++ b/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
@@ -16,6 +16,21 @@
package com.android.server.timezonedetector.location;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__CERTAIN;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__DESTROYED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__INITIALIZING;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__PERM_FAILED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__STOPPED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNCERTAIN;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNKNOWN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DESTROYED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_UNKNOWN;
+
import android.annotation.IntRange;
import com.android.internal.util.FrameworkStatsLog;
@@ -37,6 +52,28 @@
@Override
public void onProviderStateChanged(@ProviderStateEnum int stateEnum) {
- // TODO(b/172934905): Implement once the atom has landed.
+ FrameworkStatsLog.write(FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED,
+ mProviderIndex,
+ metricsProviderState(stateEnum));
+ }
+
+ private static int metricsProviderState(@ProviderStateEnum int stateEnum) {
+ switch (stateEnum) {
+ case PROVIDER_STATE_STARTED_INITIALIZING:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__INITIALIZING;
+ case PROVIDER_STATE_STARTED_UNCERTAIN:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNCERTAIN;
+ case PROVIDER_STATE_STARTED_CERTAIN:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__CERTAIN;
+ case PROVIDER_STATE_STOPPED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__STOPPED;
+ case PROVIDER_STATE_DESTROYED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__DESTROYED;
+ case PROVIDER_STATE_PERM_FAILED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__PERM_FAILED;
+ case PROVIDER_STATE_UNKNOWN:
+ default:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNKNOWN;
+ }
}
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 4fbc795..f014b07 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -56,7 +56,6 @@
import android.os.UserManager;
import android.provider.Settings;
import android.security.Authorization;
-import android.security.KeyStore;
import android.service.trust.TrustAgentService;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -704,13 +703,11 @@
dispatchDeviceLocked(userId, locked);
Authorization.onLockScreenEvent(locked, userId, null);
- KeyStore.getInstance().onUserLockedStateChanged(userId, locked);
// Also update the user's profiles who have unified challenge, since they
// share the same unlocked state (see {@link #isDeviceLocked(int)})
for (int profileHandle : mUserManager.getEnabledProfileIds(userId)) {
if (mLockPatternUtils.isManagedProfileWithUnifiedChallenge(profileHandle)) {
mAuthorizationService.onLockScreenEvent(locked, profileHandle, null);
- KeyStore.getInstance().onUserLockedStateChanged(profileHandle, locked);
}
}
}
@@ -1262,7 +1259,6 @@
}
Authorization.onLockScreenEvent(locked, userId, null);
- KeyStore.getInstance().onUserLockedStateChanged(userId, locked);
if (locked) {
try {
diff --git a/services/core/java/com/android/server/utils/Slogf.java b/services/core/java/com/android/server/utils/Slogf.java
new file mode 100644
index 0000000..bbc5414
--- /dev/null
+++ b/services/core/java/com/android/server/utils/Slogf.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2021 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.server.utils;
+
+import android.annotation.Nullable;
+import android.os.Trace;
+import android.util.Log;
+import android.util.Slog;
+import android.util.TimingsTraceLog;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.Formatter;
+import java.util.Locale;
+
+/**
+ * Extends {@link Slog} by providing overloaded methods that take string formatting.
+ *
+ * <p><strong>Note: </strong>the overloaded methods won't create the formatted message if the
+ * respective logging level is disabled for the tag, but the compiler will still create an
+ * intermediate array of the objects for the {@code vargars}, which could affect garbage collection.
+ * So, if you're calling these method in a critical path, make sure to explicitly check for the
+ * level before calling them.
+ */
+public final class Slogf {
+
+ @GuardedBy("sMessageBuilder")
+ private static final StringBuilder sMessageBuilder;
+
+ @GuardedBy("sMessageBuilder")
+ private static final Formatter sFormatter;
+
+ static {
+ TimingsTraceLog t = new TimingsTraceLog("SLog", Trace.TRACE_TAG_SYSTEM_SERVER);
+ t.traceBegin("static_init");
+ sMessageBuilder = new StringBuilder();
+ sFormatter = new Formatter(sMessageBuilder, Locale.ENGLISH);
+ t.traceEnd();
+ }
+
+ private Slogf() {
+ throw new UnsupportedOperationException("provides only static methods");
+ }
+
+ /** Same as {@link Log#isLoggable(String, int)}. */
+ public static boolean isLoggable(String tag, int level) {
+ return Log.isLoggable(tag, level);
+ }
+
+ /** Same as {@link Slog#v(String, String)}. */
+ public static int v(String tag, String msg) {
+ return Slog.v(tag, msg);
+ }
+
+ /** Same as {@link Slog#v(String, String, Throwable)}. */
+ public static int v(String tag, String msg, Throwable tr) {
+ return Slog.v(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#d(String, String)}. */
+ public static int d(String tag, String msg) {
+ return Slog.d(tag, msg);
+ }
+
+ /** Same as {@link Slog#d(String, String, Throwable)}. */
+ public static int d(String tag, String msg, Throwable tr) {
+ return Slog.d(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#i(String, String)}. */
+ public static int i(String tag, String msg) {
+ return Slog.i(tag, msg);
+ }
+
+ /** Same as {@link Slog#i(String, String, Throwable)}. */
+ public static int i(String tag, String msg, Throwable tr) {
+ return Slog.i(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#w(String, String)}. */
+ public static int w(String tag, String msg) {
+ return Slog.w(tag, msg);
+ }
+
+ /** Same as {@link Slog#w(String, String, Throwable)}. */
+ public static int w(String tag, String msg, Throwable tr) {
+ return Slog.w(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#w(String, String)}. */
+ public static int w(String tag, Throwable tr) {
+ return Slog.w(tag, tr);
+ }
+
+ /** Same as {@link Slog#e(String, String)}. */
+ public static int e(String tag, String msg) {
+ return Slog.e(tag, msg);
+ }
+
+ /** Same as {@link Slog#e(String, String, Throwable)}. */
+ public static int e(String tag, String msg, Throwable tr) {
+ return Slog.e(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#wtf(String, String)}. */
+ public static int wtf(String tag, String msg) {
+ return Slog.wtf(tag, msg);
+ }
+
+ /** Same as {@link Slog#wtfQuiet(String, String)}. */
+ public static void wtfQuiet(String tag, String msg) {
+ Slog.wtfQuiet(tag, msg);
+ }
+
+ /** Same as {@link Slog#wtfStack(String, String). */
+ public static int wtfStack(String tag, String msg) {
+ return Slog.wtfStack(tag, msg);
+ }
+
+ /** Same as {@link Slog#wtf(String, Throwable). */
+ public static int wtf(String tag, Throwable tr) {
+ return Slog.wtf(tag, tr);
+ }
+
+ /** Same as {@link Slog#wtf(String, String, Throwable)}. */
+ public static int wtf(String tag, String msg, Throwable tr) {
+ return Slog.wtf(tag, msg, tr);
+ }
+
+ /** Same as {@link Slog#println(int, String, String)}. */
+ public static int println(int priority, String tag, String msg) {
+ return Slog.println(priority, tag, msg);
+ }
+
+ /**
+ * Logs a {@link Log.VERBOSE} message.
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#VERBOSE} logging
+ * is enabled for the given {@code tag}, but the compiler will still create an intermediate
+ * array of the objects for the {@code vargars}, which could affect garbage collection. So, if
+ * you're calling this method in a critical path, make sure to explicitly do the check before
+ * calling it.
+ */
+ public static void v(String tag, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.VERBOSE)) return;
+
+ v(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@link Log.DEBUG} message.
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#DEBUG} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void d(String tag, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.DEBUG)) return;
+
+ d(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@link Log.INFO} message.
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#INFO} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void i(String tag, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.INFO)) return;
+
+ i(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@link Log.WARN} message.
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#WARN} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void w(String tag, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.WARN)) return;
+
+ w(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@link Log.WARN} message with an exception
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#WARN} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void w(String tag, Exception exception, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.WARN)) return;
+
+ w(tag, getMessage(format, args), exception);
+ }
+ /**
+ * Logs a {@link Log.ERROR} message.
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#ERROR} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void e(String tag, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.ERROR)) return;
+
+ e(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@link Log.ERROR} message with an exception
+ *
+ * <p><strong>Note: </strong>the message will only be formatted if {@link Log#ERROR} logging is
+ * enabled for the given {@code tag}, but the compiler will still create an intermediate array
+ * of the objects for the {@code vargars}, which could affect garbage collection. So, if you're
+ * calling this method in a critical path, make sure to explicitly do the check before calling
+ * it.
+ */
+ public static void e(String tag, Exception exception, String format, @Nullable Object... args) {
+ if (!isLoggable(tag, Log.ERROR)) return;
+
+ e(tag, getMessage(format, args), exception);
+ }
+
+ /**
+ * Logs a {@code wtf} message.
+ */
+ public static void wtf(String tag, String format, @Nullable Object... args) {
+ wtf(tag, getMessage(format, args));
+ }
+
+ /**
+ * Logs a {@code wtf} message with an exception.
+ */
+ public static void wtf(String tag, Exception exception, String format,
+ @Nullable Object... args) {
+ wtf(tag, getMessage(format, args), exception);
+ }
+
+ private static String getMessage(String format, @Nullable Object... args) {
+ synchronized (sMessageBuilder) {
+ sFormatter.format(format, args);
+ String message = sMessageBuilder.toString();
+ sMessageBuilder.setLength(0);
+ return message;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
index 069c5c3..ab9de77 100644
--- a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
+++ b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
@@ -118,7 +118,7 @@
if (!mIsQuitting) {
mRouteSelectionCallback = new RouteSelectionCallback();
mConnectivityManager.requestBackgroundNetwork(
- getBaseNetworkRequestBuilder().build(), mHandler, mRouteSelectionCallback);
+ getRouteSelectionRequest(), mHandler, mRouteSelectionCallback);
mWifiBringupCallback = new NetworkBringupCallback();
mConnectivityManager.requestBackgroundNetwork(
@@ -149,12 +149,48 @@
}
}
- private NetworkRequest getWifiNetworkRequest() {
+ /**
+ * Builds the Route selection request
+ *
+ * <p>This request is guaranteed to select carrier-owned, non-VCN underlying networks by virtue
+ * of a populated set of subIds as expressed in NetworkCapabilities#getSubIds(). Only carrier
+ * owned networks may be selected, as the request specifies only subIds in the VCN's
+ * subscription group, while the VCN networks are excluded by virtue of not having subIds set on
+ * the VCN-exposed networks.
+ */
+ private NetworkRequest getRouteSelectionRequest() {
return getBaseNetworkRequestBuilder()
- .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup))
.build();
}
+ /**
+ * Builds the WiFi bringup request
+ *
+ * <p>This request is built specifically to match only carrier-owned WiFi networks, but is also
+ * built to ONLY keep Carrier WiFi Networks alive (but never bring them up). This is a result of
+ * the WifiNetworkFactory not advertising a list of subIds, and therefore not accepting this
+ * request. As such, it will bind to a Carrier WiFi Network that has already been brought up,
+ * but will NEVER bring up a Carrier WiFi network itself.
+ */
+ private NetworkRequest getWifiNetworkRequest() {
+ return getBaseNetworkRequestBuilder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup))
+ .build();
+ }
+
+ /**
+ * Builds a Cellular bringup request for a given subId
+ *
+ * <p>This request is filed in order to ensure that the Telephony stack always has a
+ * NetworkRequest to bring up a VCN underlying cellular network. It is required in order to
+ * ensure that even when a VCN (appears as Cellular) satisfies the default request, Telephony
+ * will bring up additional underlying Cellular networks.
+ *
+ * <p>Since this request MUST make it to the TelephonyNetworkFactory, subIds are not specified
+ * in the NetworkCapabilities, but rather in the TelephonyNetworkSpecifier.
+ */
private NetworkRequest getCellNetworkRequestForSubId(int subId) {
return getBaseNetworkRequestBuilder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
@@ -164,20 +200,13 @@
/**
* Builds and returns a NetworkRequest builder common to all Underlying Network requests
- *
- * <p>This request is guaranteed to select carrier-owned, non-VCN underlying networks by virtue
- * of a populated set of subIds as expressed in NetworkCapabilities#getSubIds(). Only carrier
- * owned networks may be selected, as the request specifies only subIds in the VCN's
- * subscription group, while the VCN networks are excluded by virtue of not having subIds set on
- * the VCN-exposed networks.
*/
private NetworkRequest.Builder getBaseNetworkRequestBuilder() {
return new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
- .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup));
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
}
/**
diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java
index 89ed956..ae806aa 100644
--- a/services/core/java/com/android/server/vcn/Vcn.java
+++ b/services/core/java/com/android/server/vcn/Vcn.java
@@ -17,6 +17,10 @@
package com.android.server.vcn;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
import static com.android.server.VcnManagementService.VDBG;
@@ -44,7 +48,6 @@
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
/**
* Represents an single instance of a VCN.
@@ -94,17 +97,21 @@
*/
private static final int MSG_EVENT_GATEWAY_CONNECTION_QUIT = MSG_EVENT_BASE + 3;
+ /**
+ * Triggers reevaluation of safe mode conditions.
+ *
+ * <p>Upon entering safe mode, the VCN will only provide gateway connections opportunistically,
+ * leaving the underlying networks marked as NOT_VCN_MANAGED.
+ *
+ * <p>Any VcnGatewayConnection in safe mode will result in the entire Vcn instance being put
+ * into safe mode. Upon receiving this message, the Vcn MUST query all VcnGatewayConnections to
+ * determine if any are in safe mode.
+ */
+ private static final int MSG_EVENT_SAFE_MODE_STATE_CHANGED = MSG_EVENT_BASE + 4;
+
/** Triggers an immediate teardown of the entire Vcn, including GatewayConnections. */
private static final int MSG_CMD_TEARDOWN = MSG_CMD_BASE;
- /**
- * Causes this VCN to immediately enter safe mode.
- *
- * <p>Upon entering safe mode, the VCN will unregister its RequestListener, tear down all of its
- * VcnGatewayConnections, and notify VcnManagementService that it is in safe mode.
- */
- private static final int MSG_CMD_ENTER_SAFE_MODE = MSG_CMD_BASE + 1;
-
@NonNull private final VcnContext mVcnContext;
@NonNull private final ParcelUuid mSubscriptionGroup;
@NonNull private final Dependencies mDeps;
@@ -137,17 +144,14 @@
@NonNull private TelephonySubscriptionSnapshot mLastSnapshot;
/**
- * Whether this Vcn instance is active and running.
+ * The current status of this Vcn instance
*
- * <p>The value will be {@code true} while running. It will be {@code false} if the VCN has been
- * shut down or has entered safe mode.
- *
- * <p>This AtomicBoolean is required in order to ensure consistency and correctness across
- * multiple threads. Unlike the rest of the Vcn, this is queried synchronously on Binder threads
- * from VcnManagementService, and therefore cannot rely on guarantees of running on the VCN
- * Looper.
+ * <p>The value will be {@link VCN_STATUS_CODE_ACTIVE} while all VcnGatewayConnections are in
+ * good standing, {@link VCN_STATUS_CODE_SAFE_MODE} if any VcnGatewayConnections are in safe
+ * mode, and {@link VCN_STATUS_CODE_INACTIVE} once a teardown has been commanded.
*/
- private final AtomicBoolean mIsActive = new AtomicBoolean(true);
+ // Accessed from different threads, but always under lock in VcnManagementService
+ private volatile int mCurrentStatus = VCN_STATUS_CODE_ACTIVE;
public Vcn(
@NonNull VcnContext vcnContext,
@@ -199,9 +203,15 @@
sendMessageAtFrontOfQueue(obtainMessage(MSG_CMD_TEARDOWN));
}
- /** Synchronously checks whether this Vcn is active. */
- public boolean isActive() {
- return mIsActive.get();
+ /** Synchronously retrieves the current status code. */
+ public int getStatus() {
+ return mCurrentStatus;
+ }
+
+ /** Sets the status of this VCN */
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ public void setStatus(int status) {
+ mCurrentStatus = status;
}
/** Get current Gateways for testing purposes */
@@ -217,12 +227,6 @@
return Collections.unmodifiableMap(new HashMap<>(mVcnGatewayConnections));
}
- /** Set whether this Vcn is active for testing purposes */
- @VisibleForTesting(visibility = Visibility.PRIVATE)
- public void setIsActive(boolean isActive) {
- mIsActive.set(isActive);
- }
-
private class VcnNetworkRequestListener implements VcnNetworkProvider.NetworkRequestListener {
@Override
public void onNetworkRequested(@NonNull NetworkRequest request, int score, int providerId) {
@@ -234,6 +238,11 @@
@Override
public void handleMessage(@NonNull Message msg) {
+ if (mCurrentStatus != VCN_STATUS_CODE_ACTIVE
+ && mCurrentStatus != VCN_STATUS_CODE_SAFE_MODE) {
+ return;
+ }
+
switch (msg.what) {
case MSG_EVENT_CONFIG_UPDATED:
handleConfigUpdated((VcnConfig) msg.obj);
@@ -247,12 +256,12 @@
case MSG_EVENT_GATEWAY_CONNECTION_QUIT:
handleGatewayConnectionQuit((VcnGatewayConnectionConfig) msg.obj);
break;
+ case MSG_EVENT_SAFE_MODE_STATE_CHANGED:
+ handleSafeModeStatusChanged();
+ break;
case MSG_CMD_TEARDOWN:
handleTeardown();
break;
- case MSG_CMD_ENTER_SAFE_MODE:
- handleEnterSafeMode();
- break;
default:
Slog.wtf(getLogTag(), "Unknown msg.what: " + msg.what);
}
@@ -264,35 +273,28 @@
mConfig = config;
- if (mIsActive.getAndSet(true)) {
- // VCN is already active - teardown any GatewayConnections whose configs have been
- // removed and get all current requests
- for (final Entry<VcnGatewayConnectionConfig, VcnGatewayConnection> entry :
- mVcnGatewayConnections.entrySet()) {
- final VcnGatewayConnectionConfig gatewayConnectionConfig = entry.getKey();
- final VcnGatewayConnection gatewayConnection = entry.getValue();
+ // Teardown any GatewayConnections whose configs have been removed and get all current
+ // requests
+ for (final Entry<VcnGatewayConnectionConfig, VcnGatewayConnection> entry :
+ mVcnGatewayConnections.entrySet()) {
+ final VcnGatewayConnectionConfig gatewayConnectionConfig = entry.getKey();
+ final VcnGatewayConnection gatewayConnection = entry.getValue();
- // GatewayConnectionConfigs must match exactly (otherwise authentication or
- // connection details may have changed).
- if (!mConfig.getGatewayConnectionConfigs().contains(gatewayConnectionConfig)) {
- if (gatewayConnection == null) {
- Slog.wtf(
- getLogTag(),
- "Found gatewayConnectionConfig without GatewayConnection");
- } else {
- gatewayConnection.teardownAsynchronously();
- }
+ // GatewayConnectionConfigs must match exactly (otherwise authentication or
+ // connection details may have changed).
+ if (!mConfig.getGatewayConnectionConfigs().contains(gatewayConnectionConfig)) {
+ if (gatewayConnection == null) {
+ Slog.wtf(
+ getLogTag(), "Found gatewayConnectionConfig without GatewayConnection");
+ } else {
+ gatewayConnection.teardownAsynchronously();
}
}
-
- // Trigger a re-evaluation of all NetworkRequests (to make sure any that can be
- // satisfied start a new GatewayConnection)
- mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener);
- } else {
- // If this VCN was not previously active, it is exiting Safe Mode. Re-register the
- // request listener to get NetworkRequests again (and all cached requests).
- mVcnContext.getVcnNetworkProvider().registerListener(mRequestListener);
}
+
+ // Trigger a re-evaluation of all NetworkRequests (to make sure any that can be
+ // satisfied start a new GatewayConnection)
+ mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener);
}
private void handleTeardown() {
@@ -302,22 +304,30 @@
gatewayConnection.teardownAsynchronously();
}
- mIsActive.set(false);
+ mCurrentStatus = VCN_STATUS_CODE_INACTIVE;
}
- private void handleEnterSafeMode() {
- handleTeardown();
+ private void handleSafeModeStatusChanged() {
+ boolean hasSafeModeGatewayConnection = false;
- mVcnCallback.onEnteredSafeMode();
+ // If any VcnGatewayConnection is in safe mode, mark the entire VCN as being in safe mode
+ for (VcnGatewayConnection gatewayConnection : mVcnGatewayConnections.values()) {
+ if (gatewayConnection.isInSafeMode()) {
+ hasSafeModeGatewayConnection = true;
+ break;
+ }
+ }
+
+ final int oldStatus = mCurrentStatus;
+ mCurrentStatus =
+ hasSafeModeGatewayConnection ? VCN_STATUS_CODE_SAFE_MODE : VCN_STATUS_CODE_ACTIVE;
+ if (oldStatus != mCurrentStatus) {
+ mVcnCallback.onSafeModeStatusChanged(hasSafeModeGatewayConnection);
+ }
}
private void handleNetworkRequested(
@NonNull NetworkRequest request, int score, int providerId) {
- if (!isActive()) {
- Slog.v(getLogTag(), "Received NetworkRequest while inactive. Ignore for now");
- return;
- }
-
if (score > getNetworkScore()) {
if (VDBG) {
Slog.v(
@@ -370,25 +380,23 @@
mVcnGatewayConnections.remove(config);
// Trigger a re-evaluation of all NetworkRequests (to make sure any that can be satisfied
- // start a new GatewayConnection), but only if the Vcn is still active
- if (isActive()) {
- mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener);
- }
+ // start a new GatewayConnection). VCN is always alive here, courtesy of the liveness check
+ // in handleMessage()
+ mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener);
}
private void handleSubscriptionsChanged(@NonNull TelephonySubscriptionSnapshot snapshot) {
mLastSnapshot = snapshot;
- if (isActive()) {
- for (VcnGatewayConnection gatewayConnection : mVcnGatewayConnections.values()) {
- gatewayConnection.updateSubscriptionSnapshot(mLastSnapshot);
- }
+ for (VcnGatewayConnection gatewayConnection : mVcnGatewayConnections.values()) {
+ gatewayConnection.updateSubscriptionSnapshot(mLastSnapshot);
}
}
private boolean isRequestSatisfiedByGatewayConnectionConfig(
@NonNull NetworkRequest request, @NonNull VcnGatewayConnectionConfig config) {
final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
+ builder.addTransportType(TRANSPORT_CELLULAR);
builder.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
for (int cap : config.getAllExposedCapabilities()) {
builder.addCapability(cap);
@@ -412,12 +420,12 @@
/** Callback used for passing status signals from a VcnGatewayConnection to its managing Vcn. */
@VisibleForTesting(visibility = Visibility.PACKAGE)
public interface VcnGatewayStatusCallback {
- /** Called by a VcnGatewayConnection to indicate that it has entered safe mode. */
- void onEnteredSafeMode();
+ /** Called by a VcnGatewayConnection to indicate that it's safe mode status has changed. */
+ void onSafeModeStatusChanged();
/** Callback by a VcnGatewayConnection to indicate that an error occurred. */
void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable String exceptionClass,
@Nullable String exceptionMessage);
@@ -439,18 +447,18 @@
}
@Override
- public void onEnteredSafeMode() {
- sendMessage(obtainMessage(MSG_CMD_ENTER_SAFE_MODE));
+ public void onSafeModeStatusChanged() {
+ sendMessage(obtainMessage(MSG_EVENT_SAFE_MODE_STATE_CHANGED));
}
@Override
public void onGatewayConnectionError(
- @NonNull int[] networkCapabilities,
+ @NonNull String gatewayConnectionName,
@VcnErrorCode int errorCode,
@Nullable String exceptionClass,
@Nullable String exceptionMessage) {
mVcnCallback.onGatewayConnectionError(
- networkCapabilities, errorCode, exceptionClass, exceptionMessage);
+ gatewayConnectionName, errorCode, exceptionClass, exceptionMessage);
}
}
diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
index 9589505..20c08eb 100644
--- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
+++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
@@ -32,6 +32,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.net.ConnectivityManager;
import android.net.InetAddresses;
import android.net.IpPrefix;
import android.net.IpSecManager;
@@ -44,6 +45,7 @@
import android.net.NetworkAgent;
import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
+import android.net.NetworkProvider;
import android.net.RouteInfo;
import android.net.TelephonyNetworkSpecifier;
import android.net.Uri;
@@ -92,6 +94,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
/**
* A single VCN Gateway Connection, providing a single public-facing VCN network.
@@ -504,6 +507,15 @@
private boolean mIsQuitting = false;
/**
+ * Whether the VcnGatewayConnection is in safe mode.
+ *
+ * <p>Upon hitting the safe mode timeout, this will be set to {@code true}. In safe mode, this
+ * VcnGatewayConnection will continue attempting to connect, and if a successful connection is
+ * made, safe mode will be exited.
+ */
+ private boolean mIsInSafeMode = false;
+
+ /**
* The token used by the primary/current/active session.
*
* <p>This token MUST be updated when a new stateful/async session becomes the
@@ -562,8 +574,7 @@
* <p>Set in Connected state, always @NonNull in Connected, Migrating states, @Nullable
* otherwise.
*/
- @VisibleForTesting(visibility = Visibility.PRIVATE)
- NetworkAgent mNetworkAgent;
+ private NetworkAgent mNetworkAgent;
@Nullable private WakeupMessage mTeardownTimeoutAlarm;
@Nullable private WakeupMessage mDisconnectRequestAlarm;
@@ -628,6 +639,14 @@
start();
}
+ /** Queries whether this VcnGatewayConnection is in safe mode. */
+ public boolean isInSafeMode() {
+ // Accessing internal state; must only be done on looper thread.
+ mVcnContext.ensureRunningOnLooperThread();
+
+ return mIsInSafeMode;
+ }
+
/**
* Asynchronously tears down this GatewayConnection, and any resources used.
*
@@ -980,7 +999,7 @@
// IkeSessionCallback.onClosedExceptionally(), which calls sessionClosed()
if (exception != null) {
mGatewayStatusCallback.onGatewayConnectionError(
- mConnectionConfig.getExposedCapabilities(),
+ mConnectionConfig.getGatewayConnectionName(),
VCN_ERROR_CODE_INTERNAL_ERROR,
RuntimeException.class.getName(),
"Received "
@@ -1017,7 +1036,7 @@
}
mGatewayStatusCallback.onGatewayConnectionError(
- mConnectionConfig.getExposedCapabilities(),
+ mConnectionConfig.getGatewayConnectionName(),
errorCode,
exceptionClass,
exceptionMessage);
@@ -1162,6 +1181,15 @@
}
}
+ protected void handleSafeModeTimeoutExceeded() {
+ mSafeModeTimeoutAlarm = null;
+
+ // Connectivity for this GatewayConnection is broken; tear down the Network.
+ teardownNetwork();
+ mIsInSafeMode = true;
+ mGatewayStatusCallback.onSafeModeStatusChanged();
+ }
+
protected void logUnexpectedEvent(int what) {
Slog.d(TAG, String.format(
"Unexpected event code %d in state %s", what, this.getClass().getSimpleName()));
@@ -1315,8 +1343,7 @@
}
break;
case EVENT_SAFE_MODE_TIMEOUT_EXCEEDED:
- mGatewayStatusCallback.onEnteredSafeMode();
- mSafeModeTimeoutAlarm = null;
+ handleSafeModeTimeoutExceeded();
break;
default:
logUnhandledMessage(msg);
@@ -1401,8 +1428,7 @@
handleDisconnectRequested((EventDisconnectRequestedInfo) msg.obj);
break;
case EVENT_SAFE_MODE_TIMEOUT_EXCEEDED:
- mGatewayStatusCallback.onEnteredSafeMode();
- mSafeModeTimeoutAlarm = null;
+ handleSafeModeTimeoutExceeded();
break;
default:
logUnhandledMessage(msg);
@@ -1432,30 +1458,35 @@
buildNetworkCapabilities(mConnectionConfig, mUnderlying);
final LinkProperties lp =
buildConnectedLinkProperties(mConnectionConfig, tunnelIface, childConfig);
+ final NetworkAgentConfig nac =
+ new NetworkAgentConfig.Builder()
+ .setLegacyType(ConnectivityManager.TYPE_MOBILE)
+ .build();
final NetworkAgent agent =
- new NetworkAgent(
- mVcnContext.getContext(),
- mVcnContext.getLooper(),
+ mDeps.newNetworkAgent(
+ mVcnContext,
TAG,
caps,
lp,
Vcn.getNetworkScore(),
- new NetworkAgentConfig.Builder().build(),
- mVcnContext.getVcnNetworkProvider()) {
- @Override
- public void onNetworkUnwanted() {
- Slog.d(TAG, "NetworkAgent was unwanted");
- teardownAsynchronously();
- }
-
- @Override
- public void onValidationStatus(int status, @Nullable Uri redirectUri) {
- if (status == NetworkAgent.VALIDATION_STATUS_VALID) {
- clearFailedAttemptCounterAndSafeModeAlarm();
- }
- }
- };
+ nac,
+ mVcnContext.getVcnNetworkProvider(),
+ () -> {
+ Slog.d(TAG, "NetworkAgent was unwanted");
+ // If network agent has already been torn down, skip sending the
+ // disconnect. Unwanted() is always called, even when networkAgents
+ // are unregistered in teardownNetwork(), so prevent duplicate
+ // notifications.
+ if (mNetworkAgent != null) {
+ teardownAsynchronously();
+ }
+ } /* networkUnwantedCallback */,
+ (status) -> {
+ if (status == NetworkAgent.VALIDATION_STATUS_VALID) {
+ clearFailedAttemptCounterAndSafeModeAlarm();
+ }
+ } /* validationStatusCallback */);
agent.register();
agent.markConnected();
@@ -1469,6 +1500,11 @@
// Validated connection, clear failed attempt counter
mFailedAttempts = 0;
cancelSafeModeAlarm();
+
+ if (mIsInSafeMode) {
+ mIsInSafeMode = false;
+ mGatewayStatusCallback.onSafeModeStatusChanged();
+ }
}
protected void applyTransform(
@@ -1491,13 +1527,6 @@
protected void setupInterface(
int token,
@NonNull IpSecTunnelInterface tunnelIface,
- @NonNull VcnChildSessionConfiguration childConfig) {
- setupInterface(token, tunnelIface, childConfig, null);
- }
-
- protected void setupInterface(
- int token,
- @NonNull IpSecTunnelInterface tunnelIface,
@NonNull VcnChildSessionConfiguration childConfig,
@Nullable VcnChildSessionConfiguration oldChildConfig) {
try {
@@ -1579,16 +1608,17 @@
transformCreatedInfo.direction);
break;
case EVENT_SETUP_COMPLETED:
+ final VcnChildSessionConfiguration oldChildConfig = mChildConfig;
mChildConfig = ((EventSetupCompletedInfo) msg.obj).childSessionConfig;
- setupInterfaceAndNetworkAgent(mCurrentToken, mTunnelIface, mChildConfig);
+ setupInterfaceAndNetworkAgent(
+ mCurrentToken, mTunnelIface, mChildConfig, oldChildConfig);
break;
case EVENT_DISCONNECT_REQUESTED:
handleDisconnectRequested((EventDisconnectRequestedInfo) msg.obj);
break;
case EVENT_SAFE_MODE_TIMEOUT_EXCEEDED:
- mGatewayStatusCallback.onEnteredSafeMode();
- mSafeModeTimeoutAlarm = null;
+ handleSafeModeTimeoutExceeded();
break;
default:
logUnhandledMessage(msg);
@@ -1626,8 +1656,9 @@
protected void setupInterfaceAndNetworkAgent(
int token,
@NonNull IpSecTunnelInterface tunnelIface,
- @NonNull VcnChildSessionConfiguration childConfig) {
- setupInterface(token, tunnelIface, childConfig);
+ @NonNull VcnChildSessionConfiguration childConfig,
+ @NonNull VcnChildSessionConfiguration oldChildConfig) {
+ setupInterface(token, tunnelIface, childConfig, oldChildConfig);
if (mNetworkAgent == null) {
mNetworkAgent = buildNetworkAgent(tunnelIface, childConfig);
@@ -1692,8 +1723,7 @@
handleDisconnectRequested((EventDisconnectRequestedInfo) msg.obj);
break;
case EVENT_SAFE_MODE_TIMEOUT_EXCEEDED:
- mGatewayStatusCallback.onEnteredSafeMode();
- mSafeModeTimeoutAlarm = null;
+ handleSafeModeTimeoutExceeded();
break;
default:
logUnhandledMessage(msg);
@@ -1935,6 +1965,16 @@
}
@VisibleForTesting(visibility = Visibility.PRIVATE)
+ NetworkAgent getNetworkAgent() {
+ return mNetworkAgent;
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ void setNetworkAgent(@Nullable NetworkAgent networkAgent) {
+ mNetworkAgent = networkAgent;
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
void sendDisconnectRequestedAndAcquireWakelock(String reason, boolean shouldQuit) {
sendMessageAndAcquireWakeLock(
EVENT_DISCONNECT_REQUESTED,
@@ -2018,6 +2058,38 @@
return new WakeupMessage(vcnContext.getContext(), handler, tag, runnable);
}
+ /** Builds a new NetworkAgent. */
+ public NetworkAgent newNetworkAgent(
+ @NonNull VcnContext vcnContext,
+ @NonNull String tag,
+ @NonNull NetworkCapabilities caps,
+ @NonNull LinkProperties lp,
+ @NonNull int score,
+ @NonNull NetworkAgentConfig nac,
+ @NonNull NetworkProvider provider,
+ @NonNull Runnable networkUnwantedCallback,
+ @NonNull Consumer<Integer> validationStatusCallback) {
+ return new NetworkAgent(
+ vcnContext.getContext(),
+ vcnContext.getLooper(),
+ tag,
+ caps,
+ lp,
+ score,
+ nac,
+ provider) {
+ @Override
+ public void onNetworkUnwanted() {
+ networkUnwantedCallback.run();
+ }
+
+ @Override
+ public void onValidationStatus(int status, @Nullable Uri redirectUri) {
+ validationStatusCallback.accept(status);
+ }
+ };
+ }
+
/** Gets the elapsed real time since boot, in millis. */
public long getElapsedRealTime() {
return SystemClock.elapsedRealtime();
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 9dc68f2..89b7bbd 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -1300,8 +1300,9 @@
if (callbacks == null) return;
callbacks.broadcast(c -> {
try {
- int targetDisplayId =
+ Integer targetDisplayId =
callbackDisplayIds.get(c.asBinder());
+ if (targetDisplayId == null) return;
if (targetDisplayId == displayId) c.onColorsChanged(area, colors);
} catch (RemoteException e) {
e.printStackTrace();
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 16692e1..d23579a 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -1903,6 +1903,14 @@
StackTraceElement[] stackTrace) {
mTracing.logState(where, callingParams, a11yDump, callingUid, stackTrace);
}
+
+ @Override
+ public void logTrace(
+ String where, String callingParams, byte[] a11yDump, int callingUid,
+ StackTraceElement[] callStack, long timeStamp, int processId, long threadId) {
+ mTracing.logState(where, callingParams, a11yDump, callingUid, callStack, timeStamp,
+ processId, threadId);
+ }
}
private static final class AccessibilityTracing {
@@ -1916,7 +1924,7 @@
}
}
- private static final int BUFFER_CAPACITY = 4096 * 1024;
+ private static final int BUFFER_CAPACITY = 1024 * 1024 * 12;
private static final String TRACE_FILENAME = "/data/misc/a11ytrace/a11y_trace.pb";
private static final String TRACE_DIRECTORY = "/data/misc/a11ytrace/";
private static final String TAG = "AccessibilityTracing";
@@ -2034,7 +2042,22 @@
return;
}
- log(where, callingParams, a11yDump, callingUid, stackTrace);
+ log(where, callingParams, a11yDump, callingUid, stackTrace,
+ SystemClock.elapsedRealtimeNanos(),
+ Process.myPid() + ":" + Application.getProcessName(),
+ Thread.currentThread().getId() + ":" + Thread.currentThread().getName());
+ }
+
+ /**
+ * Write an accessibility trace log entry.
+ */
+ void logState(String where, String callingParams, byte[] a11yDump, int callingUid,
+ StackTraceElement[] callingStack, long timeStamp, int processId, long threadId) {
+ if (!mEnabled) {
+ return;
+ }
+ log(where, callingParams, a11yDump, callingUid, callingStack, timeStamp,
+ String.valueOf(processId), String.valueOf(threadId));
}
private String toStackTraceString(StackTraceElement[] stackTraceElements) {
@@ -2058,18 +2081,17 @@
* Write the current state to the buffer
*/
private void log(String where, String callingParams, byte[] a11yDump, int callingUid,
- StackTraceElement[] stackTrace) {
- SimpleDateFormat fm = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+ StackTraceElement[] callingStack, long timeStamp, String processName,
+ String threadName) {
SomeArgs args = SomeArgs.obtain();
- args.arg1 = SystemClock.elapsedRealtimeNanos();
- args.arg2 = fm.format(new Date()).toString();
- args.arg3 = where;
- args.arg4 = Process.myPid() + ":" + Application.getProcessName();
- args.arg5 = Thread.currentThread().getId() + ":" + Thread.currentThread().getName();
- args.arg6 = callingUid;
- args.arg7 = callingParams;
- args.arg8 = stackTrace;
- args.arg9 = a11yDump;
+ args.arg1 = timeStamp;
+ args.arg2 = where;
+ args.arg3 = processName;
+ args.arg4 = threadName;
+ args.arg5 = callingUid;
+ args.arg6 = callingParams;
+ args.arg7 = callingStack;
+ args.arg8 = a11yDump;
mHandler.obtainMessage(LogHandler.MESSAGE_LOG_TRACE_ENTRY, args).sendToTarget();
}
@@ -2100,17 +2122,26 @@
long tokenOuter = os.start(ENTRY);
String callingStack =
- toStackTraceString((StackTraceElement[]) args.arg8);
+ toStackTraceString((StackTraceElement[]) args.arg7);
- os.write(ELAPSED_REALTIME_NANOS, (long) args.arg1);
- os.write(CALENDAR_TIME, (String) args.arg2);
- os.write(WHERE, (String) args.arg3);
- os.write(PROCESS_NAME, (String) args.arg4);
- os.write(THREAD_ID_NAME, (String) args.arg5);
- os.write(CALLING_PKG, pmInternal.getNameForUid((int) args.arg6));
- os.write(CALLING_PARAMS, (String) args.arg7);
+ long reportedTimeStampNanos = (long) args.arg1;
+ long currentElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos();
+ long timeDiffNanos =
+ currentElapsedRealtimeNanos - reportedTimeStampNanos;
+ long currentTimeMillis = (new Date()).getTime();
+ long reportedTimeMillis =
+ currentTimeMillis - (long) (timeDiffNanos / 1000000);
+ SimpleDateFormat fm = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+
+ os.write(ELAPSED_REALTIME_NANOS, reportedTimeStampNanos);
+ os.write(CALENDAR_TIME, fm.format(reportedTimeMillis).toString());
+ os.write(WHERE, (String) args.arg2);
+ os.write(PROCESS_NAME, (String) args.arg3);
+ os.write(THREAD_ID_NAME, (String) args.arg4);
+ os.write(CALLING_PKG, pmInternal.getNameForUid((int) args.arg5));
+ os.write(CALLING_PARAMS, (String) args.arg6);
os.write(CALLING_STACKS, callingStack);
- os.write(ACCESSIBILITY_SERVICE, (byte[]) args.arg9);
+ os.write(ACCESSIBILITY_SERVICE, (byte[]) args.arg8);
long tokenInner = os.start(WINDOW_MANAGER_SERVICE);
synchronized (mService.mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index a9d33dc..b1606c9 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -776,6 +776,7 @@
if (mTmpInitial) {
w.resetContentChanged();
}
+ w.mSurfacePlacementNeeded = true;
w.mLayoutNeeded = false;
w.prelayout();
final boolean firstLayout = !w.isLaidOut();
@@ -818,6 +819,7 @@
//Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
w.resetContentChanged();
}
+ w.mSurfacePlacementNeeded = true;
w.mLayoutNeeded = false;
w.prelayout();
getDisplayPolicy().layoutWindowLw(w, w.getParentWindow(), mDisplayFrames);
@@ -3750,6 +3752,10 @@
@VisibleForTesting
void setImeInputTarget(WindowState target) {
mImeInputTarget = target;
+ boolean canScreenshot = mImeInputTarget == null || !mImeInputTarget.isSecureLocked();
+ if (mImeWindowsContainer.setCanScreenshot(canScreenshot)) {
+ mWmService.requestTraversal();
+ }
}
@VisibleForTesting
@@ -3867,7 +3873,7 @@
void updateImeInputAndControlTarget(WindowState target) {
if (mImeInputTarget != target) {
ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target);
- mImeInputTarget = target;
+ setImeInputTarget(target);
updateImeControlTarget();
}
}
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index f31a643..510c62d 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -240,6 +240,7 @@
@Override
public void dump(PrintWriter pw, String prefix) {
super.dump(pw, prefix);
+ prefix = prefix + " ";
pw.print(prefix);
pw.print("mImeShowing=");
pw.print(mImeShowing);
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 7b0fb01..0732314 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -63,7 +63,7 @@
/**
* Controller for a specific inset source on the server. It's called provider as it provides the
- * {@link InsetsSource} to the client that uses it in {@link InsetsSourceConsumer}.
+ * {@link InsetsSource} to the client that uses it in {@link android.view.InsetsSourceConsumer}.
*/
class InsetsSourceProvider {
@@ -452,40 +452,36 @@
}
public void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + "InsetsSourceProvider");
- pw.print(prefix + " mSource="); mSource.dump(prefix + " ", pw);
+ pw.println(prefix + getClass().getSimpleName());
+ prefix = prefix + " ";
+ pw.print(prefix + "mSource="); mSource.dump("", pw);
if (mControl != null) {
- pw.print(prefix + " mControl=");
- mControl.dump(prefix + " ", pw);
+ pw.print(prefix + "mControl=");
+ mControl.dump("", pw);
}
- pw.print(prefix + " mFakeControl="); mFakeControl.dump(prefix + " ", pw);
- pw.print(" mIsLeashReadyForDispatching="); pw.print(mIsLeashReadyForDispatching);
- pw.print(" mImeOverrideFrame="); pw.print(mImeOverrideFrame.toString());
+ pw.print(prefix);
+ pw.print("mIsLeashReadyForDispatching="); pw.print(mIsLeashReadyForDispatching);
+ pw.print(" mImeOverrideFrame="); pw.print(mImeOverrideFrame.toShortString());
+ pw.println();
if (mWin != null) {
- pw.print(prefix + " mWin=");
- mWin.dump(pw, prefix + " ", false /* dumpAll */);
+ pw.print(prefix + "mWin=");
+ pw.println(mWin);
}
if (mAdapter != null) {
- pw.print(prefix + " mAdapter=");
- mAdapter.dump(pw, prefix + " ");
+ pw.print(prefix + "mAdapter=");
+ mAdapter.dump(pw, "");
}
if (mControlTarget != null) {
- pw.print(prefix + " mControlTarget=");
- if (mControlTarget.getWindow() != null) {
- mControlTarget.getWindow().dump(pw, prefix + " ", false /* dumpAll */);
- }
+ pw.print(prefix + "mControlTarget=");
+ pw.println(mControlTarget.getWindow());
}
if (mPendingControlTarget != null) {
- pw.print(prefix + " mPendingControlTarget=");
- if (mPendingControlTarget.getWindow() != null) {
- mPendingControlTarget.getWindow().dump(pw, prefix + " ", false /* dumpAll */);
- }
+ pw.print(prefix + "mPendingControlTarget=");
+ pw.println(mPendingControlTarget.getWindow());
}
if (mFakeControlTarget != null) {
- pw.print(prefix + " mFakeControlTarget=");
- if (mFakeControlTarget.getWindow() != null) {
- mFakeControlTarget.getWindow().dump(pw, prefix + " ", false /* dumpAll */);
- }
+ pw.print(prefix + "mFakeControlTarget=");
+ pw.println(mFakeControlTarget.getWindow());
}
}
@@ -575,8 +571,9 @@
@Override
public void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + "ControlAdapter");
- pw.print(prefix + " mCapturedLeash="); pw.print(mCapturedLeash);
+ pw.print(prefix + "ControlAdapter mCapturedLeash=");
+ pw.print(mCapturedLeash);
+ pw.println();
}
@Override
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index b6057c6..655007c 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -573,18 +573,17 @@
void dump(String prefix, PrintWriter pw) {
pw.println(prefix + "WindowInsetsStateController");
- mState.dump(prefix + " ", pw);
- pw.println(prefix + " " + "Control map:");
+ prefix = prefix + " ";
+ mState.dump(prefix, pw);
+ pw.println(prefix + "Control map:");
for (int i = mTypeControlTargetMap.size() - 1; i >= 0; i--) {
pw.print(prefix + " ");
pw.println(InsetsState.typeToString(mTypeControlTargetMap.keyAt(i)) + " -> "
+ mTypeControlTargetMap.valueAt(i));
}
- pw.println(prefix + " " + "InsetsSourceProviders map:");
+ pw.println(prefix + "InsetsSourceProviders:");
for (int i = mProviders.size() - 1; i >= 0; i--) {
- pw.print(prefix + " ");
- pw.println(InsetsState.typeToString(mProviders.keyAt(i)) + " -> ");
- mProviders.valueAt(i).dump(pw, prefix);
+ mProviders.valueAt(i).dump(pw, prefix + " ");
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index a5843d4..070a725 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -3321,4 +3321,12 @@
@WindowManager.LayoutParams.WindowType int getWindowType() {
return INVALID_WINDOW_TYPE;
}
+
+ boolean setCanScreenshot(boolean canScreenshot) {
+ if (mSurfaceControl == null) {
+ return false;
+ }
+ getPendingTransaction().setSecure(mSurfaceControl, !canScreenshot);
+ return true;
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index ab515d4..47087cf 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -81,6 +81,22 @@
void logTrace(
String where, String callingParams, byte[] a11yDump, int callingUid,
StackTraceElement[] stackTrace);
+
+ /**
+ * Add an accessibility trace entry.
+ *
+ * @param where A string to identify this log entry, which can be used to filter/search
+ * through the tracing file.
+ * @param callingParams The parameters for the method to be logged.
+ * @param a11yDump The proto byte array for a11y state when the entry is generated.
+ * @param callingUid The calling uid.
+ * @param callStack The call stack of the method to be logged.
+ * @param timeStamp The time when the method to be logged is called.
+ * @param processId The calling process Id.
+ * @param threadId The calling thread Id.
+ */
+ void logTrace(String where, String callingParams, byte[] a11yDump, int callingUid,
+ StackTraceElement[] callStack, long timeStamp, int processId, long threadId);
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 95f3c37..c766125 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -513,6 +513,13 @@
*/
boolean mLayoutNeeded;
+ /**
+ * If the application is not currently visible but requires a layout,
+ * then make sure we call performSurfacePlacement as well. This is set
+ * in layout if mLayoutNeeded is set until surface placement is done.
+ */
+ boolean mSurfacePlacementNeeded;
+
/** Currently running an exit animation? */
boolean mAnimatingExit;
@@ -4281,7 +4288,10 @@
pw.println(prefix + "mEmbeddedDisplayContents=" + mEmbeddedDisplayContents);
}
if (dumpAll) {
- pw.println(prefix + "mRequestedInsetsState: " + mRequestedInsetsState);
+ final String visibilityString = mRequestedInsetsState.toSourceVisibilityString();
+ if (!visibilityString.isEmpty()) {
+ pw.println(prefix + "Requested visibility: " + visibilityString);
+ }
}
}
@@ -5367,7 +5377,7 @@
mIsDimming = false;
applyDims();
updateSurfacePositionNonOrganized();
- // Send information to SufaceFlinger about the priority of the current window.
+ // Send information to SurfaceFlinger about the priority of the current window.
updateFrameRateSelectionPriorityIfNeeded();
if (isVisibleRequested()) updateGlobalScaleIfNeeded();
@@ -5381,13 +5391,16 @@
if (mSurfaceControl == null) {
return;
}
- if (mWmService.mWindowPlacerLocked.isLayoutDeferred() || isGoneForLayout()) {
+
+ if ((mWmService.mWindowPlacerLocked.isLayoutDeferred() || isGoneForLayout())
+ && !mSurfacePlacementNeeded) {
// Since this relies on mWindowFrames, changes made while layout is deferred are
// likely to be invalid. Similarly, if it's goneForLayout, mWindowFrames may not be
// up-to-date and thus can't be relied on.
return;
}
+ mSurfacePlacementNeeded = false;
transformFrameToSurfacePosition(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top,
mSurfacePosition);
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 3ef7ccd..ca38bb9 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -538,21 +538,17 @@
// The sync transaction will contain the buffer so the bounds change transaction
// will only be applied with the buffer.
t.merge(task.getMainWindowSizeChangeTransaction());
+ task.setMainWindowSizeChangeTransaction(null);
} else {
- // Use pending transaction here instead of the transaction passed in because we
- // want to ensure the defer transaction is applied on the main transaction and
- // not on the sync transaction. This is because the sync transaction could
- // contain the buffer and we'd defer the transaction that contains the buffer
- // we're deferring on.
- SurfaceControl.Transaction pendingTransaction = mWin.getPendingTransaction();
- pendingTransaction.deferTransactionUntil(
- task.getMainWindowSizeChangeTask().getSurfaceControl(),
- mWin.getClientViewRootSurface(), mWin.getFrameNumber());
- pendingTransaction.deferTransactionUntil(mSurfaceController.mSurfaceControl,
- mWin.getClientViewRootSurface(), mWin.getFrameNumber());
- pendingTransaction.merge(task.getMainWindowSizeChangeTransaction());
+ mWin.applyWithNextDraw(finishedFrame -> {
+ final SurfaceControl.Transaction sizeChangedTransaction =
+ task.getMainWindowSizeChangeTransaction();
+ if (sizeChangedTransaction != null) {
+ finishedFrame.merge(sizeChangedTransaction);
+ task.setMainWindowSizeChangeTransaction(null);
+ }
+ });
}
- task.setMainWindowSizeChangeTransaction(null);
}
}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 0a02a86..9f25daf 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -104,7 +104,6 @@
"libhardware",
"libhardware_legacy",
"libhidlbase",
- "libkeystore_binder",
"libmeminfo",
"libmtp",
"libnativehelper",
diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp
index 9456946..646aabd 100644
--- a/services/core/jni/gnss/GnssMeasurementCallback.cpp
+++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp
@@ -302,6 +302,10 @@
SET(Cn0DbHz, measurement.antennaCN0DbHz);
SET(ConstellationType, static_cast<int32_t>(measurement.signalType.constellation));
+ // Half cycle state is reported in the AIDL version of GnssMeasurement
+ SET(AccumulatedDeltaRangeState,
+ (static_cast<int32_t>(measurement.accumulatedDeltaRangeState) |
+ ADR_STATE_HALF_CYCLE_REPORTED));
if (measurement.flags & static_cast<uint32_t>(GnssMeasurement::HAS_CARRIER_FREQUENCY)) {
SET(CarrierFrequencyHz, static_cast<float>(measurement.signalType.carrierFrequencyHz));
@@ -481,7 +485,7 @@
JavaObject& object) {
translateSingleGnssMeasurement(measurement_V1_1.v1_0, object);
- // Set the V1_1 flag, and mark that new field has valid information for Java Layer
+ // Half cycle state is reported in HIDL v1.1 or newer.
SET(AccumulatedDeltaRangeState,
(static_cast<int32_t>(measurement_V1_1.accumulatedDeltaRangeState) |
ADR_STATE_HALF_CYCLE_REPORTED));
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 6f71e99..fbf677d 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -103,6 +103,7 @@
import com.android.internal.widget.ILockSettings;
import com.android.server.am.ActivityManagerService;
import com.android.server.appbinding.AppBindingService;
+import com.android.server.art.ArtManagerLocal;
import com.android.server.attention.AttentionManagerService;
import com.android.server.audio.AudioService;
import com.android.server.biometrics.AuthService;
@@ -2610,6 +2611,10 @@
mSystemServiceManager.startService(GAME_MANAGER_SERVICE_CLASS);
t.traceEnd();
+ t.traceBegin("ArtManagerLocal");
+ LocalManagerRegistry.addManager(ArtManagerLocal.class, new ArtManagerLocal());
+ t.traceEnd();
+
t.traceBegin("StartBootPhaseDeviceSpecificServicesReady");
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_DEVICE_SPECIFIC_SERVICES_READY);
t.traceEnd();
diff --git a/services/smartspace/java/com/android/server/smartspace/SmartspacePerUserService.java b/services/smartspace/java/com/android/server/smartspace/SmartspacePerUserService.java
index db43468..5f435f9 100644
--- a/services/smartspace/java/com/android/server/smartspace/SmartspacePerUserService.java
+++ b/services/smartspace/java/com/android/server/smartspace/SmartspacePerUserService.java
@@ -406,6 +406,8 @@
+ callbackCount + " callbacks.");
}
service.onCreateSmartspaceSessionLocked(mSmartspaceConfig, mSessionId, token);
+ mCallbacks.broadcast(
+ callback -> service.registerSmartspaceUpdatesLocked(mSessionId, callback));
}
}
}
diff --git a/services/tests/PackageManagerServiceTests/host/Android.bp b/services/tests/PackageManagerServiceTests/host/Android.bp
index 06313da..b136d00 100644
--- a/services/tests/PackageManagerServiceTests/host/Android.bp
+++ b/services/tests/PackageManagerServiceTests/host/Android.bp
@@ -46,15 +46,7 @@
":PackageManagerTestAppVersion4",
":PackageManagerTestAppOriginalOverride",
":PackageManagerServiceDeviceSideTests",
- ":PackageManagerTestIntentVerifier",
- ":PackageManagerTestIntentVerifierTarget1",
- ":PackageManagerTestIntentVerifierTarget2",
- ":PackageManagerTestIntentVerifierTarget3",
- ":PackageManagerTestIntentVerifierTarget4Base",
- ":PackageManagerTestIntentVerifierTarget4NoAutoVerify",
- ":PackageManagerTestIntentVerifierTarget4Wildcard",
- ":PackageManagerTestIntentVerifierTarget4WildcardNoAutoVerify",
- ]
+ ],
}
genrule {
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt
deleted file mode 100644
index fffda8e..0000000
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.pm.test.intent.verify
-
-import com.android.internal.util.test.SystemPreparer
-import com.android.server.pm.test.Partition
-import com.android.server.pm.test.deleteApkFolders
-import com.android.server.pm.test.installJavaResourceApk
-import com.android.server.pm.test.pushApk
-import com.android.server.pm.test.uninstallPackages
-import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
-import com.google.common.truth.Truth.assertThat
-import org.junit.After
-import org.junit.Before
-import org.junit.ClassRule
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TemporaryFolder
-import org.junit.runner.RunWith
-import java.io.File
-import java.util.concurrent.TimeUnit
-
-@RunWith(DeviceJUnit4ClassRunner::class)
-class IntentFilterVerificationTest : BaseHostJUnit4Test() {
-
- companion object {
- private const val VERIFIER = "PackageManagerTestIntentVerifier.apk"
- private const val VERIFIER_PKG_NAME = "com.android.server.pm.test.intent.verifier"
- private const val TARGET_PKG_PREFIX = "$VERIFIER_PKG_NAME.target"
- private const val TARGET_APK_PREFIX = "PackageManagerTestIntentVerifierTarget"
- private const val TARGET_ONE = "${TARGET_APK_PREFIX}1.apk"
- private const val TARGET_ONE_PKG_NAME = "$TARGET_PKG_PREFIX.one"
- private const val TARGET_TWO = "${TARGET_APK_PREFIX}2.apk"
- private const val TARGET_TWO_PKG_NAME = "$TARGET_PKG_PREFIX.two"
- private const val TARGET_THREE = "${TARGET_APK_PREFIX}3.apk"
- private const val TARGET_THREE_PKG_NAME = "$TARGET_PKG_PREFIX.three"
- private const val TARGET_FOUR_BASE = "${TARGET_APK_PREFIX}4Base.apk"
- private const val TARGET_FOUR_PKG_NAME = "$TARGET_PKG_PREFIX.four"
- private const val TARGET_FOUR_NO_AUTO_VERIFY = "${TARGET_APK_PREFIX}4NoAutoVerify.apk"
- private const val TARGET_FOUR_WILDCARD = "${TARGET_APK_PREFIX}4Wildcard.apk"
- private const val TARGET_FOUR_WILDCARD_NO_AUTO_VERIFY =
- "${TARGET_APK_PREFIX}4WildcardNoAutoVerify.apk"
-
- @get:ClassRule
- val deviceRebootRule = SystemPreparer.TestRuleDelegate(true)
- }
-
- private val tempFolder = TemporaryFolder()
- private val preparer: SystemPreparer = SystemPreparer(tempFolder,
- SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
-
- @Rule
- @JvmField
- val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
-
- private val permissionsFile = File("/system/etc/permissions" +
- "/privapp-PackageManagerIntentFilterVerificationTest-permissions.xml")
-
- @Before
- fun cleanupAndPushPermissionsFile() {
- // In order for the test app to be the verification agent, it needs a permission file
- // which can be pushed onto the system and removed afterwards.
- val file = tempFolder.newFile().apply {
- """
- <permissions>
- <privapp-permissions package="$VERIFIER_PKG_NAME">
- <permission name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"/>
- </privapp-permissions>
- </permissions>
- """
- .trimIndent()
- .let { writeText(it) }
- }
- device.uninstallPackages(TARGET_ONE_PKG_NAME, TARGET_TWO_PKG_NAME, TARGET_THREE_PKG_NAME,
- TARGET_FOUR_PKG_NAME)
- preparer.pushApk(VERIFIER, Partition.SYSTEM_PRIVILEGED)
- .pushFile(file, permissionsFile.toString())
- .reboot()
- runTest("clearResponse")
- }
-
- @After
- fun cleanupAndDeletePermissionsFile() {
- device.uninstallPackages(TARGET_ONE_PKG_NAME, TARGET_TWO_PKG_NAME, TARGET_THREE_PKG_NAME,
- TARGET_FOUR_PKG_NAME)
- preparer.deleteApkFolders(Partition.SYSTEM_PRIVILEGED, VERIFIER)
- .deleteFile(permissionsFile.toString())
- device.reboot()
- }
-
- @Test
- fun verifyOne() {
- installPackage(TARGET_ONE)
-
- assertReceivedRequests(true, VerifyRequest(
- scheme = "https",
- hosts = listOf(
- "https_only.pm.server.android.com",
- "other_activity.pm.server.android.com",
- "http_only.pm.server.android.com",
- "verify.pm.server.android.com",
- "https_plus_non_web_scheme.pm.server.android.com",
- "multiple.pm.server.android.com",
- // TODO(b/159952358): the following domain should not be
- // verified, this is because the verifier tries to verify all web domains,
- // even in intent filters not marked for auto verify
- "no_verify.pm.server.android.com"
- ),
- packageName = TARGET_ONE_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "https://https_only.pm.server.android.com",
- expected = "$TARGET_ONE_PKG_NAME.TargetActivity"
- ))
- }
-
- @Test
- fun nonWebScheme() {
- installPackage(TARGET_TWO)
- assertReceivedRequests(null)
- }
-
- @Test
- fun verifyHttpNonSecureOnly() {
- installPackage(TARGET_THREE)
- assertReceivedRequests(true, VerifyRequest(
- scheme = "https",
- hosts = listOf(
- "multiple.pm.server.android.com"
- ),
- packageName = TARGET_THREE_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "http://multiple.pm.server.android.com",
- expected = "$TARGET_THREE_PKG_NAME.TargetActivity"
- ))
- }
-
- @Test
- fun multipleResults() {
- installPackage(TARGET_ONE)
- installPackage(TARGET_THREE)
- assertReceivedRequests(true, VerifyRequest(
- scheme = "https",
- hosts = listOf(
- "https_only.pm.server.android.com",
- "other_activity.pm.server.android.com",
- "http_only.pm.server.android.com",
- "verify.pm.server.android.com",
- "https_plus_non_web_scheme.pm.server.android.com",
- "multiple.pm.server.android.com",
- // TODO(b/159952358): the following domain should not be
- // verified, this is because the verifier tries to verify all web domains,
- // even in intent filters not marked for auto verify
- "no_verify.pm.server.android.com"
- ),
- packageName = TARGET_ONE_PKG_NAME
- ), VerifyRequest(
- scheme = "https",
- hosts = listOf(
- "multiple.pm.server.android.com"
- ),
- packageName = TARGET_THREE_PKG_NAME
- ))
-
- // Target3 declares http non-s, so it should be included in the set here
- runTest(StartActivityParams(
- uri = "http://multiple.pm.server.android.com",
- expected = listOf(
- "$TARGET_ONE_PKG_NAME.TargetActivity2",
- "$TARGET_THREE_PKG_NAME.TargetActivity"
- )
- ))
-
- // But it excludes https, so it shouldn't resolve here
- runTest(StartActivityParams(
- uri = "https://multiple.pm.server.android.com",
- expected = "$TARGET_ONE_PKG_NAME.TargetActivity2"
- ))
-
- // Remove Target3 and return to single verified Target1 app for http non-s
- device.uninstallPackage(TARGET_THREE_PKG_NAME)
- runTest(StartActivityParams(
- uri = "http://multiple.pm.server.android.com",
- expected = "$TARGET_ONE_PKG_NAME.TargetActivity2"
- ))
- }
-
- @Test
- fun demoteAlways() {
- installPackage(TARGET_FOUR_BASE)
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
- withBrowsers = true
- ))
- runTest(SetActivityAsAlwaysParams(
- uri = "https://failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME,
- activityName = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- // Re-installing with same host/verify set will maintain always setting
- installPackage(TARGET_FOUR_BASE)
- assertReceivedRequests(null)
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- // Installing with new wildcard host will downgrade out of always, re-including browsers
- installPackage(TARGET_FOUR_WILDCARD)
-
- // TODO(b/159952358): The first request without the wildcard should not be sent. This is
- // caused by the request being queued even if it should be dropped from the previous
- // install case since the host set didn't change.
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- hosts = listOf("failing.pm.server.android.com"),
- packageName = TARGET_FOUR_PKG_NAME
- ), VerifyRequest(
- scheme = "https",
- hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
- packageName = TARGET_FOUR_PKG_NAME
- ))
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
- withBrowsers = true
- ))
- }
-
- @Test
- fun unverifiedReinstallResendRequest() {
- installPackage(TARGET_FOUR_BASE)
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- installPackage(TARGET_FOUR_BASE)
-
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ))
- }
-
- @Test
- fun unverifiedUpdateRemovingDomainNoRequestDemoteAlways() {
- installPackage(TARGET_FOUR_WILDCARD)
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- runTest(SetActivityAsAlwaysParams(
- uri = "https://failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME,
- activityName = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- // Re-installing with a smaller host/verify set will not request re-verification
- installPackage(TARGET_FOUR_BASE)
- assertReceivedRequests(null)
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- // Re-installing with a (now) larger host/verify set will re-request and demote
- installPackage(TARGET_FOUR_WILDCARD)
- // TODO(b/159952358): The first request should not be sent. This is caused by the request
- // being queued even if it should be dropped from the previous install case.
- assertReceivedRequests(false, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ), VerifyRequest(
- scheme = "https",
- hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
- withBrowsers = true
- ))
- }
-
- // TODO(b/159952358): I would expect this to demote
- // TODO(b/32810168)
- @Test
- fun verifiedUpdateRemovingAutoVerifyMaintainsAlways() {
- installPackage(TARGET_FOUR_BASE)
- assertReceivedRequests(true, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- installPackage(TARGET_FOUR_NO_AUTO_VERIFY)
- assertReceivedRequests(null)
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
- }
-
- @Test
- fun verifiedUpdateRemovingAutoVerifyAddingDomainDemotesAlways() {
- installPackage(TARGET_FOUR_BASE)
-
- assertReceivedRequests(true, VerifyRequest(
- scheme = "https",
- host = "failing.pm.server.android.com",
- packageName = TARGET_FOUR_PKG_NAME
- ))
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
- ))
-
- installPackage(TARGET_FOUR_WILDCARD_NO_AUTO_VERIFY)
- assertReceivedRequests(null)
-
- runTest(StartActivityParams(
- uri = "https://failing.pm.server.android.com",
- expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
- withBrowsers = true
- ))
- }
-
- private fun installPackage(javaResourceName: String) {
- // Need to pass --user as verification is not currently run for all user installs
- assertThat(device.installJavaResourceApk(tempFolder, javaResourceName,
- extraArgs = arrayOf("--user", device.currentUser.toString()))).isNull()
- }
-
- private fun assertReceivedRequests(success: Boolean?, vararg expected: VerifyRequest?) {
- // TODO(b/159952358): This can probably be less than 10
- // Because tests have to assert that multiple broadcasts aren't received, there's no real
- // better way to await for a value than sleeping for a long enough time.
- TimeUnit.SECONDS.sleep(10)
-
- val params = mutableMapOf<String, String>()
- if (expected.any { it != null }) {
- params["expected"] = expected.filterNotNull()
- .joinToString(separator = "") { it.serializeToString() }
- }
- runTest("compareLastReceived", params)
-
- if (success != null) {
- if (success) {
- runTest("verifyPreviousReceivedSuccess")
- } else {
- runTest("verifyPreviousReceivedFailure")
- }
- runTest("clearResponse")
- }
- }
-
- private fun runTest(params: IntentVerifyTestParams) =
- runTest(params.methodName, params.toArgsMap())
-
- private fun runTest(testName: String, args: Map<String, String> = emptyMap()) {
- val escapedArgs = args.mapValues {
- // Need to escape strings so that args are passed properly through the shell command
- "\"${it.value.trim('"')}\""
- }
- runDeviceTests(device, null, VERIFIER_PKG_NAME, "$VERIFIER_PKG_NAME.VerifyReceiverTest",
- testName, null, 10 * 60 * 1000L, 10 * 60 * 1000L, 0L, true, false, escapedArgs)
- }
-}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp
deleted file mode 100644
index 4f3f2eb..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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.
-
-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_test_helper_app {
- name: "PackageManagerTestIntentVerifier",
- srcs: [ "src/**/*.kt" ],
- static_libs: [
- "androidx.test.core",
- "androidx.test.espresso.core",
- "androidx.test.runner",
- "compatibility-device-util-axt",
- "junit",
- "truth-prebuilt",
- "PackageManagerServiceHostTestsIntentVerifyUtils",
- ],
- platform_apis: true,
-}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml
deleted file mode 100644
index 17b50b0..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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.server.pm.test.intent.verifier"
- >
-
- <uses-permission android:name="android.permission.INTENT_FILTER_VERIFICATION_AGENT" />
- <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
- <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
-
- <instrumentation
- android:name="androidx.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.server.pm.test.intent.verifier"
- />
-
- <application>
- <receiver android:name=".VerifyReceiver" android:exported="true">
- <intent-filter android:priority="999">
- <action android:name="android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"/>
- <data android:mimeType="application/vnd.android.package-archive"/>
- </intent-filter>
- </receiver>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt
deleted file mode 100644
index 073c2be..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.pm.test.intent.verifier
-
-import android.content.BroadcastReceiver
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import com.android.server.pm.test.intent.verify.VerifyRequest
-
-class VerifyReceiver : BroadcastReceiver() {
-
- override fun onReceive(context: Context, intent: Intent) {
- if (intent.action != Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION) return
- val params = intent.toVerifyParams()
-
- // If the receiver is called for a normal request, proxy it to the real verifier on device
- if (params.hosts.none { it.contains("pm.server.android.com") }) {
- sendToRealVerifier(context, Intent(intent))
- return
- }
-
- // When the receiver is invoked for a test install, there is no direct connection to host,
- // so store the result in a file to read and assert on later. Append is intentional so that
- // amount of invocations and clean up can be verified.
- context.filesDir.resolve("test.txt")
- .appendText(params.serializeToString())
- }
-
- private fun sendToRealVerifier(context: Context, intent: Intent) {
- context.packageManager.queryBroadcastReceivers(intent, 0)
- .first { it.activityInfo?.packageName != context.packageName }
- .let { it.activityInfo!! }
- .let { intent.setComponent(ComponentName(it.packageName, it.name)) }
- .run { context.sendBroadcast(intent) }
- }
-
- private fun Intent.toVerifyParams() = VerifyRequest(
- id = getIntExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_ID, -1),
- scheme = getStringExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME)!!,
- hosts = getStringExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_HOSTS)!!
- .split(' '),
- packageName = getStringExtra(
- PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME)!!
-
- )
-}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
deleted file mode 100644
index 23ed278..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.pm.test.intent.verifier
-
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.content.pm.PackageManager
-import android.net.Uri
-import android.os.Bundle
-import android.os.UserHandle
-import androidx.test.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
-import com.android.compatibility.common.util.ShellIdentityUtils
-import com.android.server.pm.test.intent.verify.SetActivityAsAlwaysParams
-import com.android.server.pm.test.intent.verify.StartActivityParams
-import com.android.server.pm.test.intent.verify.VerifyRequest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import java.io.File
-
-@RunWith(AndroidJUnit4::class)
-class VerifyReceiverTest {
-
- val args: Bundle = InstrumentationRegistry.getArguments()
- val context: Context = InstrumentationRegistry.getContext()
-
- private val file = context.filesDir.resolve("test.txt")
-
- @Test
- fun clearResponse() {
- file.delete()
- }
-
- @Test
- fun compareLastReceived() {
- val lastReceivedText = file.readTextIfExists()
- val expectedText = args.getString("expected")
- if (expectedText.isNullOrEmpty()) {
- assertThat(lastReceivedText).isEmpty()
- return
- }
-
- val expectedParams = expectedText.parseParams()
- val lastReceivedParams = lastReceivedText.parseParams()
-
- assertThat(lastReceivedParams).hasSize(expectedParams.size)
-
- lastReceivedParams.zip(expectedParams).forEach { (actual, expected) ->
- assertThat(actual.hosts).containsExactlyElementsIn(expected.hosts)
- assertThat(actual.packageName).isEqualTo(expected.packageName)
- assertThat(actual.scheme).isEqualTo(expected.scheme)
- }
- }
-
- @Test
- fun setActivityAsAlways() {
- val params = SetActivityAsAlwaysParams.fromArgs(
- args.keySet().associateWith { args.getString(it)!! })
- val uri = Uri.parse(params.uri)
- val filter = IntentFilter().apply {
- addAction(Intent.ACTION_VIEW)
- addCategory(Intent.CATEGORY_DEFAULT)
- addCategory(Intent.CATEGORY_BROWSABLE)
- addDataScheme(uri.scheme)
- addDataAuthority(uri.authority, null)
- }
-
- val intent = Intent(Intent.ACTION_VIEW, uri).apply {
- addCategory(Intent.CATEGORY_DEFAULT)
- addCategory(Intent.CATEGORY_BROWSABLE)
- }
- val allResults = context.packageManager.queryIntentActivities(intent, 0)
- val allComponents = allResults
- .map { ComponentName(it.activityInfo.packageName, it.activityInfo.name) }
- .toTypedArray()
- val matchingInfo = allResults.first {
- it.activityInfo.packageName == params.packageName &&
- it.activityInfo.name == params.activityName
- }
-
- ShellIdentityUtils.invokeMethodWithShellPermissions(context.packageManager,
- ShellIdentityUtils.ShellPermissionMethodHelper<Unit, PackageManager> {
- it.addUniquePreferredActivity(filter, matchingInfo.match, allComponents,
- ComponentName(matchingInfo.activityInfo.packageName,
- matchingInfo.activityInfo.name))
- it.updateIntentVerificationStatusAsUser(params.packageName,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
- UserHandle.myUserId())
- }, "android.permission.SET_PREFERRED_APPLICATIONS")
- }
-
- @Test
- fun verifyPreviousReceivedSuccess() {
- file.readTextIfExists()
- .parseParams()
- .forEach {
- context.packageManager.verifyIntentFilter(it.id,
- PackageManager.INTENT_FILTER_VERIFICATION_SUCCESS, emptyList())
- }
- }
-
- @Test
- fun verifyPreviousReceivedFailure() {
- file.readTextIfExists()
- .parseParams()
- .forEach {
- context.packageManager.verifyIntentFilter(it.id,
- PackageManager.INTENT_FILTER_VERIFICATION_FAILURE, it.hosts)
- }
- }
-
- @Test
- fun verifyActivityStart() {
- val params = StartActivityParams
- .fromArgs(args.keySet().associateWith { args.getString(it)!! })
- val uri = Uri.parse(params.uri)
- val intent = Intent(Intent.ACTION_VIEW).apply {
- data = uri
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- addCategory(Intent.CATEGORY_DEFAULT)
- addCategory(Intent.CATEGORY_BROWSABLE)
- }
-
- val expectedActivities = params.expected.toMutableList()
-
- if (params.withBrowsers) {
- // Since the host doesn't know what browsers the device has, query here and add it to
- // set if it's expected that browser are returned
- val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))
- expectedActivities += context.packageManager.queryIntentActivities(browserIntent, 0)
- .map { it.activityInfo.name }
- }
-
- val infos = context.packageManager.queryIntentActivities(intent, 0)
- .map { it.activityInfo.name }
- assertThat(infos).containsExactlyElementsIn(expectedActivities)
- }
-
- private fun File.readTextIfExists() = if (exists()) readText() else ""
-
- // Rudimentary list deserialization by splitting text block into 4 line sections
- private fun String.parseParams() = trim()
- .lines()
- .windowed(4, 4)
- .map { it.joinToString(separator = "\n") }
- .map { VerifyRequest.deserialize(it) }
-}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp
deleted file mode 100644
index 9f9ed24..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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.
-
-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_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget1",
- manifest: "AndroidManifest1.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget2",
- manifest: "AndroidManifest2.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget3",
- manifest: "AndroidManifest3.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget4Base",
- manifest: "AndroidManifest4Base.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget4NoAutoVerify",
- manifest: "AndroidManifest4NoAutoVerify.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget4Wildcard",
- manifest: "AndroidManifest4Wildcard.xml",
-}
-
-android_test_helper_app {
- name: "PackageManagerTestIntentVerifierTarget4WildcardNoAutoVerify",
- manifest: "AndroidManifest4WildcardNoAutoVerify.xml",
-}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml
deleted file mode 100644
index 6cf5c76..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.one" android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="verify.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="false">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="no_verify.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:host="http_only.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="https" />
- <data android:host="https_only.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="htttps" />
- <data android:host="non_http.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="https" />
- <data android:scheme="non_web_scheme" />
- <data android:host="https_plus_non_web_scheme.pm.server.android.com" />
- </intent-filter>
- </activity>
-
- <activity android:name=".TargetActivity2" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="other_activity.pm.server.android.com" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="multiple.pm.server.android.com" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml
deleted file mode 100644
index 087ef705..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.two"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:scheme="non_web_scheme" />
- <data android:host="only_https_plus_non_web_scheme.pm.server.android.com" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml
deleted file mode 100644
index eb75b5e..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.three"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:host="multiple.pm.server.android.com" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml
deleted file mode 100644
index 7eacb8b..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.four"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="failing.pm.server.android.com" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml
deleted file mode 100644
index ecfee55..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.four"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="false">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="failing.pm.server.android.com" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml
deleted file mode 100644
index 0f0f53b..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.four"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="failing.pm.server.android.com" />
- <data android:host="*.wildcard.tld" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml
deleted file mode 100644
index d5652e1..0000000
--- a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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.server.pm.test.intent.verifier.target.four"
- android:versionCode="1">
-
- <application>
- <activity android:name=".TargetActivity" android:exported="true">
- <intent-filter android:autoVerify="false">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="failing.pm.server.android.com" />
- <data android:host="*.wildcard.tld" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 1c45203..3404aff 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -1361,6 +1361,52 @@
@SuppressWarnings("GuardedBy")
@Test
+ public void testUpdateOomAdj_DoOne_ScheduleLikeTop() {
+ final ProcessRecord app1 = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
+ MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
+ final ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
+ MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
+ final ProcessRecord client1 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
+ MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
+ final ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
+ MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
+ bindService(app1, client1, null, Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
+ mock(IBinder.class));
+ bindService(app2, client2, null, Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
+ mock(IBinder.class));
+ client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
+ client2.mServices.setHasForegroundServices(true, 0);
+
+ sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+ sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+
+ assertProcStates(app1, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
+ SCHED_GROUP_DEFAULT);
+ assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
+ SCHED_GROUP_DEFAULT);
+
+ bindService(app1, client1, null, Context.BIND_SCHEDULE_LIKE_TOP_APP, mock(IBinder.class));
+ bindService(app2, client2, null, Context.BIND_SCHEDULE_LIKE_TOP_APP, mock(IBinder.class));
+ sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+ sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+
+ assertProcStates(app1, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
+ SCHED_GROUP_TOP_APP);
+ assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
+ SCHED_GROUP_DEFAULT);
+
+ sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
+ sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+ sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
+ assertProcStates(app1, PROCESS_STATE_IMPORTANT_FOREGROUND, VISIBLE_APP_ADJ,
+ SCHED_GROUP_TOP_APP);
+ assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
+ SCHED_GROUP_DEFAULT);
+ }
+
+ @SuppressWarnings("GuardedBy")
+ @Test
public void testUpdateOomAdj_UidIdle_StopService() {
final ProcessRecord app1 = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
diff --git a/services/tests/mockingservicestests/src/com/android/server/utils/SlogfTest.java b/services/tests/mockingservicestests/src/com/android/server/utils/SlogfTest.java
new file mode 100644
index 0000000..3e8cef9
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/utils/SlogfTest.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2021 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.server.utils;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+
+import android.util.Log;
+import android.util.Slog;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+/**
+ * Run it as {@code atest FrameworksMockingServicesTests:SlogfTest}
+ */
+public final class SlogfTest {
+
+ private static final String TAG = SlogfTest.class.getSimpleName();
+
+ private MockitoSession mSession;
+
+ private final Exception mException = new Exception("D'OH!");
+
+ @Before
+ public void setup() {
+ mSession = mockitoSession()
+ .initMocks(this)
+ .mockStatic(Slog.class)
+ .spyStatic(Slogf.class) // for isLoggable only
+ .strictness(Strictness.LENIENT)
+ .startMocking();
+ }
+
+ @After
+ public void tearDown() {
+ if (mSession == null) {
+ Log.w(TAG, "finishSession(): no session");
+ } else {
+ mSession.finishMocking();
+ }
+ }
+
+ @Test
+ public void testIsLoggable() {
+ assertThat(Slogf.isLoggable(TAG, Log.VERBOSE)).isEqualTo(Log.isLoggable(TAG, Log.VERBOSE));
+ }
+
+ @Test
+ public void testV_msg() {
+ Slogf.v(TAG, "msg");
+
+ verify(()-> Slog.v(TAG, "msg"));
+ }
+
+ @Test
+ public void testV_msgAndException() {
+ Slogf.v(TAG, "msg", mException);
+
+ verify(()-> Slog.v(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testV_msgFormatted_enabled() {
+ enableLogging(Log.VERBOSE);
+
+ Slogf.v(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.v(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testV_msgFormatted_disabled() {
+ disableLogging(Log.VERBOSE);
+
+ Slogf.v(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.v(eq(TAG), any()), never());
+ }
+
+ @Test
+ public void testD_msg() {
+ Slogf.d(TAG, "msg");
+
+ verify(()-> Slog.d(TAG, "msg"));
+ }
+
+ @Test
+ public void testD_msgAndException() {
+ Slogf.d(TAG, "msg", mException);
+
+ verify(()-> Slog.d(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testD_msgFormatted_enabled() {
+ enableLogging(Log.DEBUG);
+
+ Slogf.d(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.d(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testD_msgFormatted_disabled() {
+ disableLogging(Log.DEBUG);
+
+ Slogf.d(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.d(eq(TAG), any()), never());
+ }
+
+ @Test
+ public void testI_msg() {
+ Slogf.i(TAG, "msg");
+
+ verify(()-> Slog.i(TAG, "msg"));
+ }
+
+ @Test
+ public void testI_msgAndException() {
+ Slogf.i(TAG, "msg", mException);
+
+ verify(()-> Slog.i(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testI_msgFormatted_enabled() {
+ enableLogging(Log.INFO);
+
+ Slogf.i(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.i(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testI_msgFormatted_disabled() {
+ disableLogging(Log.INFO);
+
+ Slogf.i(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.i(eq(TAG), any()), never());
+ }
+
+ @Test
+ public void testW_msg() {
+ Slogf.w(TAG, "msg");
+
+ verify(()-> Slog.w(TAG, "msg"));
+ }
+
+ @Test
+ public void testW_msgAndException() {
+ Slogf.w(TAG, "msg", mException);
+
+ verify(()-> Slog.w(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testW_exception() {
+ Slogf.w(TAG, mException);
+
+ verify(()-> Slog.w(TAG, mException));
+ }
+
+ @Test
+ public void testW_msgFormatted_enabled() {
+ enableLogging(Log.WARN);
+
+ Slogf.w(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.w(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testW_msgFormatted_disabled() {
+ disableLogging(Log.WARN);
+
+ Slogf.w(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.w(eq(TAG), any(String.class)), never());
+ }
+
+ @Test
+ public void testW_msgFormattedWithException_enabled() {
+ enableLogging(Log.WARN);
+
+ Slogf.w(TAG, mException, "msg in a %s", "bottle");
+
+ verify(()-> Slog.w(TAG, "msg in a bottle", mException));
+ }
+
+ @Test
+ public void testW_msgFormattedWithException_disabled() {
+ disableLogging(Log.WARN);
+
+ Slogf.w(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.w(eq(TAG), any(String.class), any(Throwable.class)), never());
+ }
+
+ @Test
+ public void testE_msg() {
+ Slogf.e(TAG, "msg");
+
+ verify(()-> Slog.e(TAG, "msg"));
+ }
+
+ @Test
+ public void testE_msgAndException() {
+ Slogf.e(TAG, "msg", mException);
+
+ verify(()-> Slog.e(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testE_msgFormatted_enabled() {
+ enableLogging(Log.ERROR);
+
+ Slogf.e(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.e(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testE_msgFormatted_disabled() {
+ disableLogging(Log.ERROR);
+
+ Slogf.e(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.e(eq(TAG), any()), never());
+ }
+
+ @Test
+ public void testE_msgFormattedWithException_enabled() {
+ enableLogging(Log.ERROR);
+
+ Slogf.e(TAG, mException, "msg in a %s", "bottle");
+
+ verify(()-> Slog.e(TAG, "msg in a bottle", mException));
+ }
+
+ @Test
+ public void testE_msgFormattedWithException_disabled() {
+ disableLogging(Log.ERROR);
+
+ Slogf.e(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.e(eq(TAG), any(String.class), any(Throwable.class)), never());
+ }
+
+ @Test
+ public void testWtf_msg() {
+ Slogf.wtf(TAG, "msg");
+
+ verify(()-> Slog.wtf(TAG, "msg"));
+ }
+
+ @Test
+ public void testWtf_msgAndException() {
+ Slogf.wtf(TAG, "msg", mException);
+
+ verify(()-> Slog.wtf(TAG, "msg", mException));
+ }
+
+ @Test
+ public void testWtf_exception() {
+ Slogf.wtf(TAG, mException);
+
+ verify(()-> Slog.wtf(TAG, mException));
+ }
+
+ @Test
+ public void testWtf_msgFormatted() {
+ Slogf.wtf(TAG, "msg in a %s", "bottle");
+
+ verify(()-> Slog.wtf(TAG, "msg in a bottle"));
+ }
+
+ @Test
+ public void testWtfQuiet() {
+ Slogf.wtfQuiet(TAG, "msg");
+
+ verify(()-> Slog.wtfQuiet(TAG, "msg"));
+ }
+
+ @Test
+ public void testWtfStack() {
+ Slogf.wtfStack(TAG, "msg");
+
+ verify(()-> Slog.wtfStack(TAG, "msg"));
+ }
+
+ @Test
+ public void testPrintln() {
+ Slogf.println(42, TAG, "msg");
+
+ verify(()-> Slog.println(42, TAG, "msg"));
+ }
+
+ @Test
+ public void testWtf_msgFormattedWithException() {
+ Slogf.wtf(TAG, mException, "msg in a %s", "bottle");
+
+ verify(()-> Slog.wtf(TAG, "msg in a bottle", mException));
+ }
+
+ private void enableLogging(@Log.Level int level) {
+ setIsLogging(level, true);
+ }
+
+ private void disableLogging(@Log.Level int level) {
+ setIsLogging(level, false);
+ }
+
+ private void setIsLogging(@Log.Level int level, boolean value) {
+ doReturn(value).when(() -> Slogf.isLoggable(TAG, level));
+ }
+}
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index 68f5479..d7fbd49 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -42,6 +42,7 @@
"androidx.test.ext.truth",
"androidx.test.runner",
"androidx.test.rules",
+ "cts-wm-util",
"platform-compat-test-rules",
"mockito-target-minus-junit4",
"platform-test-annotations",
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 7c30b45..d1cd7cd 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -92,6 +92,8 @@
<uses-permission android:name="android.permission.CONTROL_DEVICE_STATE"/>
<uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
<uses-permission android:name="android.permission.KILL_UID"/>
+ <uses-permission
+ android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/>
<!-- Uses API introduced in O (26) -->
<uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
index e04841b..6bca5e4 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
@@ -46,6 +46,9 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
+import android.provider.DeviceConfig;
+import android.provider.Settings;
+import android.server.wm.settings.SettingsSession;
import android.support.test.uiautomator.UiDevice;
import android.test.suitebuilder.annotation.LargeTest;
import android.text.TextUtils;
@@ -61,6 +64,8 @@
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Tests for {@link ActivityManager}.
@@ -316,6 +321,102 @@
}
}
+ @LargeTest
+ @Test
+ public void testAppFreezerWithAllowOomAdj() throws Exception {
+ final long waitFor = 5000;
+ boolean freezerWasEnabled = isFreezerEnabled();
+ SettingsSession<String> freezerEnabled = null;
+ SettingsSession<String> amConstantsSettings = null;
+ DeviceConfigSession<Long> freezerDebounceTimeout = null;
+ MyServiceConnection autoConnection = null;
+ try {
+ if (!freezerWasEnabled) {
+ freezerEnabled = new SettingsSession<>(
+ Settings.Global.getUriFor(Settings.Global.CACHED_APPS_FREEZER_ENABLED),
+ Settings.Global::getString, Settings.Global::putString);
+ freezerEnabled.set("enabled");
+ Thread.sleep(waitFor);
+ if (!isFreezerEnabled()) {
+ // Still not enabled? Probably because the device doesn't support it.
+ return;
+ }
+ }
+ freezerDebounceTimeout = new DeviceConfigSession<>(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ CachedAppOptimizer.KEY_FREEZER_DEBOUNCE_TIMEOUT,
+ DeviceConfig::getLong, CachedAppOptimizer.DEFAULT_FREEZER_DEBOUNCE_TIMEOUT);
+ freezerDebounceTimeout.set(waitFor);
+
+ final String activityManagerConstants = Settings.Global.ACTIVITY_MANAGER_CONSTANTS;
+ amConstantsSettings = new SettingsSession<>(
+ Settings.Global.getUriFor(activityManagerConstants),
+ Settings.Global::getString, Settings.Global::putString);
+
+ amConstantsSettings.set(
+ ActivityManagerConstants.KEY_MAX_SERVICE_INACTIVITY + "=" + waitFor);
+
+ final Intent intent = new Intent();
+ intent.setClassName(TEST_APP, TEST_CLASS);
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ autoConnection = new MyServiceConnection(latch);
+ mContext.bindService(intent, autoConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_ALLOW_OOM_MANAGEMENT);
+ try {
+ assertTrue("Timeout to bind to service " + intent.getComponent(),
+ latch.await(AWAIT_TIMEOUT, TimeUnit.MILLISECONDS));
+ } catch (InterruptedException e) {
+ fail("Unable to bind to service " + intent.getComponent());
+ }
+ assertFalse(TEST_APP + " shouldn't be frozen now.", isAppFrozen(TEST_APP));
+
+ // Trigger oomAdjUpdate/
+ toggleScreenOn(false);
+ toggleScreenOn(true);
+
+ // Wait for the freezer kick in if there is any.
+ Thread.sleep(waitFor * 4);
+
+ // It still shouldn't be frozen, although it's been in cached state.
+ assertFalse(TEST_APP + " shouldn't be frozen now.", isAppFrozen(TEST_APP));
+ } finally {
+ toggleScreenOn(true);
+ if (amConstantsSettings != null) {
+ amConstantsSettings.close();
+ }
+ if (freezerEnabled != null) {
+ freezerEnabled.close();
+ }
+ if (freezerDebounceTimeout != null) {
+ freezerDebounceTimeout.close();
+ }
+ if (autoConnection != null) {
+ mContext.unbindService(autoConnection);
+ }
+ }
+ }
+
+ private boolean isFreezerEnabled() throws Exception {
+ final String output = runShellCommand("dumpsys activity settings");
+ final Matcher matcher = Pattern.compile("\\b" + CachedAppOptimizer.KEY_USE_FREEZER
+ + "\\b=\\b(true|false)\\b").matcher(output);
+ if (matcher.find()) {
+ return Boolean.parseBoolean(matcher.group(1));
+ }
+ return false;
+ }
+
+ private boolean isAppFrozen(String packageName) throws Exception {
+ final String output = runShellCommand("dumpsys activity p " + packageName);
+ final Matcher matcher = Pattern.compile("\\b" + ProcessCachedOptimizerRecord.IS_FROZEN
+ + "\\b=\\b(true|false)\\b").matcher(output);
+ if (matcher.find()) {
+ return Boolean.parseBoolean(matcher.group(1));
+ }
+ return false;
+ }
+
/**
* Make sure the screen state.
*/
diff --git a/services/tests/servicestests/src/com/android/server/am/DeviceConfigSession.java b/services/tests/servicestests/src/com/android/server/am/DeviceConfigSession.java
new file mode 100644
index 0000000..03cf17c
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/DeviceConfigSession.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 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.server.am;
+
+import android.annotation.NonNull;
+import android.provider.DeviceConfig;
+
+import com.android.compatibility.common.util.SystemUtil;
+import com.android.internal.util.function.TriFunction;
+
+/**
+ * An utility class to set/restore the given device_config item.
+ */
+public class DeviceConfigSession<T> implements AutoCloseable {
+ private final TriFunction<String, String, T, T> mGetter;
+
+ private final String mNamespace;
+ private final String mKey;
+ private final T mInitialValue;
+ private final T mDefaultValue;
+ private boolean mHasInitalValue;
+
+ DeviceConfigSession(String namespace, String key,
+ TriFunction<String, String, T, T> getter, T defaultValue) {
+ mNamespace = namespace;
+ mKey = key;
+ mGetter = getter;
+ mDefaultValue = defaultValue;
+ // Try {@DeviceConfig#getString} firstly since the DeviceConfig API doesn't
+ // support "not found" exception.
+ final String initialStringValue = DeviceConfig.getString(namespace, key, null);
+ if (initialStringValue == null) {
+ mHasInitalValue = false;
+ mInitialValue = defaultValue;
+ } else {
+ mHasInitalValue = true;
+ mInitialValue = getter.apply(namespace, key, defaultValue);
+ }
+ }
+
+ public void set(final @NonNull T value) {
+ DeviceConfig.setProperty(mNamespace, mKey,
+ value == null ? null : value.toString(), false);
+ }
+
+ public T get() {
+ return mGetter.apply(mNamespace, mKey, mDefaultValue);
+ }
+
+ @Override
+ public void close() throws Exception {
+ if (mHasInitalValue) {
+ set(mInitialValue);
+ } else {
+ SystemUtil.runShellCommand("device_config delete " + mNamespace + " " + mKey);
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
index e4be448..10a7a50 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
@@ -96,6 +96,7 @@
when(mInjector.getFaceService()).thenReturn(mFaceService);
when(mInjector.getIrisService()).thenReturn(mIrisService);
when(mInjector.getAppOps(any())).thenReturn(mAppOpsManager);
+ when(mInjector.isHidlDisabled(any())).thenReturn(false);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
index 94cc666..35c37ef 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java
@@ -25,6 +25,7 @@
import android.content.Context;
import android.hardware.biometrics.common.CommonProps;
import android.hardware.biometrics.fingerprint.IFingerprint;
+import android.hardware.biometrics.fingerprint.SensorLocation;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
@@ -33,7 +34,6 @@
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.HalClientMonitor;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -77,9 +77,11 @@
final SensorProps sensor1 = new SensorProps();
sensor1.commonProps = new CommonProps();
sensor1.commonProps.sensorId = 0;
+ sensor1.sensorLocations = new SensorLocation[] {new SensorLocation()};
final SensorProps sensor2 = new SensorProps();
sensor2.commonProps = new CommonProps();
sensor2.commonProps.sensorId = 1;
+ sensor2.sensorLocations = new SensorLocation[] {new SensorLocation()};
mSensorProps = new SensorProps[] {sensor1, sensor2};
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index 100d3ea..f5876fa 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -33,12 +33,6 @@
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
-import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
-import static android.net.NetworkPolicyManager.RULE_NONE;
-import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
-import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
-import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
import static android.net.NetworkPolicyManager.uidRulesToString;
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
@@ -49,7 +43,6 @@
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifi;
import static android.net.TrafficStats.MB_IN_BYTES;
-import static android.os.Process.SYSTEM_UID;
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
@@ -141,7 +134,6 @@
import android.util.ArrayMap;
import android.util.DataUnit;
import android.util.Log;
-import android.util.Pair;
import android.util.Range;
import android.util.RecurrenceRule;
@@ -1844,68 +1836,6 @@
reset(mStatsService);
}
- /**
- * Exhaustively test checkUidNetworkingBlocked to output the expected results based on external
- * conditions.
- */
- @Test
- public void testCheckUidNetworkingBlocked() {
- final ArrayList<Pair<Boolean, Integer>> expectedBlockedStates = new ArrayList<>();
-
- // Metered network. Data saver on.
- expectedBlockedStates.add(new Pair<>(true, RULE_NONE));
- expectedBlockedStates.add(new Pair<>(false, RULE_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_TEMPORARY_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(true, RULE_REJECT_METERED));
- expectedBlockedStates.add(new Pair<>(true, RULE_ALLOW_ALL));
- expectedBlockedStates.add(new Pair<>(true, RULE_REJECT_ALL));
- verifyNetworkBlockedState(
- true /* metered */, true /* backgroundRestricted */, expectedBlockedStates);
- expectedBlockedStates.clear();
-
- // Metered network. Data saver off.
- expectedBlockedStates.add(new Pair<>(false, RULE_NONE));
- expectedBlockedStates.add(new Pair<>(false, RULE_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_TEMPORARY_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(true, RULE_REJECT_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_ALLOW_ALL));
- expectedBlockedStates.add(new Pair<>(true, RULE_REJECT_ALL));
- verifyNetworkBlockedState(
- true /* metered */, false /* backgroundRestricted */, expectedBlockedStates);
- expectedBlockedStates.clear();
-
- // Non-metered network. Data saver on.
- expectedBlockedStates.add(new Pair<>(false, RULE_NONE));
- expectedBlockedStates.add(new Pair<>(false, RULE_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_TEMPORARY_ALLOW_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_REJECT_METERED));
- expectedBlockedStates.add(new Pair<>(false, RULE_ALLOW_ALL));
- expectedBlockedStates.add(new Pair<>(true, RULE_REJECT_ALL));
- verifyNetworkBlockedState(
- false /* metered */, true /* backgroundRestricted */, expectedBlockedStates);
-
- // Non-metered network. Data saver off. The result is the same as previous case since
- // the network is blocked only for RULE_REJECT_ALL regardless of data saver.
- verifyNetworkBlockedState(
- false /* metered */, false /* backgroundRestricted */, expectedBlockedStates);
- expectedBlockedStates.clear();
- }
-
- private void verifyNetworkBlockedState(boolean metered, boolean backgroundRestricted,
- ArrayList<Pair<Boolean, Integer>> expectedBlockedStateForRules) {
-
- for (Pair<Boolean, Integer> pair : expectedBlockedStateForRules) {
- final boolean expectedResult = pair.first;
- final int rule = pair.second;
- assertEquals(formatBlockedStateError(UID_A, rule, metered, backgroundRestricted),
- expectedResult, mService.checkUidNetworkingBlocked(UID_A, rule,
- metered, backgroundRestricted));
- assertFalse(formatBlockedStateError(SYSTEM_UID, rule, metered, backgroundRestricted),
- mService.checkUidNetworkingBlocked(SYSTEM_UID, rule, metered,
- backgroundRestricted));
- }
- }
-
private void enableRestrictedMode(boolean enable) throws Exception {
mService.mRestrictedNetworkingMode = enable;
mService.updateRestrictedModeAllowlistUL();
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 88b0651..589b3b4 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -2041,11 +2041,6 @@
return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
}
- protected void updatePackageShortcut(String packageName, String shortcutId, int userId,
- Consumer<ShortcutInfo> cb) {
- mService.updatePackageShortcutForTest(packageName, shortcutId, userId, cb);
- }
-
protected void assertShortcutExists(String packageName, String shortcutId, int userId) {
assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
}
@@ -2241,10 +2236,6 @@
return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
}
- protected void updateCallerShortcut(String shortcutId, Consumer<ShortcutInfo> cb) {
- updatePackageShortcut(getCallingPackage(), shortcutId, getCallingUserId(), cb);
- }
-
protected List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
final List<ShortcutInfo>[] ret = new List[1];
runWithCaller(launcher, userId, () -> {
@@ -2404,8 +2395,6 @@
deleteAllSavedFiles();
- mMockAppSearchManager.removeShortcuts();
-
initService();
mService.applyRestore(payload, USER_0);
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 3f680e6..4d0beef 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -1385,7 +1385,6 @@
mService.waitForBitmapSavesForTest();
assertWith(getCallerShortcuts())
.forShortcutWithId("s1", si -> {
- Log.d("ShortcutManagerTest1", si.toString());
assertTrue(si.hasIconFile());
});
@@ -1703,8 +1702,8 @@
// Because setDynamicShortcuts will update the timestamps when ranks are changing,
// we explicitly set timestamps here.
- updateCallerShortcut("s1", si -> si.setTimestamp(5000));
- updateCallerShortcut("s2", si -> si.setTimestamp(1000));
+ getCallerShortcut("s1").setTimestamp(5000);
+ getCallerShortcut("s2").setTimestamp(1000);
setCaller(CALLING_PACKAGE_2);
final ShortcutInfo s2_2 = makeShortcut("s2");
@@ -1714,9 +1713,9 @@
makeComponent(ShortcutActivity.class));
assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
- updateCallerShortcut("s2", si -> si.setTimestamp(1500));
- updateCallerShortcut("s3", si -> si.setTimestamp(3000));
- updateCallerShortcut("s4", si -> si.setTimestamp(500));
+ getCallerShortcut("s2").setTimestamp(1500);
+ getCallerShortcut("s3").setTimestamp(3000);
+ getCallerShortcut("s4").setTimestamp(500);
setCaller(CALLING_PACKAGE_3);
final ShortcutInfo s3_2 = makeShortcutWithLocusId("s3", makeLocusId("l2"));
@@ -1724,7 +1723,7 @@
assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
- updateCallerShortcut("s3", si -> si.setTimestamp(START_TIME + 5000));
+ getCallerShortcut("s3").setTimestamp(START_TIME + 5000);
setCaller(LAUNCHER_1);
@@ -7687,7 +7686,7 @@
assertEquals("http://www/", si.getIntent().getData().toString());
assertEquals("foo/bar", si.getIntent().getType());
assertEquals(
- new ComponentName("abc", "abc.xyz"), si.getIntent().getComponent());
+ new ComponentName("abc", ".xyz"), si.getIntent().getComponent());
assertEquals(set("cat1", "cat2"), si.getIntent().getCategories());
assertEquals("value1", si.getIntent().getStringExtra("key1"));
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
index a37d5c8..9433bf2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
@@ -31,6 +31,7 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.graphics.Color;
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
@@ -193,7 +194,7 @@
Notification n11 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_MESSAGE)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.build();
mRecordCheaterColorized = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "cheater", uid2, uid2, n11, new UserHandle(userId),
@@ -202,7 +203,7 @@
Notification n12 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_MESSAGE)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.setStyle(new Notification.MediaStyle())
.build();
mNoMediaSessionMedia = new NotificationRecord(mContext, new StatusBarNotification(
@@ -212,7 +213,7 @@
Notification n13 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true)
- .setColorized(true /* colorized */)
+ .setColorized(true).setColor(Color.WHITE)
.build();
mRecordColorized = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "colorized", uid2, uid2, n13,
@@ -221,7 +222,7 @@
Notification n14 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_CALL)
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true)
.build();
mRecordColorizedCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
index f6d6624..809b6d5 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
@@ -350,6 +350,52 @@
}
@Test
+ public void testRemoveChannelRunnable() throws Exception {
+ NotificationHistory nh = mock(NotificationHistory.class);
+ NotificationHistoryDatabase.RemoveChannelRunnable rcr =
+ mDataBase.new RemoveChannelRunnable("pkg", "channel");
+ rcr.setNotificationHistory(nh);
+
+ AtomicFile af = mock(AtomicFile.class);
+ when(af.getBaseFile()).thenReturn(new File(mRootDir, "af"));
+ mDataBase.mHistoryFiles.addLast(af);
+
+ when(nh.removeChannelFromWrite("pkg", "channel")).thenReturn(true);
+
+ mDataBase.mBuffer = mock(NotificationHistory.class);
+
+ rcr.run();
+
+ verify(mDataBase.mBuffer).removeChannelFromWrite("pkg", "channel");
+ verify(af).openRead();
+ verify(nh).removeChannelFromWrite("pkg", "channel");
+ verify(af).startWrite();
+ }
+
+ @Test
+ public void testRemoveChannelRunnable_noChanges() throws Exception {
+ NotificationHistory nh = mock(NotificationHistory.class);
+ NotificationHistoryDatabase.RemoveChannelRunnable rcr =
+ mDataBase.new RemoveChannelRunnable("pkg", "channel");
+ rcr.setNotificationHistory(nh);
+
+ AtomicFile af = mock(AtomicFile.class);
+ when(af.getBaseFile()).thenReturn(new File(mRootDir, "af"));
+ mDataBase.mHistoryFiles.addLast(af);
+
+ when(nh.removeChannelFromWrite("pkg", "channel")).thenReturn(false);
+
+ mDataBase.mBuffer = mock(NotificationHistory.class);
+
+ rcr.run();
+
+ verify(mDataBase.mBuffer).removeChannelFromWrite("pkg", "channel");
+ verify(af).openRead();
+ verify(nh).removeChannelFromWrite("pkg", "channel");
+ verify(af, never()).startWrite();
+ }
+
+ @Test
public void testWriteBufferRunnable() throws Exception {
NotificationHistory nh = mock(NotificationHistory.class);
when(nh.getPooledStringsToWrite()).thenReturn(new String[]{});
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryManagerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryManagerTest.java
index a0293b7..5892793 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryManagerTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryManagerTest.java
@@ -366,7 +366,7 @@
@Test
public void testDeleteConversation_userUnlocked() {
String pkg = "pkg";
- Set<String> convos = Set.of("convo", "another");
+ Set<String> convos = Set.of("convo", "another");
NotificationHistoryDatabase userHistory = mock(NotificationHistoryDatabase.class);
mHistoryManager.onUserUnlocked(USER_SYSTEM);
@@ -378,6 +378,20 @@
}
@Test
+ public void testDeleteNotificationChannel_userUnlocked() {
+ String pkg = "pkg";
+ String channelId = "channelId";
+ NotificationHistoryDatabase userHistory = mock(NotificationHistoryDatabase.class);
+
+ mHistoryManager.onUserUnlocked(USER_SYSTEM);
+ mHistoryManager.replaceNotificationHistoryDatabase(USER_SYSTEM, userHistory);
+
+ mHistoryManager.deleteNotificationChannel(pkg, 1, channelId);
+
+ verify(userHistory, times(1)).deleteNotificationChannel(pkg, channelId);
+ }
+
+ @Test
public void testTriggerWriteToDisk() {
NotificationHistoryDatabase userHistorySystem = mock(NotificationHistoryDatabase.class);
NotificationHistoryDatabase userHistoryAll = mock(NotificationHistoryDatabase.class);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index b24e788..c8c8c82 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -56,6 +56,9 @@
import static android.service.notification.Adjustment.KEY_IMPORTANCE;
import static android.service.notification.Adjustment.KEY_USER_SENTIMENT;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING;
+import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS;
+import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING;
+import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_SILENT;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
@@ -124,6 +127,7 @@
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.UserInfo;
+import android.content.pm.VersionedPackage;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Icon;
@@ -189,6 +193,8 @@
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
+import com.google.common.collect.ImmutableList;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -3284,7 +3290,7 @@
Notification.Builder nb = new Notification.Builder(mContext,
mTestNotificationChannel.getId())
.setContentTitle("foo")
- .setColorized(true)
+ .setColorized(true).setColor(Color.WHITE)
.setFlag(Notification.FLAG_CAN_COLORIZE, true)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
@@ -7585,4 +7591,106 @@
mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), r.getSbn().getId(),
r.getSbn().getTag(), r,false);
}
+
+ @Test
+ public void testMigrateNotificationFilter_migrationAllAllowed() throws Exception {
+ int uid = 9000;
+ int[] userIds = new int[] {UserHandle.getUserId(mUid), 1000};
+ when(mUm.getProfileIds(anyInt(), anyBoolean())).thenReturn(userIds);
+ List<String> disallowedApps = ImmutableList.of("apples", "bananas", "cherries");
+ for (int userId : userIds) {
+ for (String pkg : disallowedApps) {
+ when(mPackageManager.getPackageUid(pkg, 0, userId)).thenReturn(uid++);
+ }
+ }
+
+ when(mListeners.getNotificationListenerFilter(any())).thenReturn(
+ new NotificationListenerFilter());
+
+ mBinderService.migrateNotificationFilter(null,
+ FLAG_FILTER_TYPE_CONVERSATIONS | FLAG_FILTER_TYPE_ONGOING,
+ disallowedApps);
+
+ ArgumentCaptor<NotificationListenerFilter> captor =
+ ArgumentCaptor.forClass(NotificationListenerFilter.class);
+ verify(mListeners).setNotificationListenerFilter(any(), captor.capture());
+
+ assertEquals(FLAG_FILTER_TYPE_CONVERSATIONS | FLAG_FILTER_TYPE_ONGOING,
+ captor.getValue().getTypes());
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 9000)));
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("cherries", 9002)));
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 9003)));
+
+ // hypothetical other user untouched
+ assertTrue(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 10000)));
+ }
+
+ @Test
+ public void testMigrateNotificationFilter_noPreexistingFilter() throws Exception {
+ int[] userIds = new int[] {UserHandle.getUserId(mUid)};
+ when(mUm.getProfileIds(anyInt(), anyBoolean())).thenReturn(userIds);
+ List<String> disallowedApps = ImmutableList.of("apples");
+ when(mPackageManager.getPackageUid("apples", 0, UserHandle.getUserId(mUid)))
+ .thenReturn(1001);
+
+ when(mListeners.getNotificationListenerFilter(any())).thenReturn(null);
+
+ mBinderService.migrateNotificationFilter(null, FLAG_FILTER_TYPE_ONGOING,
+ disallowedApps);
+
+ ArgumentCaptor<NotificationListenerFilter> captor =
+ ArgumentCaptor.forClass(NotificationListenerFilter.class);
+ verify(mListeners).setNotificationListenerFilter(any(), captor.capture());
+
+ assertEquals(FLAG_FILTER_TYPE_ONGOING, captor.getValue().getTypes());
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 1001)));
+ }
+
+ @Test
+ public void testMigrateNotificationFilter_existingTypeFilter() throws Exception {
+ int[] userIds = new int[] {UserHandle.getUserId(mUid)};
+ when(mUm.getProfileIds(anyInt(), anyBoolean())).thenReturn(userIds);
+ List<String> disallowedApps = ImmutableList.of("apples");
+ when(mPackageManager.getPackageUid("apples", 0, UserHandle.getUserId(mUid)))
+ .thenReturn(1001);
+
+ when(mListeners.getNotificationListenerFilter(any())).thenReturn(
+ new NotificationListenerFilter(FLAG_FILTER_TYPE_CONVERSATIONS, new ArraySet<>()));
+
+ mBinderService.migrateNotificationFilter(null, FLAG_FILTER_TYPE_ONGOING,
+ disallowedApps);
+
+ ArgumentCaptor<NotificationListenerFilter> captor =
+ ArgumentCaptor.forClass(NotificationListenerFilter.class);
+ verify(mListeners).setNotificationListenerFilter(any(), captor.capture());
+
+ // type isn't saved but pkg list is
+ assertEquals(FLAG_FILTER_TYPE_CONVERSATIONS, captor.getValue().getTypes());
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 1001)));
+ }
+
+ @Test
+ public void testMigrateNotificationFilter_existingPkgFilter() throws Exception {
+ int[] userIds = new int[] {UserHandle.getUserId(mUid)};
+ when(mUm.getProfileIds(anyInt(), anyBoolean())).thenReturn(userIds);
+ List<String> disallowedApps = ImmutableList.of("apples");
+ when(mPackageManager.getPackageUid("apples", 0, UserHandle.getUserId(mUid)))
+ .thenReturn(1001);
+
+ NotificationListenerFilter preexisting = new NotificationListenerFilter();
+ preexisting.addPackage(new VersionedPackage("test", 1002));
+ when(mListeners.getNotificationListenerFilter(any())).thenReturn(preexisting);
+
+ mBinderService.migrateNotificationFilter(null, FLAG_FILTER_TYPE_ONGOING,
+ disallowedApps);
+
+ ArgumentCaptor<NotificationListenerFilter> captor =
+ ArgumentCaptor.forClass(NotificationListenerFilter.class);
+ verify(mListeners).setNotificationListenerFilter(any(), captor.capture());
+
+ // type is saved but pkg list isn't
+ assertEquals(FLAG_FILTER_TYPE_ONGOING, captor.getValue().getTypes());
+ assertTrue(captor.getValue().isPackageAllowed(new VersionedPackage("apples", 1001)));
+ assertFalse(captor.getValue().isPackageAllowed(new VersionedPackage("test", 1002)));
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
index 402fd22..004e45a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
@@ -66,8 +66,14 @@
public void landscape() {
final DisplayInfo di = displayInfoForRotation(ROTATION_90, false /* withCutout */);
- verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
- verifyNonDecorInsets(di, 0, 0, NAV_BAR_HEIGHT, 0);
+ if (mDisplayPolicy.navigationBarCanMove()) {
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
+ verifyNonDecorInsets(di, 0, 0, NAV_BAR_HEIGHT, 0);
+ } else {
+ // if the navigation bar cannot move then it is always on the bottom
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT);
+ }
verifyConsistency(di);
}
@@ -75,8 +81,14 @@
public void landscape_withCutout() {
final DisplayInfo di = displayInfoForRotation(ROTATION_90, true /* withCutout */);
- verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
- verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT, 0);
+ if (mDisplayPolicy.navigationBarCanMove()) {
+ verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
+ verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT, 0);
+ } else {
+ // if the navigation bar cannot move then it is always on the bottom
+ verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, 0, NAV_BAR_HEIGHT);
+ }
verifyConsistency(di);
}
@@ -84,8 +96,14 @@
public void seascape() {
final DisplayInfo di = displayInfoForRotation(ROTATION_270, false /* withCutout */);
- verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0);
- verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, 0, 0);
+ if (mDisplayPolicy.navigationBarCanMove()) {
+ verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0);
+ verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, 0, 0);
+ } else {
+ // if the navigation bar cannot move then it is always on the bottom
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT);
+ }
verifyConsistency(di);
}
@@ -93,8 +111,14 @@
public void seascape_withCutout() {
final DisplayInfo di = displayInfoForRotation(ROTATION_270, true /* withCutout */);
- verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0);
- verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, DISPLAY_CUTOUT_HEIGHT, 0);
+ if (mDisplayPolicy.navigationBarCanMove()) {
+ verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0);
+ verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, DISPLAY_CUTOUT_HEIGHT, 0);
+ } else {
+ // if the navigation bar cannot move then it is always on the bottom
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, DISPLAY_CUTOUT_HEIGHT, NAV_BAR_HEIGHT);
+ }
verifyConsistency(di);
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index 16d83d1..a3b5fc7 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -470,7 +470,7 @@
ModelData modelData = getKeyphraseModelDataLocked(keyphraseId);
if (modelData == null || !modelData.isKeyphraseModel()) {
- Slog.e(TAG, "No model exists for given keyphrase Id " + keyphraseId);
+ Slog.w(TAG, "No model exists for given keyphrase Id " + keyphraseId);
return STATUS_ERROR;
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index a9300f3d..eac21b4 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -142,7 +142,7 @@
}
if (stat.mIsStarted) {
- Slog.e(TAG, "error onStart(): Model " + id + " already started");
+ Slog.w(TAG, "error onStart(): Model " + id + " already started");
return;
}
@@ -154,12 +154,12 @@
public synchronized void onStop(UUID id) {
SoundModelStat stat = mModelStats.get(id);
if (stat == null) {
- Slog.e(TAG, "error onStop(): Model " + id + " has no stats available");
+ Slog.w(TAG, "error onStop(): Model " + id + " has no stats available");
return;
}
if (!stat.mIsStarted) {
- Slog.e(TAG, "error onStop(): Model " + id + " already stopped");
+ Slog.w(TAG, "error onStop(): Model " + id + " already stopped");
return;
}
@@ -314,7 +314,7 @@
GenericSoundModel model = getSoundModel(parcelUuid);
if (model == null) {
- Slog.e(TAG, "Null model in database for id: " + parcelUuid);
+ Slog.w(TAG, "Null model in database for id: " + parcelUuid);
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"startRecognition(): Null model in database for id: " + parcelUuid));
@@ -409,7 +409,7 @@
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
if (soundModel == null || soundModel.getUuid() == null) {
- Slog.e(TAG, "Invalid sound model");
+ Slog.w(TAG, "Invalid sound model");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"loadGenericSoundModel(): Invalid sound model"));
@@ -445,7 +445,7 @@
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
if (soundModel == null || soundModel.getUuid() == null) {
- Slog.e(TAG, "Invalid sound model");
+ Slog.w(TAG, "Invalid sound model");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"loadKeyphraseSoundModel(): Invalid sound model"));
@@ -453,7 +453,7 @@
return STATUS_ERROR;
}
if (soundModel.getKeyphrases() == null || soundModel.getKeyphrases().length != 1) {
- Slog.e(TAG, "Only one keyphrase per model is currently supported.");
+ Slog.w(TAG, "Only one keyphrase per model is currently supported.");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"loadKeyphraseSoundModel(): Only one keyphrase per model"
@@ -513,7 +513,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"startRecognitionForService():" + soundModelId + " is not loaded"));
@@ -525,7 +525,7 @@
existingCallback = mCallbacks.get(soundModelId.getUuid());
}
if (existingCallback != null) {
- Slog.e(TAG, soundModelId + " is already running");
+ Slog.w(TAG, soundModelId + " is already running");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"startRecognitionForService():"
@@ -580,7 +580,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"stopRecognitionForService(): " + soundModelId
@@ -593,7 +593,7 @@
callback = mCallbacks.get(soundModelId.getUuid());
}
if (callback == null) {
- Slog.e(TAG, soundModelId + " is not running");
+ Slog.w(TAG, soundModelId + " is not running");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"stopRecognitionForService(): " + soundModelId
@@ -648,7 +648,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"unloadSoundModel(): " + soundModelId + " is not loaded"));
@@ -715,7 +715,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent("getModelState(): "
+ soundModelId + " is not loaded"));
@@ -777,7 +777,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded. Loaded models: "
+ Slog.w(TAG, soundModelId + " is not loaded. Loaded models: "
+ mLoadedModels.toString());
sEventLogger.log(new SoundTriggerLogger.StringEvent("setParameter(): "
@@ -810,7 +810,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent("getParameter(): "
+ soundModelId + " is not loaded"));
@@ -841,7 +841,7 @@
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
- Slog.e(TAG, soundModelId + " is not loaded");
+ Slog.w(TAG, soundModelId + " is not loaded");
sEventLogger.log(new SoundTriggerLogger.StringEvent(
"queryParameter(): "
diff --git a/telecomm/java/Android.bp b/telecomm/java/Android.bp
index bac7228..3bd5953 100644
--- a/telecomm/java/Android.bp
+++ b/telecomm/java/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-telecomm-sources",
srcs: [
diff --git a/telephony/common/Android.bp b/telephony/common/Android.bp
index 9572c69..201ab53 100644
--- a/telephony/common/Android.bp
+++ b/telephony/common/Android.bp
@@ -1,3 +1,12 @@
+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"],
+}
+
filegroup {
name: "framework-telephony-common-sources",
srcs: [
diff --git a/telephony/java/Android.bp b/telephony/java/Android.bp
index 1bd5827..3941b30 100644
--- a/telephony/java/Android.bp
+++ b/telephony/java/Android.bp
@@ -1,3 +1,13 @@
+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
+ // SPDX-license-identifier-BSD
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
filegroup {
name: "framework-telephony-sources",
srcs: [
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 1cc9c6f..234cc4d 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -5467,7 +5467,7 @@
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY,
new String[0]);
sDefaults.putStringArray(KEY_APN_PRIORITY_STRING_ARRAY, new String[] {
- "default:0", "enterprise:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2",
+ "enterprise:0", "default:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2",
"ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3"
});
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]);
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 6441565..4004e37 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -151,13 +151,14 @@
/**
* The access rules for this subscription, if it is embedded and defines any.
+ * This does not include access rules for non-embedded subscriptions.
*/
@Nullable
private UiccAccessRule[] mNativeAccessRules;
/**
* The carrier certificates for this subscription that are saved in carrier configs.
- * The other carrier certificates are embedded on Uicc and stored as part of mNativeAccessRules.
+ * This does not include access rules from the Uicc, whether embedded or non-embedded.
*/
@Nullable
private UiccAccessRule[] mCarrierConfigAccessRules;
@@ -664,7 +665,6 @@
* is authorized to manage this subscription.
* TODO and fix it properly in R / master: either deprecate this and have 3 APIs
* native + carrier + all, or have this return all by default.
- * @throws UnsupportedOperationException if this subscription is not embedded.
* @hide
*/
@SystemApi
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 67fe783..7b760ae 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2867,6 +2867,10 @@
* Checks whether the app with the given context is authorized to manage the given subscription
* according to its metadata.
*
+ * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns
+ * true). To check for permissions for non-embedded subscription as well,
+ * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}.
+ *
* @param info The subscription to check.
* @return whether the app is authorized to manage this subscription per its metadata.
*/
@@ -2879,6 +2883,10 @@
* be authorized if it is included in the {@link android.telephony.UiccAccessRule} of the
* {@link android.telephony.SubscriptionInfo} with the access status.
*
+ * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns
+ * true). To check for permissions for non-embedded subscription as well,
+ * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}.
+ *
* @param info The subscription to check.
* @param packageName Package name of the app to check.
* @return whether the app is authorized to manage this subscription per its access rules.
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 5b68be5..75c8031 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -8968,6 +8968,9 @@
* call will return true. This access is granted by the owner of the UICC
* card and does not depend on the registered carrier.
*
+ * Note that this API applies to both physical and embedded subscriptions and
+ * is a superset of the checks done in SubscriptionManager#canManageSubscription.
+ *
* @return true if the app has carrier privileges.
*/
public boolean hasCarrierPrivileges() {
@@ -8981,6 +8984,9 @@
* call will return true. This access is granted by the owner of the UICC
* card and does not depend on the registered carrier.
*
+ * Note that this API applies to both physical and embedded subscriptions and
+ * is a superset of the checks done in SubscriptionManager#canManageSubscription.
+ *
* @param subId The subscription to use.
* @return true if the app has carrier privileges.
* @hide
diff --git a/telephony/java/android/telephony/ims/SipMessage.java b/telephony/java/android/telephony/ims/SipMessage.java
index ad6d73c..b529563 100644
--- a/telephony/java/android/telephony/ims/SipMessage.java
+++ b/telephony/java/android/telephony/ims/SipMessage.java
@@ -24,6 +24,7 @@
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import com.android.internal.telephony.SipMessageParsingUtils;
@@ -60,14 +61,19 @@
*/
public SipMessage(@NonNull String startLine, @NonNull String headerSection,
@NonNull byte[] content) {
- if (startLine == null || headerSection == null || content == null) {
- throw new IllegalArgumentException("One or more null parameters entered");
- }
+ Objects.requireNonNull(startLine, "Required parameter is null: startLine");
+ Objects.requireNonNull(headerSection, "Required parameter is null: headerSection");
+ Objects.requireNonNull(content, "Required parameter is null: content");
+
mStartLine = startLine;
mHeaderSection = headerSection;
mContent = content;
mViaBranchParam = SipMessageParsingUtils.getTransactionId(mHeaderSection);
+ if (TextUtils.isEmpty(mViaBranchParam)) {
+ throw new IllegalArgumentException("header section MUST contain a branch parameter "
+ + "inside of the Via header.");
+ }
mCallIdParam = SipMessageParsingUtils.getCallId(mHeaderSection);
}
@@ -107,11 +113,9 @@
/**
* @return the branch parameter enclosed in the Via header key's value. See RFC 3261 section
- * 20.42 for more information on the Via header. If {@code null}, then there was either no
- * Via parameter found in this SIP message's headers or no branch parameter found in the
- * Via header.
+ * 20.42 for more information on the Via header.
*/
- public @Nullable String getViaBranchParameter() {
+ public @NonNull String getViaBranchParameter() {
return mViaBranchParam;
}
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
index 739946b..5c9ec53 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
@@ -28,8 +28,6 @@
import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.SipMessage;
import android.telephony.ims.stub.SipDelegate;
-import android.text.TextUtils;
-import android.util.Log;
import java.util.ArrayList;
import java.util.Set;
@@ -187,11 +185,6 @@
private void notifyLocalMessageFailedToBeReceived(SipMessage m, int reason) {
String transactionId = m.getViaBranchParameter();
- if (TextUtils.isEmpty(transactionId)) {
- Log.w(LOG_TAG, "failure to parse SipMessage.");
- throw new IllegalArgumentException("Malformed SipMessage, can not determine "
- + "transaction ID.");
- }
SipDelegate d = mDelegate;
if (d != null) {
mExecutor.execute(() -> d.notifyMessageReceiveError(transactionId, reason));
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
index 3cd2726..ad02fe5 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
@@ -28,7 +28,6 @@
import android.telephony.ims.stub.DelegateConnectionMessageCallback;
import android.telephony.ims.stub.DelegateConnectionStateCallback;
import android.telephony.ims.stub.SipDelegate;
-import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -267,12 +266,6 @@
private void notifyLocalMessageFailedToSend(SipMessage m, int reason) {
String transactionId = m.getViaBranchParameter();
- if (TextUtils.isEmpty(transactionId)) {
- Log.w(LOG_TAG, "sendMessage detected a malformed SipMessage and can not get a "
- + "transaction ID.");
- throw new IllegalArgumentException("Could not send SipMessage due to malformed header");
- }
- mExecutor.execute(() ->
- mMessageCallback.onMessageSendFailure(transactionId, reason));
+ mExecutor.execute(() -> mMessageCallback.onMessageSendFailure(transactionId, reason));
}
}
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 541292a..1e5d598 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -130,4 +130,5 @@
public static final String RAT_NAME_LTE = "LTE";
public static final String RAT_NAME_NR_NSA = "NR_NSA";
public static final String RAT_NAME_NR_NSA_MMWAVE = "NR_NSA_MMWAVE";
+ public static final String RAT_NAME_NR_SA_MMWAVE = "NR_MMWAVE";
}
diff --git a/tests/ActivityManagerPerfTests/tests/Android.bp b/tests/ActivityManagerPerfTests/tests/Android.bp
index c8dbf81..e5813ae 100644
--- a/tests/ActivityManagerPerfTests/tests/Android.bp
+++ b/tests/ActivityManagerPerfTests/tests/Android.bp
@@ -28,6 +28,7 @@
"androidx.test.rules",
"apct-perftests-utils",
"ActivityManagerPerfTestsUtils",
+ "collector-device-lib-platform",
],
platform_apis: true,
min_sdk_version: "25",
diff --git a/tests/ActivityManagerPerfTests/tests/AndroidTest.xml b/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
index 475bb82..e753b70 100644
--- a/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
+++ b/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
@@ -28,5 +28,22 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.frameworks.perftests.amtests"/>
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
+
+ <!-- TODO: Add PerfettoListener to automatically capture perfetto traces for each test-->
+ <!-- Listener related args for collecting the traces and waiting for the device
+ to stabilize. -->
+ <option name="device-listeners"
+ value="android.device.collectors.ProcLoadListener" />
+ <!-- Guarantee that user defined RunListeners will be running before any of the default
+ listeners defined in this runner. -->
+ <option name="instrumentation-arg" key="newRunListenerMode" value="true" />
+
+ <!-- ProcLoadListener related arguments -->
+ <!-- Wait for device last minute threshold to reach 3 with 2 minute timeout before
+ starting the test run -->
+ <option name="instrumentation-arg" key="procload-collector:per_run" value="true" />
+ <option name="instrumentation-arg" key="proc-loadavg-threshold" value="3" />
+ <option name="instrumentation-arg" key="proc-loadavg-timeout" value="120000" />
+ <option name="instrumentation-arg" key="proc-loadavg-interval" value="10000" />
</test>
</configuration>
diff --git a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
index df58da5..039ba51 100644
--- a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
+++ b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
@@ -117,6 +117,7 @@
uiAutomation.adoptShellPermissionIdentity(
Manifest.permission.LOG_COMPAT_CHANGE,
Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG,
+ Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD,
Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
}
}
diff --git a/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt b/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt
index 5c26448..b41ee3a 100644
--- a/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt
+++ b/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt
@@ -19,7 +19,11 @@
import android.content.Context
import android.content.pm.ActivityInfo
import android.hardware.display.DisplayManager
+import android.os.IBinder
import android.util.AttributeSet
+import android.util.Log
+import android.view.SurfaceControl
+import android.view.SurfaceControlHdrLayerInfoListener
import android.view.Window
import android.widget.Button
import android.widget.LinearLayout
@@ -35,6 +39,7 @@
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
displayManager = context.getSystemService(DisplayManager::class.java)!!
displayId = context.getDisplayId()
+ displayToken = SurfaceControl.getInternalDisplayToken()
}
private var window: Window? = null
@@ -42,6 +47,7 @@
private val displayManager: DisplayManager
private var targetSdrWhitePointIndex = 0
private var displayId: Int
+ private var displayToken: IBinder
private val whitePoint get() = SDR_WHITE_POINTS[targetSdrWhitePointIndex]
@@ -109,6 +115,7 @@
// Imperfect, but close enough, synchronization by waiting for frame commit to set the value
viewTreeObserver.registerFrameCommitCallback {
try {
+ SurfaceControl.setDisplayBrightness(displayToken, level)
displayManager.setTemporaryBrightness(displayId, level)
} catch (ex: Exception) {
// Ignore a permission denied rejection - it doesn't meaningfully change much
@@ -116,9 +123,28 @@
}
}
+ private val listener = object : SurfaceControlHdrLayerInfoListener() {
+ override fun onHdrInfoChanged(
+ displayToken: IBinder?,
+ numberOfHdrLayers: Int,
+ maxW: Int,
+ maxH: Int,
+ flags: Int
+ ) {
+ Log.d("HDRInfo", "onHdrInfoChanged: numLayer = $numberOfHdrLayers ($maxW x $maxH)" +
+ ", flags = $flags")
+ }
+ }
+
override fun onAttachedToWindow() {
super.onAttachedToWindow()
threadedRenderer?.setColorMode(window!!.colorMode, whitePoint)
+ listener.register(displayToken)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ listener.unregister(displayToken)
}
}
\ No newline at end of file
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index 429e676..ef324e7 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -25,27 +25,22 @@
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.content.Context;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Icon;
import android.media.AudioAttributes;
-import android.os.Bundle;
-import android.os.Vibrator;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.util.Log;
import android.net.Uri;
-import android.os.SystemClock;
-import android.widget.RemoteViews;
+import android.os.Bundle;
+import android.os.Handler;
import android.os.PowerManager;
-
-// private NM API
-import android.app.INotificationManager;
+import android.os.SystemClock;
+import android.os.Vibrator;
+import android.util.Log;
+import android.widget.RemoteViews;
import android.widget.Toast;
public class NotificationTestList extends TestActivity
@@ -185,6 +180,7 @@
.setContentTitle("default priority group 1")
.setGroup("group1")
.setOngoing(true)
+ .setColor(Color.WHITE)
.setColorized(true)
.build();
mNM.notify(6002, n);
diff --git a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java
index e7718b5..6d852bf 100644
--- a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java
@@ -48,6 +48,7 @@
import static com.android.modules.utils.build.SdkLevel.isAtLeastR;
import static com.android.modules.utils.build.SdkLevel.isAtLeastS;
+import static com.android.net.module.util.NetworkCapabilitiesUtils.TRANSPORT_USB;
import static com.android.testutils.MiscAsserts.assertEmpty;
import static com.android.testutils.MiscAsserts.assertThrows;
import static com.android.testutils.ParcelUtils.assertParcelSane;
@@ -959,6 +960,11 @@
assertNotEquals(512, nc.getLinkUpstreamBandwidthKbps());
}
+ private int getMaxTransport() {
+ if (!isAtLeastS() && MAX_TRANSPORT == TRANSPORT_USB) return MAX_TRANSPORT - 1;
+ return MAX_TRANSPORT;
+ }
+
@Test
public void testSignalStrength() {
final NetworkCapabilities nc = new NetworkCapabilities();
@@ -970,7 +976,7 @@
}
private void assertNoTransport(NetworkCapabilities nc) {
- for (int i = MIN_TRANSPORT; i <= MAX_TRANSPORT; i++) {
+ for (int i = MIN_TRANSPORT; i <= getMaxTransport(); i++) {
assertFalse(nc.hasTransport(i));
}
}
@@ -987,7 +993,7 @@
assertFalse(nc.hasTransport(i));
}
}
- for (int i = MAX_TRANSPORT; i > maxTransportType; i--) {
+ for (int i = getMaxTransport(); i > maxTransportType; i--) {
if (positiveSequence) {
assertFalse(nc.hasTransport(i));
} else {
@@ -1001,12 +1007,12 @@
final NetworkCapabilities nc = new NetworkCapabilities();
assertNoTransport(nc);
// Test adding multiple transport types.
- for (int i = MIN_TRANSPORT; i <= MAX_TRANSPORT; i++) {
+ for (int i = MIN_TRANSPORT; i <= getMaxTransport(); i++) {
nc.addTransportType(i);
checkCurrentTransportTypes(nc, i, true /* positiveSequence */);
}
// Test removing multiple transport types.
- for (int i = MIN_TRANSPORT; i <= MAX_TRANSPORT; i++) {
+ for (int i = MIN_TRANSPORT; i <= getMaxTransport(); i++) {
nc.removeTransportType(i);
checkCurrentTransportTypes(nc, i, false /* positiveSequence */);
}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 154e6f8..af7eb59 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -18,8 +18,12 @@
import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
+import static android.Manifest.permission.NETWORK_FACTORY;
import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.content.Intent.ACTION_PACKAGE_ADDED;
+import static android.content.Intent.ACTION_PACKAGE_REMOVED;
+import static android.content.Intent.ACTION_PACKAGE_REPLACED;
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.ACTION_USER_UNLOCKED;
@@ -577,6 +581,7 @@
final UserManager umMock = createContextAsUser(userHandle, 0 /* flags */)
.getSystemService(UserManager.class);
doReturn(value).when(umMock).isManagedProfile();
+ doReturn(value).when(mUserManager).isManagedProfile(eq(userHandle.getIdentifier()));
}
@Override
@@ -2781,10 +2786,14 @@
}
private void grantUsingBackgroundNetworksPermissionForUid(final int uid) throws Exception {
- final String myPackageName = mContext.getPackageName();
- when(mPackageManager.getPackageInfo(eq(myPackageName), eq(GET_PERMISSIONS)))
+ grantUsingBackgroundNetworksPermissionForUid(uid, mContext.getPackageName());
+ }
+
+ private void grantUsingBackgroundNetworksPermissionForUid(
+ final int uid, final String packageName) throws Exception {
+ when(mPackageManager.getPackageInfo(eq(packageName), eq(GET_PERMISSIONS)))
.thenReturn(buildPackageInfo(true, uid));
- mService.mPermissionMonitor.onPackageAdded(myPackageName, uid);
+ mService.mPermissionMonitor.onPackageAdded(packageName, uid);
}
@Test
@@ -8234,12 +8243,12 @@
assertExtraInfoFromCmPresent(mWiFiNetworkAgent);
b1 = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED);
+ b2 = expectConnectivityAction(TYPE_VPN, DetailedState.DISCONNECTED);
mWiFiNetworkAgent.disconnect();
callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
systemDefaultCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
b1.expectBroadcast();
callback.expectCapabilitiesThat(mMockVpn, nc -> !nc.hasTransport(TRANSPORT_WIFI));
- b2 = expectConnectivityAction(TYPE_VPN, DetailedState.DISCONNECTED);
mMockVpn.expectStopVpnRunnerPrivileged();
callback.expectCallback(CallbackEntry.LOST, mMockVpn);
b2.expectBroadcast();
@@ -10431,6 +10440,12 @@
.thenReturn(applicationInfo);
}
+ private void mockGetApplicationInfoThrowsNameNotFound(@NonNull final String packageName)
+ throws Exception {
+ when(mPackageManager.getApplicationInfo(eq(packageName), anyInt()))
+ .thenThrow(new PackageManager.NameNotFoundException(packageName));
+ }
+
private void mockHasSystemFeature(@NonNull final String featureName,
@NonNull final boolean hasFeature) {
when(mPackageManager.hasSystemFeature(eq(featureName)))
@@ -10887,15 +10902,23 @@
@NonNull final UidRangeParcel[] uidRanges,
@NonNull final String testPackageName)
throws Exception {
- mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
-
// These tests work off a single UID therefore using 'start' is valid.
mockGetApplicationInfo(testPackageName, uidRanges[0].start);
+ setOemNetworkPreference(networkPrefToSetup, testPackageName);
+ }
+
+ private void setOemNetworkPreference(final int networkPrefToSetup,
+ @NonNull final String... testPackageNames)
+ throws Exception {
+ mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
+
// Build OemNetworkPreferences object
- final OemNetworkPreferences pref = new OemNetworkPreferences.Builder()
- .addNetworkPreference(testPackageName, networkPrefToSetup)
- .build();
+ final OemNetworkPreferences.Builder builder = new OemNetworkPreferences.Builder();
+ for (final String packageName : testPackageNames) {
+ builder.addNetworkPreference(packageName, networkPrefToSetup);
+ }
+ final OemNetworkPreferences pref = builder.build();
// Act on ConnectivityService.setOemNetworkPreference()
final TestOemListenerCallback oemPrefListener = new TestOemListenerCallback();
@@ -11494,8 +11517,7 @@
// Arrange PackageManager mocks
final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID);
final UidRangeParcel[] uidRangesSingleUser =
- toUidRangeStableParcels(
- uidRangesForUids(TEST_PACKAGE_UID));
+ toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID));
final UidRangeParcel[] uidRangesBothUsers =
toUidRangeStableParcels(
uidRangesForUids(TEST_PACKAGE_UID, secondUserTestPackageUid));
@@ -11542,6 +11564,84 @@
false /* shouldDestroyNetwork */);
}
+ @Test
+ public void testMultilayerForPackageChangesEvaluatesCorrectly()
+ throws Exception {
+ @OemNetworkPreferences.OemNetworkPreference final int networkPref =
+ OEM_NETWORK_PREFERENCE_OEM_PAID;
+ final String packageScheme = "package:";
+
+ // Arrange PackageManager mocks
+ final String packageToInstall = "package.to.install";
+ final int packageToInstallUid = 81387;
+ final UidRangeParcel[] uidRangesSinglePackage =
+ toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID));
+ mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID);
+ mockGetApplicationInfoThrowsNameNotFound(packageToInstall);
+ setOemNetworkPreference(networkPref, TEST_PACKAGE_NAME, packageToInstall);
+ grantUsingBackgroundNetworksPermissionForUid(Binder.getCallingUid(), packageToInstall);
+
+ // Verify the starting state. No networks should be connected.
+ verifySetOemNetworkPreferenceForPreference(uidRangesSinglePackage,
+ OEM_PREF_ANY_NET_ID, 0 /* times */,
+ OEM_PREF_ANY_NET_ID, 0 /* times */,
+ false /* shouldDestroyNetwork */);
+
+ // Test that we correctly add the expected values for installed packages.
+ setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true);
+ verifySetOemNetworkPreferenceForPreference(uidRangesSinglePackage,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ OEM_PREF_ANY_NET_ID, 0 /* times */,
+ false /* shouldDestroyNetwork */);
+
+ // Set the system to recognize the package to be installed
+ mockGetApplicationInfo(packageToInstall, packageToInstallUid);
+ final UidRangeParcel[] uidRangesAllPackages =
+ toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID, packageToInstallUid));
+
+ // Send a broadcast indicating a package was installed.
+ final Intent addedIntent = new Intent(ACTION_PACKAGE_ADDED);
+ addedIntent.setData(Uri.parse(packageScheme + packageToInstall));
+ processBroadcast(addedIntent);
+
+ // Test the single package is removed and the combined packages are added.
+ verifySetOemNetworkPreferenceForPreference(uidRangesAllPackages, uidRangesSinglePackage,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ false /* shouldDestroyNetwork */);
+
+ // Set the system to no longer recognize the package to be installed
+ mockGetApplicationInfoThrowsNameNotFound(packageToInstall);
+
+ // Send a broadcast indicating a package was removed.
+ final Intent removedIntent = new Intent(ACTION_PACKAGE_REMOVED);
+ removedIntent.setData(Uri.parse(packageScheme + packageToInstall));
+ processBroadcast(removedIntent);
+
+ // Test the combined packages are removed and the single package is added.
+ verifySetOemNetworkPreferenceForPreference(uidRangesSinglePackage, uidRangesAllPackages,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ false /* shouldDestroyNetwork */);
+
+ // Set the system to change the installed package's uid
+ final int replacedTestPackageUid = TEST_PACKAGE_UID + 1;
+ mockGetApplicationInfo(TEST_PACKAGE_NAME, replacedTestPackageUid);
+ final UidRangeParcel[] uidRangesReplacedPackage =
+ toUidRangeStableParcels(uidRangesForUids(replacedTestPackageUid));
+
+ // Send a broadcast indicating a package was replaced.
+ final Intent replacedIntent = new Intent(ACTION_PACKAGE_REPLACED);
+ replacedIntent.setData(Uri.parse(packageScheme + TEST_PACKAGE_NAME));
+ processBroadcast(replacedIntent);
+
+ // Test the original uid is removed and is replaced with the new uid.
+ verifySetOemNetworkPreferenceForPreference(uidRangesReplacedPackage, uidRangesSinglePackage,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ mCellNetworkAgent.getNetwork().netId, 1 /* times */,
+ false /* shouldDestroyNetwork */);
+ }
+
/**
* Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID in the following order:
* NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback
@@ -12474,4 +12574,68 @@
mCm.setProfileNetworkPreference(testHandle,
PROFILE_NETWORK_PREFERENCE_ENTERPRISE, null, null));
}
+
+ @Test
+ public void testSubIdsClearedWithoutNetworkFactoryPermission() throws Exception {
+ mServiceContext.setPermission(NETWORK_FACTORY, PERMISSION_DENIED);
+ final NetworkCapabilities nc = new NetworkCapabilities();
+ nc.setSubIds(Collections.singleton(Process.myUid()));
+
+ final NetworkCapabilities result =
+ mService.networkCapabilitiesRestrictedForCallerPermissions(
+ nc, Process.myPid(), Process.myUid());
+ assertTrue(result.getSubIds().isEmpty());
+ }
+
+ @Test
+ public void testSubIdsExistWithNetworkFactoryPermission() throws Exception {
+ mServiceContext.setPermission(NETWORK_FACTORY, PERMISSION_GRANTED);
+
+ final Set<Integer> subIds = Collections.singleton(Process.myUid());
+ final NetworkCapabilities nc = new NetworkCapabilities();
+ nc.setSubIds(subIds);
+
+ final NetworkCapabilities result =
+ mService.networkCapabilitiesRestrictedForCallerPermissions(
+ nc, Process.myPid(), Process.myUid());
+ assertEquals(subIds, result.getSubIds());
+ }
+
+ private NetworkRequest getRequestWithSubIds() {
+ return new NetworkRequest.Builder()
+ .setSubIds(Collections.singleton(Process.myUid()))
+ .build();
+ }
+
+ @Test
+ public void testNetworkRequestWithSubIdsWithNetworkFactoryPermission() throws Exception {
+ mServiceContext.setPermission(NETWORK_FACTORY, PERMISSION_GRANTED);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext, 0 /* requestCode */, new Intent("a"), FLAG_IMMUTABLE);
+ final NetworkCallback networkCallback1 = new NetworkCallback();
+ final NetworkCallback networkCallback2 = new NetworkCallback();
+
+ mCm.requestNetwork(getRequestWithSubIds(), networkCallback1);
+ mCm.requestNetwork(getRequestWithSubIds(), pendingIntent);
+ mCm.registerNetworkCallback(getRequestWithSubIds(), networkCallback2);
+
+ mCm.unregisterNetworkCallback(networkCallback1);
+ mCm.releaseNetworkRequest(pendingIntent);
+ mCm.unregisterNetworkCallback(networkCallback2);
+ }
+
+ @Test
+ public void testNetworkRequestWithSubIdsWithoutNetworkFactoryPermission() throws Exception {
+ mServiceContext.setPermission(NETWORK_FACTORY, PERMISSION_DENIED);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext, 0 /* requestCode */, new Intent("a"), FLAG_IMMUTABLE);
+
+ final Class<SecurityException> expected = SecurityException.class;
+ assertThrows(
+ expected, () -> mCm.requestNetwork(getRequestWithSubIds(), new NetworkCallback()));
+ assertThrows(expected, () -> mCm.requestNetwork(getRequestWithSubIds(), pendingIntent));
+ assertThrows(
+ expected,
+ () -> mCm.registerNetworkCallback(getRequestWithSubIds(), new NetworkCallback()));
+ }
}
diff --git a/tests/vcn/java/android/net/vcn/VcnConfigTest.java b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
index c1ef350..7ac51b7 100644
--- a/tests/vcn/java/android/net/vcn/VcnConfigTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
@@ -79,6 +79,18 @@
}
@Test
+ public void testBuilderRequiresUniqueGatewayConnectionNames() {
+ final VcnGatewayConnectionConfig config = VcnGatewayConnectionConfigTest.buildTestConfig();
+ try {
+ new VcnConfig.Builder(mContext)
+ .addGatewayConnectionConfig(config)
+ .addGatewayConnectionConfig(config);
+ fail("Expected exception due to duplicate gateway connection name");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ @Test
public void testBuilderAndGetters() {
final VcnConfig config = buildTestConfig(mContext);
diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
index 8a0c923..4ee4d61 100644
--- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.net.NetworkCapabilities;
@@ -61,13 +62,20 @@
public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG =
VcnControlPlaneIkeConfigTest.buildTestConfig();
+ public static final String GATEWAY_CONNECTION_NAME_PREFIX = "gatewayConnectionName-";
+ private static int sGatewayConnectionConfigCount = 0;
+
// Public for use in VcnGatewayConnectionTest
public static VcnGatewayConnectionConfig buildTestConfig() {
return buildTestConfigWithExposedCaps(EXPOSED_CAPS);
}
private static VcnGatewayConnectionConfig.Builder newBuilder() {
- return new VcnGatewayConnectionConfig.Builder(CONTROL_PLANE_CONFIG);
+ // Append a unique identifier to the name prefix to guarantee that all created
+ // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
+ return new VcnGatewayConnectionConfig.Builder(
+ GATEWAY_CONNECTION_NAME_PREFIX + sGatewayConnectionConfigCount++,
+ CONTROL_PLANE_CONFIG);
}
// Public for use in VcnGatewayConnectionTest
@@ -87,9 +95,23 @@
}
@Test
+ public void testBuilderRequiresNonNullGatewayConnectionName() {
+ try {
+ new VcnGatewayConnectionConfig.Builder(
+ null /* gatewayConnectionName */, CONTROL_PLANE_CONFIG)
+ .build();
+
+ fail("Expected exception due to invalid gateway connection name");
+ } catch (NullPointerException e) {
+ }
+ }
+
+ @Test
public void testBuilderRequiresNonNullControlPlaneConfig() {
try {
- new VcnGatewayConnectionConfig.Builder(null).build();
+ new VcnGatewayConnectionConfig.Builder(
+ GATEWAY_CONNECTION_NAME_PREFIX, null /* ctrlPlaneConfig */)
+ .build();
fail("Expected exception due to invalid control plane config");
} catch (NullPointerException e) {
@@ -139,6 +161,8 @@
public void testBuilderAndGetters() {
final VcnGatewayConnectionConfig config = buildTestConfig();
+ assertTrue(config.getGatewayConnectionName().startsWith(GATEWAY_CONNECTION_NAME_PREFIX));
+
int[] exposedCaps = config.getExposedCapabilities();
Arrays.sort(exposedCaps);
assertArrayEquals(EXPOSED_CAPS, exposedCaps);
diff --git a/tests/vcn/java/android/net/vcn/VcnManagerTest.java b/tests/vcn/java/android/net/vcn/VcnManagerTest.java
index 516c206..8461de6 100644
--- a/tests/vcn/java/android/net/vcn/VcnManagerTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnManagerTest.java
@@ -50,9 +50,7 @@
public class VcnManagerTest {
private static final ParcelUuid SUB_GROUP = new ParcelUuid(new UUID(0, 0));
- private static final int[] UNDERLYING_NETWORK_CAPABILITIES = {
- NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_INTERNET
- };
+ private static final String GATEWAY_CONNECTION_NAME = "gatewayConnectionName";
private static final Executor INLINE_EXECUTOR = Runnable::run;
private IVcnManagementService mMockVcnManagementService;
@@ -207,13 +205,13 @@
verify(mMockStatusCallback).onStatusChanged(VCN_STATUS_CODE_ACTIVE);
cbBinder.onGatewayConnectionError(
- UNDERLYING_NETWORK_CAPABILITIES,
+ GATEWAY_CONNECTION_NAME,
VcnManager.VCN_ERROR_CODE_NETWORK_ERROR,
UnknownHostException.class.getName(),
"exception_message");
verify(mMockStatusCallback)
.onGatewayConnectionError(
- eq(UNDERLYING_NETWORK_CAPABILITIES),
+ eq(GATEWAY_CONNECTION_NAME),
eq(VcnManager.VCN_ERROR_CODE_NETWORK_ERROR),
any(UnknownHostException.class));
}
diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
index c88b0c1..43e6676 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -16,9 +16,13 @@
package com.android.server;
+import static android.net.ConnectivityManager.NetworkCallback;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
@@ -53,8 +57,10 @@
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
+import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities.Transport;
+import android.net.NetworkRequest;
import android.net.TelephonyNetworkSpecifier;
import android.net.vcn.IVcnStatusCallback;
import android.net.vcn.IVcnUnderlyingNetworkPolicyListener;
@@ -256,6 +262,10 @@
verify(mConnMgr).registerNetworkProvider(any(VcnNetworkProvider.class));
verify(mSubscriptionTracker).register();
+ verify(mConnMgr)
+ .registerNetworkCallback(
+ eq(new NetworkRequest.Builder().clearCapabilities().build()),
+ any(NetworkCallback.class));
}
@Test
@@ -527,17 +537,6 @@
}
@Test
- public void testSetVcnConfigInSafeModeNotifiesStatusCallback() throws Exception {
- setupSubscriptionAndStartVcn(TEST_SUBSCRIPTION_ID, TEST_UUID_2, false /* isActive */);
- mVcnMgmtSvc.registerVcnStatusCallback(TEST_UUID_2, mMockStatusCallback, TEST_PACKAGE_NAME);
- verify(mMockStatusCallback).onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_SAFE_MODE);
-
- mVcnMgmtSvc.setVcnConfig(TEST_UUID_2, TEST_VCN_CONFIG, TEST_PACKAGE_NAME);
-
- verify(mMockStatusCallback).onVcnStatusChanged(VcnManager.VCN_STATUS_CODE_ACTIVE);
- }
-
- @Test
public void testClearVcnConfigRequiresNonSystemServer() throws Exception {
doReturn(Process.SYSTEM_UID).when(mMockDeps).getBinderCallingUid();
@@ -695,17 +694,17 @@
hasCarrierPrivileges);
final Vcn vcn = startAndGetVcnInstance(subGrp);
- doReturn(isVcnActive).when(vcn).isActive();
+ doReturn(isVcnActive ? VCN_STATUS_CODE_ACTIVE : VCN_STATUS_CODE_SAFE_MODE)
+ .when(vcn)
+ .getStatus();
doReturn(true)
.when(mLocationPermissionChecker)
.checkLocationPermission(eq(TEST_PACKAGE_NAME), any(), eq(TEST_UID), any());
}
- private VcnUnderlyingNetworkPolicy startVcnAndGetPolicyForTransport(
- int subId, ParcelUuid subGrp, boolean isVcnActive, int transport) {
- setupSubscriptionAndStartVcn(subId, subGrp, isVcnActive);
-
+ private NetworkCapabilities.Builder getNetworkCapabilitiesBuilderForTransport(
+ int subId, int transport) {
final NetworkCapabilities.Builder ncBuilder =
new NetworkCapabilities.Builder()
.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
@@ -714,7 +713,16 @@
ncBuilder.setSubIds(Collections.singleton(subId));
}
- return mVcnMgmtSvc.getUnderlyingNetworkPolicy(ncBuilder.build(), new LinkProperties());
+ return ncBuilder;
+ }
+
+ private VcnUnderlyingNetworkPolicy startVcnAndGetPolicyForTransport(
+ int subId, ParcelUuid subGrp, boolean isVcnActive, int transport) {
+ setupSubscriptionAndStartVcn(subId, subGrp, isVcnActive);
+
+ return mVcnMgmtSvc.getUnderlyingNetworkPolicy(
+ getNetworkCapabilitiesBuilderForTransport(subId, transport).build(),
+ new LinkProperties());
}
@Test
@@ -776,6 +784,53 @@
true /* isRestricted */);
}
+ private void setupTrackedCarrierWifiNetwork(NetworkCapabilities caps) {
+ mVcnMgmtSvc.systemReady();
+
+ final ArgumentCaptor<NetworkCallback> captor =
+ ArgumentCaptor.forClass(NetworkCallback.class);
+ verify(mConnMgr)
+ .registerNetworkCallback(
+ eq(new NetworkRequest.Builder().clearCapabilities().build()),
+ captor.capture());
+ captor.getValue().onCapabilitiesChanged(new Network(0), caps);
+ }
+
+ @Test
+ public void testGetUnderlyingNetworkPolicyVcnWifi_unrestrictingExistingNetworkRequiresRestart()
+ throws Exception {
+ final NetworkCapabilities existingNetworkCaps =
+ getNetworkCapabilitiesBuilderForTransport(TEST_SUBSCRIPTION_ID, TRANSPORT_WIFI)
+ .removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
+ .build();
+ setupTrackedCarrierWifiNetwork(existingNetworkCaps);
+
+ // Trigger test without VCN instance alive; expect restart due to change of NOT_RESTRICTED
+ // immutable capability
+ final VcnUnderlyingNetworkPolicy policy =
+ mVcnMgmtSvc.getUnderlyingNetworkPolicy(
+ getNetworkCapabilitiesBuilderForTransport(
+ TEST_SUBSCRIPTION_ID, TRANSPORT_WIFI)
+ .build(),
+ new LinkProperties());
+ assertTrue(policy.isTeardownRequested());
+ }
+
+ @Test
+ public void testGetUnderlyingNetworkPolicyVcnWifi_restrictingExistingNetworkRequiresRestart()
+ throws Exception {
+ final NetworkCapabilities existingNetworkCaps =
+ getNetworkCapabilitiesBuilderForTransport(TEST_SUBSCRIPTION_ID, TRANSPORT_WIFI)
+ .build();
+ setupTrackedCarrierWifiNetwork(existingNetworkCaps);
+
+ final VcnUnderlyingNetworkPolicy policy =
+ startVcnAndGetPolicyForTransport(
+ TEST_SUBSCRIPTION_ID, TEST_UUID_2, false /* isActive */, TRANSPORT_WIFI);
+
+ assertTrue(policy.isTeardownRequested());
+ }
+
@Test
public void testGetUnderlyingNetworkPolicyNonVcnNetwork() throws Exception {
setupSubscriptionAndStartVcn(TEST_SUBSCRIPTION_ID, TEST_UUID_1, true /* isActive */);
@@ -836,7 +891,9 @@
}
private void triggerVcnSafeMode(
- @NonNull ParcelUuid subGroup, @NonNull TelephonySubscriptionSnapshot snapshot)
+ @NonNull ParcelUuid subGroup,
+ @NonNull TelephonySubscriptionSnapshot snapshot,
+ boolean isInSafeMode)
throws Exception {
verify(mMockDeps)
.newVcn(
@@ -847,22 +904,32 @@
mVcnCallbackCaptor.capture());
VcnCallback vcnCallback = mVcnCallbackCaptor.getValue();
- vcnCallback.onEnteredSafeMode();
+ vcnCallback.onSafeModeStatusChanged(isInSafeMode);
}
- @Test
- public void testVcnEnteringSafeModeNotifiesPolicyListeners() throws Exception {
+ private void verifyVcnSafeModeChangesNotifiesPolicyListeners(boolean enterSafeMode)
+ throws Exception {
TelephonySubscriptionSnapshot snapshot =
triggerSubscriptionTrackerCbAndGetSnapshot(Collections.singleton(TEST_UUID_1));
mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener);
- triggerVcnSafeMode(TEST_UUID_1, snapshot);
+ triggerVcnSafeMode(TEST_UUID_1, snapshot, enterSafeMode);
verify(mMockPolicyListener).onPolicyChanged();
}
- private void triggerVcnStatusCallbackOnEnteredSafeMode(
+ @Test
+ public void testVcnEnteringSafeModeNotifiesPolicyListeners() throws Exception {
+ verifyVcnSafeModeChangesNotifiesPolicyListeners(true /* enterSafeMode */);
+ }
+
+ @Test
+ public void testVcnExitingSafeModeNotifiesPolicyListeners() throws Exception {
+ verifyVcnSafeModeChangesNotifiesPolicyListeners(false /* enterSafeMode */);
+ }
+
+ private void triggerVcnStatusCallbackOnSafeModeStatusChanged(
@NonNull ParcelUuid subGroup,
@NonNull String pkgName,
int uid,
@@ -885,12 +952,13 @@
mVcnMgmtSvc.registerVcnStatusCallback(subGroup, mMockStatusCallback, pkgName);
- triggerVcnSafeMode(subGroup, snapshot);
+ triggerVcnSafeMode(subGroup, snapshot, true /* enterSafeMode */);
}
@Test
- public void testVcnStatusCallbackOnEnteredSafeModeWithCarrierPrivileges() throws Exception {
- triggerVcnStatusCallbackOnEnteredSafeMode(
+ public void testVcnStatusCallbackOnSafeModeStatusChangedWithCarrierPrivileges()
+ throws Exception {
+ triggerVcnStatusCallbackOnSafeModeStatusChanged(
TEST_UUID_1,
TEST_PACKAGE_NAME,
TEST_UID,
@@ -901,8 +969,9 @@
}
@Test
- public void testVcnStatusCallbackOnEnteredSafeModeWithoutCarrierPrivileges() throws Exception {
- triggerVcnStatusCallbackOnEnteredSafeMode(
+ public void testVcnStatusCallbackOnSafeModeStatusChangedWithoutCarrierPrivileges()
+ throws Exception {
+ triggerVcnStatusCallbackOnSafeModeStatusChanged(
TEST_UUID_1,
TEST_PACKAGE_NAME,
TEST_UID,
@@ -914,8 +983,9 @@
}
@Test
- public void testVcnStatusCallbackOnEnteredSafeModeWithoutLocationPermission() throws Exception {
- triggerVcnStatusCallbackOnEnteredSafeMode(
+ public void testVcnStatusCallbackOnSafeModeStatusChangedWithoutLocationPermission()
+ throws Exception {
+ triggerVcnStatusCallbackOnSafeModeStatusChanged(
TEST_UUID_1,
TEST_PACKAGE_NAME,
TEST_UID,
diff --git a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
index ed2e4d9..b592000 100644
--- a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
@@ -158,7 +158,7 @@
for (final int subId : expectedSubIds) {
verify(mConnectivityManager)
.requestBackgroundNetwork(
- eq(getCellRequestForSubId(subId, expectedSubIds)),
+ eq(getCellRequestForSubId(subId)),
any(),
any(NetworkBringupCallback.class));
}
@@ -189,30 +189,30 @@
}
private NetworkRequest getWifiRequest(Set<Integer> netCapsSubIds) {
- return getExpectedRequestBase(netCapsSubIds)
+ return getExpectedRequestBase()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .setSubIds(netCapsSubIds)
.build();
}
- private NetworkRequest getCellRequestForSubId(int subId, Set<Integer> netCapsSubIds) {
- return getExpectedRequestBase(netCapsSubIds)
+ private NetworkRequest getCellRequestForSubId(int subId) {
+ return getExpectedRequestBase()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
.build();
}
private NetworkRequest getRouteSelectionRequest(Set<Integer> netCapsSubIds) {
- return getExpectedRequestBase(netCapsSubIds).build();
+ return getExpectedRequestBase().setSubIds(netCapsSubIds).build();
}
- private NetworkRequest.Builder getExpectedRequestBase(Set<Integer> subIds) {
+ private NetworkRequest.Builder getExpectedRequestBase() {
final NetworkRequest.Builder builder =
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
- .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
- .setSubIds(subIds);
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
return builder;
}
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
index ca6448c..34c0018 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
@@ -32,6 +32,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -40,6 +41,8 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import android.net.ConnectivityManager;
+import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
@@ -58,19 +61,29 @@
import org.mockito.ArgumentCaptor;
import java.io.IOException;
+import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
/** Tests for VcnGatewayConnection.ConnectedState */
@RunWith(AndroidJUnit4.class)
@SmallTest
public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnectionTestBase {
private VcnIkeSession mIkeSession;
+ private NetworkAgent mNetworkAgent;
@Before
public void setUp() throws Exception {
super.setUp();
+ mNetworkAgent = mock(NetworkAgent.class);
+ doReturn(mNetworkAgent)
+ .when(mDeps)
+ .newNetworkAgent(any(), any(), any(), any(), anyInt(), any(), any(), any(), any());
+
mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1);
mIkeSession = mGatewayConnection.buildIkeSession(TEST_UNDERLYING_NETWORK_RECORD_1.network);
@@ -159,21 +172,44 @@
assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState());
}
- @Test
- public void testChildOpenedRegistersNetwork() throws Exception {
- // Verify scheduled but not canceled when entering ConnectedState
- verifySafeModeTimeoutAlarmAndGetCallback(false /* expectCanceled */);
+ private void triggerChildOpened() {
+ triggerChildOpened(Collections.singletonList(TEST_INTERNAL_ADDR), TEST_DNS_ADDR);
+ }
+ private void triggerChildOpened(List<LinkAddress> internalAddresses, InetAddress dnsAddress) {
final VcnChildSessionConfiguration mMockChildSessionConfig =
mock(VcnChildSessionConfiguration.class);
- doReturn(Collections.singletonList(TEST_INTERNAL_ADDR))
- .when(mMockChildSessionConfig)
- .getInternalAddresses();
- doReturn(Collections.singletonList(TEST_DNS_ADDR))
+ doReturn(internalAddresses).when(mMockChildSessionConfig).getInternalAddresses();
+ doReturn(Collections.singletonList(dnsAddress))
.when(mMockChildSessionConfig)
.getInternalDnsServers();
getChildSessionCallback().onOpened(mMockChildSessionConfig);
+ }
+
+ private void triggerValidation(int status) {
+ final ArgumentCaptor<Consumer<Integer>> validationCallbackCaptor =
+ ArgumentCaptor.forClass(Consumer.class);
+ verify(mDeps)
+ .newNetworkAgent(
+ any(),
+ any(),
+ any(),
+ any(),
+ anyInt(),
+ any(),
+ any(),
+ any(),
+ validationCallbackCaptor.capture());
+
+ validationCallbackCaptor.getValue().accept(status);
+ }
+
+ @Test
+ public void testChildOpenedRegistersNetwork() throws Exception {
+ // Verify scheduled but not canceled when entering ConnectedState
+ verifySafeModeTimeoutAlarmAndGetCallback(false /* expectCanceled */);
+ triggerChildOpened();
mTestLooper.dispatchAll();
assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState());
@@ -182,15 +218,20 @@
ArgumentCaptor.forClass(LinkProperties.class);
final ArgumentCaptor<NetworkCapabilities> ncCaptor =
ArgumentCaptor.forClass(NetworkCapabilities.class);
- verify(mConnMgr)
- .registerNetworkAgent(
- any(),
- any(),
- lpCaptor.capture(),
+ verify(mDeps)
+ .newNetworkAgent(
+ eq(mVcnContext),
+ any(String.class),
ncCaptor.capture(),
+ lpCaptor.capture(),
+ anyInt(),
+ argThat(nac -> nac.getLegacyType() == ConnectivityManager.TYPE_MOBILE),
any(),
any(),
- anyInt());
+ any());
+ verify(mNetworkAgent).register();
+ verify(mNetworkAgent).markConnected();
+
verify(mIpSecSvc)
.addAddressToTunnelInterface(
eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(TEST_INTERNAL_ADDR), any());
@@ -208,9 +249,78 @@
// Now that Vcn Network is up, notify it as validated and verify the SafeMode alarm is
// canceled
- mGatewayConnection.mNetworkAgent.onValidationStatus(
- NetworkAgent.VALIDATION_STATUS_VALID, null /* redirectUri */);
+ triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID);
verify(mSafeModeTimeoutAlarm).cancel();
+ assertFalse(mGatewayConnection.isInSafeMode());
+ }
+
+ @Test
+ public void testInternalAndDnsAddressesChanged() throws Exception {
+ final List<LinkAddress> startingInternalAddrs =
+ Arrays.asList(new LinkAddress[] {TEST_INTERNAL_ADDR, TEST_INTERNAL_ADDR_2});
+ triggerChildOpened(startingInternalAddrs, TEST_DNS_ADDR);
+ mTestLooper.dispatchAll();
+
+ for (LinkAddress addr : startingInternalAddrs) {
+ verify(mIpSecSvc)
+ .addAddressToTunnelInterface(
+ eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(addr), any());
+ }
+
+ verify(mDeps)
+ .newNetworkAgent(
+ any(),
+ any(),
+ any(),
+ argThat(
+ lp ->
+ startingInternalAddrs.equals(lp.getLinkAddresses())
+ && Collections.singletonList(TEST_DNS_ADDR)
+ .equals(lp.getDnsServers())),
+ anyInt(),
+ any(),
+ any(),
+ any(),
+ any());
+
+ // Trigger another connection event, and verify that the addresses change
+ final List<LinkAddress> newInternalAddrs =
+ Arrays.asList(new LinkAddress[] {TEST_INTERNAL_ADDR_2, TEST_INTERNAL_ADDR_3});
+ triggerChildOpened(newInternalAddrs, TEST_DNS_ADDR_2);
+ mTestLooper.dispatchAll();
+
+ // Verify addresses on tunnel network added/removed
+ for (LinkAddress addr : newInternalAddrs) {
+ verify(mIpSecSvc)
+ .addAddressToTunnelInterface(
+ eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(addr), any());
+ }
+ verify(mIpSecSvc)
+ .removeAddressFromTunnelInterface(
+ eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(TEST_INTERNAL_ADDR), any());
+
+ // TODO(b/184579891): Also verify link properties updated and sent when sendLinkProperties
+ // is mockable
+
+ // Verify that IpSecTunnelInterface only created once
+ verify(mIpSecSvc).createTunnelInterface(any(), any(), any(), any(), any());
+ verifyNoMoreInteractions(mIpSecSvc);
+ }
+
+ @Test
+ public void testSuccessfulConnectionExitsSafeMode() throws Exception {
+ verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(
+ mGatewayConnection.mConnectedState);
+
+ assertTrue(mGatewayConnection.isInSafeMode());
+ assertFalse(mGatewayConnection.isQuitting());
+
+ triggerChildOpened();
+ mTestLooper.dispatchAll();
+
+ triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID);
+
+ assertFalse(mGatewayConnection.isInSafeMode());
}
@Test
@@ -241,7 +351,7 @@
verify(mGatewayStatusCallback)
.onGatewayConnectionError(
- eq(mConfig.getExposedCapabilities()),
+ eq(mConfig.getGatewayConnectionName()),
eq(VCN_ERROR_CODE_INTERNAL_ERROR),
any(),
any());
@@ -275,7 +385,10 @@
verify(mGatewayStatusCallback)
.onGatewayConnectionError(
- eq(mConfig.getExposedCapabilities()), eq(expectedErrorType), any(), any());
+ eq(mConfig.getGatewayConnectionName()),
+ eq(expectedErrorType),
+ any(),
+ any());
}
@Test
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectingStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectingStateTest.java
index 7afa449..bfe8c73 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectingStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectingStateTest.java
@@ -118,8 +118,9 @@
}
@Test
- public void testSafeModeTimeoutNotifiesCallback() {
- verifySafeModeTimeoutNotifiesCallback(mGatewayConnection.mConnectingState);
+ public void testSafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent() {
+ verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(
+ mGatewayConnection.mConnectingState);
}
@Test
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionDisconnectingStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionDisconnectingStateTest.java
index 99feffd..9da8b45 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionDisconnectingStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionDisconnectingStateTest.java
@@ -86,8 +86,9 @@
}
@Test
- public void testSafeModeTimeoutNotifiesCallback() {
- verifySafeModeTimeoutNotifiesCallback(mGatewayConnection.mDisconnectingState);
+ public void testSafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent() {
+ verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(
+ mGatewayConnection.mDisconnectingState);
}
@Test
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
index 85a0277..6dbf7d5 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
@@ -96,8 +96,9 @@
}
@Test
- public void testSafeModeTimeoutNotifiesCallback() {
- verifySafeModeTimeoutNotifiesCallback(mGatewayConnection.mRetryTimeoutState);
+ public void testSafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent() {
+ verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(
+ mGatewayConnection.mRetryTimeoutState);
}
@Test
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
index a660735..c5ed8f6 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java
@@ -21,6 +21,8 @@
import static com.android.server.vcn.VcnTestUtils.setupIpSecManager;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
@@ -42,6 +44,7 @@
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
+import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.ipsec.ike.ChildSessionCallback;
import android.net.ipsec.ike.IkeSessionCallback;
@@ -71,8 +74,14 @@
protected static final ParcelUuid TEST_SUB_GRP = new ParcelUuid(UUID.randomUUID());
protected static final InetAddress TEST_DNS_ADDR =
InetAddresses.parseNumericAddress("2001:DB8:0:1::");
+ protected static final InetAddress TEST_DNS_ADDR_2 =
+ InetAddresses.parseNumericAddress("2001:DB8:0:2::");
protected static final LinkAddress TEST_INTERNAL_ADDR =
- new LinkAddress(InetAddresses.parseNumericAddress("2001:DB8:0:2::"), 64);
+ new LinkAddress(InetAddresses.parseNumericAddress("2001:DB8:1:1::"), 64);
+ protected static final LinkAddress TEST_INTERNAL_ADDR_2 =
+ new LinkAddress(InetAddresses.parseNumericAddress("2001:DB8:1:2::"), 64);
+ protected static final LinkAddress TEST_INTERNAL_ADDR_3 =
+ new LinkAddress(InetAddresses.parseNumericAddress("2001:DB8:1:3::"), 64);
protected static final int TEST_IPSEC_SPI_VALUE = 0x1234;
protected static final int TEST_IPSEC_SPI_RESOURCE_ID = 1;
@@ -267,7 +276,12 @@
expectCanceled);
}
- protected void verifySafeModeTimeoutNotifiesCallback(@NonNull State expectedState) {
+ protected void verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(
+ @NonNull State expectedState) {
+ // Set a NetworkAgent, and expect it to be unregistered and cleared
+ final NetworkAgent mockNetworkAgent = mock(NetworkAgent.class);
+ mGatewayConnection.setNetworkAgent(mockNetworkAgent);
+
// SafeMode timer starts when VcnGatewayConnection exits DisconnectedState (the initial
// state)
final Runnable delayedEvent =
@@ -275,7 +289,11 @@
delayedEvent.run();
mTestLooper.dispatchAll();
- verify(mGatewayStatusCallback).onEnteredSafeMode();
+ verify(mGatewayStatusCallback).onSafeModeStatusChanged();
assertEquals(expectedState, mGatewayConnection.getCurrentState());
+ assertTrue(mGatewayConnection.isInSafeMode());
+
+ verify(mockNetworkAgent).unregister();
+ assertNull(mGatewayConnection.getNetworkAgent());
}
}
diff --git a/tests/vcn/java/com/android/server/vcn/VcnTest.java b/tests/vcn/java/com/android/server/vcn/VcnTest.java
index c853fc5..90eb75e 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnTest.java
@@ -19,12 +19,13 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
+import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
@@ -51,7 +52,8 @@
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import java.util.UUID;
@@ -132,6 +134,7 @@
private void startVcnGatewayWithCapabilities(
NetworkRequestListener requestListener, int... netCapabilities) {
final NetworkRequest.Builder requestBuilder = new NetworkRequest.Builder();
+ requestBuilder.addTransportType(TRANSPORT_CELLULAR);
for (final int netCapability : netCapabilities) {
requestBuilder.addCapability(netCapability);
}
@@ -140,7 +143,7 @@
mTestLooper.dispatchAll();
}
- private void verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(boolean isActive) {
+ private void verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(int status) {
final NetworkRequestListener requestListener = verifyAndGetRequestListener();
startVcnGatewayWithCapabilities(requestListener, TEST_CAPS[0]);
@@ -150,25 +153,24 @@
final TelephonySubscriptionSnapshot updatedSnapshot =
mock(TelephonySubscriptionSnapshot.class);
- mVcn.setIsActive(isActive);
+ mVcn.setStatus(status);
mVcn.updateSubscriptionSnapshot(updatedSnapshot);
mTestLooper.dispatchAll();
for (final VcnGatewayConnection gateway : gatewayConnections) {
- verify(gateway, isActive ? times(1) : never())
- .updateSubscriptionSnapshot(eq(updatedSnapshot));
+ verify(gateway).updateSubscriptionSnapshot(eq(updatedSnapshot));
}
}
@Test
public void testSubscriptionSnapshotUpdatesVcnGatewayConnections() {
- verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(true /* isActive */);
+ verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(VCN_STATUS_CODE_ACTIVE);
}
@Test
- public void testSubscriptionSnapshotUpdatesVcnGatewayConnectionsWhileInactive() {
- verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(false /* isActive */);
+ public void testSubscriptionSnapshotUpdatesVcnGatewayConnectionsInSafeMode() {
+ verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(VCN_STATUS_CODE_SAFE_MODE);
}
private void triggerVcnRequestListeners(NetworkRequestListener requestListener) {
@@ -198,32 +200,53 @@
private void verifySafeMode(
NetworkRequestListener requestListener,
- Set<VcnGatewayConnection> expectedGatewaysTornDown) {
- assertFalse(mVcn.isActive());
- for (final VcnGatewayConnection gatewayConnection : expectedGatewaysTornDown) {
- verify(gatewayConnection).teardownAsynchronously();
+ Set<VcnGatewayConnection> activeGateways,
+ boolean expectInSafeMode) {
+ for (VcnGatewayConnection gatewayConnection : activeGateways) {
+ verify(gatewayConnection, never()).teardownAsynchronously();
}
- verify(mVcnNetworkProvider).unregisterListener(requestListener);
- verify(mVcnCallback).onEnteredSafeMode();
+
+ assertEquals(
+ expectInSafeMode ? VCN_STATUS_CODE_SAFE_MODE : VCN_STATUS_CODE_ACTIVE,
+ mVcn.getStatus());
+ verify(mVcnCallback).onSafeModeStatusChanged(expectInSafeMode);
}
@Test
- public void testGatewayEnteringSafeModeNotifiesVcn() {
+ public void testGatewayEnteringAndExitingSafeModeNotifiesVcn() {
final NetworkRequestListener requestListener = verifyAndGetRequestListener();
final Set<VcnGatewayConnection> gatewayConnections =
startGatewaysAndGetGatewayConnections(requestListener);
- // Doesn't matter which callback this gets - any Gateway entering Safemode should shut down
- // all Gateways
+ // Doesn't matter which callback this gets, or which VCN is in safe mode - any Gateway
+ // entering Safemode should trigger safe mode
final VcnGatewayStatusCallback statusCallback = mGatewayStatusCallbackCaptor.getValue();
- statusCallback.onEnteredSafeMode();
+ final VcnGatewayConnection gatewayConnection = gatewayConnections.iterator().next();
+
+ doReturn(true).when(gatewayConnection).isInSafeMode();
+ statusCallback.onSafeModeStatusChanged();
mTestLooper.dispatchAll();
- verifySafeMode(requestListener, gatewayConnections);
+ verifySafeMode(requestListener, gatewayConnections, true /* expectInSafeMode */);
+
+ // Verify that when all GatewayConnections exit safe mode, the VCN also exits safe mode
+ doReturn(false).when(gatewayConnection).isInSafeMode();
+ statusCallback.onSafeModeStatusChanged();
+ mTestLooper.dispatchAll();
+
+ verifySafeMode(requestListener, gatewayConnections, false /* expectInSafeMode */);
+
+ // Re-trigger, verify safe mode callback does not get fired again for identical state
+ statusCallback.onSafeModeStatusChanged();
+ mTestLooper.dispatchAll();
+
+ // Expect only once still; from above.
+ verify(mVcnCallback).onSafeModeStatusChanged(false);
}
- @Test
- public void testGatewayQuit() {
+ private void verifyGatewayQuit(int status) {
+ mVcn.setStatus(status);
+
final NetworkRequestListener requestListener = verifyAndGetRequestListener();
final Set<VcnGatewayConnection> gatewayConnections =
new ArraySet<>(startGatewaysAndGetGatewayConnections(requestListener));
@@ -236,7 +259,7 @@
assertEquals(1, mVcn.getVcnGatewayConnections().size());
verify(mVcnNetworkProvider).resendAllRequests(requestListener);
- // Verify that the VcnGatewayConnection is restarted
+ // Verify that the VcnGatewayConnection is restarted if a request exists for it
triggerVcnRequestListeners(requestListener);
mTestLooper.dispatchAll();
assertEquals(2, mVcn.getVcnGatewayConnections().size());
@@ -250,21 +273,13 @@
}
@Test
- public void testGatewayQuitWhileInactive() {
- final NetworkRequestListener requestListener = verifyAndGetRequestListener();
- final Set<VcnGatewayConnection> gatewayConnections =
- new ArraySet<>(startGatewaysAndGetGatewayConnections(requestListener));
+ public void testGatewayQuitReevaluatesRequests() {
+ verifyGatewayQuit(VCN_STATUS_CODE_ACTIVE);
+ }
- mVcn.teardownAsynchronously();
- mTestLooper.dispatchAll();
-
- final VcnGatewayStatusCallback statusCallback = mGatewayStatusCallbackCaptor.getValue();
- statusCallback.onQuit();
- mTestLooper.dispatchAll();
-
- // Verify that the VCN requests the networkRequests be resent
- assertEquals(1, mVcn.getVcnGatewayConnections().size());
- verify(mVcnNetworkProvider, never()).resendAllRequests(requestListener);
+ @Test
+ public void testGatewayQuitReevaluatesRequestsInSafeMode() {
+ verifyGatewayQuit(VCN_STATUS_CODE_SAFE_MODE);
}
@Test
@@ -274,11 +289,12 @@
assertEquals(2, mVcn.getVcnGatewayConnectionConfigMap().size());
// Create VcnConfig with only one VcnGatewayConnectionConfig so a gateway connection is torn
- // down
- final VcnGatewayConnectionConfig activeConfig =
- VcnGatewayConnectionConfigTest.buildTestConfigWithExposedCaps(TEST_CAPS[0]);
- final VcnGatewayConnectionConfig removedConfig =
- VcnGatewayConnectionConfigTest.buildTestConfigWithExposedCaps(TEST_CAPS[1]);
+ // down. Reuse existing VcnGatewayConnectionConfig so that the gateway connection name
+ // matches.
+ final List<VcnGatewayConnectionConfig> currentConfigs =
+ new ArrayList<>(mVcn.getVcnGatewayConnectionConfigMap().keySet());
+ final VcnGatewayConnectionConfig activeConfig = currentConfigs.get(0);
+ final VcnGatewayConnectionConfig removedConfig = currentConfigs.get(1);
final VcnConfig updatedConfig =
new VcnConfig.Builder(mContext).addGatewayConnectionConfig(activeConfig).build();
@@ -293,49 +309,4 @@
verify(removedGatewayConnection).teardownAsynchronously();
verify(mVcnNetworkProvider).resendAllRequests(requestListener);
}
-
- @Test
- public void testUpdateConfigExitsSafeMode() {
- final NetworkRequestListener requestListener = verifyAndGetRequestListener();
- final Set<VcnGatewayConnection> gatewayConnections =
- new ArraySet<>(startGatewaysAndGetGatewayConnections(requestListener));
-
- final VcnGatewayStatusCallback statusCallback = mGatewayStatusCallbackCaptor.getValue();
- statusCallback.onEnteredSafeMode();
- mTestLooper.dispatchAll();
- verifySafeMode(requestListener, gatewayConnections);
-
- doAnswer(invocation -> {
- final NetworkRequestListener listener = invocation.getArgument(0);
- triggerVcnRequestListeners(listener);
- return null;
- }).when(mVcnNetworkProvider).registerListener(eq(requestListener));
-
- mVcn.updateConfig(mConfig);
- mTestLooper.dispatchAll();
-
- // Registered on start, then re-registered with new configs
- verify(mVcnNetworkProvider, times(2)).registerListener(eq(requestListener));
- assertTrue(mVcn.isActive());
- for (final int[] caps : TEST_CAPS) {
- // Expect each gateway connection created only on initial startup
- verify(mDeps)
- .newVcnGatewayConnection(
- eq(mVcnContext),
- eq(TEST_SUB_GROUP),
- eq(mSubscriptionSnapshot),
- argThat(config -> Arrays.equals(caps, config.getExposedCapabilities())),
- any());
- }
- }
-
- @Test
- public void testIgnoreNetworkRequestWhileInactive() {
- mVcn.setIsActive(false /* isActive */);
-
- final NetworkRequestListener requestListener = verifyAndGetRequestListener();
- triggerVcnRequestListeners(requestListener);
-
- verify(mDeps, never()).newVcnGatewayConnection(any(), any(), any(), any(), any());
- }
}
diff --git a/tools/aapt2/cmd/Link_test.cpp b/tools/aapt2/cmd/Link_test.cpp
index dfdac6b..d1e6d39 100644
--- a/tools/aapt2/cmd/Link_test.cpp
+++ b/tools/aapt2/cmd/Link_test.cpp
@@ -466,11 +466,19 @@
const std::string android_r_java = android_java + "/android/R.java";
std::string android_r_contents;
ASSERT_TRUE(android::base::ReadFileToString(android_r_java, &android_r_contents));
- EXPECT_THAT(android_r_contents, HasSubstr(" public static final int finalized_res=0x01010001;"));
- EXPECT_THAT(android_r_contents, HasSubstr(" public static int staged_s_res=0x01010050;"));
- EXPECT_THAT(android_r_contents, HasSubstr(" public static int staged_s2_res=0x01ff0049;"));
- EXPECT_THAT(android_r_contents, HasSubstr(" public static int staged_t_res=0x01fe0063;"));
- EXPECT_THAT(android_r_contents, HasSubstr(" public static int staged_t_string=0x01fd0072;"));
+ EXPECT_THAT(android_r_contents, HasSubstr("public static final int finalized_res=0x01010001;"));
+ EXPECT_THAT(
+ android_r_contents,
+ HasSubstr("public static final int staged_s_res; static { staged_s_res=0x01010050; }"));
+ EXPECT_THAT(
+ android_r_contents,
+ HasSubstr("public static final int staged_s2_res; static { staged_s2_res=0x01ff0049; }"));
+ EXPECT_THAT(
+ android_r_contents,
+ HasSubstr("public static final int staged_t_res; static { staged_t_res=0x01fe0063; }"));
+ EXPECT_THAT(
+ android_r_contents,
+ HasSubstr("public static final int staged_t_string; static { staged_t_string=0x01fd0072; }"));
// Build an app that uses the framework attribute in a declare-styleable
const std::string client_res = GetTestPath("app-res");
diff --git a/tools/aapt2/format/binary/BinaryResourceParser.cpp b/tools/aapt2/format/binary/BinaryResourceParser.cpp
index bfb8d58..f1b350f 100644
--- a/tools/aapt2/format/binary/BinaryResourceParser.cpp
+++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp
@@ -393,8 +393,15 @@
.SetAllowMangled(true);
if (entry->flags & ResTable_entry::FLAG_PUBLIC) {
- res_builder.SetVisibility(Visibility{Visibility::Level::kPublic});
+ Visibility visibility{Visibility::Level::kPublic};
+ auto spec_flags = entry_type_spec_flags_.find(res_id);
+ if (spec_flags != entry_type_spec_flags_.end() &&
+ spec_flags->second & ResTable_typeSpec::SPEC_STAGED_API) {
+ visibility.staged_api = true;
+ }
+
+ res_builder.SetVisibility(visibility);
// Erase the ID from the map once processed, so that we don't mark the same symbol more than
// once.
entry_type_spec_flags_.erase(res_id);
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index d3648c8..2acdadb 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -78,10 +78,18 @@
ClassMember::Print(final, printer, strip_api_annotations);
printer->Print("public static ");
- if (final && !staged_api_) {
+ if (final) {
printer->Print("final ");
}
- printer->Print("int ").Print(name_).Print("=").Print(to_string(val_)).Print(";");
+ printer->Print("int ").Print(name_);
+ if (staged_api_) {
+ // Prevent references to staged apis from being inline by setting their value out-of-line.
+ printer->Print("; static { ").Print(name_);
+ }
+ printer->Print("=").Print(to_string(val_)).Print(";");
+ if (staged_api_) {
+ printer->Print(" }");
+ }
}
private: