diff options
290 files changed, 8091 insertions, 6513 deletions
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java index de9d609ea17b..5b43ac387453 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java @@ -412,11 +412,6 @@ public final class AppSearchImpl implements Closeable { String prefix = createPrefix(packageName, databaseName); GetSchemaResponse.Builder responseBuilder = new GetSchemaResponse.Builder(); - if (!fullSchema.getTypesList().isEmpty()) { - // TODO(b/183050495) find a place to store the version for the database, rather - // than read from a schema. - responseBuilder.setVersion(fullSchema.getTypes(0).getVersion()); - } for (int i = 0; i < fullSchema.getTypesCount(); i++) { String typePrefix = getPrefix(fullSchema.getTypes(i).getSchemaType()); if (!prefix.equals(typePrefix)) { @@ -444,6 +439,10 @@ public final class AppSearchImpl implements Closeable { AppSearchSchema schema = SchemaToProtoConverter.toAppSearchSchema(typeConfigBuilder); + + // TODO(b/183050495) find a place to store the version for the database, rather + // than read from a schema. + responseBuilder.setVersion(fullSchema.getTypes(i).getVersion()); responseBuilder.addSchema(schema); } return responseBuilder.build(); diff --git a/apex/appsearch/synced_jetpack_changeid.txt b/apex/appsearch/synced_jetpack_changeid.txt index 58f430b5bd61..29bd54134a37 100644 --- a/apex/appsearch/synced_jetpack_changeid.txt +++ b/apex/appsearch/synced_jetpack_changeid.txt @@ -1 +1 @@ -Ie11a0555775a0ab2a39f6ce6d0d8a7b735c416ce +Ibbd3a92ad091f6911de652e2ba7e44f555a70a72 diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java index cb1fccf1e96e..d459c0502189 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java @@ -183,6 +183,10 @@ public class PowerExemptionManager { 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 @@ public class PowerExemptionManager { 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 @@ public class PowerExemptionManager { 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/java/android/media/MediaTranscodeManager.java b/apex/media/framework/java/android/media/MediaTranscodeManager.java index fef48654eb59..775b0e54b24c 100644 --- a/apex/media/framework/java/android/media/MediaTranscodeManager.java +++ b/apex/media/framework/java/android/media/MediaTranscodeManager.java @@ -629,7 +629,16 @@ public final class MediaTranscodeManager { /* Writes the TranscodingRequest to a parcel. */ private TranscodingRequestParcel writeToParcel(@NonNull Context context) { TranscodingRequestParcel parcel = new TranscodingRequestParcel(); - parcel.priority = mPriority; + switch (mPriority) { + case PRIORITY_OFFLINE: + parcel.priority = TranscodingSessionPriority.kUnspecified; + break; + case PRIORITY_REALTIME: + case PRIORITY_UNKNOWN: + default: + parcel.priority = TranscodingSessionPriority.kNormal; + break; + } parcel.transcodingType = mType; parcel.sourceFilePath = mSourceUri.toString(); parcel.sourceFd = mSourceFileDescriptor; @@ -1578,7 +1587,7 @@ public final class MediaTranscodeManager { result = "RESULT_SUCCESS"; break; case RESULT_ERROR: - result = "RESULT_ERROR"; + result = "RESULT_ERROR(" + mErrorCode + ")"; break; case RESULT_CANCELED: result = "RESULT_CANCELED"; diff --git a/boot/Android.bp b/boot/Android.bp index 4f7c44eca818..71edea27ada6 100644 --- a/boot/Android.bp +++ b/boot/Android.bp @@ -23,7 +23,24 @@ package { 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/core/api/current.txt b/core/api/current.txt index 89cf257d894c..39d0b8c6bf1a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -303,7 +303,7 @@ package android { 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 +334,7 @@ package android { 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 +400,7 @@ package android { 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 +442,7 @@ package android { 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 +512,7 @@ package android { 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 +534,8 @@ package android { 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 +583,7 @@ package android { 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 +669,7 @@ package android { 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 +733,14 @@ package android { 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 +824,7 @@ package android { 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 +866,8 @@ package android { 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 +977,8 @@ package android { 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 +987,7 @@ package android { 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 +1011,7 @@ package android { 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 +1081,13 @@ package android { 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 +1124,7 @@ package android { 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 +1181,8 @@ package android { 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 +1207,7 @@ package android { 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 +1268,7 @@ package android { 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 +1296,7 @@ package android { 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 +1319,17 @@ package android { 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 +1402,7 @@ package android { 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 +1417,8 @@ package android { 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 +1588,7 @@ package android { 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 +1643,10 @@ package android { 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 +1665,7 @@ package android { 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 +1684,11 @@ package android { 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 +1736,66 @@ package android { 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 +1811,9 @@ package android { 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 } @@ -27093,12 +27093,13 @@ package android.net.vcn { 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 +27123,7 @@ package android.net.vcn { 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); } diff --git a/core/api/system-current.txt b/core/api/system-current.txt index be4b75db3f2c..696494b0248c 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -313,15 +313,15 @@ package android { 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 @@ package android { } 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 @@ package android { 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 { @@ -7016,8 +7016,8 @@ package android.media.tv.tuner.frontend { field public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = 30; // 0x1e field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f field public static final int FRONTEND_STATUS_TYPE_IS_LINEAR = 35; // 0x23 - field public static final int FRONTEND_STATUS_TYPE_IS_MISO = 34; // 0x22 - field public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES = 36; // 0x24 + field public static final int FRONTEND_STATUS_TYPE_IS_MISO_ENABLED = 34; // 0x22 + field public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED = 36; // 0x24 field public static final int FRONTEND_STATUS_TYPE_LAYER_ERROR = 16; // 0x10 field public static final int FRONTEND_STATUS_TYPE_LNA = 15; // 0xf field public static final int FRONTEND_STATUS_TYPE_LNB_VOLTAGE = 11; // 0xb @@ -8766,6 +8766,8 @@ package android.permission { 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 @@ package android.permission { 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); @@ -11851,7 +11855,7 @@ package android.telephony { method @Deprecated public boolean getDataEnabled(); method @Deprecated public boolean getDataEnabled(int); method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getDefaultRespondViaMessageApplication(); - method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDeviceSoftwareVersion(int); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain(); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 6745a69e001e..7b6f9b3f2b26 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -58,8 +58,8 @@ package android { 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 } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 2fbea28f34d5..4e140a8d3f45 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3744,10 +3744,8 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable || 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 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable } private boolean useExistingRemoteView() { - return mStyle == null || (!mStyle.displayCustomViewInline() - && !mRebuildStyledRemoteViews); + return mStyle == null || !mStyle.displayCustomViewInline(); } /** @@ -6083,8 +6083,7 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable * 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 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable * 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 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable * 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 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable * @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 @@ public class Notification implements Parcelable + " notification: " + mN.mShortcutId + " vs bubble: " + mN.mBubbleMetadata.getShortcutId()); } + validateColorizedHasColor(); // first, add any extras from the calling code if (mUserExtras != null) { @@ -6539,6 +6534,21 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable } 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.getColor(0, defaultColor); } - int background = ta.getColor(0, defaultColor); - ta.recycle(); - return background; } /** @@ -6671,11 +6677,7 @@ public class Notification implements Parcelable * 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 @@ public class Notification implements Parcelable } /** - * 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 @@ public class Notification implements Parcelable * @hide */ public boolean isColorized() { - return extras.getBoolean(EXTRA_COLORIZED) + return color != COLOR_DEFAULT && extras.getBoolean(EXTRA_COLORIZED) && (hasColorizedPermission() || isForegroundService()); } @@ -8389,27 +8379,6 @@ public class Notification implements Parcelable 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 @@ public class Notification implements Parcelable 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"; @@ -9889,23 +9853,6 @@ public class Notification implements Parcelable // 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/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index e4120913c9f7..843aa2ecb492 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1774,19 +1774,6 @@ public class DevicePolicyManager { = "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 @@ public class DevicePolicyManager { * 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/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 0952b3e1233c..fa9142ca9449 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -896,11 +896,13 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { }; /** - * 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 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { * @hide */ @ChangeId + @Overridable @Disabled @TestApi public static final long FORCE_NON_RESIZE_APP = 181136395L; // buganizer id diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java index cdd8265ad5cd..4c6255da0a39 100644 --- a/core/java/android/content/res/ColorStateList.java +++ b/core/java/android/content/res/ColorStateList.java @@ -376,10 +376,13 @@ public class ColorStateList extends ComplexColor implements Parcelable { 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/net/vcn/IVcnStatusCallback.aidl b/core/java/android/net/vcn/IVcnStatusCallback.aidl index 236ae8bb11b2..11bc443c9dd6 100644 --- a/core/java/android/net/vcn/IVcnStatusCallback.aidl +++ b/core/java/android/net/vcn/IVcnStatusCallback.aidl @@ -20,7 +20,7 @@ package android.net.vcn; 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 52cc2182b094..d41c0b4fbdb3 100644 --- a/core/java/android/net/vcn/VcnConfig.java +++ b/core/java/android/net/vcn/VcnConfig.java @@ -183,12 +183,25 @@ public final class VcnConfig implements Parcelable { * * @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 d4e8e2dca296..75db3820f5e7 100644 --- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java +++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java @@ -148,6 +148,8 @@ public final class VcnGatewayConnectionConfig { 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 @@ public final class VcnGatewayConnectionConfig { /** 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 @@ public final class VcnGatewayConnectionConfig { 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 @@ public final class VcnGatewayConnectionConfig { } private void validate() { + Objects.requireNonNull(mGatewayConnectionName, "gatewayConnectionName was null"); Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null"); Preconditions.checkArgument( @@ -242,6 +248,20 @@ public final class VcnGatewayConnectionConfig { } /** + * 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 @@ public final class VcnGatewayConnectionConfig { 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 @@ public final class VcnGatewayConnectionConfig { @Override public int hashCode() { return Objects.hash( + mGatewayConnectionName, mExposedCapabilities, mUnderlyingCapabilities, Arrays.hashCode(mRetryIntervalsMs), @@ -389,7 +411,8 @@ public final class VcnGatewayConnectionConfig { } 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 @@ public final class VcnGatewayConnectionConfig { * 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 @@ public final class VcnGatewayConnectionConfig { /** * 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 @@ public final class VcnGatewayConnectionConfig { @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 abd41dacdeb6..d09094cee1bf 100644 --- a/core/java/android/net/vcn/VcnManager.java +++ b/core/java/android/net/vcn/VcnManager.java @@ -445,18 +445,16 @@ public class VcnManager { * 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 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 * @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 +584,7 @@ public class VcnManager { // 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 +595,7 @@ public class VcnManager { mExecutor.execute( () -> mCallback.onGatewayConnectionError( - networkCapabilities, errorCode, cause))); + gatewayConnectionName, errorCode, cause))); } private static Throwable createThrowableByClassName( diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index a0721c32fc2a..bcd00b21e97d 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -74,7 +74,7 @@ public final class BatteryUsageStats implements Parcelable { 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); } diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index b12dad038ce3..40c658f01e28 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -46,8 +46,6 @@ import android.content.ContentResolver; 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.security.NoSuchAlgorithmException; 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 @@ public final class FileUtils { } } - // 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/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl index 6d677f35b563..66e1c5a93f16 100644 --- a/core/java/android/permission/IPermissionController.aidl +++ b/core/java/android/permission/IPermissionController.aidl @@ -48,4 +48,10 @@ oneway interface IPermissionController { 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 913b827332bf..05eb23ad705d 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -45,6 +45,7 @@ import android.os.Handler; 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.Collections; 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 @@ public final class PermissionControllerManager { 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 ad9e8b3d6dd4..0b99b85fdf24 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -301,6 +301,29 @@ public abstract class PermissionControllerService extends Service { } /** + * 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 @@ public abstract class PermissionControllerService extends Service { 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/provider/Settings.java b/core/java/android/provider/Settings.java index 22d74ca33a83..ecb1700bf7d5 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6745,9 +6745,8 @@ public final class Settings { /** * 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/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java index 7aa5ee51b606..9a855f30a373 100644 --- a/core/java/android/speech/SpeechRecognizer.java +++ b/core/java/android/speech/SpeechRecognizer.java @@ -214,6 +214,17 @@ public class SpeechRecognizer { * 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 @@ public class SpeechRecognizer { * {@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/view/HapticFeedbackConstants.java b/core/java/android/view/HapticFeedbackConstants.java index c62e93463048..9f63500fc853 100644 --- a/core/java/android/view/HapticFeedbackConstants.java +++ b/core/java/android/view/HapticFeedbackConstants.java @@ -129,6 +129,12 @@ public class HapticFeedbackConstants { 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/OWNERS b/core/java/android/view/OWNERS index 4a1d68547f70..cdf1e46ac5db 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/input/O 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/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java index 14dcdad8e2b5..cdc099b8e2ea 100644 --- a/core/java/android/view/RemoteAnimationTarget.java +++ b/core/java/android/view/RemoteAnimationTarget.java @@ -34,7 +34,8 @@ import static android.view.RemoteAnimationTargetProto.WINDOW_CONFIGURATION; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import android.annotation.IntDef; -import android.app.PictureInPictureParams; +import android.app.ActivityManager; +import android.app.TaskInfo; import android.app.WindowConfiguration; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.Point; @@ -189,12 +190,11 @@ public class RemoteAnimationTarget implements Parcelable { public boolean isNotInRecents; /** - * {@link PictureInPictureParams} to allow launcher to determine if an app should - * automatically enter PiP on swiping up to home. + * {@link TaskInfo} to allow the controller to identify information about the task. * * TODO: add this to proto dump */ - public PictureInPictureParams pictureInPictureParams; + public ActivityManager.RunningTaskInfo taskInfo; /** * The {@link android.view.WindowManager.LayoutParams.WindowType} of this window. It's only used @@ -206,11 +206,10 @@ public class RemoteAnimationTarget implements Parcelable { Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, - SurfaceControl startLeash, Rect startBounds, - PictureInPictureParams pictureInPictureParams) { + SurfaceControl startLeash, Rect startBounds, ActivityManager.RunningTaskInfo taskInfo) { this(taskId, mode, leash, isTranslucent, clipRect, contentInsets, prefixOrderIndex, position, localBounds, screenSpaceBounds, windowConfig, isNotInRecents, startLeash, - startBounds, pictureInPictureParams, INVALID_WINDOW_TYPE); + startBounds, taskInfo, INVALID_WINDOW_TYPE); } public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, @@ -218,7 +217,7 @@ public class RemoteAnimationTarget implements Parcelable { Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, - PictureInPictureParams pictureInPictureParams, + ActivityManager.RunningTaskInfo taskInfo, @WindowManager.LayoutParams.WindowType int windowType) { this.mode = mode; this.taskId = taskId; @@ -235,7 +234,7 @@ public class RemoteAnimationTarget implements Parcelable { this.isNotInRecents = isNotInRecents; this.startLeash = startLeash; this.startBounds = startBounds == null ? null : new Rect(startBounds); - this.pictureInPictureParams = pictureInPictureParams; + this.taskInfo = taskInfo; this.windowType = windowType; } @@ -255,7 +254,7 @@ public class RemoteAnimationTarget implements Parcelable { isNotInRecents = in.readBoolean(); startLeash = in.readTypedObject(SurfaceControl.CREATOR); startBounds = in.readTypedObject(Rect.CREATOR); - pictureInPictureParams = in.readTypedObject(PictureInPictureParams.CREATOR); + taskInfo = in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); windowType = in.readInt(); } @@ -281,7 +280,7 @@ public class RemoteAnimationTarget implements Parcelable { dest.writeBoolean(isNotInRecents); dest.writeTypedObject(startLeash, 0 /* flags */); dest.writeTypedObject(startBounds, 0 /* flags */); - dest.writeTypedObject(pictureInPictureParams, 0 /* flags */); + dest.writeTypedObject(taskInfo, 0 /* flags */); dest.writeInt(windowType); } @@ -299,7 +298,7 @@ public class RemoteAnimationTarget implements Parcelable { pw.println(); pw.print(prefix); pw.print("windowConfiguration="); pw.println(windowConfiguration); pw.print(prefix); pw.print("leash="); pw.println(leash); - pw.print(prefix); pw.print("pictureInPictureParams="); pw.println(pictureInPictureParams); + pw.print(prefix); pw.print("taskInfo="); pw.println(taskInfo); pw.print(prefix); pw.print("windowType="); pw.print(windowType); } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 8198254958f4..5b695f4c425a 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2053,26 +2053,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager for (int i = childrenCount - 1; i >= 0; i--) { final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); - View childWithAccessibilityFocus = - event.isTargetAccessibilityFocus() - ? findChildWithAccessibilityFocus() - : null; if (!child.canReceivePointerEvents() || !isTransformedTouchPointInView(x, y, child, null)) { - - // If there is a view that has accessibility focus we want it - // to get the event first and if not handled we will perform a - // normal dispatch. We may do a double iteration but this is - // safer given the timeframe. - if (childWithAccessibilityFocus != null) { - if (childWithAccessibilityFocus != child) { - continue; - } - childWithAccessibilityFocus = null; - i = childrenCount - 1; - } - event.setTargetAccessibilityFocus(false); continue; } final PointerIcon pointerIcon = @@ -2730,8 +2713,22 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager childrenCount, i, customOrder); final View child = getAndVerifyPreorderedView( preorderedList, children, childIndex); + + // If there is a view that has accessibility focus we want it + // to get the event first and if not handled we will perform a + // normal dispatch. We may do a double iteration but this is + // safer given the timeframe. + if (childWithAccessibilityFocus != null) { + if (childWithAccessibilityFocus != child) { + continue; + } + childWithAccessibilityFocus = null; + i = childrenCount - 1; + } + if (!child.canReceivePointerEvents() || !isTransformedTouchPointInView(x, y, child, null)) { + ev.setTargetAccessibilityFocus(false); continue; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e2cf9624e1a5..1ff625d39249 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -8600,8 +8600,6 @@ public final class ViewRootImpl implements ViewParent, // available, we cannot compute end-to-end input latency metrics. return; } - final long gpuCompletedTime = data[FrameMetrics.Index.GPU_COMPLETED]; - mReceiver.reportTimeline(inputEventId, gpuCompletedTime, presentTime); } } HardwareRendererObserver mHardwareRendererObserver; @@ -10204,9 +10202,6 @@ public final class ViewRootImpl implements ViewParent, if (useBLAST() && mBlastBufferQueue != null) { mBlastBufferQueue.mergeWithNextTransaction(transaction, frameNumber); - } else { - transaction.deferTransactionUntil(surfaceControl, surfaceControl, frameNumber); - transaction.apply(); } } diff --git a/core/java/android/view/translation/UiTranslationController.java b/core/java/android/view/translation/UiTranslationController.java index 7d1df9cd51b8..53e354f8200e 100644 --- a/core/java/android/view/translation/UiTranslationController.java +++ b/core/java/android/view/translation/UiTranslationController.java @@ -101,7 +101,8 @@ public class UiTranslationController { */ public void updateUiTranslationState(@UiTranslationState int state, TranslationSpec sourceSpec, TranslationSpec destSpec, List<AutofillId> views) { - if (!mActivity.isResumed()) { + if (!mActivity.isResumed() && (state == STATE_UI_TRANSLATION_STARTED + || state == STATE_UI_TRANSLATION_RESUMED)) { return; } Log.i(TAG, "updateUiTranslationState state: " + stateToString(state) diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 957e416986e0..6bf46457a1de 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -34,7 +34,7 @@ import android.telephony.SignalStrength; 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/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 0a2c2eca847f..c144451c1b94 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" /> @@ -2759,8 +2758,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"/> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index eb179911b1c9..26ac8c154f75 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -573,7 +573,8 @@ <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> + <!-- 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">"Kon nie vingerafdruk verwerk nie. Probeer asseblief weer."</string> @@ -620,14 +621,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 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 +1029,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 +2136,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 +2261,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 9dd9814e266d..bad2d4364c6b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 b2f83b7511bb..564f1368bd0b 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -585,7 +585,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> @@ -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> @@ -2416,8 +2418,7 @@ <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_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 3c7e37204c83..890410998072 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -573,7 +573,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 +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> @@ -2280,8 +2282,7 @@ <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_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 48e83b2d961a..a753fd891a4e 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 78fce43f1ec9..9d913a265cb9 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -576,7 +576,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 +624,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 +664,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 +1032,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> @@ -2175,31 +2170,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 +2295,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 12a9b42958aa..eb30d2d5fa13 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,14 +541,10 @@ <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) --> - <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) --> - <skip /> + <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> <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> @@ -585,7 +579,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 +627,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 +667,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 +1035,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> @@ -2215,31 +2204,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 +2329,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 258dad5e01a5..317ad7ab46c8 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 55823300d316..52fc66649d4b 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,14 +535,10 @@ <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) --> - <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) --> - <skip /> + <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> <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"পছন্দের NFC পেমেন্ট পরিষেবার তথ্য"</string> <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"অ্যাপের মাধ্যমে পছন্দসই এনএফসি পেমেন্ট পরিষেবার তথ্য, যেমন রেজিস্ট্রার করার সহায়তা এবং রুট ডেস্টিনেশন সম্পর্কিত তথ্য অ্যাক্সেস করার অনুমতি দেয়।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"নিয়ার ফিল্ড কমিউনিকেশন নিয়ন্ত্রণ করে"</string> @@ -579,7 +573,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> @@ -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> @@ -2286,8 +2282,7 @@ <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_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 b6d478fecd1b..0921e5f6a077 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -576,7 +576,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 +624,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 +664,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 +1032,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 +2170,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 +2295,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 023ec099fd2b..35ae1debed14 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +1322,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 +2136,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">"L\'administrador de TI ha bloquejat la compartició"</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 +2261,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 34846ec04272..36e130ec0b9e 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -579,7 +579,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 +627,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 +667,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 +1035,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 +2204,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 +2329,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 475b274f3166..0e00d3e3bb37 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -575,7 +575,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Fingeraftrykket kunne ikke behandles. Prøv igen."</string> @@ -622,14 +623,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 +663,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 +1031,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 +2138,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 +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">"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 f8cb56041b3d..0a516453d329 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -573,7 +573,8 @@ <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> + <!-- 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">"Fingerabdruck konnte nicht verarbeitet werden. Bitte versuche es noch einmal."</string> @@ -664,7 +665,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 727963405d39..ddefff5fab92 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -573,7 +573,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> @@ -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">"Χρήση προσώπου ή κλειδώματος οθόνης"</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> @@ -2280,8 +2282,7 @@ <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_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 9fdd65b230ee..ff07433cb2ce 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string> @@ -660,7 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 2f0a4d23da00..9e314c17e686 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string> @@ -660,7 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 e52ff7d28044..1e3bbdeebb68 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string> @@ -660,7 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 a73db0038c30..b4c6c851afba 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string> @@ -660,7 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 12bc97832a58..9e9025cae05e 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> @@ -573,29 +572,23 @@ <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) --> + <!-- no translation found for screen_lock_dialog_default_subtitle (120359538048533695) --> <skip /> + <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 +653,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 475fe5f04592..55850e3c58b2 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -573,7 +573,8 @@ <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 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 pudo procesar la huella dactilar. Vuelve a intentarlo."</string> @@ -664,7 +665,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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> @@ -2280,8 +2282,7 @@ <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_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 3aefd2bd3d81..8276269555e1 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 el navegador personal"</string> + <string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar el navegador del 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 +2261,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 d45e91796e33..264fa4172edd 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 a4dad808db12..2a6b107a2599 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 7ce6cf013718..80f0870866a8 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 7320df7ec0b1..95951dde74ea 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 a6c8195fa1c9..8a1ddd531f86 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 48b3f260fb5b..479adf1422a1 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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,8 +2261,7 @@ <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 /> + <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nouveaux paramètres d\'agrandissement"</string> <!-- no translation found for window_magnification_prompt_content (8159173903032344891) --> <skip /> <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 69ab060de820..2e252e51da6c 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 60d95a395655..fe918d847f38 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -573,7 +573,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 +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> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ba237ce2e1cf..4994da950e02 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -573,7 +573,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 +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> @@ -2280,8 +2282,7 @@ <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_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 b7db3080b6a6..3d774ee5dac7 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -576,7 +576,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 +624,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 +664,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 +1032,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 +2170,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 +2295,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 ceefe4fc7a0c..4ef186461e5e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 0ac8e92db377..980f1afb60f7 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 0b8bae6fdaaa..82a193de3947 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +1265,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 +1360,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 +2136,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 +2261,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 c37c52cf34c7..8e7c9ec1e751 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ekki var hægt að vinna úr fingrafarinu. Reyndu aftur."</string> @@ -620,14 +621,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 +661,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 +1029,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 +2136,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 +2261,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 27ee7ceae6ed..c34defc721e2 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossibile elaborare l\'impronta. Riprova."</string> @@ -620,14 +621,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 +661,8 @@ <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> + <!-- no translation found for face_dialog_default_subtitle (6620492813371195429) --> + <skip /> <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 +1029,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 +2136,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 +2261,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 7e4b8adce9fc..7dda7ce3278f 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -42,7 +42,7 @@ <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> @@ -238,7 +238,7 @@ <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" 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> @@ -247,7 +247,7 @@ <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> @@ -302,7 +302,7 @@ <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_multiple_separator" msgid="5002287361849863168">"<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>, <xliff:g id="LEFT_SIDE">%1$s</xliff:g>"</string> @@ -387,7 +387,7 @@ <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> @@ -579,7 +579,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> @@ -587,7 +588,7 @@ <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 +610,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> @@ -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> @@ -914,9 +916,9 @@ <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_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_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> @@ -924,7 +926,7 @@ <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_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> @@ -956,11 +958,11 @@ <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> @@ -971,7 +973,7 @@ <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_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> @@ -1160,7 +1162,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,7 +1174,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_relative_future" formatted="false" msgid="1964709470979250702"> <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item> @@ -1248,13 +1250,13 @@ <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="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> @@ -1275,7 +1277,7 @@ <string name="aerr_wait" msgid="3198677780474548217">"להמתין"</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_process" msgid="1664277165911816067">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> אינו מגיב."</string> @@ -1292,7 +1294,7 @@ <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_process" msgid="1398801497130695446">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הפר את מדיניות StrictMode באכיפה עצמית."</string> @@ -1321,7 +1323,7 @@ <string name="dump_heap_ready_notification" msgid="2302452262927390268">"Dump של ערימה בשביל <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_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="sendText" msgid="493003724401350724">"בחירת פעולה לביצוע עם טקסט"</string> @@ -1510,7 +1512,7 @@ <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"מאפשרת לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו."</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> @@ -1549,7 +1551,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> @@ -1610,7 +1612,7 @@ <string name="keyboardview_keycode_enter" msgid="168054869339091055">"Enter"</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> @@ -1655,7 +1657,7 @@ <string name="sha1_fingerprint" msgid="2339915142825390774">"טביעת אצבע SHA-1:"</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="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> @@ -1677,7 +1679,7 @@ <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_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> @@ -1691,7 +1693,7 @@ <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> @@ -1721,7 +1723,7 @@ <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_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> @@ -1875,7 +1877,7 @@ <string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"יש להזין את קוד האימות של מנהל המכשיר"</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> @@ -2018,7 +2020,7 @@ <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> @@ -2120,7 +2122,7 @@ <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="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="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> @@ -2348,8 +2350,7 @@ <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_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 aa98621df113..6be065139e3d 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 5d851e01549c..2c1a016c629e 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 0f82f8434c0a..4a6548238db1 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 852811829c26..c8e183882a0b 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 f0ed6faa5ecd..1a450add12f6 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -573,7 +573,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 +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> @@ -2280,8 +2282,7 @@ <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_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 bbac5e8b20fb..dc59a700dcfc 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 89d23988ddde..40940b059a0a 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 8baca0869896..5b0208bb64ce 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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 aac2dc668ffd..07438b5d0d6d 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -579,7 +579,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 +627,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 +667,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 +1035,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 +2204,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 +2329,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 d4b2f7e85f87..e8dceb9677f7 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -576,7 +576,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 +624,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 +664,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 +1032,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 +2170,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 +2295,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 99a888d01134..2f1954a430e8 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 45a99f1cf555..1143e22c119d 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 bc0789030d22..30c664f4ab92 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -445,7 +445,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> @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +1280,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 +2136,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 +2261,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 b63d6a7d241a..ddc001f472e9 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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,8 +2261,7 @@ <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 /> + <string name="window_magnification_prompt_title" msgid="2876703640772778215">"नवीन मॅग्निफिकेशन सेटिंग्ज"</string> <!-- no translation found for window_magnification_prompt_content (8159173903032344891) --> <skip /> <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"सेटिंग्ज मध्ये सुरू करा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 1a047418a5dd..4d8726701009 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -573,7 +573,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 +621,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 menambah 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 +661,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 +1029,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 +2136,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"</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 +2261,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 9e41ccd33505..f2e813c90b9c 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 0ca8b91d9b67..9921422185e8 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 6a0ba3bd75cd..8d11114e78bb 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -573,7 +573,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> @@ -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> @@ -2280,8 +2282,7 @@ <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_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-nl/strings.xml b/core/res/res/values-nl/strings.xml index 92cd82b431d7..d8507f3bf7ed 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> @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kan vingerafdruk niet verwerken. Probeer het opnieuw."</string> @@ -604,7 +605,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 +621,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 +657,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 +670,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 +901,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 +1029,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 +1372,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 +1401,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 +1653,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 +1688,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 +1697,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 +1822,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 +1859,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 +1898,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 +2136,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 +2261,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 e392f64233c4..44831e304227 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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,8 +2261,7 @@ <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 /> + <string name="window_magnification_prompt_title" msgid="2876703640772778215">"ନୂଆ ମ୍ୟାଗ୍ନିଫିକେସନ୍ ସେଟିଂସ୍"</string> <!-- no translation found for window_magnification_prompt_content (8159173903032344891) --> <skip /> <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"ସେଟିଂସରେ ଚାଲୁ କରନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 5daf8c88e073..918753a05105 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -573,7 +573,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 +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> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index c07b40fcd434..60f395d2d8e5 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -579,7 +579,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> @@ -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> @@ -2348,8 +2350,7 @@ <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_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 c286e23f9fb2..a65056de43b2 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -573,7 +573,8 @@ <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 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> @@ -660,7 +661,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 +2262,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 80b0f0360b1c..f92481c25e88 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 c286e23f9fb2..a65056de43b2 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -573,7 +573,8 @@ <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 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> @@ -660,7 +661,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 +2262,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 a3435a3f456c..0f4005abb478 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -576,7 +576,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> @@ -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> @@ -2314,8 +2316,7 @@ <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_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 58e86a76463e..d015f3089787 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -579,7 +579,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> @@ -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> @@ -2348,8 +2350,7 @@ <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_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 97da7bd6c658..0f54b2020a11 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 ca71551ad65b..af1566e90ec9 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -579,7 +579,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Odtlačok prsta sa nepodarilo spracovať. Skúste to znova."</string> @@ -626,14 +627,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 +667,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 +1035,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 +2204,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 +2329,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 0da1ec669a14..4752a7467566 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -579,7 +579,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Prstnega odtisa ni bilo mogoče obdelati. Poskusite znova."</string> @@ -670,7 +671,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> @@ -2348,8 +2350,7 @@ <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_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 07be4eec80d4..1044f21b7e0f 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 27ffe44c20df..99e909c76aa2 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -576,7 +576,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 +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> @@ -667,7 +664,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 +1032,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> @@ -2175,31 +2170,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 +2295,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 ed5b7462929d..c7a91f7dfa40 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 21998ed2be92..728c4a604d9a 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 c27d4956fa53..d0e2b34c7021 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -573,7 +573,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 +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> @@ -2280,8 +2282,7 @@ <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_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 e1d4cfb5193d..91f766e61769 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -573,7 +573,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 +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> @@ -2280,8 +2282,7 @@ <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_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 c46c43bf5dc1..583f00c07c4e 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 790c25e25109..0692c139cdec 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 be54f7cc2f76..b16d02df6e44 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 2cb286f07d3e..95d63aa53abe 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -579,7 +579,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 +627,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 +667,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 +1035,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 +2204,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 +2329,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 c0f21c420bc6..418b9ebc91e6 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -573,7 +573,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 +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> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index f7ed329baed4..048c3022a427 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -573,7 +573,8 @@ <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 screen_lock_dialog_default_subtitle (120359538048533695) --> + <skip /> <!-- no translation found for fingerprint_acquired_partial (694598777291084823) --> <skip /> <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Barmoq izi aniqlanmadi. Qaytadan urining."</string> @@ -620,14 +621,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 +661,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 +1029,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 +2136,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 +2261,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 cabfdfa9118c..22714a8e7619 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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,8 +2261,7 @@ <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 /> + <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Chế độ cài đặt phóng to mới"</string> <!-- no translation found for window_magnification_prompt_content (8159173903032344891) --> <skip /> <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bật trong phần Cài đặt"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index c8f035a60619..93fcf30beb07 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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,8 +2261,7 @@ <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 /> + <string name="window_magnification_prompt_title" msgid="2876703640772778215">"推出了新的放大设置"</string> <!-- no translation found for window_magnification_prompt_content (8159173903032344891) --> <skip /> <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"在“设置”中开启"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 68fef917f457..57423e14363c 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 1ab5024b26e7..74cbe3709268 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 d6fcb0dd1969..0f0cf74bdaca 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -573,7 +573,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 +621,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 +661,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 +1029,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 +2136,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 +2261,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 bf790fa5ff95..32732170e92b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3939,10 +3939,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> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 9e159f9e511e..6cccdb5c3148 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 77ef15b438c3..58fa8de4970e 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1576,7 +1576,7 @@ <!-- Name for an app setting that lets the user authenticate for that app with their screen lock credential (i.e. PIN, pattern, or password). [CHAR LIMIT=30] --> <string name="screen_lock_app_setting_name">Use screen lock</string> <!-- Subtitle shown on the system-provided biometric dialog, asking the user to authenticate with their screen lock credential (i.e. PIN, pattern, or password). [CHAR LIMIT=70] --> - <string name="screen_lock_dialog_default_subtitle">Enter your device credential to continue</string> + <string name="screen_lock_dialog_default_subtitle">Enter your screen lock to continue</string> <!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized --> <string name="fingerprint_acquired_partial">Partial fingerprint detected</string> @@ -1746,7 +1746,7 @@ <!-- Name for an app setting that lets the user authenticate for that app with their face or screen lock credential (i.e. PIN, pattern, or password). [CHAR LIMIT=70] --> <string name="face_or_screen_lock_app_setting_name">Use face or screen lock</string> <!-- Subtitle shown on the system-provided biometric dialog, asking the user to authenticate with their face. [CHAR LIMIT=70] --> - <string name="face_dialog_default_subtitle">Use face unlock to continue</string> + <string name="face_dialog_default_subtitle">Use your face to continue</string> <!-- Subtitle shown on the system-provided biometric dialog, asking the user to authenticate with their face or screen lock credential (i.e. PIN, pattern, or password). [CHAR LIMIT=90] --> <string name="face_or_screen_lock_dialog_default_subtitle">Use your face or screen lock to continue</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 1ab3c849cae7..e607b11e5297 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" /> diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index 0ea63643d24e..0f8c9e2de826 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.Context; 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 class NotificationTest { 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 @@ public class NotificationTest { 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 class NotificationTest { 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 @@ public class NotificationTest { 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/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java index a18a88cb2ca8..60df9688b5a4 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 class BatteryUsageStatsTest { } 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/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 1eecca5baa2c..8312320a8d87 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -499,6 +499,8 @@ applications that come with the platform <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"/> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/drm/java/Android.bp b/drm/java/Android.bp index 54e1a8c0dff8..21fc018f7f4a 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 dcfd5d72a7cb..63d1f6d6f2d6 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/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index f28b66d12688..3bd0a43652d2 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -48,6 +48,7 @@ import android.graphics.RecordingCanvas; 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; @@ -151,7 +152,8 @@ public class RippleDrawable extends LayerDrawable { 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 = true; + private static final boolean FORCE_PATTERNED_STYLE = + SystemProperties.getBoolean("persist.material.patternedripple", false); private final Rect mTempRect = new Rect(); diff --git a/identity/Android.bp b/identity/Android.bp new file mode 100644 index 000000000000..826d6f806573 --- /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 16aef5d2d871..a193d9764c7a 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 6860f71a8516..21edff1e1c96 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/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index 9eec48c02306..64bd245cb2ee 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 @@ public class BubbleStackView extends FrameLayout 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 @@ public class BubbleStackView extends FrameLayout @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 @@ public class BubbleStackView extends FrameLayout 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 @@ public class BubbleStackView extends FrameLayout // 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 @@ public class BubbleStackView extends FrameLayout /** 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 @@ public class BubbleStackView extends FrameLayout * 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 @@ public class BubbleStackView extends FrameLayout mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix); }) .withEndActions(() -> { - mExpandedViewHidden = false; + mExpandedViewTemporarilyHidden = false; mIsBubbleSwitchAnimating = false; }) .start(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java index f118b1e0b7a3..b7235a31af03 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java @@ -150,6 +150,7 @@ public class DisplayLayout { mDensityDpi = dl.mDensityDpi; mHasNavigationBar = dl.mHasNavigationBar; mHasStatusBar = dl.mHasStatusBar; + mNavBarFrameHeight = dl.mNavBarFrameHeight; mNonDecorInsets.set(dl.mNonDecorInsets); mStableInsets.set(dl.mStableInsets); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java index a7e9a0135de0..242f8f120e27 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java @@ -89,4 +89,9 @@ public interface OneHanded { * Receive onConfigurationChanged() events */ void onConfigChanged(Configuration newConfig); + + /** + * Notifies when user switch complete + */ + void onUserSwitch(int userId); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 8bbc35fa7c61..38cf9e6183b4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -17,6 +17,7 @@ package com.android.wm.shell.onehanded; import static android.os.UserHandle.USER_CURRENT; +import static android.os.UserHandle.myUserId; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission; @@ -74,6 +75,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> private volatile boolean mIsSwipeToNotificationEnabled; private boolean mTaskChangeToExit; private boolean mLockedDisabled; + private int mUserId; private float mOffSetFraction; private Context mContext; @@ -141,7 +143,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController> } if (enabled) { final int mOneHandedTimeout = mOneHandedSettingsUtil - .getSettingsOneHandedModeTimeout(mContext.getContentResolver()); + .getSettingsOneHandedModeTimeout( + mContext.getContentResolver(), mUserId); final int timeout = mAccessibilityManager .getRecommendedTimeoutMillis(mOneHandedTimeout * 1000 /* align with A11y timeout millis */, @@ -149,7 +152,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController> mTimeoutHandler.setTimeout(timeout / 1000); } else { mTimeoutHandler.setTimeout(mOneHandedSettingsUtil - .getSettingsOneHandedModeTimeout(mContext.getContentResolver())); + .getSettingsOneHandedModeTimeout( + mContext.getContentResolver(), mUserId)); } } }; @@ -247,12 +251,13 @@ public class OneHandedController implements RemoteCallable<OneHandedController> R.fraction.config_one_handed_offset, 1, 1); final int sysPropPercentageConfig = SystemProperties.getInt( ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f)); + mUserId = myUserId(); mOffSetFraction = sysPropPercentageConfig / 100.0f; mIsOneHandedEnabled = mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - context.getContentResolver()); + context.getContentResolver(), mUserId); mIsSwipeToNotificationEnabled = mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( - context.getContentResolver()); + context.getContentResolver(), mUserId); mTimeoutHandler = timeoutHandler; mEnabledObserver = getObserver(this::onEnabledSettingChanged); @@ -262,9 +267,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController> getObserver(this::onSwipeToNotificationEnabledSettingChanged); mDisplayController.addDisplayChangingController(mRotationController); - setupCallback(); - setupSettingObservers(); + registerSettingObservers(mUserId); setupTimeoutListener(); setupGesturalOverlay(); updateSettings(); @@ -379,27 +383,38 @@ public class OneHandedController implements RemoteCallable<OneHandedController> } } - private void setupSettingObservers() { + private void registerSettingObservers(int newUserId) { mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_ENABLED, - mContext.getContentResolver(), mEnabledObserver); + mContext.getContentResolver(), mEnabledObserver, newUserId); mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_TIMEOUT, - mContext.getContentResolver(), mTimeoutObserver); + mContext.getContentResolver(), mTimeoutObserver, newUserId); mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.TAPS_APP_TO_EXIT, - mContext.getContentResolver(), mTaskChangeExitObserver); + mContext.getContentResolver(), mTaskChangeExitObserver, newUserId); mOneHandedSettingsUtil.registerSettingsKeyObserver( Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, - mContext.getContentResolver(), mSwipeToNotificationEnabledObserver); + mContext.getContentResolver(), mSwipeToNotificationEnabledObserver, newUserId); + } + + private void unregisterSettingObservers() { + mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), + mEnabledObserver); + mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), + mTimeoutObserver); + mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), + mTaskChangeExitObserver); + mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), + mSwipeToNotificationEnabledObserver); } private void updateSettings() { setOneHandedEnabled(mOneHandedSettingsUtil - .getSettingsOneHandedModeEnabled(mContext.getContentResolver())); + .getSettingsOneHandedModeEnabled(mContext.getContentResolver(), mUserId)); mTimeoutHandler.setTimeout(mOneHandedSettingsUtil - .getSettingsOneHandedModeTimeout(mContext.getContentResolver())); + .getSettingsOneHandedModeTimeout(mContext.getContentResolver(), mUserId)); setTaskChangeToExit(mOneHandedSettingsUtil - .getSettingsTapsAppToExit(mContext.getContentResolver())); + .getSettingsTapsAppToExit(mContext.getContentResolver(), mUserId)); setSwipeToNotificationEnabled(mOneHandedSettingsUtil - .getSettingsSwipeToNotificationEnabled(mContext.getContentResolver())); + .getSettingsSwipeToNotificationEnabled(mContext.getContentResolver(), mUserId)); } private void updateDisplayLayout(int displayId) { @@ -420,7 +435,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> @VisibleForTesting void onEnabledSettingChanged() { final boolean enabled = mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - mContext.getContentResolver()); + mContext.getContentResolver(), mUserId); mOneHandedUiEventLogger.writeEvent(enabled ? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_ENABLED_ON : OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_ENABLED_OFF); @@ -430,13 +445,13 @@ public class OneHandedController implements RemoteCallable<OneHandedController> // Also checks swipe to notification settings since they all need gesture overlay. setEnabledGesturalOverlay( enabled || mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( - mContext.getContentResolver())); + mContext.getContentResolver(), mUserId)); } @VisibleForTesting void onTimeoutSettingChanged() { final int newTimeout = mOneHandedSettingsUtil.getSettingsOneHandedModeTimeout( - mContext.getContentResolver()); + mContext.getContentResolver(), mUserId); int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId(); switch (newTimeout) { case OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_NEVER: @@ -465,7 +480,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> @VisibleForTesting void onTaskChangeExitSettingChanged() { final boolean enabled = mOneHandedSettingsUtil.getSettingsTapsAppToExit( - mContext.getContentResolver()); + mContext.getContentResolver(), mUserId); mOneHandedUiEventLogger.writeEvent(enabled ? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_ON : OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_OFF); @@ -477,13 +492,13 @@ public class OneHandedController implements RemoteCallable<OneHandedController> void onSwipeToNotificationEnabledSettingChanged() { final boolean enabled = mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( - mContext.getContentResolver()); + mContext.getContentResolver(), mUserId); setSwipeToNotificationEnabled(enabled); // Also checks one handed mode settings since they all need gesture overlay. setEnabledGesturalOverlay( enabled || mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - mContext.getContentResolver())); + mContext.getContentResolver(), mUserId)); } private void setupTimeoutListener() { @@ -524,7 +539,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> private void setupGesturalOverlay() { if (!mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - mContext.getContentResolver())) { + mContext.getContentResolver(), mUserId)) { return; } @@ -572,6 +587,14 @@ public class OneHandedController implements RemoteCallable<OneHandedController> } } + private void onUserSwitch(int newUserId) { + unregisterSettingObservers(); + mUserId = newUserId; + registerSettingObservers(newUserId); + updateSettings(); + updateOneHandedEnabled(); + } + public void dump(@NonNull PrintWriter pw) { final String innerPrefix = " "; pw.println(TAG + "States: "); @@ -579,6 +602,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController> pw.println(mOffSetFraction); pw.print(innerPrefix + "mLockedDisabled="); pw.println(mLockedDisabled); + pw.print(innerPrefix + "mUserId="); + pw.println(mUserId); if (mBackgroundPanelOrganizer != null) { mBackgroundPanelOrganizer.dump(pw); @@ -604,7 +629,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> mTutorialHandler.dump(pw); } - mOneHandedSettingsUtil.dump(pw, innerPrefix, mContext.getContentResolver()); + mOneHandedSettingsUtil.dump(pw, innerPrefix, mContext.getContentResolver(), mUserId); if (mOverlayManager != null) { OverlayInfo info = null; @@ -703,6 +728,13 @@ public class OneHandedController implements RemoteCallable<OneHandedController> OneHandedController.this.onConfigChanged(newConfig); }); } + + @Override + public void onUserSwitch(int userId) { + mMainExecutor.execute(() -> { + OneHandedController.this.onUserSwitch(userId); + }); + } } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java index fa94ec557883..1b2fcdd6313e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java @@ -22,6 +22,8 @@ import android.database.ContentObserver; import android.net.Uri; import android.provider.Settings; +import androidx.annotation.Nullable; + import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -62,17 +64,19 @@ public final class OneHandedSettingsUtil { /** * Register one handed preference settings observer * - * @param key Setting key to monitor in observer - * @param resolver ContentResolver of context - * @param observer Observer from caller + * @param key Setting key to monitor in observer + * @param resolver ContentResolver of context + * @param observer Observer from caller + * @param newUserId New user id to be registered * @return uri key for observing */ + @Nullable public Uri registerSettingsKeyObserver(String key, ContentResolver resolver, - ContentObserver observer) { + ContentObserver observer, int newUserId) { Uri uriKey = null; uriKey = Settings.Secure.getUriFor(key); if (resolver != null && uriKey != null) { - resolver.registerContentObserver(uriKey, false, observer); + resolver.registerContentObserver(uriKey, false, observer, newUserId); } return uriKey; } @@ -80,8 +84,8 @@ public final class OneHandedSettingsUtil { /** * Unregister one handed preference settings observer * - * @param resolver ContentResolver of context - * @param observer preference key change observer + * @param resolver ContentResolver of context + * @param observer preference key change observer */ public void unregisterSettingsKeyObserver(ContentResolver resolver, ContentObserver observer) { @@ -95,9 +99,9 @@ public final class OneHandedSettingsUtil { * * @return enable or disable one handed mode flag. */ - public boolean getSettingsOneHandedModeEnabled(ContentResolver resolver) { - return Settings.Secure.getInt(resolver, - Settings.Secure.ONE_HANDED_MODE_ENABLED, 0 /* Disabled */) == 1; + public boolean getSettingsOneHandedModeEnabled(ContentResolver resolver, int userId) { + return Settings.Secure.getIntForUser(resolver, + Settings.Secure.ONE_HANDED_MODE_ENABLED, 0 /* Disabled */, userId) == 1; } /** @@ -105,40 +109,44 @@ public final class OneHandedSettingsUtil { * * @return enable or disable taps app exit. */ - public boolean getSettingsTapsAppToExit(ContentResolver resolver) { - return Settings.Secure.getInt(resolver, - Settings.Secure.TAPS_APP_TO_EXIT, 0) == 1; + public boolean getSettingsTapsAppToExit(ContentResolver resolver, int userId) { + return Settings.Secure.getIntForUser(resolver, + Settings.Secure.TAPS_APP_TO_EXIT, 0, userId) == 1; } /** - * Query timeout value from Settings provider. - * Default is {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS} + * Query timeout value from Settings provider. Default is + * {@link OneHandedSettingsUtil#ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS} * * @return timeout value in seconds. */ - public @OneHandedTimeout int getSettingsOneHandedModeTimeout(ContentResolver resolver) { - return Settings.Secure.getInt(resolver, - Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS); + public @OneHandedTimeout int getSettingsOneHandedModeTimeout(ContentResolver resolver, + int userId) { + return Settings.Secure.getIntForUser(resolver, + Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS, + userId); } /** * Returns whether swipe bottom to notification gesture enabled or not. */ - public boolean getSettingsSwipeToNotificationEnabled(ContentResolver resolver) { + public boolean getSettingsSwipeToNotificationEnabled(ContentResolver resolver, int userId) { return Settings.Secure.getInt(resolver, Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 0 /* Default OFF */) == 1; } - void dump(PrintWriter pw, String prefix, ContentResolver resolver) { + void dump(PrintWriter pw, String prefix, ContentResolver resolver, + int userId) { final String innerPrefix = prefix + " "; - pw.println(prefix + TAG); + pw.println(innerPrefix + TAG); pw.print(innerPrefix + "isOneHandedModeEnable="); - pw.println(getSettingsOneHandedModeEnabled(resolver)); + pw.println(getSettingsOneHandedModeEnabled(resolver, userId)); pw.print(innerPrefix + "oneHandedTimeOut="); - pw.println(getSettingsOneHandedModeTimeout(resolver)); + pw.println(getSettingsOneHandedModeTimeout(resolver, userId)); pw.print(innerPrefix + "tapsAppToExit="); - pw.println(getSettingsTapsAppToExit(resolver)); + pw.println(getSettingsTapsAppToExit(resolver, userId)); } + public OneHandedSettingsUtil() { } } 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 a52db24aa184..af4ccadae538 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 @@ -540,9 +540,10 @@ public class PipAnimationController { // WindowContainerTransaction in task organizer final Rect destBounds = getDestinationBounds(); getSurfaceTransactionHelper().resetScale(tx, leash, destBounds); - if (transitionDirection == TRANSITION_DIRECTION_LEAVE_PIP) { - // Leaving to fullscreen, reset crop to null. - tx.setPosition(leash, destBounds.left, destBounds.top); + if (isOutPipDirection(transitionDirection)) { + // Exit pip, clear scale, position and crop. + tx.setMatrix(leash, 1, 0, 0, 1); + tx.setPosition(leash, 0, 0); tx.setWindowCrop(leash, 0, 0); } else { getSurfaceTransactionHelper().crop(tx, leash, destBounds); 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 ffa821daf7f8..99ec10049340 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 @@ -1016,10 +1016,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.scheduleFinishEnterPip(mToken, destinationBounds); } else if (isOutPipDirection(direction)) { - // If we are animating to fullscreen, then we need to reset the override bounds - // on the task to ensure that the task "matches" the parent's bounds. - taskBounds = (direction == TRANSITION_DIRECTION_LEAVE_PIP) - ? null : destinationBounds; + // If we are animating to fullscreen or split screen, then we need to reset the + // override bounds on the task to ensure that the task "matches" the parent's bounds. + taskBounds = null; applyWindowingModeChangeOnExit(wct, direction); } else { // Just a resize in PIP 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 d75c1d65614d..62ae1d5d600c 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 @@ public class PipController implements PipTransitionController.PipTransitionCallb private PipBoundsState mPipBoundsState; private PipTouchHandler mTouchHandler; private PipTransitionController mPipTransitionController; + private TaskStackListenerImpl mTaskStackListener; private Optional<OneHandedController> mOneHandedController; protected final PipImpl mImpl; @@ -291,12 +292,18 @@ public class PipController implements PipTransitionController.PipTransitionCallb 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 @@ public class PipController implements PipTransitionController.PipTransitionCallb 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 @@ public class PipController implements PipTransitionController.PipTransitionCallb } // 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/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java index 99a663523d61..c26b686f91fb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java @@ -16,6 +16,8 @@ package com.android.wm.shell.pip.phone; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + import android.content.Context; import android.content.res.Resources; import android.graphics.PixelFormat; @@ -242,6 +244,7 @@ public class PipDismissTargetHandler { lp.setTitle("pip-dismiss-overlay"); lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; + lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; lp.setFitInsetsTypes(0 /* types */); return lp; 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 287f68f397ca..d474b6638e4a 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 @@ -782,7 +782,6 @@ public class PipTouchHandler { private final Point mStartPosition = new Point(); private final PointF mDelta = new PointF(); private boolean mShouldHideMenuAfterFling; - private float mDownSavedFraction = -1f; @Override public void onDown(PipTouchState touchState) { @@ -796,7 +795,6 @@ public class PipTouchHandler { mMovementWithinDismiss = touchState.getDownTouchPosition().y >= mPipBoundsState.getMovementBounds().bottom; mMotionHelper.setSpringingToTouch(false); - mDownSavedFraction = mPipBoundsAlgorithm.getSnapFraction(mPipBoundsState.getBounds()); // If the menu is still visible then just poke the menu // so that it will timeout after the user stops touching it @@ -867,9 +865,12 @@ public class PipTouchHandler { if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds())) { mMotionHelper.stashToEdge(vel.x, vel.y, this::stashEndAction /* endAction */); } else { - mPipUiEventLogger.log( - PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED); - mPipBoundsState.setStashed(STASH_TYPE_NONE); + if (mPipBoundsState.isStashed()) { + // Reset stashed state if previously stashed + mPipUiEventLogger.log( + PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED); + mPipBoundsState.setStashed(STASH_TYPE_NONE); + } mMotionHelper.flingToSnapTarget(vel.x, vel.y, this::flingEndAction /* endAction */); } @@ -896,19 +897,19 @@ public class PipTouchHandler { mMotionHelper.expandLeavePip(); } } else if (mMenuState != MENU_STATE_FULL) { - if (!mTouchState.isWaitingForDoubleTap()) { - if (mPipBoundsState.isStashed()) { - animateToUnStashedState(); - mPipUiEventLogger.log( - PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED); - mPipBoundsState.setStashed(STASH_TYPE_NONE); - } else { - // User has stalled long enough for this not to be a drag or a double tap, - // just expand the menu - mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(), - true /* allowMenuTimeout */, willResizeMenu(), - shouldShowResizeHandle()); - } + if (mPipBoundsState.isStashed()) { + // Unstash immediately if stashed, and don't wait for the double tap timeout + animateToUnStashedState(); + mPipUiEventLogger.log( + PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED); + mPipBoundsState.setStashed(STASH_TYPE_NONE); + mTouchState.removeDoubleTapTimeoutCallback(); + } else if (!mTouchState.isWaitingForDoubleTap()) { + // User has stalled long enough for this not to be a drag or a double tap, + // just expand the menu + mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(), + true /* allowMenuTimeout */, willResizeMenu(), + shouldShowResizeHandle()); } else { // Next touch event _may_ be the second tap for the double-tap, schedule a // fallback runnable to trigger the menu if no touch event occurs before the @@ -916,7 +917,6 @@ public class PipTouchHandler { mTouchState.scheduleDoubleTapTimeoutCallback(); } } - mDownSavedFraction = -1f; return true; } @@ -932,6 +932,7 @@ public class PipTouchHandler { PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_RIGHT); mPipBoundsState.setStashed(STASH_TYPE_RIGHT); } + mMenuController.hideMenu(); } private void flingEndAction() { 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 index 5713822bba99..84f66fc14969 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 @@ package com.android.wm.shell.flicker.pip 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.MethodSorters 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 @@ class PipMovesInAllApps(testSpec: FlickerTestParameter) : PipTransition(testSpec eachRun { taplInstrumentation.pressHome() } + test { + testApp.exit(wmHelper) + } } transitions { - taplInstrumentation.pressHome().switchToAllApps() - wmHelper.waitForAppTransitionIdle() + testApp.launchViaIntent(wmHelper) } } @@ -68,7 +71,7 @@ class PipMovesInAllApps(testSpec: FlickerTestParameter) : PipTransition(testSpec } } - @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/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java index b0fc4c14a6bf..e309f9659338 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.when; import android.content.om.IOverlayManager; import android.graphics.Rect; import android.os.Handler; +import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.util.ArrayMap; import android.view.Display; @@ -53,6 +54,8 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedControllerTest extends OneHandedTestCase { + private int mCurrentUser = UserHandle.myUserId(); + Display mDisplay; DisplayLayout mDisplayLayout; OneHandedController mSpiedOneHandedController; @@ -100,13 +103,13 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>()); when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash); - when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any())).thenReturn( + when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn( mDefaultEnabled); - when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any())).thenReturn( + when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn( OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS); - when(mMockSettingsUitl.getSettingsTapsAppToExit(any())).thenReturn( + when(mMockSettingsUitl.getSettingsTapsAppToExit(any(), anyInt())).thenReturn( mDefaultTapAppToExitEnabled); - when(mMockSettingsUitl.getSettingsSwipeToNotificationEnabled(any())).thenReturn( + when(mMockSettingsUitl.getSettingsSwipeToNotificationEnabled(any(), anyInt())).thenReturn( mDefaultSwipeToNotificationEnabled); when(mMockDisplayAreaOrganizer.getLastDisplayBounds()).thenReturn( 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 700bf7850604..c61302be19b1 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 @@ public class PipControllerTest extends ShellTestCase { @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/location/java/Android.bp b/location/java/Android.bp index 996a7ea37adf..543f2b1ab4a8 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 b95b0daf428e..58513d70042c 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/ExifInterface.java b/media/java/android/media/ExifInterface.java index 21f8623b1953..d746c850a018 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -32,6 +32,7 @@ import android.content.res.AssetManager; 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 @@ public class ExifInterface { 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 @@ public class ExifInterface { 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/MediaCodec.java b/media/java/android/media/MediaCodec.java index 822d22b072d6..4968bd1e0ce7 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -1684,7 +1684,6 @@ final public class MediaCodec { 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 2448d481af2e..50a326e9a595 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -219,6 +219,15 @@ public final class MediaFormat { 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 c13f610a908c..2943eee5b1da 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -33,6 +33,7 @@ import android.os.Build; 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 class MediaMetadataRetriever implements AutoCloseable { */ 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 644afb79814f..2d8babdc9f94 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -46,6 +46,7 @@ import android.os.IBinder; 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.UUID; 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 class MediaPlayer extends PlayerBase */ 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/PlayerBase.java b/media/java/android/media/PlayerBase.java index 5d0f0aa8a921..86ed50bacb63 100644 --- a/media/java/android/media/PlayerBase.java +++ b/media/java/android/media/PlayerBase.java @@ -19,12 +19,10 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; -import android.app.AppOpsManager; import android.content.Context; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; -import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.text.TextUtils; @@ -51,10 +49,6 @@ public abstract class PlayerBase { private static final boolean DEBUG = DEBUG_APP_OPS || false; private static IAudioService sService; //lazy initialization, use getService() - /** if true, only use OP_PLAY_AUDIO monitoring for logging, and rely on muting to happen - * in AudioFlinger */ - private static final boolean USE_AUDIOFLINGER_MUTING_FOR_OP = true; - // parameters of the player that affect AppOps protected AudioAttributes mAttributes; @@ -112,21 +106,6 @@ public abstract class PlayerBase { * Call from derived class when instantiation / initialization is successful */ protected void baseRegisterPlayer(int sessionId) { - if (!USE_AUDIOFLINGER_MUTING_FOR_OP) { - IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE); - mAppOps = IAppOpsService.Stub.asInterface(b); - // initialize mHasAppOpsPlayAudio - updateAppOpsPlayAudio(); - // register a callback to monitor whether the OP_PLAY_AUDIO is still allowed - mAppOpsCallback = new IAppOpsCallbackWrapper(this); - try { - mAppOps.startWatchingMode(AppOpsManager.OP_PLAY_AUDIO, - ActivityThread.currentPackageName(), mAppOpsCallback); - } catch (RemoteException e) { - Log.e(TAG, "Error registering appOps callback", e); - mHasAppOpsPlayAudio = false; - } - } try { mPlayerIId = getService().trackPlayer( new PlayerIdCard(mImplType, mAttributes, new IPlayerWrapper(this), @@ -150,9 +129,7 @@ public abstract class PlayerBase { Log.e(TAG, "Error talking to audio service, audio attributes will not be updated", e); } synchronized (mLock) { - boolean attributesChanged = (mAttributes != attr); mAttributes = attr; - updateAppOpsPlayAudio_sync(attributesChanged); } } @@ -209,11 +186,6 @@ public abstract class PlayerBase { Log.v(TAG, "baseStart() piid=" + mPlayerIId + " deviceId=" + deviceId); } updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED, deviceId); - synchronized (mLock) { - if (isRestricted_sync()) { - playerSetVolume(true/*muting*/,0, 0); - } - } } void baseSetStartDelayMs(int delayMs) { @@ -254,13 +226,11 @@ public abstract class PlayerBase { private void updatePlayerVolume() { final float finalLeftVol, finalRightVol; - final boolean isRestricted; synchronized (mLock) { finalLeftVol = mVolMultiplier * mLeftVolume * mPanMultiplierL; finalRightVol = mVolMultiplier * mRightVolume * mPanMultiplierR; - isRestricted = isRestricted_sync(); } - playerSetVolume(isRestricted /*muting*/, finalLeftVol, finalRightVol); + playerSetVolume(false /*muting*/, finalLeftVol, finalRightVol); } void setVolumeMultiplier(float vol) { @@ -281,9 +251,6 @@ public abstract class PlayerBase { int baseSetAuxEffectSendLevel(float level) { synchronized (mLock) { mAuxEffectSendLevel = level; - if (isRestricted_sync()) { - return AudioSystem.SUCCESS; - } } return playerSetAuxEffectSendLevel(false/*muting*/, level); } @@ -317,98 +284,6 @@ public abstract class PlayerBase { } } - private void updateAppOpsPlayAudio() { - synchronized (mLock) { - updateAppOpsPlayAudio_sync(false); - } - } - - /** - * To be called whenever a condition that might affect audibility of this player is updated. - * Must be called synchronized on mLock. - */ - void updateAppOpsPlayAudio_sync(boolean attributesChanged) { - if (USE_AUDIOFLINGER_MUTING_FOR_OP) { - return; - } - boolean oldHasAppOpsPlayAudio = mHasAppOpsPlayAudio; - try { - int mode = AppOpsManager.MODE_IGNORED; - if (mAppOps != null) { - mode = mAppOps.checkAudioOperation(AppOpsManager.OP_PLAY_AUDIO, - mAttributes.getUsage(), - Process.myUid(), ActivityThread.currentPackageName()); - } - mHasAppOpsPlayAudio = (mode == AppOpsManager.MODE_ALLOWED); - } catch (RemoteException e) { - mHasAppOpsPlayAudio = false; - } - - // AppsOps alters a player's volume; when the restriction changes, reflect it on the actual - // volume used by the player - try { - if (oldHasAppOpsPlayAudio != mHasAppOpsPlayAudio || - attributesChanged) { - getService().playerHasOpPlayAudio(mPlayerIId, mHasAppOpsPlayAudio); - if (!isRestricted_sync()) { - if (DEBUG_APP_OPS) { - Log.v(TAG, "updateAppOpsPlayAudio: unmuting player, vol=" + mLeftVolume - + "/" + mRightVolume); - } - playerSetVolume(false/*muting*/, - mLeftVolume * mPanMultiplierL, mRightVolume * mPanMultiplierR); - playerSetAuxEffectSendLevel(false/*muting*/, mAuxEffectSendLevel); - } else { - if (DEBUG_APP_OPS) { - Log.v(TAG, "updateAppOpsPlayAudio: muting player"); - } - playerSetVolume(true/*muting*/, 0.0f, 0.0f); - playerSetAuxEffectSendLevel(true/*muting*/, 0.0f); - } - } - } catch (Exception e) { - // failing silently, player might not be in right state - } - } - - /** - * To be called by the subclass whenever an operation is potentially restricted. - * As the media player-common behavior are incorporated into this class, the subclass's need - * to call this method should be removed, and this method could become private. - * FIXME can this method be private so subclasses don't have to worry about when to check - * the restrictions. - * @return - */ - boolean isRestricted_sync() { - if (USE_AUDIOFLINGER_MUTING_FOR_OP) { - return false; - } - // check app ops - if (mHasAppOpsPlayAudio) { - return false; - } - // check bypass flag - if ((mAttributes.getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY) != 0) { - return false; - } - // check force audibility flag and camera restriction - if (((mAttributes.getAllFlags() & AudioAttributes.FLAG_AUDIBILITY_ENFORCED) != 0) - && (mAttributes.getUsage() == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)) { - boolean cameraSoundForced = false; - try { - cameraSoundForced = getService().isCameraSoundForced(); - } catch (RemoteException e) { - Log.e(TAG, "Cannot access AudioService in isRestricted_sync()"); - } catch (NullPointerException e) { - Log.e(TAG, "Null AudioService in isRestricted_sync()"); - } - if (cameraSoundForced) { - return false; - } - } - return true; - } - private static IAudioService getService() { if (sService != null) { @@ -478,26 +353,6 @@ public abstract class PlayerBase { abstract void playerStop(); //===================================================================== - private static class IAppOpsCallbackWrapper extends IAppOpsCallback.Stub { - private final WeakReference<PlayerBase> mWeakPB; - - public IAppOpsCallbackWrapper(PlayerBase pb) { - mWeakPB = new WeakReference<PlayerBase>(pb); - } - - @Override - public void opChanged(int op, int uid, String packageName) { - if (op == AppOpsManager.OP_PLAY_AUDIO) { - if (DEBUG_APP_OPS) { Log.v(TAG, "opChanged: op=PLAY_AUDIO pack=" + packageName); } - final PlayerBase pb = mWeakPB.get(); - if (pb != null) { - pb.updateAppOpsPlayAudio(); - } - } - } - } - - //===================================================================== /** * Wrapper around an implementation of IPlayer for all subclasses of PlayerBase * that doesn't keep a strong reference on PlayerBase diff --git a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java index 4acaa58a1842..b82a5a914da8 100644 --- a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java +++ b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java @@ -52,8 +52,8 @@ public class FrontendStatus { FRONTEND_STATUS_TYPE_T2_SYSTEM_ID, FRONTEND_STATUS_TYPE_INTERLEAVINGS, FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS, FRONTEND_STATUS_TYPE_TS_DATA_RATES, FRONTEND_STATUS_TYPE_MODULATIONS_EXT, FRONTEND_STATUS_TYPE_ROLL_OFF, - FRONTEND_STATUS_TYPE_IS_MISO, FRONTEND_STATUS_TYPE_IS_LINEAR, - FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES}) + FRONTEND_STATUS_TYPE_IS_MISO_ENABLED, FRONTEND_STATUS_TYPE_IS_LINEAR, + FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED}) @Retention(RetentionPolicy.SOURCE) public @interface FrontendStatusType {} @@ -218,7 +218,7 @@ public class FrontendStatus { /** * If the frontend currently supports MISO or not. Only supported in Tuner HAL 1.1 or higher. */ - public static final int FRONTEND_STATUS_TYPE_IS_MISO = + public static final int FRONTEND_STATUS_TYPE_IS_MISO_ENABLED = android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.IS_MISO; /** * If the frontend code rate is linear or not. Only supported in Tuner HAL 1.1 or higher. @@ -228,7 +228,7 @@ public class FrontendStatus { /** * If short frames is enabled or not. Only supported in Tuner HAL 1.1 or higher. */ - public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES = + public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED = android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.IS_SHORT_FRAMES; /** @hide */ @@ -465,7 +465,7 @@ public class FrontendStatus { */ public boolean isDemodLocked() { if (mIsDemodLocked == null) { - throw new IllegalStateException(); + throw new IllegalStateException("DemodLocked status is empty"); } return mIsDemodLocked; } @@ -474,7 +474,7 @@ public class FrontendStatus { */ public int getSnr() { if (mSnr == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Snr status is empty"); } return mSnr; } @@ -485,7 +485,7 @@ public class FrontendStatus { */ public int getBer() { if (mBer == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Ber status is empty"); } return mBer; } @@ -497,7 +497,7 @@ public class FrontendStatus { */ public int getPer() { if (mPer == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Per status is empty"); } return mPer; } @@ -508,7 +508,7 @@ public class FrontendStatus { */ public int getPerBer() { if (mPerBer == null) { - throw new IllegalStateException(); + throw new IllegalStateException("PerBer status is empty"); } return mPerBer; } @@ -517,7 +517,7 @@ public class FrontendStatus { */ public int getSignalQuality() { if (mSignalQuality == null) { - throw new IllegalStateException(); + throw new IllegalStateException("SignalQuality status is empty"); } return mSignalQuality; } @@ -526,7 +526,7 @@ public class FrontendStatus { */ public int getSignalStrength() { if (mSignalStrength == null) { - throw new IllegalStateException(); + throw new IllegalStateException("SignalStrength status is empty"); } return mSignalStrength; } @@ -535,7 +535,7 @@ public class FrontendStatus { */ public int getSymbolRate() { if (mSymbolRate == null) { - throw new IllegalStateException(); + throw new IllegalStateException("SymbolRate status is empty"); } return mSymbolRate; } @@ -546,7 +546,7 @@ public class FrontendStatus { @FrontendSettings.InnerFec public long getInnerFec() { if (mInnerFec == null) { - throw new IllegalStateException(); + throw new IllegalStateException("InnerFec status is empty"); } return mInnerFec; } @@ -556,7 +556,7 @@ public class FrontendStatus { @FrontendModulation public int getModulation() { if (mModulation == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Modulation status is empty"); } return mModulation; } @@ -566,7 +566,7 @@ public class FrontendStatus { @FrontendSettings.FrontendSpectralInversion public int getSpectralInversion() { if (mInversion == null) { - throw new IllegalStateException(); + throw new IllegalStateException("SpectralInversion status is empty"); } return mInversion; } @@ -576,7 +576,7 @@ public class FrontendStatus { @Lnb.Voltage public int getLnbVoltage() { if (mLnbVoltage == null) { - throw new IllegalStateException(); + throw new IllegalStateException("LnbVoltage status is empty"); } return mLnbVoltage; } @@ -585,7 +585,7 @@ public class FrontendStatus { */ public int getPlpId() { if (mPlpId == null) { - throw new IllegalStateException(); + throw new IllegalStateException("PlpId status is empty"); } return mPlpId; } @@ -594,7 +594,7 @@ public class FrontendStatus { */ public boolean isEwbs() { if (mIsEwbs == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Ewbs status is empty"); } return mIsEwbs; } @@ -603,7 +603,7 @@ public class FrontendStatus { */ public int getAgc() { if (mAgc == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Agc status is empty"); } return mAgc; } @@ -612,7 +612,7 @@ public class FrontendStatus { */ public boolean isLnaOn() { if (mIsLnaOn == null) { - throw new IllegalStateException(); + throw new IllegalStateException("LnaOn status is empty"); } return mIsLnaOn; } @@ -622,7 +622,7 @@ public class FrontendStatus { @NonNull public boolean[] getLayerErrors() { if (mIsLayerErrors == null) { - throw new IllegalStateException(); + throw new IllegalStateException("LayerErrors status is empty"); } return mIsLayerErrors; } @@ -631,7 +631,7 @@ public class FrontendStatus { */ public int getMer() { if (mMer == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Mer status is empty"); } return mMer; } @@ -642,7 +642,7 @@ public class FrontendStatus { */ public int getFreqOffset() { if (mFreqOffset == null) { - throw new IllegalStateException(); + throw new IllegalStateException("FreqOffset status is empty"); } return mFreqOffset; } @@ -652,7 +652,7 @@ public class FrontendStatus { @DvbtFrontendSettings.Hierarchy public int getHierarchy() { if (mHierarchy == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Hierarchy status is empty"); } return mHierarchy; } @@ -661,7 +661,7 @@ public class FrontendStatus { */ public boolean isRfLocked() { if (mIsRfLocked == null) { - throw new IllegalStateException(); + throw new IllegalStateException("isRfLocked status is empty"); } return mIsRfLocked; } @@ -671,7 +671,7 @@ public class FrontendStatus { @NonNull public Atsc3PlpTuningInfo[] getAtsc3PlpTuningInfo() { if (mPlpInfo == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Atsc3PlpTuningInfo status is empty"); } return mPlpInfo; } @@ -687,7 +687,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getBers status"); if (mBers == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Bers status is empty"); } return mBers; } @@ -704,7 +704,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getCodeRates status"); if (mCodeRates == null) { - throw new IllegalStateException(); + throw new IllegalStateException("CodeRates status is empty"); } return mCodeRates; } @@ -720,7 +720,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getBandwidth status"); if (mBandwidth == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Bandwidth status is empty"); } return mBandwidth; } @@ -736,7 +736,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getGuardInterval status"); if (mGuardInterval == null) { - throw new IllegalStateException(); + throw new IllegalStateException("GuardInterval status is empty"); } return mGuardInterval; } @@ -752,7 +752,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getTransmissionMode status"); if (mTransmissionMode == null) { - throw new IllegalStateException(); + throw new IllegalStateException("TransmissionMode status is empty"); } return mTransmissionMode; } @@ -768,7 +768,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getUec status"); if (mUec == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Uec status is empty"); } return mUec; } @@ -784,7 +784,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getSystemId status"); if (mSystemId == null) { - throw new IllegalStateException(); + throw new IllegalStateException("SystemId status is empty"); } return mSystemId; } @@ -801,7 +801,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getInterleaving status"); if (mInterleaving == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Interleaving status is empty"); } return mInterleaving; } @@ -819,7 +819,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getIsdbtSegment status"); if (mIsdbtSegment == null) { - throw new IllegalStateException(); + throw new IllegalStateException("IsdbtSegment status is empty"); } return mIsdbtSegment; } @@ -835,7 +835,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getTsDataRate status"); if (mTsDataRate == null) { - throw new IllegalStateException(); + throw new IllegalStateException("TsDataRate status is empty"); } return mTsDataRate; } @@ -852,7 +852,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getExtendedModulations status"); if (mModulationsExt == null) { - throw new IllegalStateException(); + throw new IllegalStateException("ExtendedModulations status is empty"); } return mModulationsExt; } @@ -868,7 +868,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "getRollOff status"); if (mRollOff == null) { - throw new IllegalStateException(); + throw new IllegalStateException("RollOff status is empty"); } return mRollOff; } @@ -883,7 +883,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "isMisoEnabled status"); if (mIsMisoEnabled == null) { - throw new IllegalStateException(); + throw new IllegalStateException("isMisoEnabled status is empty"); } return mIsMisoEnabled; } @@ -898,7 +898,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "isLinear status"); if (mIsLinear == null) { - throw new IllegalStateException(); + throw new IllegalStateException("isLinear status is empty"); } return mIsLinear; } @@ -913,7 +913,7 @@ public class FrontendStatus { TunerVersionChecker.checkHigherOrEqualVersionTo( TunerVersionChecker.TUNER_VERSION_1_1, "isShortFramesEnabled status"); if (mIsShortFrames == null) { - throw new IllegalStateException(); + throw new IllegalStateException("isShortFramesEnabled status is empty"); } return mIsShortFrames; } diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 6141b7fc7463..860d88afe4a2 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -805,8 +805,10 @@ public class MtpDatabase implements AutoCloseable { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteStream); - if (byteStream.size() > MAX_THUMB_SIZE) + if (byteStream.size() > MAX_THUMB_SIZE) { + Log.w(TAG, "getThumbnailProcess: size=" + byteStream.size()); return null; + } byte[] byteArray = byteStream.toByteArray(); @@ -836,7 +838,15 @@ public class MtpDatabase implements AutoCloseable { outLongs[0] = thumbOffsetAndSize != null ? thumbOffsetAndSize[1] : 0; outLongs[1] = exif.getAttributeInt(ExifInterface.TAG_PIXEL_X_DIMENSION, 0); outLongs[2] = exif.getAttributeInt(ExifInterface.TAG_PIXEL_Y_DIMENSION, 0); - return true; + if (exif.getThumbnailRange() != null) { + if ((outLongs[0] == 0) || (outLongs[1] == 0) || (outLongs[2] == 0)) { + Log.d(TAG, "getThumbnailInfo: check thumb info:" + + thumbOffsetAndSize[0] + "," + thumbOffsetAndSize[1] + + "," + outLongs[1] + "," + outLongs[2]); + } + + return true; + } } catch (IOException e) { // ignore and fall through } @@ -869,7 +879,9 @@ public class MtpDatabase implements AutoCloseable { case MtpConstants.FORMAT_JFIF: try { ExifInterface exif = new ExifInterface(path); - return exif.getThumbnail(); + + if (exif.getThumbnailRange() != null) + return exif.getThumbnail(); } catch (IOException e) { // ignore and fall through } diff --git a/media/mca/effect/java/Android.bp b/media/mca/effect/java/Android.bp index 708167c94607..70d999f76483 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 51be85b46602..77afcff27f56 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 d9271b95f6d2..f370b21589c5 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/media/tests/MtpTests/res/raw/test_bad_thumb.jpg b/media/tests/MtpTests/res/raw/test_bad_thumb.jpg Binary files differindex e69de29bb2d1..78ac703850a1 100644 --- a/media/tests/MtpTests/res/raw/test_bad_thumb.jpg +++ b/media/tests/MtpTests/res/raw/test_bad_thumb.jpg diff --git a/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java b/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java index dfbafe496de5..48be6fea845f 100644 --- a/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java +++ b/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java @@ -271,9 +271,10 @@ public class MtpDatabaseTest { Log.d(TAG, "testMtpDatabaseThumbnail: Test bad JPG"); - testThumbnail(handleJpgBadThumb, jpgfileBadThumb, false); +// Now we support to generate thumbnail if embedded thumbnail is corrupted or not existed + testThumbnail(handleJpgBadThumb, jpgfileBadThumb, true); - testThumbnail(handleJpgNoThumb, jpgFileNoThumb, false); + testThumbnail(handleJpgNoThumb, jpgFileNoThumb, true); testThumbnail(handleJpgBad, jpgfileBad, false); diff --git a/mime/java/Android.bp b/mime/java/Android.bp index 7e562639d4cc..07cada8e1372 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 367d8c35fdce..4d51439392fa 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/opengl/java/Android.bp b/opengl/java/Android.bp index 8ed4161cb9de..6dbae421e059 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 74cecdd351b3..609455f27b65 100644 --- a/packages/Connectivity/framework/Android.bp +++ b/packages/Connectivity/framework/Android.bp @@ -121,7 +121,16 @@ java_sdk_library { "//packages/modules/Connectivity/service", "//frameworks/base/packages/Connectivity/service", "//frameworks/base", - "//packages/modules/Connectivity/Tethering/tests/unit", + + // Tests using hidden APIs + "//external/sl4a:__subpackages__", + "//frameworks/base/tests/net:__subpackages__", + "//frameworks/libs/net/common/testutils", + "//frameworks/libs/net/common/tests:__subpackages__", + "//frameworks/opt/telephony/tests/telephonytests", + "//packages/modules/Connectivity/Tethering/tests:__subpackages__", + "//packages/modules/Connectivity/tests:__subpackages__", + "//packages/modules/NetworkStack/tests:__subpackages__", ], apex_available: [ "com.android.tethering", diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt index 2cae99fbb326..5613ca1562f7 100644 --- a/packages/Connectivity/framework/api/system-current.txt +++ b/packages/Connectivity/framework/api/system-current.txt @@ -232,6 +232,7 @@ package android.net { method @NonNull public android.net.Network register(); method public final void sendLinkProperties(@NonNull android.net.LinkProperties); method public final void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities); + method public final void sendNetworkScore(@NonNull android.net.NetworkScore); method public final void sendNetworkScore(@IntRange(from=0, to=99) int); method public final void sendQosCallbackError(int, int); method public final void sendQosSessionAvailable(int, int, @NonNull android.net.QosSessionAttributes); diff --git a/packages/Connectivity/framework/src/android/net/NetworkAgent.java b/packages/Connectivity/framework/src/android/net/NetworkAgent.java index c57da53f289d..3622c1c669db 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkAgent.java +++ b/packages/Connectivity/framework/src/android/net/NetworkAgent.java @@ -956,7 +956,6 @@ public abstract class NetworkAgent { * Must be called by the agent to update the score of this network. * * @param score the new score. - * @hide TODO : unhide when impl is complete */ public final void sendNetworkScore(@NonNull NetworkScore score) { Objects.requireNonNull(score); diff --git a/packages/Connectivity/framework/src/android/net/NetworkScore.java b/packages/Connectivity/framework/src/android/net/NetworkScore.java index 1c235f470157..0dee225a0e89 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkScore.java +++ b/packages/Connectivity/framework/src/android/net/NetworkScore.java @@ -170,7 +170,7 @@ public final class NetworkScore implements Parcelable { @Override public String toString() { - return "Score(" + mLegacyInt + ")"; + return "Score(" + mLegacyInt + " ; Policies : " + mPolicies + ")"; } @Override diff --git a/packages/Connectivity/test/Android.bp b/packages/Connectivity/test/Android.bp new file mode 100644 index 000000000000..a6cad2e7fabd --- /dev/null +++ b/packages/Connectivity/test/Android.bp @@ -0,0 +1,38 @@ +// +// 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_license"], +} + +// defaults for tests that need to build against framework-connectivity's @hide APIs +// Only usable from targets that have visibility on framework-connectivity.impl. +// Instead of using this, consider avoiding to depend on hidden connectivity APIs in +// tests. +java_defaults { + name: "framework-connectivity-test-defaults", + sdk_version: "core_platform", // tests can use @CorePlatformApi's + libs: [ + // order matters: classes in framework-connectivity are resolved before framework, + // meaning @hide APIs in framework-connectivity are resolved before @SystemApi + // stubs in framework + "framework-connectivity.impl", + "framework", + + // if sdk_version="" this gets automatically included, but here we need to add manually. + "framework-res", + ], +} diff --git a/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppSwitchPreference.java b/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppSwitchPreference.java index 1ccf4175bac5..781bfcdbc75e 100644 --- a/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppSwitchPreference.java +++ b/packages/SettingsLib/AppPreference/src/com/android/settingslib/widget/AppSwitchPreference.java @@ -51,7 +51,6 @@ public class AppSwitchPreference extends SwitchPreference { @Override public void onBindViewHolder(PreferenceViewHolder holder) { - setSingleLineTitle(true); super.onBindViewHolder(holder); final View switchView = holder.findViewById(android.R.id.switch_widget); if (switchView != null) { diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 927e9db89be8..bcc22f6605a5 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1126,9 +1126,9 @@ <!-- [CHAR_LIMIT=40] Label for battery level chart when charging --> <string name="power_charging"><xliff:g id="level">%1$s</xliff:g> - <xliff:g id="state">%2$s</xliff:g></string> <!-- [CHAR_LIMIT=40] Label for estimated remaining duration of battery charging --> - <string name="power_remaining_charging_duration_only"><xliff:g id="time">%1$s</xliff:g> left until charged</string> + <string name="power_remaining_charging_duration_only"><xliff:g id="time">%1$s</xliff:g> left until full</string> <!-- [CHAR_LIMIT=40] Label for battery level chart when charging with duration --> - <string name="power_charging_duration"><xliff:g id="level">%1$s</xliff:g> - <xliff:g id="time">%2$s</xliff:g> until charged</string> + <string name="power_charging_duration"><xliff:g id="level">%1$s</xliff:g> - <xliff:g id="time">%2$s</xliff:g> left until full</string> <!-- [CHAR_LIMIT=80] Label for battery level chart when charge been limited --> <string name="power_charging_limited"><xliff:g id="level">%1$s</xliff:g> - Optimizing for battery health</string> @@ -1145,7 +1145,7 @@ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed --> <string name="battery_info_status_not_charging">Plugged in, can\'t charge right now</string> <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed --> - <string name="battery_info_status_full">Full</string> + <string name="battery_info_status_full">Charged</string> <!-- Summary for settings preference disabled by administrator [CHAR LIMIT=50] --> <string name="disabled_by_admin_summary_text">Controlled by admin</string> @@ -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/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 47510957cb4d..6cf2bb683517 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -455,6 +455,9 @@ <!-- 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" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" 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 000000000000..3fdce761b135 --- /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 000000000000..b0184e9bc207 --- /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/qs_customizer_toolbar.xml b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml index 7cb44b3e1500..416583013e64 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/layout/auth_biometric_contents.xml b/packages/SystemUI/res/layout/auth_biometric_contents.xml index eef37ab20c69..99e8116cb681 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 000000000000..87affde5c04b --- /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/global_actions_grid_item_lite.xml b/packages/SystemUI/res/layout/global_actions_grid_item_lite.xml new file mode 100644 index 000000000000..9ab1ac80f048 --- /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 000000000000..0df980054c0c --- /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/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml index 6d44138c5354..8b2d4e0a44b9 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" /> @@ -115,4 +117,3 @@ /> </androidx.constraintlayout.widget.ConstraintLayout> - diff --git a/packages/SystemUI/res/layout/people_space_tile_view.xml b/packages/SystemUI/res/layout/people_space_tile_view.xml index 8f64ddf7011d..3e901808e66a 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/values/colors.xml b/packages/SystemUI/res/values/colors.xml index e3bf12495a82..e77a8a4fbdf0 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. --> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 53a42aeb2b87..1d82518da619 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--> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 1bd12a3deca3..91e0466c82fe 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1065,6 +1065,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> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index cb21245fa639..10c70a0914c8 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -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> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java index 7b3aa9258d2d..fcab71ca3167 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java @@ -18,7 +18,7 @@ package com.android.systemui.shared.system; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; -import android.app.PictureInPictureParams; +import android.app.ActivityManager; import android.app.WindowConfiguration; import android.graphics.Point; import android.graphics.Rect; @@ -57,7 +57,7 @@ public class RemoteAnimationTargetCompat { public final Rect screenSpaceBounds; public final boolean isNotInRecents; public final Rect contentInsets; - public final PictureInPictureParams pictureInPictureParams; + public final ActivityManager.RunningTaskInfo taskInfo; public final int rotationChange; public final int windowType; @@ -77,7 +77,7 @@ public class RemoteAnimationTargetCompat { isNotInRecents = app.isNotInRecents; contentInsets = app.contentInsets; activityType = app.windowConfiguration.getActivityType(); - pictureInPictureParams = app.pictureInPictureParams; + taskInfo = app.taskInfo; rotationChange = 0; mStartLeash = app.startLeash; @@ -119,7 +119,7 @@ public class RemoteAnimationTargetCompat { isNotInRecents = true; activityType = ACTIVITY_TYPE_UNDEFINED; } - pictureInPictureParams = null; + taskInfo = change.getTaskInfo(); mStartLeash = null; rotationChange = change.getEndRotation() - change.getStartRotation(); windowType = INVALID_WINDOW_TYPE; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java index 02a8958ef657..31f1332b265c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java @@ -492,4 +492,11 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView> 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 708b2d55b75a..7ed63375a334 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -267,6 +267,13 @@ public class KeyguardSecurityContainer extends FrameLayout { 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 @@ public class KeyguardSecurityContainer extends FrameLayout { 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 @@ public class KeyguardSecurityContainer extends FrameLayout { 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 760eaecae247..4827cab3b5c0 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -515,6 +515,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard } } + /** 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/systemui/biometrics/AuthBiometricFaceToUdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java new file mode 100644 index 000000000000..197f35ba3e86 --- /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 9b09cfd0dba6..4c5ca691939c 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.view.View; 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 @@ public class AuthBiometricFaceView extends AuthBiometricView { // 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 @@ public class AuthBiometricFaceView extends AuthBiometricView { 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 @@ public class AuthBiometricFaceView extends AuthBiometricView { 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 class AuthBiometricFaceView extends AuthBiometricView { } } - 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 @@ public class AuthBiometricFaceView extends AuthBiometricView { } } - @VisibleForTesting IconController mIconController; + protected IconController mIconController; public AuthBiometricFaceView(Context context) { this(context, null); @@ -174,14 +174,21 @@ public class AuthBiometricFaceView extends AuthBiometricView { } @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 @@ public class AuthBiometricFaceView extends AuthBiometricView { @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 007080bc8603..376368fbf9d4 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 @@ public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView { 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 d59a865e2add..a40af70adb8f 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 @@ public abstract class AuthBiometricView extends LinearLayout { } 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 @@ public abstract class AuthBiometricView extends LinearLayout { Utils.notifyAccessibilityContentChanged(mAccessibilityManager, this); } + protected boolean supportsManualRetry() { + return false; + } + public void updateState(@BiometricState int newState) { Log.v(TAG, "newState: " + newState); @@ -749,7 +755,9 @@ public abstract class AuthBiometricView extends LinearLayout { 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 @@ public abstract class AuthBiometricView extends LinearLayout { 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 d05e9278762d..4e93f58dd51f 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 @@ public class AuthContainerView extends LinearLayout 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 @@ public class AuthContainerView extends LinearLayout 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 @@ public class AuthContainerView extends LinearLayout 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/UdfpsDialogMeasureAdapter.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java new file mode 100644 index 000000000000..1ad2b9ca856c --- /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/camera/CameraIntents.kt b/packages/SystemUI/src/com/android/systemui/camera/CameraIntents.kt index 464bee18f030..f8a20023e47a 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 android.text.TextUtils 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 @@ interface CameraIntents { } @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/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 1c5715c0296d..fd80d50c2894 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.permission.PermissionManager; 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 @@ public class FrameworkServicesModule { @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/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 18627189f188..34d94d8e13bb 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.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.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.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.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 @@ import javax.inject.Provider; /** * 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, // 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, // 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 class GlobalActionsDialog implements DialogInterface.OnDismissListener, */ 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, * 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, * * @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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, /** * 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 + @Override + protected int getEmergencyTextColor(Context context) { + return context.getResources().getColor( + com.android.systemui.R.color.global_actions_emergency_text); } - 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); + @Override + protected int getEmergencyIconColor(Context context) { + return getContext().getResources().getColor( + com.android.systemui.R.color.global_actions_emergency_text); } - /** - * 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; - } + @Override + protected int getEmergencyBackgroundColor(Context context) { + return getContext().getResources().getColor( + com.android.systemui.R.color.global_actions_emergency_background); } - @NonNull @Override - public Lifecycle getLifecycle() { - return mLifecycle; + 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 { - - 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; + static class ActionsDialog extends ActionsDialogLite { + 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, | 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private void initializeWalletView() { + if (mWalletFactory == null) { + return; + } mWalletViewController = mWalletFactory.get(); if (!isWalletViewAvailable()) { return; @@ -2313,132 +546,24 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } - 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(); - } - - private void showPowerOverflowMenu() { - mOverflowPopup = createPowerOverflowPopup(); - mOverflowPopup.show(); + @Override + protected int getLayoutResource() { + return com.android.systemui.R.layout.global_actions_grid_v2; } - 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } @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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, }); } - 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } - 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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } @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 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private boolean controlsAvailable() { - return mDeviceProvisioned + return isDeviceProvisioned() && mControlsComponent.isEnabled() && !mControlsServiceInfos.isEmpty(); } @@ -2703,7 +720,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } 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 000000000000..47ae145590b5 --- /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 000000000000..eb4cd6b449a2 --- /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/navigationbar/buttons/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/KeyButtonView.java index 531ccb4eb1cb..9ea938325659 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 @@ public class KeyButtonView extends ImageView implements ButtonInterface { @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 ba41d33bab92..02c12f6d51e5 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 @@ package com.android.systemui.people; 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 @@ public class PeopleSpaceActivity extends Activity { /** 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 e30ad80be3f6..36b435b04fd6 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 @@ package com.android.systemui.people; 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 @@ public class PeopleSpaceTileView extends LinearLayout { 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 @@ public class PeopleSpaceTileView extends LinearLayout { } } 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 @@ public class PeopleSpaceTileView extends LinearLayout { 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 8d1b712e0807..96fbe6987562 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 @@ class PeopleTileViewHelper { } 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 @@ class PeopleTileViewHelper { } 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 @@ class PeopleTileViewHelper { 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/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index c57ff1276a3f..ea471b957d68 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -32,6 +32,7 @@ import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.qs.TouchAnimator.Listener; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.tileimpl.HeightOverrideable; +import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -54,6 +55,9 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows"; public static final float EXPANDED_TILE_DELAY = .86f; + private static final long QQS_FADE_IN_DURATION = 200L; + // Fade out faster than fade in to finish before QQS hides. + private static final long QQS_FADE_OUT_DURATION = 50L; private final ArrayList<View> mAllViews = new ArrayList<>(); @@ -87,7 +91,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private HeightExpansionAnimator mOtherTilesExpandAnimator; private boolean mNeedsAnimatorUpdate = false; - + private boolean mToShowing; private boolean mOnKeyguard; private boolean mAllowFancy; @@ -150,6 +154,18 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha } } + void startAlphaAnimation(boolean show) { + if (show == mToShowing) { + return; + } + mToShowing = show; + if (show) { + CrossFadeHelper.fadeIn(mQs.getView(), QQS_FADE_IN_DURATION, 0 /* delay */); + } else { + CrossFadeHelper.fadeOut(mQs.getView(), QQS_FADE_OUT_DURATION, 0 /* delay */, + null /* endRunnable */); + } + } /** * Sets whether or not the keyguard is currently being shown with a collapsed header. diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index e8976d379fef..5256bc45b7b5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -92,6 +92,11 @@ public class QSContainerImpl extends FrameLayout { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); } + @Override + public boolean hasOverlappingRendering() { + return false; + } + void onMediaVisibilityChanged(boolean qsVisible) { mAnimateBottomOnNextLayout = qsVisible; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java index f1f4e16206a1..52e05a4fd6c5 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.MetricsLogger; 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 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme 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 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme } else { startSettingsActivity(); } + } else if (v == mPowerMenuLite) { + mGlobalActionsDialog.showOrHideDialog(false, true); } } }; @@ -129,7 +133,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme 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 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme 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 7c9f0b082d8f..94b99c3d9f2a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -190,7 +190,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { boolean sizeChanged = (oldTop - oldBottom) != (top - bottom); if (sizeChanged) { - setQsExpansion(mLastQSExpansion, mLastQSExpansion); + setQsExpansion(mLastQSExpansion, mLastHeaderTranslation); } }); } @@ -395,6 +395,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Override public void setQsExpansion(float expansion, float headerTranslation) { if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation); + + if (mQSAnimator != null) { + final boolean showQSOnLockscreen = expansion > 0; + final boolean showQSUnlocked = headerTranslation == 0; + mQSAnimator.startAlphaAnimation(showQSOnLockscreen || showQSUnlocked); + } mContainer.setExpansion(expansion); final float translationScaleY = expansion - 1; boolean onKeyguardAndExpanded = isKeyguardShowing() && !mShowCollapsedOnKeyguard; 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 0d73a5a97706..5b986b6fece9 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 @@ public class CameraToggleTile extends SensorPrivacyToggleTile { 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 b8d879226f55..42bd77b354bb 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 @@ public class MicrophoneToggleTile extends SensorPrivacyToggleTile { .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/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 1d307364d661..5f3933b827c4 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 @@ public class NotificationChildrenContainer extends ViewGroup { private ViewGroup mCurrentHeader; private boolean mIsConversation; - private boolean mTintWithThemeAccent; private boolean mShowGroupCountInExpander; private boolean mShowDividersWhenExpanded; private boolean mHideDividersDuringExpand; @@ -149,8 +148,6 @@ public class NotificationChildrenContainer extends ViewGroup { 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 @@ public class NotificationChildrenContainer extends ViewGroup { 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/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 6b69103f6030..5ff9b703924e 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 @@ public class KeyguardBouncer { 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/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index d3da0bce0a15..a38cf61d5e4e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -2625,8 +2625,7 @@ public class NotificationPanelViewController extends PanelViewController { return; } mSectionPadding = padding; - mQsFrame.setTranslationY(padding); - mNotificationStackScrollLayoutController.setSectionPadding(padding); + // TODO(b/172289889) update overscroll to spec } @Override @@ -3495,6 +3494,12 @@ public class NotificationPanelViewController extends PanelViewController { 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; } 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 7ee7aa4100d4..0b6bbcd407f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -1150,6 +1150,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb || 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; 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 b96cb5e36c82..7ac6d63430d6 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.os.Message; 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.text.SimpleDateFormat; 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 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa 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/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index cfaeb0edec53..f683603c9cd5 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.Collections; 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 @@ public class NetworkControllerImpl extends BroadcastReceiver 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 class NetworkControllerImpl extends BroadcastReceiver public NetworkControllerImpl( Context context, @Background Looper bgLooper, + @Background Executor bgExecutor, + SubscriptionManager subscriptionManager, + CallbackHandler callbackHandler, DeviceProvisionedController deviceProvisionedController, BroadcastDispatcher broadcastDispatcher, ConnectivityManager connectivityManager, @@ -212,8 +218,11 @@ public class NetworkControllerImpl extends BroadcastReceiver 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 @@ public class NetworkControllerImpl extends BroadcastReceiver WifiManager wifiManager, NetworkScoreManager networkScoreManager, SubscriptionManager subManager, Config config, Looper bgLooper, + Executor bgExecutor, CallbackHandler callbackHandler, AccessPointControllerImpl accessPointController, DataUsageController dataUsageController, @@ -241,6 +251,8 @@ public class NetworkControllerImpl extends BroadcastReceiver mTelephonyListenerManager = telephonyListenerManager; mConfig = config; mReceiverHandler = new Handler(bgLooper); + mBgLooper = bgLooper; + mBgExecutor = bgExecutor; mCallbackHandler = callbackHandler; mDataSaverController = new DataSaverControllerImpl(context); mBroadcastDispatcher = broadcastDispatcher; @@ -377,21 +389,23 @@ public class NetworkControllerImpl extends BroadcastReceiver // 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 @@ public class NetworkControllerImpl extends BroadcastReceiver mobileSignalController.registerListener(); } if (mSubscriptionListener == null) { - mSubscriptionListener = new SubListener(); + mSubscriptionListener = new SubListener(mBgLooper); } mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener); mTelephonyListenerManager.addActiveDataSubscriptionIdListener(mPhoneStateListener); @@ -1336,6 +1350,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } private class SubListener extends OnSubscriptionsChangedListener { + SubListener(Looper looper) { + super(looper); + } + @Override public void onSubscriptionsChanged() { updateMobileControllers(); @@ -1346,10 +1364,5 @@ public class NetworkControllerImpl extends BroadcastReceiver * 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/telephony/TelephonyCallback.java b/packages/SystemUI/src/com/android/systemui/telephony/TelephonyCallback.java index 95216c559420..728907fd2d36 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 @@ class TelephonyCallback extends android.telephony.TelephonyCallback @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 @@ class TelephonyCallback extends android.telephony.TelephonyCallback @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 @@ class TelephonyCallback extends android.telephony.TelephonyCallback @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/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 4eb75ebe4553..74b79d57adcb 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -296,6 +296,11 @@ public final class WMShell extends SystemUI } oneHanded.stopOneHanded(); } + + @Override + public void onUserSwitchComplete(int userId) { + oneHanded.onUserSwitch(userId); + } }; mKeyguardUpdateMonitor.registerCallback(mOneHandedKeyguardCallback); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java index 714f1f235c52..4d526508ce0f 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 @@ public class KeyguardHostViewControllerTest extends SysuiTestCase { ((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 99b3f6f19f81..ca857c5dd05b 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 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { 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 104318e0f4ae..9557d5cdb982 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 @@ package com.android.keyguard; 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 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { 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/systemui/biometrics/AuthBiometricViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java index 1565dee932cd..36a031a6ae35 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.never; 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.junit.runner.RunWith; 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 @@ public class AuthBiometricViewTest extends SysuiTestCase { 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/UdfpsDialogMeasureAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java new file mode 100644 index 000000000000..ee13d2366285 --- /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/camera/CameraIntentsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/camera/CameraIntentsTest.kt new file mode 100644 index 000000000000..feaedc53fbc1 --- /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/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java new file mode 100644 index 000000000000..80716f9398f3 --- /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 8add93032caa..93769c4600de 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 static org.mockito.Mockito.when; 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.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; @@ -105,9 +104,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase { @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 @@ public class GlobalActionsDialogTest extends SysuiTestCase { mDevicePolicyManager, mLockPatternUtils, mBroadcastDispatcher, - mConnectivityManager, mTelephonyListenerManager, - mContentResolver, + mGlobalSettings, + mSecureSettings, null, mResources, mConfigurationController, @@ -520,7 +518,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogTest extends SysuiTestCase { 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 fa29fd4f94ae..853684ab8dfc 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_0; 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 @@ public class KeyButtonViewTest extends SysuiTestCase { } @Test - public void testLogOverviewPress() { + public void testLogOverviewPress() { checkmetrics(KEYCODE_APP_SWITCH, ACTION_UP, 0, NAVBAR_OVERVIEW_BUTTON_TAP); } @@ -134,6 +135,22 @@ public class KeyButtonViewTest extends SysuiTestCase { 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 d40e6a4586b8..650ee50f13af 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.MetricsLogger; 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 @@ public class QSFooterViewControllerTest extends LeakCheckedTest { private MultiUserSwitch mMultiUserSwitch; @Mock private View mPowerMenuLiteView; + @Mock + private GlobalActionsDialogLite mGlobalActionsDialog; private QSFooterViewController mController; @@ -118,7 +121,7 @@ public class QSFooterViewControllerTest extends LeakCheckedTest { 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/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinatorTest.java index 278456859735..f2e7081e096b 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.times; 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 @@ public class AppOpsCoordinatorTest extends SysuiTestCase { 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 @@ public class AppOpsCoordinatorTest extends SysuiTestCase { 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/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index 18481bca1aa6..bfce2a568c78 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.Intent; 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 @@ public class NotificationGutsManagerTest extends SysuiTestCase { 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/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index d9e938948f5e..e5f2aa7a93c7 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 @@ public class KeyguardBouncerTest extends SysuiTestCase { // 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 45b791715904..20261e060601 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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { 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/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index ef3317288e4c..566c71774709 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.IconState; 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,6 +125,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected DeviceProvisionedListener mUserCallback; protected Instrumentation mInstrumentation; protected DemoModeController mDemoModeController; + protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); protected int mSubId; @@ -222,6 +225,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockSm, mConfig, TestableLooper.get(this).getLooper(), + mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), @@ -291,7 +295,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { 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); 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 f4ad819acf57..6219fafc98db 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 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { 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 3c5cbb69eef6..8d3e403f1189 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 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { // 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 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { 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 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { // 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/rs/java/Android.bp b/rs/java/Android.bp index 9f854f7d5cb7..1c2b575e7c8d 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 97751891559c..0ed69e4bfb8e 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/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 878ebc5bbfbd..80408518d84e 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -53,10 +53,13 @@ import com.android.server.accessibility.AccessibilityManagerService; * is triggered.</li> * <li> 4. {@link #onTripleTapped} updates magnification switch UI depending on magnification * capabilities and magnification active state when triple-tap gesture is detected. </li> + * <li> 4. {@link #onRequestMagnificationSpec} updates magnification switch UI depending on + * magnification capabilities and magnification active state when new magnification spec is + * changed by external request from calling public APIs. </li> * </ol> * - * <b>Note</b> Updates magnification switch UI when magnification mode transition - * is done {@link DisableMagnificationCallback#onResult}. + * <b>Note</b> Updates magnification switch UI when magnification mode transition + * is done and before invoking {@link TransitionCallBack#onResult}. */ public class MagnificationController implements WindowMagnificationManager.Callback, MagnificationGestureHandler.Callback, @@ -205,21 +208,22 @@ public class MagnificationController implements WindowMagnificationManager.Callb @Override public void onRequestMagnificationSpec(int displayId, int serviceId) { + final WindowMagnificationManager windowMagnificationManager; synchronized (mLock) { if (serviceId == AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID) { return; } - if (mWindowMagnificationMgr == null - || !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) { - return; - } + updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + windowMagnificationManager = mWindowMagnificationMgr; + } + if (windowMagnificationManager != null) { mWindowMagnificationMgr.disableWindowMagnification(displayId, false); } } // TODO : supporting multi-display (b/182227245). @Override - public void onWindowMagnificationActivationState(boolean activated) { + public void onWindowMagnificationActivationState(int displayId, boolean activated) { if (activated) { mWindowModeEnabledTime = SystemClock.uptimeMillis(); @@ -227,6 +231,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb mActivatedMode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; } logMagnificationModeWithImeOnIfNeeded(); + disableFullScreenMagnificationIfNeeded(displayId); } else { logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, SystemClock.uptimeMillis() - mWindowModeEnabledTime); @@ -237,6 +242,17 @@ public class MagnificationController implements WindowMagnificationManager.Callb } } + private void disableFullScreenMagnificationIfNeeded(int displayId) { + final FullScreenMagnificationController fullScreenMagnificationController = + getFullScreenMagnificationController(); + // Internal request may be for transition, so we just need to check external request. + final boolean isMagnifyByExternalRequest = + fullScreenMagnificationController.getIdOfLastServiceToMagnify(displayId) > 0; + if (isMagnifyByExternalRequest) { + fullScreenMagnificationController.reset(displayId, false); + } + } + @Override public void onFullScreenMagnificationActivationState(boolean activated) { if (activated) { diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java index ded601e70ff1..86f61eef2e7a 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -97,9 +97,10 @@ public class WindowMagnificationManager implements /** * Called when the state of the magnification activation is changed. * + * @param displayId The logical display id. * @param activated {@code true} if the magnification is activated, otherwise {@code false}. */ - void onWindowMagnificationActivationState(boolean activated); + void onWindowMagnificationActivationState(int displayId, boolean activated); } private final Callback mCallback; @@ -285,7 +286,7 @@ public class WindowMagnificationManager implements } if (enabled) { - mCallback.onWindowMagnificationActivationState(true); + mCallback.onWindowMagnificationActivationState(displayId, true); } } @@ -321,7 +322,7 @@ public class WindowMagnificationManager implements } if (disabled) { - mCallback.onWindowMagnificationActivationState(false); + mCallback.onWindowMagnificationActivationState(displayId, false); } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 483f67a91c19..82538b6b906c 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 @@ public class CompanionDeviceManagerService extends SystemService implements Bind return association; } })); + + restartBleScan(); } @Override diff --git a/services/core/Android.bp b/services/core/Android.bp index 1e3f12a8edab..7fc7933529e2 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -225,7 +225,6 @@ filegroup { "java/com/android/server/NetIdManager.java", "java/com/android/server/TestNetworkService.java", "java/com/android/server/connectivity/AutodestructReference.java", - "java/com/android/server/connectivity/ConnectivityConstants.java", "java/com/android/server/connectivity/DnsManager.java", "java/com/android/server/connectivity/FullScore.java", "java/com/android/server/connectivity/KeepaliveTracker.java", diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 6708fc380e08..57a93fa69a03 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -5543,12 +5543,7 @@ public class ConnectivityService extends IConnectivityManager.Stub incrementRequestCountOrThrow(this); mCallbackFlags = callbackFlags; mCallingAttributionTag = callingAttributionTag; - - try { - mBinder.linkToDeath(this, 0); - } catch (RemoteException e) { - binderDied(); - } + linkDeathRecipient(); } NetworkRequestInfo(@NonNull final NetworkRequestInfo nri, @@ -5586,6 +5581,7 @@ public class ConnectivityService extends IConnectivityManager.Stub incrementRequestCountOrThrow(this); mCallbackFlags = nri.mCallbackFlags; mCallingAttributionTag = nri.mCallingAttributionTag; + linkDeathRecipient(); } NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r) { @@ -5614,8 +5610,18 @@ public class ConnectivityService extends IConnectivityManager.Stub return Collections.unmodifiableList(tempRequests); } + void linkDeathRecipient() { + if (null != mBinder) { + try { + mBinder.linkToDeath(this, 0); + } catch (RemoteException e) { + binderDied(); + } + } + } + void unlinkDeathRecipient() { - if (mBinder != null) { + if (null != mBinder) { mBinder.unlinkToDeath(this, 0); } } @@ -7742,7 +7748,7 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo bestNetwork = null; NetworkRequest bestRequest = null; for (final NetworkRequest req : nri.mRequests) { - bestNetwork = mNetworkRanker.getBestNetwork(req, nais); + bestNetwork = mNetworkRanker.getBestNetwork(req, nais, nri.getSatisfier()); // Stop evaluating as the highest possible priority request is satisfied. if (null != bestNetwork) { bestRequest = req; @@ -7995,7 +8001,6 @@ public class ConnectivityService extends IConnectivityManager.Stub @NonNull final NetworkOffer offer, @NonNull final NetworkRanker networkRanker) { final NetworkRequest activeRequest = nri.isBeingSatisfied() ? nri.getActiveRequest() : null; final NetworkAgentInfo satisfier = null != activeRequest ? nri.getSatisfier() : null; - final FullScore satisfierScore = null != satisfier ? satisfier.getScore() : null; // Multi-layer requests have a currently active request, the one being satisfied. // Since the system will try to bring up a better network than is currently satisfying @@ -8034,7 +8039,7 @@ public class ConnectivityService extends IConnectivityManager.Stub && satisfier.factorySerialNumber == offer.providerId; final boolean newNeeded = (currentlyServing || (activeRequest.canBeSatisfiedBy(offer.caps) - && networkRanker.mightBeat(activeRequest, satisfierScore, offer))); + && networkRanker.mightBeat(activeRequest, satisfier, offer))); if (newNeeded != oldNeeded) { if (newNeeded) { offer.onNetworkNeeded(activeRequest); diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index d66d82d1f23f..c7460a6337a9 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -930,7 +930,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { /** 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); @@ -959,7 +959,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @Override public void onGatewayConnectionError( - @NonNull int[] networkCapabilities, + @NonNull String gatewayConnectionName, @VcnErrorCode int errorCode, @Nullable String exceptionClass, @Nullable String exceptionMessage) { @@ -975,7 +975,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { Binder.withCleanCallingIdentity( () -> cbInfo.mCallback.onGatewayConnectionError( - networkCapabilities, + gatewayConnectionName, errorCode, exceptionClass, exceptionMessage)); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index b1543ee86565..c1ab6cc89eac 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.app.ActivityManager.PROCESS_STATE_TOP; 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { } // 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 @@ public final class ActiveServices { } } + 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/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java index e16a6cc6fefc..232005b7559b 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 @@ final class DiscreteRegistry { 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 @@ final class DiscreteRegistry { 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 @@ final class DiscreteRegistry { 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 @@ final class DiscreteRegistry { 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,28 +341,13 @@ final class DiscreteRegistry { } 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) { + if (uid < Process.FIRST_APPLICATION_UID) { return false; } - return true; - } - - static boolean isDiscreteUid(int uid) { - if (uid < Process.FIRST_APPLICATION_UID) { + if ((flags & (sDiscreteFlags)) == 0) { return false; } return true; @@ -876,6 +879,26 @@ final class DiscreteRegistry { } } + 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/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index 75aa6c97d323..2bc81cb56996 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 @@ public class ClipboardService extends SystemService { 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 @@ public class ClipboardService extends SystemService { 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 @@ public class ClipboardService extends SystemService { } } + 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 @@ public class ClipboardService extends SystemService { } @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 @@ public class ClipboardService extends SystemService { && 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/ConnectivityConstants.java b/services/core/java/com/android/server/connectivity/ConnectivityConstants.java deleted file mode 100644 index 325a2cd7bd69..000000000000 --- a/services/core/java/com/android/server/connectivity/ConnectivityConstants.java +++ /dev/null @@ -1,28 +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 com.android.server.connectivity; - -/** - * A class encapsulating various constants used by Connectivity. - * TODO : remove this class. - * @hide - */ -public class ConnectivityConstants { - // VPNs typically have priority over other networks. Give them a score that will - // let them win every single time. - public static final int VPN_DEFAULT_SCORE = 101; -} diff --git a/services/core/java/com/android/server/connectivity/FullScore.java b/services/core/java/com/android/server/connectivity/FullScore.java index 117253f9c75d..a8a83fc00491 100644 --- a/services/core/java/com/android/server/connectivity/FullScore.java +++ b/services/core/java/com/android/server/connectivity/FullScore.java @@ -86,9 +86,14 @@ public class FullScore { /** @hide */ public static final int POLICY_IS_UNMETERED = 59; + // This network is invincible. This is useful for offers until there is an API to listen + // to requests. + /** @hide */ + public static final int POLICY_IS_INVINCIBLE = 58; + // To help iterate when printing @VisibleForTesting - static final int MIN_CS_MANAGED_POLICY = POLICY_IS_UNMETERED; + static final int MIN_CS_MANAGED_POLICY = POLICY_IS_INVINCIBLE; @VisibleForTesting static final int MAX_CS_MANAGED_POLICY = POLICY_IS_VALIDATED; @@ -109,6 +114,7 @@ public class FullScore { case POLICY_YIELD_TO_BAD_WIFI: return "YIELD_TO_BAD_WIFI"; case POLICY_TRANSPORT_PRIMARY: return "TRANSPORT_PRIMARY"; case POLICY_EXITING: return "EXITING"; + case POLICY_IS_INVINCIBLE: return "INVINCIBLE"; } throw new IllegalArgumentException("Unknown policy : " + policy); } @@ -147,7 +153,8 @@ public class FullScore { caps.hasCapability(NET_CAPABILITY_NOT_METERED), config.explicitlySelected, config.acceptUnvalidated, - yieldToBadWiFi); + yieldToBadWiFi, + false /* invincible */); // only prospective scores can be invincible } /** @@ -178,8 +185,12 @@ public class FullScore { final boolean acceptUnvalidated = false; // Don't assume clinging to bad wifi final boolean yieldToBadWiFi = false; + // A prospective score is invincible if the legacy int in the filter is over the maximum + // score. + final boolean invincible = score.getLegacyInt() > NetworkRanker.LEGACY_INT_MAX; return withPolicies(score.getLegacyInt(), score.getPolicies(), KEEP_CONNECTED_NONE, - mayValidate, vpn, unmetered, everUserSelected, acceptUnvalidated, yieldToBadWiFi); + mayValidate, vpn, unmetered, everUserSelected, acceptUnvalidated, yieldToBadWiFi, + invincible); } /** @@ -193,14 +204,15 @@ public class FullScore { // telephony factory, so that it depends on the carrier. For now this is handled by // connectivity for backward compatibility. public FullScore mixInScore(@NonNull final NetworkCapabilities caps, - @NonNull final NetworkAgentConfig config, final boolean avoidBadWiFi) { + @NonNull final NetworkAgentConfig config, final boolean yieldToBadWifi) { return withPolicies(mLegacyInt, mPolicies, mKeepConnectedReason, caps.hasCapability(NET_CAPABILITY_VALIDATED), caps.hasTransport(TRANSPORT_VPN), caps.hasCapability(NET_CAPABILITY_NOT_METERED), config.explicitlySelected, config.acceptUnvalidated, - avoidBadWiFi); + yieldToBadWifi, + false /* invincible */); // only prospective scores can be invincible } // TODO : this shouldn't manage bad wifi avoidance – instead this should be done by the @@ -214,14 +226,16 @@ public class FullScore { final boolean isUnmetered, final boolean everUserSelected, final boolean acceptUnvalidated, - final boolean yieldToBadWiFi) { + final boolean yieldToBadWiFi, + final boolean invincible) { return new FullScore(legacyInt, (externalPolicies & EXTERNAL_POLICIES_MASK) | (isValidated ? 1L << POLICY_IS_VALIDATED : 0) | (isVpn ? 1L << POLICY_IS_VPN : 0) | (isUnmetered ? 1L << POLICY_IS_UNMETERED : 0) | (everUserSelected ? 1L << POLICY_EVER_USER_SELECTED : 0) | (acceptUnvalidated ? 1L << POLICY_ACCEPT_UNVALIDATED : 0) - | (yieldToBadWiFi ? 1L << POLICY_YIELD_TO_BAD_WIFI : 0), + | (yieldToBadWiFi ? 1L << POLICY_YIELD_TO_BAD_WIFI : 0) + | (invincible ? 1L << POLICY_IS_INVINCIBLE : 0), keepConnectedReason); } diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 3902573fa241..5d793fdda7b0 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -143,7 +143,7 @@ import java.util.TreeSet; // the network is no longer considered "lingering". After the linger timer expires, if the network // is satisfying one or more background NetworkRequests it is kept up in the background. If it is // not, ConnectivityService disconnects the NetworkAgent's AsyncChannel. -public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { +public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRanker.Scoreable { @NonNull public NetworkInfo networkInfo; // This Network object should always be used if possible, so as to encourage reuse of the @@ -890,7 +890,15 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { return isVPN(); } - public FullScore getScore() { + // Caller must not mutate. This method is called frequently and making a defensive copy + // would be too expensive. This is used by NetworkRanker.Scoreable, so it can be compared + // against other scoreables. + @Override public NetworkCapabilities getCaps() { + return networkCapabilities; + } + + // NetworkRanker.Scoreable + @Override public FullScore getScore() { return mScore; } diff --git a/services/core/java/com/android/server/connectivity/NetworkOffer.java b/services/core/java/com/android/server/connectivity/NetworkOffer.java index a0d392445472..5336593b4065 100644 --- a/services/core/java/com/android/server/connectivity/NetworkOffer.java +++ b/services/core/java/com/android/server/connectivity/NetworkOffer.java @@ -40,7 +40,7 @@ import java.util.Set; * * @hide */ -public class NetworkOffer { +public class NetworkOffer implements NetworkRanker.Scoreable { @NonNull public final FullScore score; @NonNull public final NetworkCapabilities caps; @NonNull public final INetworkOfferCallback callback; @@ -67,6 +67,20 @@ public class NetworkOffer { } /** + * Get the score filter of this offer + */ + @Override @NonNull public FullScore getScore() { + return score; + } + + /** + * Get the capabilities filter of this offer + */ + @Override @NonNull public NetworkCapabilities getCaps() { + return caps; + } + + /** * Tell the provider for this offer that the network is needed for a request. * @param request the request for which the offer is needed */ diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java index 0e4dda22886e..3aaff59a7484 100644 --- a/services/core/java/com/android/server/connectivity/NetworkRanker.java +++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java @@ -16,31 +16,233 @@ package com.android.server.connectivity; +import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH; +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; +import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; +import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import static android.net.NetworkScore.POLICY_EXITING; +import static android.net.NetworkScore.POLICY_TRANSPORT_PRIMARY; +import static android.net.NetworkScore.POLICY_YIELD_TO_BAD_WIFI; + +import static com.android.server.connectivity.FullScore.POLICY_ACCEPT_UNVALIDATED; +import static com.android.server.connectivity.FullScore.POLICY_EVER_USER_SELECTED; +import static com.android.server.connectivity.FullScore.POLICY_IS_INVINCIBLE; +import static com.android.server.connectivity.FullScore.POLICY_IS_VALIDATED; +import static com.android.server.connectivity.FullScore.POLICY_IS_VPN; + import android.annotation.NonNull; import android.annotation.Nullable; import android.net.NetworkCapabilities; import android.net.NetworkRequest; +import com.android.net.module.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; /** * A class that knows how to find the best network matching a request out of a list of networks. */ public class NetworkRanker { + // Historically the legacy ints have been 0~100 in principle (though the highest score in + // AOSP has always been 90). This is relied on by VPNs that send a legacy score of 101. + public static final int LEGACY_INT_MAX = 100; + + /** + * A class that can be scored against other scoreables. + */ + public interface Scoreable { + /** Get score of this scoreable */ + FullScore getScore(); + /** Get capabilities of this scoreable */ + NetworkCapabilities getCaps(); + } + + private static final boolean USE_POLICY_RANKING = false; + public NetworkRanker() { } + // TODO : move to module utils CollectionUtils. + @NonNull private static <T> ArrayList<T> filter(@NonNull final Collection<T> source, + @NonNull final Predicate<T> test) { + final ArrayList<T> matches = new ArrayList<>(); + for (final T e : source) { + if (test.test(e)) { + matches.add(e); + } + } + return matches; + } + /** * Find the best network satisfying this request among the list of passed networks. */ - // Almost equivalent to Collections.max(nais), but allows returning null if no network - // satisfies the request. @Nullable public NetworkAgentInfo getBestNetwork(@NonNull final NetworkRequest request, + @NonNull final Collection<NetworkAgentInfo> nais, + @Nullable final NetworkAgentInfo currentSatisfier) { + final ArrayList<NetworkAgentInfo> candidates = filter(nais, nai -> nai.satisfies(request)); + if (candidates.size() == 1) return candidates.get(0); // Only one potential satisfier + if (candidates.size() <= 0) return null; // No network can satisfy this request + if (USE_POLICY_RANKING) { + return getBestNetworkByPolicy(candidates, currentSatisfier); + } else { + return getBestNetworkByLegacyInt(candidates); + } + } + + // Transport preference order, if it comes down to that. + private static final int[] PREFERRED_TRANSPORTS_ORDER = { TRANSPORT_ETHERNET, TRANSPORT_WIFI, + TRANSPORT_BLUETOOTH, TRANSPORT_CELLULAR }; + + // Function used to partition a list into two working areas depending on whether they + // satisfy a predicate. All items satisfying the predicate will be put in |positive|, all + // items that don't will be put in |negative|. + // This is useful in this file because many of the ranking checks will retain only networks that + // satisfy a predicate if any of them do, but keep them all if all of them do. Having working + // areas is uncustomary in Java, but this function is called in a fairly intensive manner + // and doing allocation quite that often might affect performance quite badly. + private static <T> void partitionInto(@NonNull final List<T> source, @NonNull Predicate<T> test, + @NonNull final List<T> positive, @NonNull final List<T> negative) { + positive.clear(); + negative.clear(); + for (final T item : source) { + if (test.test(item)) { + positive.add(item); + } else { + negative.add(item); + } + } + } + + @Nullable private <T extends Scoreable> T getBestNetworkByPolicy( + @NonNull List<T> candidates, + @Nullable final T currentSatisfier) { + // Used as working areas. + final ArrayList<T> accepted = + new ArrayList<>(candidates.size() /* initialCapacity */); + final ArrayList<T> rejected = + new ArrayList<>(candidates.size() /* initialCapacity */); + + // The following tests will search for a network matching a given criterion. They all + // function the same way : if any network matches the criterion, drop from consideration + // all networks that don't. To achieve this, the tests below : + // 1. partition the list of remaining candidates into accepted and rejected networks. + // 2. if only one candidate remains, that's the winner : if accepted.size == 1 return [0] + // 3. if multiple remain, keep only the accepted networks and go on to the next criterion. + // Because the working areas will be wiped, a copy of the accepted networks needs to be + // made. + // 4. if none remain, the criterion did not help discriminate so keep them all. As an + // optimization, skip creating a new array and go on to the next criterion. + + // If a network is invincible, use it. + partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_INVINCIBLE), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // If there is a connected VPN, use it. + partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_VPN), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // Selected & Accept-unvalidated policy : if any network has both of these, then don't + // choose one that doesn't. + partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_EVER_USER_SELECTED) + && nai.getScore().hasPolicy(POLICY_ACCEPT_UNVALIDATED), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // Yield to bad wifi policy : if any wifi has ever been validated, keep only networks + // that don't yield to such a wifi network. + final boolean anyWiFiEverValidated = CollectionUtils.any(candidates, + nai -> nai.getScore().hasPolicy(POLICY_EVER_USER_SELECTED) + && nai.getCaps().hasTransport(TRANSPORT_WIFI)); + if (anyWiFiEverValidated) { + partitionInto(candidates, nai -> !nai.getScore().hasPolicy(POLICY_YIELD_TO_BAD_WIFI), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + } + + // If any network is validated (or should be accepted even if it's not validated), then + // don't choose one that isn't. + partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_VALIDATED) + || nai.getScore().hasPolicy(POLICY_ACCEPT_UNVALIDATED), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // If any network is not exiting, don't choose one that is. + partitionInto(candidates, nai -> !nai.getScore().hasPolicy(POLICY_EXITING), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // TODO : If any network is unmetered, don't choose a metered network. + // This can't be implemented immediately because prospective networks are always + // considered unmetered because factories don't know if the network will be metered. + // Saying an unmetered network always beats a metered one would mean that when metered wifi + // is connected, the offer for telephony would beat WiFi but the actual metered network + // would lose, so we'd have an infinite loop where telephony would continually bring up + // a network that is immediately torn down. + // Fix this by getting the agent to tell connectivity whether the network they will + // bring up is metered. Cell knows that in advance, while WiFi has a good estimate and + // can revise it if the network later turns out to be metered. + // partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_UNMETERED), + // accepted, rejected); + // if (accepted.size() == 1) return accepted.get(0); + // if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted); + + // If any network is for the default subscription, don't choose a network for another + // subscription with the same transport. + partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_TRANSPORT_PRIMARY), + accepted, rejected); + for (final Scoreable defaultSubNai : accepted) { + // Remove all networks without the DEFAULT_SUBSCRIPTION policy and the same transports + // as a network that has it. + final int[] transports = defaultSubNai.getCaps().getTransportTypes(); + candidates.removeIf(nai -> !nai.getScore().hasPolicy(POLICY_TRANSPORT_PRIMARY) + && Arrays.equals(transports, nai.getCaps().getTransportTypes())); + } + if (1 == candidates.size()) return candidates.get(0); + // It's guaranteed candidates.size() > 0 because there is at least one with DEFAULT_SUB + // policy and only those without it were removed. + + // If some of the networks have a better transport than others, keep only the ones with + // the best transports. + for (final int transport : PREFERRED_TRANSPORTS_ORDER) { + partitionInto(candidates, nai -> nai.getCaps().hasTransport(transport), + accepted, rejected); + if (accepted.size() == 1) return accepted.get(0); + if (accepted.size() > 0 && rejected.size() > 0) { + candidates = new ArrayList<>(accepted); + break; + } + } + + // At this point there are still multiple networks passing all the tests above. If any + // of them is the previous satisfier, keep it. + if (candidates.contains(currentSatisfier)) return currentSatisfier; + + // If there are still multiple options at this point but none of them is any of the + // transports above, it doesn't matter which is returned. They are all the same. + return candidates.get(0); + } + + // TODO : switch to the policy implementation and remove + // Almost equivalent to Collections.max(nais), but allows returning null if no network + // satisfies the request. + private NetworkAgentInfo getBestNetworkByLegacyInt( @NonNull final Collection<NetworkAgentInfo> nais) { NetworkAgentInfo bestNetwork = null; int bestScore = Integer.MIN_VALUE; for (final NetworkAgentInfo nai : nais) { - if (!nai.satisfies(request)) continue; if (nai.getCurrentScore() > bestScore) { bestNetwork = nai; bestScore = nai.getCurrentScore(); @@ -63,19 +265,37 @@ public class NetworkRanker { * beat a current champion. * * @param request The request to evaluate against. - * @param championScore The currently best network for this request. + * @param champion The currently best network for this request. * @param offer The offer. * @return Whether the offer stands a chance to beat the champion. */ public boolean mightBeat(@NonNull final NetworkRequest request, - @Nullable final FullScore championScore, + @Nullable final NetworkAgentInfo champion, @NonNull final NetworkOffer offer) { // If this network can't even satisfy the request then it can't beat anything, not // even an absence of network. It can't satisfy it anyway. if (!request.canBeSatisfiedBy(offer.caps)) return false; // If there is no satisfying network, then this network can beat, because some network // is always better than no network. - if (null == championScore) return true; + if (null == champion) return true; + if (USE_POLICY_RANKING) { + // If there is no champion, the offer can always beat. + // Otherwise rank them. + final ArrayList<Scoreable> candidates = new ArrayList<>(); + candidates.add(champion); + candidates.add(offer); + return offer == getBestNetworkByPolicy(candidates, champion); + } else { + return mightBeatByLegacyInt(request, champion.getScore(), offer); + } + } + + /** + * Returns whether an offer might beat a champion according to the legacy int. + */ + public boolean mightBeatByLegacyInt(@NonNull final NetworkRequest request, + @Nullable final FullScore championScore, + @NonNull final NetworkOffer offer) { final int offerIntScore; if (offer.caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { // If the offer might have Internet access, then it might validate. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index dcb990600bb8..1279025b1485 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4217,8 +4217,9 @@ public class PackageManagerService extends IPackageManager.Stub // aware/unaware components they want to see, so fall through and // give them what they want } else { + final UserManagerInternal umInternal = mInjector.getUserManagerInternal(); // Caller expressed no opinion, so match based on user state - if (mUserManager.isUserUnlockingOrUnlocked(userId)) { + if (umInternal.isUserUnlockingOrUnlocked(userId)) { flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE; } else { flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE; @@ -6469,20 +6470,6 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.readLegacyPermissionsTEMP(mSettings.mPermissions); - // Clean up orphaned packages for which the code path doesn't exist - // and they are an update to a system app - caused by bug/32321269 - final WatchedArrayMap<String, PackageSetting> packageSettings = - mSettings.getPackagesLocked(); - final int packageSettingCount = packageSettings.size(); - for (int i = packageSettingCount - 1; i >= 0; i--) { - PackageSetting ps = packageSettings.valueAt(i); - if (!isExternal(ps) && (ps.getPath() == null || !ps.getPath().exists()) - && mSettings.getDisabledSystemPkgLPr(ps.name) != null) { - packageSettings.removeAt(i); - mSettings.enableSystemPackageLPw(ps.name); - } - } - if (!mOnlyCore && mFirstBoot) { requestCopyPreoptedFiles(mInjector); } @@ -6531,6 +6518,9 @@ public class PackageManagerService extends IPackageManager.Stub mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1; mIsPreQUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.Q; + final WatchedArrayMap<String, PackageSetting> packageSettings = + mSettings.getPackagesLocked(); + // Save the names of pre-existing packages prior to scanning, so we can determine // which system packages are completely new due to an upgrade. if (isDeviceUpgrading()) { @@ -8213,9 +8203,10 @@ public class PackageManagerService extends IPackageManager.Stub // 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 { @@ -15253,7 +15244,8 @@ public class PackageManagerService extends IPackageManager.Stub userId); // Deliver BOOT_COMPLETED only if user is unlocked - if (mUserManager.isUserUnlockingOrUnlocked(userId)) { + final UserManagerInternal umInternal = mInjector.getUserManagerInternal(); + if (umInternal.isUserUnlockingOrUnlocked(userId)) { Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED).setPackage(packageName); if (includeStopped) { bcIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 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 142b36e8eaf3..7e3911ac9a6d 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -3125,6 +3125,10 @@ public class PermissionManagerService extends IPermissionManager.Stub { if (sourcePerms != null) { Permission bp = mRegistry.getPermission(newPerm); + if (bp == null) { + throw new IllegalStateException("Unknown new permission in split permission: " + + newPerm); + } if (bp.isRuntime()) { if (!newPerm.equals(Manifest.permission.ACTIVITY_RECOGNITION)) { @@ -3140,6 +3144,10 @@ public class PermissionManagerService extends IPermissionManager.Stub { sourcePermNum++) { final String sourcePerm = sourcePerms.valueAt(sourcePermNum); Permission sourceBp = mRegistry.getPermission(sourcePerm); + if (sourceBp == null) { + throw new IllegalStateException("Unknown source permission in split" + + " permission: " + sourcePerm); + } if (!sourceBp.isRuntime()) { inheritsFromInstallPerm = true; break; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f931df8d7704..c7789eecc68f 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 91231c3032b4..a7e2d1dcceec 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 android.util.MathUtils.constrain; 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.NetworkStatsExt; 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 @@ public class StatsPullAtomService extends SystemService { 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 @@ public class StatsPullAtomService extends SystemService { 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 @@ public class StatsPullAtomService extends SystemService { registerBuildInformation(); registerRoleHolder(); registerTimeZoneDataInfo(); + registerTimeZoneDetectorState(); registerExternalStorageInfo(); registerAppsOnExternalStorageInfo(); registerFaceSettings(); @@ -3254,6 +3265,57 @@ public class StatsPullAtomService extends SystemService { 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 8819b371b225..52ff48b6a277 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 @@ public final class ServerFlags { @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 dfff6f2dd5ae..e19ec8472e0a 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 @@ public class RealProviderMetricsLogger implements ProviderMetricsLogger { @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/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java index 89ed956b3aef..c0130da7ddbc 100644 --- a/services/core/java/com/android/server/vcn/Vcn.java +++ b/services/core/java/com/android/server/vcn/Vcn.java @@ -417,7 +417,7 @@ public class Vcn extends Handler { /** 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); @@ -445,12 +445,12 @@ public class Vcn extends Handler { @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 9589505ef251..2ba8edd3b1d0 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -980,7 +980,7 @@ public class VcnGatewayConnection extends StateMachine { // 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 +1017,7 @@ public class VcnGatewayConnection extends StateMachine { } mGatewayStatusCallback.onGatewayConnectionError( - mConnectionConfig.getExposedCapabilities(), + mConnectionConfig.getGatewayConnectionName(), errorCode, exceptionClass, exceptionMessage); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f0c4a1565bfe..d13babc166eb 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8507,7 +8507,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A record.mAdapter.mRootTaskBounds, task.getWindowConfiguration(), false /*isNotInRecents*/, record.mThumbnailAdapter != null ? record.mThumbnailAdapter.mCapturedLeash : null, - record.mStartBounds, task.getPictureInPictureParams()); + record.mStartBounds, task.getTaskInfo()); } @Override diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a9d33dc29467..c9af62bcfd61 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3750,6 +3750,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @VisibleForTesting void setImeInputTarget(WindowState target) { mImeInputTarget = target; + boolean canScreenshot = mImeInputTarget == null || !mImeInputTarget.isSecureLocked(); + if (mImeWindowsContainer.setCanScreenshot(canScreenshot)) { + mWmService.requestTraversal(); + } } @VisibleForTesting @@ -3867,7 +3871,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp 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/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 87854c251d26..c1d5b5c98f57 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -1126,7 +1126,7 @@ public class RecentsAnimationController implements DeathRecipient { !topApp.fillsParent(), new Rect(), insets, mTask.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top), mLocalBounds, mBounds, mTask.getWindowConfiguration(), - mIsRecentTaskInvisible, null, null, mTask.getPictureInPictureParams()); + mIsRecentTaskInvisible, null, null, mTask.getTaskInfo()); return mTarget; } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 7644cf2fa592..580bd06194c8 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -274,7 +274,9 @@ class WallpaperController { void hideDeferredWallpapersIfNeededLegacy() { for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) { final WallpaperWindowToken token = mWallpaperTokens.get(i); - token.commitVisibility(false); + if (!token.isVisibleRequested()) { + token.commitVisibility(false); + } } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index a5843d496add..070a7252a3bf 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 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< @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/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 171e93fb4df9..95f3c3711136 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5035,7 +5035,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // Cancel the existing exit animation for the next enter animation. if (isAnimating()) { cancelAnimation(); - destroySurfaceUnchecked(); } mAnimatingExit = false; } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 3ef7ccd6bfab..ca38bb90f19c 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 @@ class WindowStateAnimator { // 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/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index 3dff36e8f379..81be2e7d8cea 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -64,6 +64,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; /** * Tests for MagnificationController. @@ -72,6 +73,7 @@ import org.mockito.MockitoAnnotations; public class MagnificationControllerTest { private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY; + private static final int TEST_SERVICE_ID = 1; private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600); private static final float MAGNIFIED_CENTER_X = 100; private static final float MAGNIFIED_CENTER_Y = 200; @@ -96,6 +98,7 @@ public class MagnificationControllerTest { private WindowMagnificationManager mWindowMagnificationManager; private MockContentResolver mMockResolver; private MagnificationController mMagnificationController; + private FullScreenMagnificationControllerStubber mScreenMagnificationControllerStubber; @Before public void setUp() throws Exception { @@ -112,8 +115,11 @@ public class MagnificationControllerTest { mock(WindowMagnificationManager.Callback.class))); mMockConnection = new MockWindowMagnificationConnection(true); mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + mScreenMagnificationControllerStubber = new FullScreenMagnificationControllerStubber( + mScreenMagnificationController); mMagnificationController = spy(new MagnificationController(mService, new Object(), mContext, mScreenMagnificationController, mWindowMagnificationManager)); + mMagnificationController.setMagnificationCapabilities( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL); } @@ -240,9 +246,11 @@ public class MagnificationControllerTest { MODE_FULLSCREEN, mTransitionCallBack); - verify(mScreenMagnificationController).setScaleAndCenter(TEST_DISPLAY, - DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, - true, MAGNIFICATION_GESTURE_HANDLER_ID); + assertEquals(DEFAULT_SCALE, mScreenMagnificationController.getScale(TEST_DISPLAY), 0); + assertEquals(MAGNIFIED_CENTER_X, mScreenMagnificationController.getCenterX(TEST_DISPLAY), + 0); + assertEquals(MAGNIFIED_CENTER_Y, mScreenMagnificationController.getCenterY(TEST_DISPLAY), + 0); verify(mTransitionCallBack).onResult(true); } @@ -286,13 +294,32 @@ public class MagnificationControllerTest { public void onMagnificationRequest_windowMagnifying_disableWindow() throws RemoteException { setMagnificationEnabled(MODE_WINDOW); - mMagnificationController.onRequestMagnificationSpec(TEST_DISPLAY, 1); + mMagnificationController.onRequestMagnificationSpec(TEST_DISPLAY, TEST_SERVICE_ID); mMockConnection.invokeCallbacks(); assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY)); } @Test + public void magnifyThroughExternalRequest_showMagnificationButton() { + mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE, + MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, false, TEST_SERVICE_ID); + mMagnificationController.onRequestMagnificationSpec(TEST_DISPLAY, TEST_SERVICE_ID); + + verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY), + eq(MODE_FULLSCREEN)); + } + + @Test + public void setScaleOneThroughExternalRequest_removeMagnificationButton() { + mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, 1.0f, + MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, false, TEST_SERVICE_ID); + mMagnificationController.onRequestMagnificationSpec(TEST_DISPLAY, TEST_SERVICE_ID); + + verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY)); + } + + @Test public void onPerformScaleAction_magnifierEnabled_handleScaleChange() throws RemoteException { final float newScale = 4.0f; setMagnificationEnabled(MODE_WINDOW); @@ -305,15 +332,26 @@ public class MagnificationControllerTest { @Test public void onWindowMagnificationActivationState_windowActivated_logWindowDuration() { - mMagnificationController.onWindowMagnificationActivationState(true); + mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); - mMagnificationController.onWindowMagnificationActivationState(false); + mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, false); verify(mMagnificationController).logMagnificationUsageState( eq(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW), anyLong()); } @Test + public void onWinodwModeActivated_fullScreenIsActivatedByExternal_fullScreenIsDisabled() { + mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, + DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, + true, TEST_SERVICE_ID); + + mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); + + assertFalse(mScreenMagnificationController.isMagnifying(TEST_DISPLAY)); + } + + @Test public void onFullScreenMagnificationActivationState_fullScreenActivated_logFullScreenDuration() { mMagnificationController.onFullScreenMagnificationActivationState(true); @@ -418,6 +456,18 @@ public class MagnificationControllerTest { } @Test + public void triggerShortcutToShowMagnificationBound_fullscreenMode_showMagnificationButton() { + setMagnificationModeSettings(MODE_FULLSCREEN); + + when(mScreenMagnificationController.isForceShowMagnifiableBounds(TEST_DISPLAY)).thenReturn( + true); + mMagnificationController.onShortcutTriggered(TEST_DISPLAY, MODE_FULLSCREEN); + + verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY), + eq(MODE_FULLSCREEN)); + } + + @Test public void onShortcutTriggered_windowModeDisabled_removeMagnificationButton() throws RemoteException { @@ -488,7 +538,7 @@ public class MagnificationControllerTest { @Test public void imeWindowStateShown_windowMagnifying_logWindowMode() { - mMagnificationController.onWindowMagnificationActivationState(true); + mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); mMagnificationController.onImeWindowVisibilityChanged(true); @@ -522,26 +572,19 @@ public class MagnificationControllerTest { @Test public void imeWindowStateHidden_fullScreenMagnifying_noLogAnyMode() { - mMagnificationController.onWindowMagnificationActivationState(true); + mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); verify(mMagnificationController, never()).logMagnificationModeWithIme(anyInt()); } private void setMagnificationEnabled(int mode) throws RemoteException { - setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y); } private void setMagnificationEnabled(int mode, float centerX, float centerY) throws RemoteException { setMagnificationModeSettings(mode); - Mockito.reset(mScreenMagnificationController); - doAnswer(invocation -> { - final Region outRegion = invocation.getArgument(1); - outRegion.set(MAGNIFICATION_REGION); - return null; - }).when(mScreenMagnificationController).getMagnificationRegion(anyInt(), any(Region.class)); - + mScreenMagnificationControllerStubber.resetAndStubMethods(); final boolean windowMagnifying = mWindowMagnificationManager.isWindowMagnifierEnabled( TEST_DISPLAY); if (windowMagnifying) { @@ -549,21 +592,9 @@ public class MagnificationControllerTest { mMockConnection.invokeCallbacks(); } if (mode == MODE_FULLSCREEN) { - when(mScreenMagnificationController.isMagnifying(TEST_DISPLAY)).thenReturn(true); - when(mScreenMagnificationController.isForceShowMagnifiableBounds( - TEST_DISPLAY)).thenReturn(true); - when(mScreenMagnificationController.getPersistedScale()).thenReturn(DEFAULT_SCALE); - when(mScreenMagnificationController.getScale(TEST_DISPLAY)).thenReturn(DEFAULT_SCALE); - when(mScreenMagnificationController.getCenterX(TEST_DISPLAY)).thenReturn( - centerX); - when(mScreenMagnificationController.getCenterY(TEST_DISPLAY)).thenReturn( - centerY); + mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE, centerX, + centerY, true, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); } else { - doAnswer(invocation -> { - when(mScreenMagnificationController.isMagnifying(TEST_DISPLAY)).thenReturn(true); - return null; - }).when(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), - eq(DEFAULT_SCALE), anyFloat(), anyFloat(), anyBoolean(), anyInt()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, DEFAULT_SCALE, centerX, centerY, null); mMockConnection.invokeCallbacks(); @@ -574,4 +605,90 @@ public class MagnificationControllerTest { Settings.Secure.putIntForUser(mMockResolver, Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, mode, CURRENT_USER_ID); } + + /** + * Stubs public methods to simulate the real beahviours. + */ + private static class FullScreenMagnificationControllerStubber { + private final FullScreenMagnificationController mScreenMagnificationController; + private boolean mIsMagnifying = false; + private float mScale = 1.0f; + private float mCenterX = 0; + private float mCenterY = 0; + private int mServiceId = -1; + + FullScreenMagnificationControllerStubber( + FullScreenMagnificationController screenMagnificationController) { + mScreenMagnificationController = screenMagnificationController; + resetCenter(); + stubMethods(); + } + + private void stubMethods() { + doAnswer(invocation -> mIsMagnifying).when(mScreenMagnificationController).isMagnifying( + TEST_DISPLAY); + doAnswer(invocation -> mIsMagnifying).when( + mScreenMagnificationController).isForceShowMagnifiableBounds(TEST_DISPLAY); + doAnswer(invocation -> mScale).when(mScreenMagnificationController).getPersistedScale(); + doAnswer(invocation -> mScale).when(mScreenMagnificationController).getScale( + TEST_DISPLAY); + doAnswer(invocation -> mCenterX).when(mScreenMagnificationController).getCenterX( + TEST_DISPLAY); + doAnswer(invocation -> mCenterY).when(mScreenMagnificationController).getCenterY( + TEST_DISPLAY); + doAnswer(invocation -> mServiceId).when( + mScreenMagnificationController).getIdOfLastServiceToMagnify(TEST_DISPLAY); + + doAnswer(invocation -> { + final Region outRegion = invocation.getArgument(1); + outRegion.set(MAGNIFICATION_REGION); + return null; + }).when(mScreenMagnificationController).getMagnificationRegion(anyInt(), + any(Region.class)); + + Answer setScaleAndCenterStubAnswer = invocation -> { + final float scale = invocation.getArgument(1); + mScale = Float.isNaN(scale) ? mScale : scale; + mIsMagnifying = mScale > 1.0f; + if (mIsMagnifying) { + mCenterX = invocation.getArgument(2); + mCenterY = invocation.getArgument(3); + mServiceId = invocation.getArgument(5); + } else { + mServiceId = -1; + resetCenter(); + } + return true; + }; + doAnswer(setScaleAndCenterStubAnswer).when( + mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), + anyFloat(), anyFloat(), anyFloat(), any(), anyInt()); + + doAnswer(setScaleAndCenterStubAnswer).when( + mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), + anyFloat(), anyFloat(), anyFloat(), anyBoolean(), anyInt()); + + Answer resetStubAnswer = invocation -> { + mScale = 1.0f; + mIsMagnifying = false; + mServiceId = -1; + resetCenter(); + return true; + }; + doAnswer(resetStubAnswer).when(mScreenMagnificationController).reset(eq(TEST_DISPLAY), + any()); + doAnswer(resetStubAnswer).when(mScreenMagnificationController).reset(eq(TEST_DISPLAY), + anyBoolean()); + } + + private void resetCenter() { + mCenterX = MAGNIFICATION_REGION.getBounds().exactCenterX(); + mCenterY = MAGNIFICATION_REGION.getBounds().exactCenterY(); + } + + public void resetAndStubMethods() { + Mockito.reset(mScreenMagnificationController); + stubMethods(); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java index 955217c7d93f..ffa0185b4542 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java @@ -397,7 +397,7 @@ public class WindowMagnificationManagerTest { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); - verify(mMockCallback).onWindowMagnificationActivationState(eq(true)); + verify(mMockCallback).onWindowMagnificationActivationState(TEST_DISPLAY, true); } @Test @@ -406,7 +406,7 @@ public class WindowMagnificationManagerTest { mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, true); - verify(mMockCallback).onWindowMagnificationActivationState(eq(false)); + verify(mMockCallback).onWindowMagnificationActivationState(TEST_DISPLAY, false); } private MotionEvent generatePointersDownEvent(PointF[] pointersLocation) { 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 a37d5c8a956a..9433bf28e237 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.app.NotificationManager; 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 @@ public class NotificationComparatorTest extends UiServiceTestCase { 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 @@ public class NotificationComparatorTest extends UiServiceTestCase { 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 @@ public class NotificationComparatorTest extends UiServiceTestCase { 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 @@ public class NotificationComparatorTest extends UiServiceTestCase { 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/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index b24e78828f86..9a63782a4079 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -3284,7 +3284,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { 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, diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index 16d83d133fbe..a3b5fc7ba872 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 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { 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 7a53f1e159a9..eac21b492f10 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -56,6 +56,7 @@ import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; +import android.media.permission.ClearCallingIdentityContext; import android.media.permission.Identity; import android.media.permission.IdentityContext; import android.media.permission.PermissionUtil; @@ -141,7 +142,7 @@ public class SoundTriggerService extends SystemService { } if (stat.mIsStarted) { - Slog.e(TAG, "error onStart(): Model " + id + " already started"); + Slog.w(TAG, "error onStart(): Model " + id + " already started"); return; } @@ -153,12 +154,12 @@ public class SoundTriggerService extends SystemService { 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; } @@ -242,7 +243,7 @@ public class SoundTriggerService extends SystemService { @NonNull IBinder client) { try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect( originatorIdentity)) { - return new SoundTriggerSessionStub(newSoundTriggerHelper(), client); + return new SoundTriggerSessionStub(client); } } @@ -253,7 +254,7 @@ public class SoundTriggerService extends SystemService { try (SafeCloseable ignored = PermissionUtil.establishIdentityIndirect(mContext, SOUNDTRIGGER_DELEGATE_IDENTITY, middlemanIdentity, originatorIdentity)) { - return new SoundTriggerSessionStub(newSoundTriggerHelper(), client); + return new SoundTriggerSessionStub(client); } } } @@ -262,14 +263,15 @@ public class SoundTriggerService extends SystemService { private final SoundTriggerHelper mSoundTriggerHelper; // Used to detect client death. private final IBinder mClient; + private final Identity mOriginatorIdentity; private final TreeMap<UUID, SoundModel> mLoadedModels = new TreeMap<>(); private final Object mCallbacksLock = new Object(); private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks = new TreeMap<>(); - SoundTriggerSessionStub( - SoundTriggerHelper soundTriggerHelper, @NonNull IBinder client) { - mSoundTriggerHelper = soundTriggerHelper; + SoundTriggerSessionStub(@NonNull IBinder client) { + mSoundTriggerHelper = newSoundTriggerHelper(); mClient = client; + mOriginatorIdentity = IdentityContext.getNonNull(); try { mClient.linkToDeath(() -> { clientDied(); @@ -297,464 +299,496 @@ public class SoundTriggerService extends SystemService { @Override public int startRecognition(ParcelUuid parcelUuid, IRecognitionStatusCallback callback, RecognitionConfig config, boolean runInBatterySaverMode) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (runInBatterySaverMode) { - enforceCallingPermission(Manifest.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER); - } - if (DEBUG) { - Slog.i(TAG, "startRecognition(): Uuid : " + parcelUuid); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (runInBatterySaverMode) { + enforceCallingPermission(Manifest.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("startRecognition(): Uuid : " - + parcelUuid)); + if (DEBUG) { + Slog.i(TAG, "startRecognition(): Uuid : " + parcelUuid); + } - GenericSoundModel model = getSoundModel(parcelUuid); - if (model == null) { - Slog.e(TAG, "Null model in database for id: " + parcelUuid); + sEventLogger.log(new SoundTriggerLogger.StringEvent("startRecognition(): Uuid : " + + parcelUuid)); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognition(): Null model in database for id: " + parcelUuid)); + GenericSoundModel model = getSoundModel(parcelUuid); + if (model == null) { + Slog.w(TAG, "Null model in database for id: " + parcelUuid); - return STATUS_ERROR; - } + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "startRecognition(): Null model in database for id: " + parcelUuid)); - int ret = mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, - callback, config, runInBatterySaverMode); - if (ret == STATUS_OK) { - mSoundModelStatTracker.onStart(parcelUuid.getUuid()); + return STATUS_ERROR; + } + + int ret = mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, + callback, config, runInBatterySaverMode); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStart(parcelUuid.getUuid()); + } + return ret; } - return ret; } @Override public int stopRecognition(ParcelUuid parcelUuid, IRecognitionStatusCallback callback) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "stopRecognition(): Uuid : " + parcelUuid); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "stopRecognition(): Uuid : " + parcelUuid); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("stopRecognition(): Uuid : " - + parcelUuid)); + sEventLogger.log(new SoundTriggerLogger.StringEvent("stopRecognition(): Uuid : " + + parcelUuid)); - int ret = mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); - if (ret == STATUS_OK) { - mSoundModelStatTracker.onStop(parcelUuid.getUuid()); + int ret = mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), + callback); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStop(parcelUuid.getUuid()); + } + return ret; } - return ret; } @Override public SoundTrigger.GenericSoundModel getSoundModel(ParcelUuid soundModelId) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "getSoundModel(): id = " + soundModelId); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "getSoundModel(): id = " + soundModelId); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("getSoundModel(): id = " - + soundModelId)); + sEventLogger.log(new SoundTriggerLogger.StringEvent("getSoundModel(): id = " + + soundModelId)); - SoundTrigger.GenericSoundModel model = mDbHelper.getGenericSoundModel( - soundModelId.getUuid()); - return model; + SoundTrigger.GenericSoundModel model = mDbHelper.getGenericSoundModel( + soundModelId.getUuid()); + return model; + } } @Override public void updateSoundModel(SoundTrigger.GenericSoundModel soundModel) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "updateSoundModel(): model = " + soundModel); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "updateSoundModel(): model = " + soundModel); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("updateSoundModel(): model = " - + soundModel)); + sEventLogger.log(new SoundTriggerLogger.StringEvent("updateSoundModel(): model = " + + soundModel)); - mDbHelper.updateGenericSoundModel(soundModel); + mDbHelper.updateGenericSoundModel(soundModel); + } } @Override public void deleteSoundModel(ParcelUuid soundModelId) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "deleteSoundModel(): id = " + soundModelId); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "deleteSoundModel(): id = " + soundModelId); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("deleteSoundModel(): id = " - + soundModelId)); + sEventLogger.log(new SoundTriggerLogger.StringEvent("deleteSoundModel(): id = " + + soundModelId)); - // Unload the model if it is loaded. - mSoundTriggerHelper.unloadGenericSoundModel(soundModelId.getUuid()); + // Unload the model if it is loaded. + mSoundTriggerHelper.unloadGenericSoundModel(soundModelId.getUuid()); - // Stop tracking recognition if it is started. - mSoundModelStatTracker.onStop(soundModelId.getUuid()); + // Stop tracking recognition if it is started. + mSoundModelStatTracker.onStop(soundModelId.getUuid()); - mDbHelper.deleteGenericSoundModel(soundModelId.getUuid()); + mDbHelper.deleteGenericSoundModel(soundModelId.getUuid()); + } } @Override public int loadGenericSoundModel(GenericSoundModel soundModel) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (soundModel == null || soundModel.getUuid() == null) { - Slog.e(TAG, "Invalid sound model"); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (soundModel == null || soundModel.getUuid() == null) { + Slog.w(TAG, "Invalid sound model"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "loadGenericSoundModel(): Invalid sound model")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "loadGenericSoundModel(): Invalid sound model")); - return STATUS_ERROR; - } - if (DEBUG) { - Slog.i(TAG, "loadGenericSoundModel(): id = " + soundModel.getUuid()); - } + return STATUS_ERROR; + } + if (DEBUG) { + Slog.i(TAG, "loadGenericSoundModel(): id = " + soundModel.getUuid()); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("loadGenericSoundModel(): id = " - + soundModel.getUuid())); + sEventLogger.log(new SoundTriggerLogger.StringEvent("loadGenericSoundModel(): id = " + + soundModel.getUuid())); - synchronized (mLock) { - SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); - // If the model we're loading is actually different than what we had loaded, we - // should unload that other model now. We don't care about return codes since we - // don't know if the other model is loaded. - if (oldModel != null && !oldModel.equals(soundModel)) { - mSoundTriggerHelper.unloadGenericSoundModel(soundModel.getUuid()); - synchronized (mCallbacksLock) { - mCallbacks.remove(soundModel.getUuid()); + synchronized (mLock) { + SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); + // If the model we're loading is actually different than what we had loaded, we + // should unload that other model now. We don't care about return codes since we + // don't know if the other model is loaded. + if (oldModel != null && !oldModel.equals(soundModel)) { + mSoundTriggerHelper.unloadGenericSoundModel(soundModel.getUuid()); + synchronized (mCallbacksLock) { + mCallbacks.remove(soundModel.getUuid()); + } } + mLoadedModels.put(soundModel.getUuid(), soundModel); } - mLoadedModels.put(soundModel.getUuid(), soundModel); + return STATUS_OK; } - return STATUS_OK; } @Override public int loadKeyphraseSoundModel(KeyphraseSoundModel soundModel) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (soundModel == null || soundModel.getUuid() == null) { - Slog.e(TAG, "Invalid sound model"); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (soundModel == null || soundModel.getUuid() == null) { + Slog.w(TAG, "Invalid sound model"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "loadKeyphraseSoundModel(): Invalid sound model")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "loadKeyphraseSoundModel(): Invalid sound model")); - return STATUS_ERROR; - } - if (soundModel.getKeyphrases() == null || soundModel.getKeyphrases().length != 1) { - Slog.e(TAG, "Only one keyphrase per model is currently supported."); + return STATUS_ERROR; + } + if (soundModel.getKeyphrases() == null || soundModel.getKeyphrases().length != 1) { + Slog.w(TAG, "Only one keyphrase per model is currently supported."); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "loadKeyphraseSoundModel(): Only one keyphrase per model" - + " is currently supported.")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "loadKeyphraseSoundModel(): Only one keyphrase per model" + + " is currently supported.")); - return STATUS_ERROR; - } - if (DEBUG) { - Slog.i(TAG, "loadKeyphraseSoundModel(): id = " + soundModel.getUuid()); - } + return STATUS_ERROR; + } + if (DEBUG) { + Slog.i(TAG, "loadKeyphraseSoundModel(): id = " + soundModel.getUuid()); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("loadKeyphraseSoundModel(): id = " - + soundModel.getUuid())); + sEventLogger.log( + new SoundTriggerLogger.StringEvent("loadKeyphraseSoundModel(): id = " + + soundModel.getUuid())); - synchronized (mLock) { - SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); - // If the model we're loading is actually different than what we had loaded, we - // should unload that other model now. We don't care about return codes since we - // don't know if the other model is loaded. - if (oldModel != null && !oldModel.equals(soundModel)) { - mSoundTriggerHelper.unloadKeyphraseSoundModel( - soundModel.getKeyphrases()[0].getId()); - synchronized (mCallbacksLock) { - mCallbacks.remove(soundModel.getUuid()); + synchronized (mLock) { + SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); + // If the model we're loading is actually different than what we had loaded, we + // should unload that other model now. We don't care about return codes since we + // don't know if the other model is loaded. + if (oldModel != null && !oldModel.equals(soundModel)) { + mSoundTriggerHelper.unloadKeyphraseSoundModel( + soundModel.getKeyphrases()[0].getId()); + synchronized (mCallbacksLock) { + mCallbacks.remove(soundModel.getUuid()); + } } + mLoadedModels.put(soundModel.getUuid(), soundModel); } - mLoadedModels.put(soundModel.getUuid(), soundModel); + return STATUS_OK; } - return STATUS_OK; } @Override public int startRecognitionForService(ParcelUuid soundModelId, Bundle params, ComponentName detectionService, SoundTrigger.RecognitionConfig config) { - Objects.requireNonNull(soundModelId); - Objects.requireNonNull(detectionService); - Objects.requireNonNull(config); - - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + Objects.requireNonNull(soundModelId); + Objects.requireNonNull(detectionService); + Objects.requireNonNull(config); - enforceDetectionPermissions(detectionService); + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "startRecognition(): id = " + soundModelId); - } - - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognitionForService(): id = " + soundModelId)); + enforceDetectionPermissions(detectionService); - IRecognitionStatusCallback callback = - new RemoteSoundTriggerDetectionService(soundModelId.getUuid(), params, - detectionService, Binder.getCallingUserHandle(), config); + if (DEBUG) { + Slog.i(TAG, "startRecognition(): id = " + soundModelId); + } - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "startRecognitionForService(): id = " + soundModelId)); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognitionForService():" + soundModelId + " is not loaded")); + IRecognitionStatusCallback callback = + new RemoteSoundTriggerDetectionService(soundModelId.getUuid(), params, + detectionService, Binder.getCallingUserHandle(), config); - return STATUS_ERROR; - } - IRecognitionStatusCallback existingCallback = null; - synchronized (mCallbacksLock) { - existingCallback = mCallbacks.get(soundModelId.getUuid()); - } - if (existingCallback != null) { - Slog.e(TAG, soundModelId + " is already running"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognitionForService():" - + soundModelId + " is already running")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "startRecognitionForService():" + soundModelId + " is not loaded")); - return STATUS_ERROR; - } - int ret; - switch (soundModel.getType()) { - case SoundModel.TYPE_GENERIC_SOUND: - ret = mSoundTriggerHelper.startGenericRecognition(soundModel.getUuid(), - (GenericSoundModel) soundModel, callback, config, false); - break; - default: - Slog.e(TAG, "Unknown model type"); + return STATUS_ERROR; + } + IRecognitionStatusCallback existingCallback = null; + synchronized (mCallbacksLock) { + existingCallback = mCallbacks.get(soundModelId.getUuid()); + } + if (existingCallback != null) { + Slog.w(TAG, soundModelId + " is already running"); sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognitionForService(): Unknown model type")); + "startRecognitionForService():" + + soundModelId + " is already running")); return STATUS_ERROR; - } + } + int ret; + switch (soundModel.getType()) { + case SoundModel.TYPE_GENERIC_SOUND: + ret = mSoundTriggerHelper.startGenericRecognition(soundModel.getUuid(), + (GenericSoundModel) soundModel, callback, config, false); + break; + default: + Slog.e(TAG, "Unknown model type"); + + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "startRecognitionForService(): Unknown model type")); + + return STATUS_ERROR; + } - if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to start model: " + ret); + if (ret != STATUS_OK) { + Slog.e(TAG, "Failed to start model: " + ret); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "startRecognitionForService(): Failed to start model:")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "startRecognitionForService(): Failed to start model:")); - return ret; - } - synchronized (mCallbacksLock) { - mCallbacks.put(soundModelId.getUuid(), callback); - } + return ret; + } + synchronized (mCallbacksLock) { + mCallbacks.put(soundModelId.getUuid(), callback); + } - mSoundModelStatTracker.onStart(soundModelId.getUuid()); + mSoundModelStatTracker.onStart(soundModelId.getUuid()); + } + return STATUS_OK; } - return STATUS_OK; } @Override public int stopRecognitionForService(ParcelUuid soundModelId) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "stopRecognition(): id = " + soundModelId); - } - - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "stopRecognitionForService(): id = " + soundModelId)); - - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "stopRecognition(): id = " + soundModelId); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "stopRecognitionForService(): " + soundModelId - + " is not loaded")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "stopRecognitionForService(): id = " + soundModelId)); - return STATUS_ERROR; - } - IRecognitionStatusCallback callback = null; - synchronized (mCallbacksLock) { - callback = mCallbacks.get(soundModelId.getUuid()); - } - if (callback == null) { - Slog.e(TAG, soundModelId + " is not running"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "stopRecognitionForService(): " + soundModelId - + " is not running")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "stopRecognitionForService(): " + soundModelId + + " is not loaded")); - return STATUS_ERROR; - } - int ret; - switch (soundModel.getType()) { - case SoundModel.TYPE_GENERIC_SOUND: - ret = mSoundTriggerHelper.stopGenericRecognition( - soundModel.getUuid(), callback); - break; - default: - Slog.e(TAG, "Unknown model type"); + return STATUS_ERROR; + } + IRecognitionStatusCallback callback = null; + synchronized (mCallbacksLock) { + callback = mCallbacks.get(soundModelId.getUuid()); + } + if (callback == null) { + Slog.w(TAG, soundModelId + " is not running"); sEventLogger.log(new SoundTriggerLogger.StringEvent( - "stopRecognitionForService(): Unknown model type")); + "stopRecognitionForService(): " + soundModelId + + " is not running")); return STATUS_ERROR; - } + } + int ret; + switch (soundModel.getType()) { + case SoundModel.TYPE_GENERIC_SOUND: + ret = mSoundTriggerHelper.stopGenericRecognition( + soundModel.getUuid(), callback); + break; + default: + Slog.e(TAG, "Unknown model type"); + + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "stopRecognitionForService(): Unknown model type")); + + return STATUS_ERROR; + } - if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to stop model: " + ret); + if (ret != STATUS_OK) { + Slog.e(TAG, "Failed to stop model: " + ret); - sEventLogger.log(new SoundTriggerLogger.StringEvent( + sEventLogger.log(new SoundTriggerLogger.StringEvent( "stopRecognitionForService(): Failed to stop model: " + ret)); - return ret; - } - synchronized (mCallbacksLock) { - mCallbacks.remove(soundModelId.getUuid()); - } + return ret; + } + synchronized (mCallbacksLock) { + mCallbacks.remove(soundModelId.getUuid()); + } - mSoundModelStatTracker.onStop(soundModelId.getUuid()); + mSoundModelStatTracker.onStop(soundModelId.getUuid()); + } + return STATUS_OK; } - return STATUS_OK; } @Override public int unloadSoundModel(ParcelUuid soundModelId) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "unloadSoundModel(): id = " + soundModelId); - } - - sEventLogger.log(new SoundTriggerLogger.StringEvent("unloadSoundModel(): id = " - + soundModelId)); - - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "unloadSoundModel(): id = " + soundModelId); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "unloadSoundModel(): " + soundModelId + " is not loaded")); + sEventLogger.log(new SoundTriggerLogger.StringEvent("unloadSoundModel(): id = " + + soundModelId)); - return STATUS_ERROR; - } - int ret; - switch (soundModel.getType()) { - case SoundModel.TYPE_KEYPHRASE: - ret = mSoundTriggerHelper.unloadKeyphraseSoundModel( - ((KeyphraseSoundModel) soundModel).getKeyphrases()[0].getId()); - break; - case SoundModel.TYPE_GENERIC_SOUND: - ret = mSoundTriggerHelper.unloadGenericSoundModel(soundModel.getUuid()); - break; - default: - Slog.e(TAG, "Unknown model type"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); sEventLogger.log(new SoundTriggerLogger.StringEvent( - "unloadSoundModel(): Unknown model type")); + "unloadSoundModel(): " + soundModelId + " is not loaded")); return STATUS_ERROR; - } - if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to unload model"); + } + int ret; + switch (soundModel.getType()) { + case SoundModel.TYPE_KEYPHRASE: + ret = mSoundTriggerHelper.unloadKeyphraseSoundModel( + ((KeyphraseSoundModel) soundModel).getKeyphrases()[0].getId()); + break; + case SoundModel.TYPE_GENERIC_SOUND: + ret = mSoundTriggerHelper.unloadGenericSoundModel(soundModel.getUuid()); + break; + default: + Slog.e(TAG, "Unknown model type"); + + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "unloadSoundModel(): Unknown model type")); + + return STATUS_ERROR; + } + if (ret != STATUS_OK) { + Slog.e(TAG, "Failed to unload model"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "unloadSoundModel(): Failed to unload model")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "unloadSoundModel(): Failed to unload model")); - return ret; + return ret; + } + mLoadedModels.remove(soundModelId.getUuid()); + return STATUS_OK; } - mLoadedModels.remove(soundModelId.getUuid()); - return STATUS_OK; } } @Override public boolean isRecognitionActive(ParcelUuid parcelUuid) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - synchronized (mCallbacksLock) { - IRecognitionStatusCallback callback = mCallbacks.get(parcelUuid.getUuid()); - if (callback == null) { - return false; + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + synchronized (mCallbacksLock) { + IRecognitionStatusCallback callback = mCallbacks.get(parcelUuid.getUuid()); + if (callback == null) { + return false; + } } + return mSoundTriggerHelper.isRecognitionRequested(parcelUuid.getUuid()); } - return mSoundTriggerHelper.isRecognitionRequested(parcelUuid.getUuid()); } @Override public int getModelState(ParcelUuid soundModelId) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - int ret = STATUS_ERROR; - if (DEBUG) { - Slog.i(TAG, "getModelState(): id = " + soundModelId); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + int ret = STATUS_ERROR; + if (DEBUG) { + Slog.i(TAG, "getModelState(): id = " + soundModelId); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent("getModelState(): id = " - + soundModelId)); + sEventLogger.log(new SoundTriggerLogger.StringEvent("getModelState(): id = " + + soundModelId)); - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); + + sEventLogger.log(new SoundTriggerLogger.StringEvent("getModelState(): " + + soundModelId + " is not loaded")); - sEventLogger.log(new SoundTriggerLogger.StringEvent("getModelState(): " - + soundModelId + " is not loaded")); + return ret; + } + switch (soundModel.getType()) { + case SoundModel.TYPE_GENERIC_SOUND: + ret = mSoundTriggerHelper.getGenericModelState(soundModel.getUuid()); + break; + default: + // SoundModel.TYPE_KEYPHRASE is not supported to increase privacy. + Slog.e(TAG, "Unsupported model type, " + soundModel.getType()); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "getModelState(): Unsupported model type, " + + soundModel.getType())); + break; + } return ret; } - switch (soundModel.getType()) { - case SoundModel.TYPE_GENERIC_SOUND: - ret = mSoundTriggerHelper.getGenericModelState(soundModel.getUuid()); - break; - default: - // SoundModel.TYPE_KEYPHRASE is not supported to increase privacy. - Slog.e(TAG, "Unsupported model type, " + soundModel.getType()); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "getModelState(): Unsupported model type, " - + soundModel.getType())); - break; - } - - return ret; } } @Override @Nullable public ModuleProperties getModuleProperties() { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "getModuleProperties()"); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.i(TAG, "getModuleProperties()"); + } - synchronized (mLock) { - ModuleProperties properties = mSoundTriggerHelper.getModuleProperties(); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "getModuleProperties(): " + properties)); - return properties; + synchronized (mLock) { + ModuleProperties properties = mSoundTriggerHelper.getModuleProperties(); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "getModuleProperties(): " + properties)); + return properties; + } } } @Override public int setParameter(ParcelUuid soundModelId, @ModelParams int modelParam, int value) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "setParameter(): id=" + soundModelId - + ", param=" + modelParam - + ", value=" + value); - } - - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "setParameter(): id=" + soundModelId + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.d(TAG, "setParameter(): id=" + soundModelId + ", param=" + modelParam - + ", value=" + value)); + + ", value=" + value); + } - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded. Loaded models: " - + mLoadedModels.toString()); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "setParameter(): id=" + soundModelId + + ", param=" + modelParam + + ", value=" + value)); - sEventLogger.log(new SoundTriggerLogger.StringEvent("setParameter(): " - + soundModelId + " is not loaded")); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded. Loaded models: " + + mLoadedModels.toString()); - return STATUS_BAD_VALUE; - } + sEventLogger.log(new SoundTriggerLogger.StringEvent("setParameter(): " + + soundModelId + " is not loaded")); - return mSoundTriggerHelper.setParameter(soundModel.getUuid(), modelParam, value); + return STATUS_BAD_VALUE; + } + + return mSoundTriggerHelper.setParameter(soundModel.getUuid(), modelParam, + value); + } } } @@ -762,28 +796,30 @@ public class SoundTriggerService extends SystemService { public int getParameter(@NonNull ParcelUuid soundModelId, @ModelParams int modelParam) throws UnsupportedOperationException, IllegalArgumentException { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "getParameter(): id=" + soundModelId - + ", param=" + modelParam); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.d(TAG, "getParameter(): id=" + soundModelId + + ", param=" + modelParam); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "getParameter(): id=" + soundModelId - + ", param=" + modelParam)); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "getParameter(): id=" + soundModelId + + ", param=" + modelParam)); - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); - sEventLogger.log(new SoundTriggerLogger.StringEvent("getParameter(): " - + soundModelId + " is not loaded")); + sEventLogger.log(new SoundTriggerLogger.StringEvent("getParameter(): " + + soundModelId + " is not loaded")); - throw new IllegalArgumentException("sound model is not loaded"); - } + throw new IllegalArgumentException("sound model is not loaded"); + } - return mSoundTriggerHelper.getParameter(soundModel.getUuid(), modelParam); + return mSoundTriggerHelper.getParameter(soundModel.getUuid(), modelParam); + } } } @@ -791,29 +827,31 @@ public class SoundTriggerService extends SystemService { @Nullable public ModelParamRange queryParameter(@NonNull ParcelUuid soundModelId, @ModelParams int modelParam) { - enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "queryParameter(): id=" + soundModelId - + ", param=" + modelParam); - } + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + if (DEBUG) { + Slog.d(TAG, "queryParameter(): id=" + soundModelId + + ", param=" + modelParam); + } - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "queryParameter(): id=" + soundModelId - + ", param=" + modelParam)); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "queryParameter(): id=" + soundModelId + + ", param=" + modelParam)); - synchronized (mLock) { - SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); - if (soundModel == null) { - Slog.e(TAG, soundModelId + " is not loaded"); + synchronized (mLock) { + SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); + if (soundModel == null) { + Slog.w(TAG, soundModelId + " is not loaded"); - sEventLogger.log(new SoundTriggerLogger.StringEvent( - "queryParameter(): " - + soundModelId + " is not loaded")); + sEventLogger.log(new SoundTriggerLogger.StringEvent( + "queryParameter(): " + + soundModelId + " is not loaded")); - return null; - } + return null; + } - return mSoundTriggerHelper.queryParameter(soundModel.getUuid(), modelParam); + return mSoundTriggerHelper.queryParameter(soundModel.getUuid(), modelParam); + } } } @@ -824,6 +862,20 @@ public class SoundTriggerService extends SystemService { mSoundTriggerHelper.detach(); } + private void enforceCallingPermission(String permission) { + PermissionUtil.checkPermissionForPreflight(mContext, mOriginatorIdentity, permission); + } + + private void enforceDetectionPermissions(ComponentName detectionService) { + PackageManager packageManager = mContext.getPackageManager(); + String packageName = detectionService.getPackageName(); + if (packageManager.checkPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD, packageName) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException(detectionService.getPackageName() + " does not have" + + " permission " + Manifest.permission.CAPTURE_AUDIO_HOTWORD); + } + } + /** * Local end for a {@link SoundTriggerDetectionService}. Operations are queued up and * executed when the service connects. @@ -1577,23 +1629,6 @@ public class SoundTriggerService extends SystemService { } } - private void enforceCallingPermission(String permission) { - if (mContext.checkCallingOrSelfPermission(permission) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Caller does not hold the permission " + permission); - } - } - - private void enforceDetectionPermissions(ComponentName detectionService) { - PackageManager packageManager = mContext.getPackageManager(); - String packageName = detectionService.getPackageName(); - if (packageManager.checkPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD, packageName) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException(detectionService.getPackageName() + " does not have" - + " permission " + Manifest.permission.CAPTURE_AUDIO_HOTWORD); - } - } - //================================================================= // For logging diff --git a/telecomm/java/Android.bp b/telecomm/java/Android.bp index bac7228ca03b..3bd595352a55 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 9572c695c552..201ab530fe86 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 1bd582789572..3941b300206f 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/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 653aa9c06d2a..5b68be5e17b7 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1907,14 +1907,14 @@ public class TelephonyManager { * the IMEI/SV for GSM phones. Return null if the software version is * not available. * <p> - * Requires Permission: READ_PRIVILEGED_PHONE_STATE. + * Requires Permission: READ_PHONE_STATE. * * @param slotIndex of which deviceID is returned * * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public String getDeviceSoftwareVersion(int slotIndex) { ITelephony telephony = getITelephony(); 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 df58da5f157a..039ba512e95b 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 @@ public class PlatformCompatChangeRule extends CoreCompatChangeRule { 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/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index 429e676155f8..ef324e7c1377 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.Notification; 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.net.Uri; 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.PowerManager; import android.os.SystemClock; +import android.os.Vibrator; +import android.util.Log; import android.widget.RemoteViews; -import android.os.PowerManager; - -// private NM API -import android.app.INotificationManager; import android.widget.Toast; public class NotificationTestList extends TestActivity @@ -185,6 +180,7 @@ public class NotificationTestList extends TestActivity .setContentTitle("default priority group 1") .setGroup("group1") .setOngoing(true) + .setColor(Color.WHITE) .setColorized(true) .build(); mNM.notify(6002, n); diff --git a/tests/net/Android.bp b/tests/net/Android.bp index e1a424f214a5..6f503ace037f 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -51,12 +51,14 @@ java_defaults { android_test { name: "FrameworksNetTests", - defaults: ["FrameworksNetTests-jni-defaults"], + defaults: [ + "framework-connectivity-test-defaults", + "FrameworksNetTests-jni-defaults", + ], srcs: [ "java/**/*.java", "java/**/*.kt", ], - platform_apis: true, test_suites: ["device-tests"], certificate: "platform", jarjar_rules: "jarjar-rules.txt", diff --git a/tests/net/common/Android.bp b/tests/net/common/Android.bp index babb81c5fa34..439665b67ab7 100644 --- a/tests/net/common/Android.bp +++ b/tests/net/common/Android.bp @@ -27,7 +27,11 @@ package { java_library { name: "FrameworksNetCommonTests", - srcs: ["java/**/*.java", "java/**/*.kt"], + defaults: ["framework-connectivity-test-defaults"], + srcs: [ + "java/**/*.java", + "java/**/*.kt", + ], static_libs: [ "androidx.core_core", "androidx.test.rules", diff --git a/tests/net/integration/AndroidManifest.xml b/tests/net/integration/AndroidManifest.xml index f5a4234ede9e..db1850031ff5 100644 --- a/tests/net/integration/AndroidManifest.xml +++ b/tests/net/integration/AndroidManifest.xml @@ -37,6 +37,7 @@ <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <!-- Reading DeviceConfig flags --> <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/> + <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application android:debuggable="true"> <uses-library android:name="android.test.runner"/> diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 6245e8542b04..40d068d7e324 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -52,7 +52,6 @@ import android.util.Log; import android.util.Range; import com.android.net.module.util.ArrayTrackRecord; -import com.android.server.connectivity.ConnectivityConstants; import com.android.testutils.HandlerUtils; import com.android.testutils.TestableNetworkCallback; @@ -70,7 +69,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { private final ConditionVariable mDisconnected = new ConditionVariable(); private final ConditionVariable mPreventReconnectReceived = new ConditionVariable(); private final AtomicBoolean mConnected = new AtomicBoolean(false); - private int mScore; + private NetworkScore mScore; private NetworkAgent mNetworkAgent; private int mStartKeepaliveError = SocketKeepalive.ERROR_UNSUPPORTED; private int mStopKeepaliveError = SocketKeepalive.NO_KEEPALIVE; @@ -91,23 +90,23 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { mNetworkCapabilities.addTransportType(transport); switch (transport) { case TRANSPORT_ETHERNET: - mScore = 70; + mScore = new NetworkScore.Builder().setLegacyInt(70).build(); break; case TRANSPORT_WIFI: - mScore = 60; + mScore = new NetworkScore.Builder().setLegacyInt(60).build(); break; case TRANSPORT_CELLULAR: - mScore = 50; + mScore = new NetworkScore.Builder().setLegacyInt(50).build(); break; case TRANSPORT_WIFI_AWARE: - mScore = 20; + mScore = new NetworkScore.Builder().setLegacyInt(20).build(); break; case TRANSPORT_VPN: mNetworkCapabilities.removeCapability(NET_CAPABILITY_NOT_VPN); // VPNs deduce the SUSPENDED capability from their underlying networks and there // is no public API to let VPN services set it. mNetworkCapabilities.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); - mScore = ConnectivityConstants.VPN_DEFAULT_SCORE; + mScore = new NetworkScore.Builder().setLegacyInt(101).build(); break; default: throw new UnsupportedOperationException("unimplemented network type"); @@ -201,16 +200,22 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { } public void setScore(@NonNull final NetworkScore score) { - mScore = score.getLegacyInt(); + mScore = score; mNetworkAgent.sendNetworkScore(score); } public void adjustScore(int change) { - mScore += change; + final int newLegacyScore = mScore.getLegacyInt() + change; + final NetworkScore.Builder builder = new NetworkScore.Builder() + .setLegacyInt(newLegacyScore); + if (mNetworkCapabilities.hasTransport(TRANSPORT_WIFI) && newLegacyScore < 50) { + builder.setExiting(true); + } + mScore = builder.build(); mNetworkAgent.sendNetworkScore(mScore); } - public int getScore() { + public NetworkScore getScore() { return mScore; } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index c3cb5f80920e..b15d25250d4d 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -290,7 +290,6 @@ import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.FakeSettingsProvider; import com.android.net.module.util.ArrayTrackRecord; import com.android.server.ConnectivityService.ConnectivityDiagnosticsCallbackInfo; -import com.android.server.connectivity.ConnectivityConstants; import com.android.server.connectivity.MockableSystemProperties; import com.android.server.connectivity.Nat464Xlat; import com.android.server.connectivity.NetworkAgentInfo; @@ -3033,8 +3032,9 @@ public class ConnectivityServiceTest { } NetworkCapabilities filter = new NetworkCapabilities(); + filter.addTransportType(TRANSPORT_CELLULAR); filter.addCapability(capability); - // Add NOT_VCN_MANAGED capability into filter unconditionally since some request will add + // Add NOT_VCN_MANAGED capability into filter unconditionally since some requests will add // NOT_VCN_MANAGED automatically but not for NetworkCapabilities, // see {@code NetworkCapabilities#deduceNotVcnManagedCapability} for more details. filter.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); @@ -3063,15 +3063,11 @@ public class ConnectivityServiceTest { // Now bring in a higher scored network. TestNetworkAgentWrapper testAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - // Rather than create a validated network which complicates things by registering it's - // own NetworkRequest during startup, just bump up the score to cancel out the - // unvalidated penalty. - testAgent.adjustScore(40); - - // When testAgent connects, because of its 50 score (50 for cell + 40 adjustment score - // - 40 penalty for not being validated), it will beat the testFactory's offer, so - // the request will be removed. - testAgent.connect(false); + // When testAgent connects, because of its score (50 legacy int / cell transport) + // it will beat or equal the testFactory's offer, so the request will be removed. + // Note the agent as validated only if the capability is INTERNET, as it's the only case + // where it makes sense. + testAgent.connect(NET_CAPABILITY_INTERNET == capability /* validated */); testAgent.addCapability(capability); testFactory.expectRequestRemove(); testFactory.assertRequestCountEquals(0); @@ -3085,17 +3081,18 @@ public class ConnectivityServiceTest { testFactory.assertRequestCountEquals(0); assertFalse(testFactory.getMyStartRequested()); - // Make the test agent weak enough to have the exact same score as the - // factory (50 for cell + 40 adjustment -40 validation penalty - 5 adjustment). Make sure - // the factory doesn't see the request. + // If using legacy scores, make the test agent weak enough to have the exact same score as + // the factory (50 for cell - 5 adjustment). Make sure the factory doesn't see the request. + // If not using legacy score, this is a no-op and the "same score removes request" behavior + // has already been tested above. testAgent.adjustScore(-5); expectNoRequestChanged(testFactory); assertFalse(testFactory.getMyStartRequested()); - // Make the test agent weak enough to see the two requests (the one that was just sent, - // and either the default one or the one sent at the top of this test if the default - // won't be seen). - testAgent.adjustScore(-45); + // Make the test agent weak enough that the factory will see the two requests (the one that + // was just sent, and either the default one or the one sent at the top of this test if + // the default won't be seen). + testAgent.setScore(new NetworkScore.Builder().setLegacyInt(2).setExiting(true).build()); testFactory.expectRequestAdds(2); testFactory.assertRequestCountEquals(2); assertTrue(testFactory.getMyStartRequested()); @@ -3127,7 +3124,7 @@ public class ConnectivityServiceTest { assertTrue(testFactory.getMyStartRequested()); // Adjust the agent score up again. Expect the request to be withdrawn. - testAgent.adjustScore(50); + testAgent.setScore(new NetworkScore.Builder().setLegacyInt(50).build()); testFactory.expectRequestRemove(); testFactory.assertRequestCountEquals(0); assertFalse(testFactory.getMyStartRequested()); @@ -3168,22 +3165,35 @@ public class ConnectivityServiceTest { @Test public void testRegisterIgnoringScore() throws Exception { mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - mWiFiNetworkAgent.adjustScore(30); // score = 60 (wifi) + 30 = 90 + mWiFiNetworkAgent.setScore(new NetworkScore.Builder().setLegacyInt(90).build()); mWiFiNetworkAgent.connect(true /* validated */); // Make sure the factory sees the default network final NetworkCapabilities filter = new NetworkCapabilities(); + filter.addTransportType(TRANSPORT_CELLULAR); filter.addCapability(NET_CAPABILITY_INTERNET); filter.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); final HandlerThread handlerThread = new HandlerThread("testNetworkFactoryRequests"); handlerThread.start(); final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(), mServiceContext, "testFactory", filter, mCsHandlerThread); - testFactory.registerIgnoringScore(); - testFactory.expectRequestAdd(); + testFactory.register(); + + final MockNetworkFactory testFactoryAll = new MockNetworkFactory(handlerThread.getLooper(), + mServiceContext, "testFactoryAll", filter, mCsHandlerThread); + testFactoryAll.registerIgnoringScore(); + + // The regular test factory should not see the request, because WiFi is stronger than cell. + expectNoRequestChanged(testFactory); + // With ignoringScore though the request is seen. + testFactoryAll.expectRequestAdd(); + + // The legacy int will be ignored anyway, set the only other knob to true + mWiFiNetworkAgent.setScore(new NetworkScore.Builder().setLegacyInt(110) + .setTransportPrimary(true).build()); - mWiFiNetworkAgent.adjustScore(20); // exceed the maximum score - expectNoRequestChanged(testFactory); // still seeing the request + expectNoRequestChanged(testFactory); // still not seeing the request + expectNoRequestChanged(testFactoryAll); // still seeing the request mWiFiNetworkAgent.disconnect(); } @@ -6047,7 +6057,8 @@ public class ConnectivityServiceTest { // called again, it does. For example, connect Ethernet, but with a low score, such that it // does not become the default network. mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); - mEthernetNetworkAgent.adjustScore(-40); + mEthernetNetworkAgent.setScore( + new NetworkScore.Builder().setLegacyInt(30).setExiting(true).build()); mEthernetNetworkAgent.connect(false); waitForIdle(); verify(mStatsManager).notifyNetworkStatus(any(List.class), @@ -6922,8 +6933,6 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mMockVpn); callback.assertNoCallback(); - assertTrue(mMockVpn.getAgent().getScore() > mEthernetNetworkAgent.getScore()); - assertEquals(ConnectivityConstants.VPN_DEFAULT_SCORE, mMockVpn.getAgent().getScore()); assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); @@ -8225,12 +8234,12 @@ public class ConnectivityServiceTest { 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(); @@ -11645,14 +11654,14 @@ public class ConnectivityServiceTest { new LinkProperties(), oemPaidNc); oemPaidAgent.connect(true); - // The oemPaidAgent has score 50 (default for cell) so it beats what the oemPaidFactory can + // The oemPaidAgent has score 50/cell transport, so it beats what the oemPaidFactory can // provide, therefore it loses the request. oemPaidFactory.expectRequestRemove(); oemPaidFactory.assertRequestCountEquals(0); expectNoRequestChanged(internetFactory); internetFactory.assertRequestCountEquals(0); - oemPaidAgent.adjustScore(-30); + oemPaidAgent.setScore(new NetworkScore.Builder().setLegacyInt(20).setExiting(true).build()); // Now the that the agent is weak, the oemPaidFactory can beat the existing network for the // OEM_PAID request. The internet factory however can't beat a network that has OEM_PAID // for the preference request, so it doesn't see the request. @@ -11682,7 +11691,8 @@ public class ConnectivityServiceTest { // Now WiFi connects and it's unmetered, but it's weaker than cell. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); - mWiFiNetworkAgent.adjustScore(-30); // Not the best Internet network, but unmetered + mWiFiNetworkAgent.setScore(new NetworkScore.Builder().setLegacyInt(30).setExiting(true) + .build()); // Not the best Internet network, but unmetered mWiFiNetworkAgent.connect(true); // The OEM_PAID preference prefers an unmetered network to an OEM_PAID network, so diff --git a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt index 86c91165f61b..1348c6a1ac19 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt +++ b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt @@ -43,7 +43,7 @@ class NetworkRankerTest { val nais = scores.map { makeNai(true, it) } val bestNetwork = nais[2] // The one with the top score val someRequest = mock(NetworkRequest::class.java) - assertEquals(bestNetwork, ranker.getBestNetwork(someRequest, nais)) + assertEquals(bestNetwork, ranker.getBestNetwork(someRequest, nais, bestNetwork)) } @Test @@ -52,20 +52,20 @@ class NetworkRankerTest { makeNai(false, 60), makeNai(true, 23), makeNai(false, 68)) val bestNetwork = nais[1] // Top score that's satisfying val someRequest = mock(NetworkRequest::class.java) - assertEquals(bestNetwork, ranker.getBestNetwork(someRequest, nais)) + assertEquals(bestNetwork, ranker.getBestNetwork(someRequest, nais, nais[1])) } @Test fun testNoMatch() { val nais = listOf(makeNai(false, 20), makeNai(false, 50), makeNai(false, 90)) val someRequest = mock(NetworkRequest::class.java) - assertNull(ranker.getBestNetwork(someRequest, nais)) + assertNull(ranker.getBestNetwork(someRequest, nais, null)) } @Test fun testEmpty() { val someRequest = mock(NetworkRequest::class.java) - assertNull(ranker.getBestNetwork(someRequest, emptyList())) + assertNull(ranker.getBestNetwork(someRequest, emptyList(), null)) } // Make sure the ranker is "stable" (as in stable sort), that is, it always returns the FIRST @@ -75,10 +75,10 @@ class NetworkRankerTest { val nais1 = listOf(makeNai(true, 30), makeNai(true, 30), makeNai(true, 30), makeNai(true, 30), makeNai(true, 30), makeNai(true, 30)) val someRequest = mock(NetworkRequest::class.java) - assertEquals(nais1[0], ranker.getBestNetwork(someRequest, nais1)) + assertEquals(nais1[0], ranker.getBestNetwork(someRequest, nais1, nais1[0])) val nais2 = listOf(makeNai(true, 30), makeNai(true, 50), makeNai(true, 20), makeNai(true, 50), makeNai(true, 50), makeNai(true, 40)) - assertEquals(nais2[1], ranker.getBestNetwork(someRequest, nais2)) + assertEquals(nais2[1], ranker.getBestNetwork(someRequest, nais2, nais2[1])) } } diff --git a/tests/vcn/java/android/net/vcn/VcnConfigTest.java b/tests/vcn/java/android/net/vcn/VcnConfigTest.java index c1ef350e5c4a..7ac51b7e3342 100644 --- a/tests/vcn/java/android/net/vcn/VcnConfigTest.java +++ b/tests/vcn/java/android/net/vcn/VcnConfigTest.java @@ -79,6 +79,18 @@ public class VcnConfigTest { } @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 8a0c923d5fb0..4ee4d611e9b0 100644 --- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java +++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java @@ -19,6 +19,7 @@ package android.net.vcn; 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 class VcnGatewayConnectionConfigTest { 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 @@ public class VcnGatewayConnectionConfigTest { } @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 class VcnGatewayConnectionConfigTest { 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 516c206672d2..8461de6d877b 100644 --- a/tests/vcn/java/android/net/vcn/VcnManagerTest.java +++ b/tests/vcn/java/android/net/vcn/VcnManagerTest.java @@ -50,9 +50,7 @@ import java.util.concurrent.Executor; 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 @@ public class VcnManagerTest { 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/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index ca6448ca9b8c..2fadd44440f3 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -241,7 +241,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verify(mGatewayStatusCallback) .onGatewayConnectionError( - eq(mConfig.getExposedCapabilities()), + eq(mConfig.getGatewayConnectionName()), eq(VCN_ERROR_CODE_INTERNAL_ERROR), any(), any()); @@ -275,7 +275,10 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection 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/VcnTest.java b/tests/vcn/java/com/android/server/vcn/VcnTest.java index c853fc50fdf7..530d8348bfff 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnTest.java @@ -51,7 +51,9 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -274,11 +276,12 @@ public class VcnTest { 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(); diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index df727e0f883e..3937cee99e3b 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -196,9 +196,9 @@ cc_test_host { ], defaults: ["aapt2_defaults"], data: [ - "integration-tests/CompileTest/**/*", - "integration-tests/CommandTests/**/*", - "integration-tests/ConvertTest/**/*" + "integration-tests/CompileTest/**/*", + "integration-tests/CommandTests/**/*", + "integration-tests/ConvertTest/**/*", ], } @@ -232,6 +232,9 @@ genrule { "cp $(in) $(genDir)/protos && " + "$(location :soong_zip) -o $(out) -C $(genDir)/protos -D $(genDir)/protos", dist: { - targets: ["sdk_repo", "aapt2_artifacts"], + targets: [ + "sdk_repo", + "aapt2_artifacts", + ], }, } diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index ee6a764966f0..2a8923d927f6 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -1764,7 +1764,7 @@ class Linker { // anything else being generated, which includes the Java classes. // If required, the package name is modifed before flattening, and then modified back // to its original name. - std::optional<ResourceTablePackageView> package_to_rewrite; + ResourceTablePackage* package_to_rewrite = nullptr; // Pre-O, the platform treats negative resource IDs [those with a package ID of 0x80 // or higher] as invalid. In order to work around this limitation, we allow the use // of traditionally reserved resource IDs [those between 0x02 and 0x7E]. Allow the @@ -1773,16 +1773,13 @@ class Linker { context_->GetPackageId() != kAppPackageId && context_->GetPackageId() != kFrameworkPackageId) || (!options_.allow_reserved_package_id && context_->GetPackageId() > kAppPackageId); - if (isSplitPackage && - included_feature_base_ == make_value(context_->GetCompilationPackage())) { + if (isSplitPackage && included_feature_base_ == context_->GetCompilationPackage()) { // The base APK is included, and this is a feature split. If the base package is // the same as this package, then we are building an old style Android Instant Apps feature // split and must apply this workaround to avoid requiring namespaces support. - auto table_view = table->GetPartitionedView(); - if (!table_view.packages.empty() && - table_view.packages.back().name == context_->GetCompilationPackage()) { - package_to_rewrite = std::move(table_view.packages.back()); - CHECK_EQ(1u, table->packages.size()) << "can't change name of package when > 1 package"; + if (!table->packages.empty() && + table->packages.back()->name == context_->GetCompilationPackage()) { + package_to_rewrite = table->packages.back().get(); std::string new_package_name = StringPrintf("%s.%s", package_to_rewrite->name.c_str(), app_info_.split_name.value_or_default("feature").c_str()); @@ -1798,12 +1795,15 @@ class Linker { bool success = FlattenTable(table, options_.output_format, writer); - if (package_to_rewrite.has_value()) { + if (package_to_rewrite != nullptr) { // Change the name back. package_to_rewrite->name = context_->GetCompilationPackage(); - if (package_to_rewrite->id) { - table->included_packages_.erase(package_to_rewrite->id.value()); - } + + // TableFlattener creates an `included_packages_` mapping entry for each package with a + // non-standard package id (not 0x01 or 0x7f). Since this is a feature split and not a shared + // library, do not include a mapping from the feature package name to the feature package id + // in the feature's dynamic reference table. + table->included_packages_.erase(context_->GetPackageId()); } if (!success) { diff --git a/tools/aapt2/cmd/Link_test.cpp b/tools/aapt2/cmd/Link_test.cpp index dfdac6b9d93e..d1e6d3922f3f 100644 --- a/tools/aapt2/cmd/Link_test.cpp +++ b/tools/aapt2/cmd/Link_test.cpp @@ -466,11 +466,19 @@ TEST_F(LinkTest, StagedAndroidApi) { 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 bfb8d5854d6d..f1b350fe90f7 100644 --- a/tools/aapt2/format/binary/BinaryResourceParser.cpp +++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp @@ -393,8 +393,15 @@ bool BinaryResourceParser::ParseType(const ResourceTablePackage* package, .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 d3648c8aae52..2acdadb3c034 100644 --- a/tools/aapt2/java/ClassDefinition.h +++ b/tools/aapt2/java/ClassDefinition.h @@ -78,10 +78,18 @@ class PrimitiveMember : public ClassMember { 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: |