From d5146f80cc7aca4e3ce202911a433dea88549c4e Mon Sep 17 00:00:00 2001 From: Alex Johnston Date: Tue, 5 Oct 2021 11:44:37 +0000 Subject: Stop managed profile owner granting READ_SMS Reason: There is only one telephony stack shared between the personal and work profile. Bug: 194382185 Bug: 189942529 Test: build Change-Id: If0d27a317a7c0ee46af371b30208327e5636c7cf --- core/java/android/app/admin/DevicePolicyManager.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 08527c79c242..bf8f9c6d3493 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -8815,6 +8815,15 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#M} the app-op matching the permission is set to * {@link android.app.AppOpsManager#MODE_IGNORED}, but the permission stays granted. * + * Control over the following permissions are restricted for managed profile owners: + * + *

+ * A managed profile owner may not grant these permissions (i.e. call this method with any of + * the permissions listed above and {@code grantState} of + * {@code #PERMISSION_GRANT_STATE_GRANTED}), but may deny them. + * * @param admin Which profile or device owner this request is associated with. * @param packageName The application to grant or revoke a permission to. * @param permission The permission to grant or revoke. -- cgit v1.2.3 From b76141eb2bace631aabe4c6b55630e7b219044b1 Mon Sep 17 00:00:00 2001 From: Oli Lan Date: Thu, 25 Aug 2022 18:03:48 +0100 Subject: Prevent exfiltration of system files via avatar picker. This adds mitigations to prevent system files being exfiltrated via the settings content provider when a content URI is provided as a chosen user image. The mitigations are: 1) Copy the image to a new URI rather than the existing takePictureUri prior to cropping. 2) Only allow a system handler to respond to the CROP intent. This is a fixed version of ag/17005706, to address b/239513606. Bug: 187702830 Test: atest AvatarPhotoControllerTest Change-Id: I21f1b25154dc00a305bdadb96fdf22edff31d9b8 --- .../settingslib/users/AvatarPhotoController.java | 62 ++++++++------ .../users/AvatarPhotoControllerTest.java | 95 ++++++++++++++-------- 2 files changed, 97 insertions(+), 60 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java index adfa39e3df80..4ce88ee115a2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java @@ -21,6 +21,8 @@ import android.content.ClipData; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -46,6 +48,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import java.util.concurrent.ExecutionException; class AvatarPhotoController { @@ -57,9 +60,9 @@ class AvatarPhotoController { void startActivityForResult(Intent intent, int resultCode); - int getPhotoSize(); + boolean startSystemActivityForResult(Intent intent, int resultCode); - boolean canCropPhoto(); + int getPhotoSize(); } interface ContextInjector { @@ -82,6 +85,7 @@ class AvatarPhotoController { private static final long DELAY_BEFORE_CROP_MILLIS = 150; private static final String IMAGES_DIR = "multi_user"; + private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg"; private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg"; private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto.jpg"; @@ -91,6 +95,7 @@ class AvatarPhotoController { private final ContextInjector mContextInjector; private final File mImagesDir; + private final Uri mPreCropPictureUri; private final Uri mCropPictureUri; private final Uri mTakePictureUri; @@ -100,6 +105,8 @@ class AvatarPhotoController { mImagesDir = new File(mContextInjector.getCacheDir(), IMAGES_DIR); mImagesDir.mkdir(); + mPreCropPictureUri = mContextInjector + .createTempImageUri(mImagesDir, PRE_CROP_PICTURE_FILE_NAME, !waiting); mCropPictureUri = mContextInjector.createTempImageUri(mImagesDir, CROP_PICTURE_FILE_NAME, !waiting); mTakePictureUri = @@ -131,7 +138,7 @@ class AvatarPhotoController { return true; case REQUEST_CODE_TAKE_PHOTO: if (mTakePictureUri.equals(pictureUri)) { - cropPhoto(); + cropPhoto(pictureUri); } else { copyAndCropPhoto(pictureUri, false); } @@ -160,7 +167,7 @@ class AvatarPhotoController { ThreadUtils.postOnBackgroundThread(() -> { final ContentResolver cr = mContextInjector.getContentResolver(); try (InputStream in = cr.openInputStream(pictureUri); - OutputStream out = cr.openOutputStream(mTakePictureUri)) { + OutputStream out = cr.openOutputStream(mPreCropPictureUri)) { Streams.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to copy photo", e); @@ -168,7 +175,7 @@ class AvatarPhotoController { } Runnable cropRunnable = () -> { if (!mAvatarUi.isFinishing()) { - cropPhoto(); + cropPhoto(mPreCropPictureUri); } }; if (delayBeforeCrop) { @@ -183,22 +190,21 @@ class AvatarPhotoController { } } - private void cropPhoto() { - if (mAvatarUi.canCropPhoto()) { - // TODO: Use a public intent, when there is one. - Intent intent = new Intent("com.android.camera.action.CROP"); - intent.setDataAndType(mTakePictureUri, "image/*"); - appendOutputExtra(intent, mCropPictureUri); - appendCropExtras(intent); - try { - StrictMode.disableDeathOnFileUriExposure(); - mAvatarUi.startActivityForResult(intent, REQUEST_CODE_CROP_PHOTO); - } finally { - StrictMode.enableDeathOnFileUriExposure(); + private void cropPhoto(final Uri pictureUri) { + // TODO: Use a public intent, when there is one. + Intent intent = new Intent("com.android.camera.action.CROP"); + intent.setDataAndType(pictureUri, "image/*"); + appendOutputExtra(intent, mCropPictureUri); + appendCropExtras(intent); + try { + StrictMode.disableDeathOnFileUriExposure(); + if (mAvatarUi.startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) { + return; } - } else { - onPhotoNotCropped(mTakePictureUri); + } finally { + StrictMode.enableDeathOnFileUriExposure(); } + onPhotoNotCropped(pictureUri); } private void appendOutputExtra(Intent intent, Uri pictureUri) { @@ -320,14 +326,22 @@ class AvatarPhotoController { } @Override - public int getPhotoSize() { - return mActivity.getResources() - .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); + public boolean startSystemActivityForResult(Intent intent, int code) { + List resolveInfos = mActivity.getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY); + if (resolveInfos.isEmpty()) { + Log.w(TAG, "No system package activity could be found for code " + code); + return false; + } + intent.setPackage(resolveInfos.get(0).activityInfo.packageName); + mActivity.startActivityForResult(intent, code); + return true; } @Override - public boolean canCropPhoto() { - return PhotoCapabilityUtils.canCropPhoto(mActivity); + public int getPhotoSize() { + return mActivity.getResources() + .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); } } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java index 3dc2fabe051a..d988111c29d5 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java @@ -34,6 +34,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.MediaStore; @@ -51,6 +52,7 @@ import org.mockito.MockitoAnnotations; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; @RunWith(AndroidJUnit4.class) @@ -73,6 +75,7 @@ public class AvatarPhotoControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); when(mMockAvatarUi.getPhotoSize()).thenReturn(PHOTO_SIZE); + when(mMockAvatarUi.startSystemActivityForResult(any(), anyInt())).thenReturn(true); mImagesDir = new File( InstrumentationRegistry.getTargetContext().getCacheDir(), "multi_user"); @@ -110,9 +113,7 @@ public class AvatarPhotoControllerTest { } @Test - public void takePhotoIsFollowedByCropWhenSupported() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - + public void takePhotoIsFollowedByCrop() throws IOException { new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -121,14 +122,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void takePhotoIsNotFollowedByCropWhenResultCodeNotOk() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -138,12 +137,11 @@ public class AvatarPhotoControllerTest { REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_CANCELED, intent); verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); + verify(mMockAvatarUi, never()).startSystemActivityForResult(any(), anyInt()); } @Test public void takePhotoIsFollowedByCropWhenTakePhotoUriReturned() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "TakeEditUserPhoto.jpg").createNewFile(); Intent intent = new Intent(); @@ -151,14 +149,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void choosePhotoIsFollowedByCrop() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -167,14 +163,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void choosePhotoIsNotFollowedByCropWhenResultCodeNotOk() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -184,12 +178,11 @@ public class AvatarPhotoControllerTest { REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_CANCELED, intent); verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); + verify(mMockAvatarUi, never()).startSystemActivityForResult(any(), anyInt()); } @Test public void choosePhotoIsFollowedByCropWhenTakePhotoUriReturned() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "TakeEditUserPhoto.jpg").createNewFile(); Intent intent = new Intent(); @@ -197,27 +190,10 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } - @Test - public void choosePhotoIsNotFollowedByCropIntentWhenCropNotSupported() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(false); - - File file = new File(mImagesDir, "file.txt"); - saveBitmapToFile(file); - - Intent intent = new Intent(); - intent.setData(Uri.parse( - "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); - mController.onActivityResult( - REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - - verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); - verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)).returnUriResult(mCropPhotoUri); - } - @Test public void cropPhotoResultIsReturnedIfResultOkAndContent() { Intent intent = new Intent(); @@ -242,11 +218,58 @@ public class AvatarPhotoControllerTest { verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS).times(0)).returnUriResult(mCropPhotoUri); } - private void verifyStartActivityForResult(String action, int resultCode) { + @Test + public void cropDoesNotUseTakePhotoUri() throws IOException { + new File(mImagesDir, "file.txt").createNewFile(); + + Intent intent = new Intent(); + intent.setData(Uri.parse( + "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); + mController.onActivityResult( + REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); + + Intent startIntent = verifyStartSystemActivityForResult( + "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); + assertThat(startIntent.getData()).isNotEqualTo(mTakePhotoUri); + } + + @Test + public void internalCropUsedIfNoSystemCropperFound() throws IOException { + when(mMockAvatarUi.startSystemActivityForResult(any(), anyInt())).thenReturn(false); + + File file = new File(mImagesDir, "file.txt"); + saveBitmapToFile(file); + + Intent intent = new Intent(); + intent.setData(Uri.parse( + "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); + mController.onActivityResult( + REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); + + verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)).returnUriResult(mCropPhotoUri); + + InputStream imageStream = mContext.getContentResolver().openInputStream(mCropPhotoUri); + Bitmap bitmap = BitmapFactory.decodeStream(imageStream); + assertThat(bitmap.getWidth()).isEqualTo(PHOTO_SIZE); + assertThat(bitmap.getHeight()).isEqualTo(PHOTO_SIZE); + } + + private Intent verifyStartActivityForResult(String action, int resultCode) { ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)) .startActivityForResult(captor.capture(), eq(resultCode)); - assertThat(captor.getValue().getAction()).isEqualTo(action); + Intent intent = captor.getValue(); + assertThat(intent.getAction()).isEqualTo(action); + return intent; + } + + private Intent verifyStartSystemActivityForResult(String action, int resultCode) { + ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); + verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)) + .startSystemActivityForResult(captor.capture(), eq(resultCode)); + Intent intent = captor.getValue(); + assertThat(intent.getAction()).isEqualTo(action); + return intent; } private void saveBitmapToFile(File file) throws IOException { -- cgit v1.2.3 From 1b48ca6b7f44bacdb7b9469bfaf08fe4881ea0ae Mon Sep 17 00:00:00 2001 From: Oli Lan Date: Fri, 26 Aug 2022 17:35:21 +0100 Subject: Prevent exfiltration of system files via avatar picker. This adds mitigations to prevent system files being exfiltrated via the settings content provider when a content URI is provided as a chosen user image. The mitigations are: 1) Copy the image to a new URI rather than the existing takePictureUri prior to cropping. 2) Only allow a system handler to respond to the CROP intent. This is a fixed version of ag/17071224, to address b/239513606. Bug: 187702830 Test: build and check functionality Change-Id: Ie352d07bbcfc7e0b0a1db1dbe3fd43085e0ecbb6 Merged-In: Idf1ab60878d619ee30505d71e8afe31d8b0c0ebe --- .../settingslib/users/EditUserPhotoController.java | 44 +++++++++++++++------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java index f9584a3e15e9..0c6cd048619c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java @@ -21,6 +21,8 @@ import android.content.ClipData; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; @@ -83,6 +85,7 @@ public class EditUserPhotoController { private static final int DEFAULT_PHOTO_SIZE = 500; private static final String IMAGES_DIR = "multi_user"; + private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg"; private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg"; private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto.jpg"; private static final String NEW_USER_PHOTO_FILE_NAME = "NewUserPhoto.png"; @@ -95,6 +98,7 @@ public class EditUserPhotoController { private final String mFileAuthority; private final File mImagesDir; + private final Uri mPreCropPictureUri; private final Uri mCropPictureUri; private final Uri mTakePictureUri; @@ -110,6 +114,7 @@ public class EditUserPhotoController { mImagesDir = new File(activity.getCacheDir(), IMAGES_DIR); mImagesDir.mkdir(); + mPreCropPictureUri = createTempImageUri(activity, PRE_CROP_PICTURE_FILE_NAME, !waiting); mCropPictureUri = createTempImageUri(activity, CROP_PICTURE_FILE_NAME, !waiting); mTakePictureUri = createTempImageUri(activity, TAKE_PICTURE_FILE_NAME, !waiting); mPhotoSize = getPhotoSize(activity); @@ -143,7 +148,7 @@ public class EditUserPhotoController { case REQUEST_CODE_CHOOSE_PHOTO: if (mTakePictureUri.equals(pictureUri)) { if (PhotoCapabilityUtils.canCropPhoto(mActivity)) { - cropPhoto(); + cropPhoto(pictureUri); } else { onPhotoNotCropped(pictureUri); } @@ -224,7 +229,7 @@ public class EditUserPhotoController { protected Void doInBackground(Void... params) { final ContentResolver cr = mActivity.getContentResolver(); try (InputStream in = cr.openInputStream(pictureUri); - OutputStream out = cr.openOutputStream(mTakePictureUri)) { + OutputStream out = cr.openOutputStream(mPreCropPictureUri)) { Streams.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to copy photo", e); @@ -235,28 +240,41 @@ public class EditUserPhotoController { @Override protected void onPostExecute(Void result) { if (!mActivity.isFinishing() && !mActivity.isDestroyed()) { - cropPhoto(); + cropPhoto(mPreCropPictureUri); } } }.execute(); } - private void cropPhoto() { + private void cropPhoto(final Uri pictureUri) { // TODO: Use a public intent, when there is one. Intent intent = new Intent("com.android.camera.action.CROP"); - intent.setDataAndType(mTakePictureUri, "image/*"); + intent.setDataAndType(pictureUri, "image/*"); appendOutputExtra(intent, mCropPictureUri); appendCropExtras(intent); - if (intent.resolveActivity(mActivity.getPackageManager()) != null) { - try { - StrictMode.disableDeathOnFileUriExposure(); - mActivityStarter.startActivityForResult(intent, REQUEST_CODE_CROP_PHOTO); - } finally { - StrictMode.enableDeathOnFileUriExposure(); + try { + StrictMode.disableDeathOnFileUriExposure(); + if (startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) { + return; } - } else { - onPhotoNotCropped(mTakePictureUri); + } finally { + StrictMode.enableDeathOnFileUriExposure(); + } + + onPhotoNotCropped(mTakePictureUri); + + } + + private boolean startSystemActivityForResult(Intent intent, int code) { + List resolveInfos = mActivity.getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY); + if (resolveInfos.isEmpty()) { + Log.w(TAG, "No system package activity could be found for code " + code); + return false; } + intent.setPackage(resolveInfos.get(0).activityInfo.packageName); + mActivityStarter.startActivityForResult(intent, code); + return true; } private void appendOutputExtra(Intent intent, Uri pictureUri) { -- cgit v1.2.3 From 3ce74461e94b479b3712079475d7eff458337e7b Mon Sep 17 00:00:00 2001 From: Julia Tuttle Date: Fri, 12 Aug 2022 14:29:31 -0400 Subject: New Pipeline: hide VISIBILITY_SECRET notifications on lock screen We forgot to check the visibility of the notification itself when deciding whether to filter out a notification on the lock screen. This change fixes that and adds relevant test cases. Bug: 241611867 Test: atest KeyguardNotificationVisibilityProviderTest Change-Id: Ifa4e9ddd5e55c4518d8d6674186df3fed622945d (cherry picked from commit 848597858b35cf36ab73d96130265d776a7a418c) --- .../KeyguardNotificationVisibilityProvider.kt | 3 ++ ...KeyguardNotificationVisibilityProviderTest.java | 49 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt index 0b6b929cd93c..c956a2ea1836 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt @@ -1,6 +1,7 @@ package com.android.systemui.statusbar.notification.interruption import android.app.Notification +import android.app.Notification.VISIBILITY_SECRET import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -172,6 +173,8 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( !lockscreenUserManager.shouldShowLockscreenNotifications() -> true // User settings do not allow this notification on the lockscreen, so hide it. userSettingsDisallowNotification(entry) -> true + // Entry is explicitly marked SECRET, so hide it. + entry.sbn.notification.visibility == VISIBILITY_SECRET -> true // if entry is silent, apply custom logic to see if should hide shouldHideIfEntrySilent(entry) -> true else -> false diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java index 541749b49474..d59cc54dfe98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProviderTest.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification.interruption; +import static android.app.Notification.VISIBILITY_PRIVATE; import static android.app.Notification.VISIBILITY_PUBLIC; import static android.app.Notification.VISIBILITY_SECRET; import static android.app.NotificationManager.IMPORTANCE_HIGH; @@ -448,6 +449,54 @@ public class KeyguardNotificationVisibilityProviderTest extends SysuiTestCase { assertFalse(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); } + @Test + public void notificationVisibilityPublic() { + // GIVEN a VISIBILITY_PUBLIC notification + NotificationEntryBuilder entryBuilder = new NotificationEntryBuilder() + .setUser(new UserHandle(NOTIF_USER_ID)); + entryBuilder.modifyNotification(mContext) + .setVisibility(VISIBILITY_PUBLIC); + mEntry = entryBuilder.build(); + + // WHEN we're in an 'unfiltered-keyguard-showing' state + setupUnfilteredState(mEntry); + + // THEN don't hide the entry based on visibility. + assertFalse(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); + } + + @Test + public void notificationVisibilityPrivate() { + // GIVEN a VISIBILITY_PRIVATE notification + NotificationEntryBuilder entryBuilder = new NotificationEntryBuilder() + .setUser(new UserHandle(NOTIF_USER_ID)); + entryBuilder.modifyNotification(mContext) + .setVisibility(VISIBILITY_PRIVATE); + mEntry = entryBuilder.build(); + + // WHEN we're in an 'unfiltered-keyguard-showing' state + setupUnfilteredState(mEntry); + + // THEN don't hide the entry based on visibility. (Redaction is handled elsewhere.) + assertFalse(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); + } + + @Test + public void notificationVisibilitySecret() { + // GIVEN a VISIBILITY_SECRET notification + NotificationEntryBuilder entryBuilder = new NotificationEntryBuilder() + .setUser(new UserHandle(NOTIF_USER_ID)); + entryBuilder.modifyNotification(mContext) + .setVisibility(VISIBILITY_SECRET); + mEntry = entryBuilder.build(); + + // WHEN we're in an 'unfiltered-keyguard-showing' state + setupUnfilteredState(mEntry); + + // THEN hide the entry based on visibility. + assertTrue(mKeyguardNotificationVisibilityProvider.shouldHideNotification(mEntry)); + } + @Test public void summaryExceedsThresholdToShow() { // GIVEN the notification doesn't exceed the threshold to show on the lockscreen -- cgit v1.2.3 From 2bc4d49c2b0265f5de1c62d1342b1426cc5e1377 Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Thu, 1 Sep 2022 10:14:24 -0700 Subject: Include all enabled services when FEEDBACK_ALL_MASK. Bug: 243849844 Test: m sts; sts-tradefed run sts-dynamic-develop -m CtsAccessibilityTestCases Change-Id: I4f93e06d1066085bd64e8f09882de2f4a72a0633 --- .../com/android/server/accessibility/AccessibilityManagerService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 05b937a34626..3ca6bf421fae 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -670,7 +670,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final List result = new ArrayList<>(serviceCount); for (int i = 0; i < serviceCount; ++i) { final AccessibilityServiceConnection service = services.get(i); - if ((service.mFeedbackType & feedbackType) != 0) { + if ((service.mFeedbackType & feedbackType) != 0 + || feedbackType == AccessibilityServiceInfo.FEEDBACK_ALL_MASK) { result.add(service.getServiceInfo()); } } -- cgit v1.2.3 From b4ce721aa97c6cb9d304a82bc5b7edc870b87c31 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index 2b245aae915f..5c29eb35fcee 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -95,8 +95,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -122,7 +125,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From c23f14f874396c5049f7d6e58f6b5c5e5de23d09 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index c194a2844bd5..39e48443f1ff 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -95,8 +95,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -122,7 +125,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From 410a19794824707c5f32c1a6d8645f6e0ca27e3b Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index c194a2844bd5..39e48443f1ff 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -95,8 +95,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -122,7 +125,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From 02e177caeb1cee170740f9d4237367575977ca43 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index 526c0491f03f..07802a220015 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -94,8 +94,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -121,7 +124,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From ad30b85784354a21fb915d47d4dc3ef8828d5d3b Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index 526c0491f03f..07802a220015 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -94,8 +94,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -121,7 +124,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From a37554289731f0d52923123697d55074b0f41748 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index 85de55e6dd2e..cb20b7f84256 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -94,8 +94,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -121,7 +124,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From e51c402650c5e4400108cf63d460ec349577087c Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 6 Sep 2022 10:19:06 -0400 Subject: Fix NPE Test: NotificationChannelGroupTest Test: view notification settings for an app that doesn't use groups Fixes: 244574602 Bug: 241764350 Bug: 241764340 Bug: 241764135 Bug: 242702935 Bug: 242703118 Bug: 242703202 Bug: 242702851 Bug: 242703217 Bug: 242703556 Change-Id: I9c681106f6d645e62b0e44903d40aa523fee0e95 (cherry picked from commit 6f02c07176d0fa4d6985c8f2200ccf49a1657d1c) Merged-In: I9c681106f6d645e62b0e44903d40aa523fee0e95 --- core/java/android/app/NotificationChannelGroup.java | 14 +++++++++++--- .../src/android/app/NotificationChannelGroupTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index c194a2844bd5..39e48443f1ff 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -95,8 +95,11 @@ public final class NotificationChannelGroup implements Parcelable { } else { mId = null; } - mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - mName = getTrimmedString(mName.toString()); + if (in.readByte() != 0) { + mName = getTrimmedString(in.readString()); + } else { + mName = ""; + } if (in.readByte() != 0) { mDescription = getTrimmedString(in.readString()); } else { @@ -122,7 +125,12 @@ public final class NotificationChannelGroup implements Parcelable { } else { dest.writeByte((byte) 0); } - TextUtils.writeToParcel(mName.toString(), dest, flags); + if (mName != null) { + dest.writeByte((byte) 1); + dest.writeString(mName.toString()); + } else { + dest.writeByte((byte) 0); + } if (mDescription != null) { dest.writeByte((byte) 1); dest.writeString(mDescription); diff --git a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java index 2a3da05eabb3..625c66a4c60e 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelGroupTest.java @@ -17,9 +17,11 @@ package android.app; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import android.os.Parcel; import android.test.AndroidTestCase; +import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -70,4 +72,18 @@ public class NotificationChannelGroupTest { assertEquals(NotificationChannelGroup.MAX_TEXT_LENGTH, fromParcel.getDescription().length()); } + + @Test + public void testNullableFields() { + NotificationChannelGroup group = new NotificationChannelGroup("my_group_01", null); + + Parcel parcel = Parcel.obtain(); + group.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + NotificationChannelGroup fromParcel = + NotificationChannelGroup.CREATOR.createFromParcel(parcel); + assertEquals(group.getId(), fromParcel.getId()); + assertTrue(TextUtils.isEmpty(fromParcel.getName())); + } } -- cgit v1.2.3 From 49efb9cdf2ad6eb20278a9b9fc930fa65f174270 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 09:17:54 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaca3ba8062e2ff45611f563b0219afddfd14c068 --- core/res/res/values-am/strings.xml | 10 ++++---- core/res/res/values-es-rUS/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-es/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-fr-rCA/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-fr/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-hi/strings.xml | 6 ++--- core/res/res/values-it/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-or/strings.xml | 2 +- core/res/res/values-pt-rBR/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-pt-rPT/strings.xml | 45 +++++++++++++++++----------------- core/res/res/values-pt/strings.xml | 45 +++++++++++++++++----------------- 11 files changed, 193 insertions(+), 185 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 030262902833..a49c923e9e5b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -111,8 +111,8 @@ "በዝውውር ላይ አመላካች በርቷል" "በዝውውር ላይ አመልካች ጠፍቷል" "በዝውውር ላይ አመልካች ብልጭ ብልጭ ይላል" - "ከጎረቤት ውጪ" - "ከህንፃ ውጪ" + "ከጎረቤት ውጭ" + "ከህንፃ ውጭ" "የዝውውር- ተመራጭ ስርዓት" "ዝውውር- ዝግጁ የሆነ ስርዓት" " የዝውውር- አጋር ስምምነት" @@ -433,7 +433,7 @@ "ይህ መተግበሪያ ሁሉንም በእርስዎ ጡባዊ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" "ይህ መተግበሪያ ሁሉንም በእርስዎ Android TV መሣሪያ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" "ይህ መተግበሪያ ሁሉንም በእርስዎ ስልክ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" - "የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጪ ላክ።" + "የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጭ ላክ።" "ይህ መተግበሪያ በእርስዎ ጡባዊ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" "ይህ መተግበሪያ በእርስዎ Android TV መሣሪያ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" "ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" @@ -1157,7 +1157,7 @@ "ትኩረት" "በመጫን ላይ…" "በ" - "ውጪ" + "ውጭ" "ምልክት ተደርጎበታል" "ምልክት አልተደረገበትም" "ተመርጧል" @@ -1470,7 +1470,7 @@ "ፈቃድ ተጠይቋል" \n" ለ%s መለያ ፈቃድ ተጠይቋል" "ለመለያ %2$s\nበ%1$s የተጠየቀ ፈቃድ።" - "ከስራ መገለጫዎ ውጪ ሆነው መተግበሪያ እየተጠቀሙ ነው" + "ከስራ መገለጫዎ ውጭ ሆነው መተግበሪያ እየተጠቀሙ ነው" "ይህን መተግበሪያ በእርስዎ የስራ መገለጫ ላይ እየተጠቀሙበት ነው" "ግቤት ስልት" "አስምር" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 28a2cda7aaf2..ed9bd5b43247 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -51,6 +51,7 @@ "Escribir PUK2 para desbloquear la tarjeta SIM." "Error; habilita el bloqueo de SIM/RUIM." + You have %d remaining attempts before SIM is locked. Tienes %d intentos más antes de que se bloquee la tarjeta SIM. Tienes %d un intento más antes de que se bloquee la tarjeta SIM. @@ -180,7 +181,7 @@ "El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio." "El almacenamiento del dispositivo Android TV está lleno. Borra algunos archivos para liberar espacio." "Se ha agotado el espacio de almacenamiento del dispositivo. Elimina algunos archivos para liberar espacio." - "{count,plural, =1{Se instaló la autoridad certificadora}other{Se instalaron las autoridades certificadoras}}" + "{count,plural, =1{Se instaló la autoridad certificadora}many{Se instalaron las autoridades certificadoras}other{Se instalaron las autoridades certificadoras}}" "Por un tercero desconocido" "Por parte de tu administrador del perfil de trabajo" "Por %s" @@ -254,7 +255,7 @@ "Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, ingresar más detalles acerca del problema y tomar capturas de pantalla. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse." "Informe completo" "Usa esta opción para reducir al mínimo la interferencia del sistema cuando tu dispositivo no responde o funciona muy lento, o cuando necesitas todas las secciones del informe. No permite ingresar más detalles ni tomar capturas de pantalla adicionales." - "{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}" + "{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}many{Se tomará una captura de pantalla para el informe de errores en # segundos.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}" "Se tomó la captura de pantalla con el informe de errores" "No se pudo tomar la captura de pantalla con el informe de errores" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s desea activar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el dispositivo." "Hace 1 mes." "Anterior a 1 mes atrás" - "{count,plural, =1{Último # día}other{Últimos # días}}" + "{count,plural, =1{Último # día}many{Últimos # días}other{Últimos # días}}" "Último mes" "Antiguos" "activado %s" @@ -1106,14 +1107,14 @@ "en %d h" "en %d d" "en %d años" - "{count,plural, =1{Hace # minuto}other{Hace # minutos}}" - "{count,plural, =1{Hace # hora}other{Hace # horas}}" - "{count,plural, =1{Hace # día}other{Hace # días}}" - "{count,plural, =1{Hace # año}other{Hace # años}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# día}other{# días}}" - "{count,plural, =1{# año}other{# años}}" + "{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}" + "{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}" + "{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}" + "{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# día}many{# días}other{# días}}" + "{count,plural, =1{# año}many{# años}other{# años}}" "Problemas de video" "No es posible transmitir este video al dispositivo." "No se puede reproducir el video." @@ -1501,7 +1502,7 @@ "Omitir" "Sin coincidencias" "Buscar en la página" - "{count,plural, =1{# coincidencia}other{# de {total}}}" + "{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}" "Listo" "Borrando almacenamiento compartido…" "Compartir" @@ -1854,14 +1855,14 @@ "Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones." "¿Deseas activar Ahorro de datos?" "Activar" - "{count,plural, =1{Por un minuto (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}" - "{count,plural, =1{Durante un minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Por un minuto (hasta {formattedTime})}many{Por # minutos (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 min (hasta {formattedTime})}many{Durante # min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (hasta {formattedTime})}many{Durante # horas (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 h (hasta {formattedTime})}many{Durante # h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}" + "{count,plural, =1{Durante un minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Hasta las %1$s" "Hasta la(s) %1$s" "Hasta la hora %1$s (próxima alarma)" @@ -1990,7 +1991,7 @@ "Guardar para Autocompletar" "El contenido no puede autocompletarse" "No hay sugerencias de Autocompletar" - "{count,plural, =1{Una sugerencia de autocompletar}other{# sugerencias de autocompletar}}" + "{count,plural, =1{Una sugerencia de autocompletar}many{# sugerencias de autocompletar}other{# sugerencias de autocompletar}}" "¿Quieres guardar en ""%1$s""?" "¿Quieres guardar la %1$s en ""%2$s""?" "¿Quieres guardar %1$s y %2$s en ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentación %1$s" "La conexión Bluetooth permanecerá activa durante el modo de avión" "Cargando" - "{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}" + "{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}" "No hay personas recomendadas con quienes compartir" "Lista de apps" "Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB." diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 819cc47a0cb9..96b813112c94 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -51,6 +51,7 @@ "Introduce el código PUK2 para desbloquear la tarjeta SIM." "Error, habilitar bloqueo de SIM/RUIM." + You have %d remaining attempts before SIM is locked. Te quedan %d intentos para bloquear la tarjeta SIM. Te queda %d intento para bloquear la tarjeta SIM. @@ -180,7 +181,7 @@ "El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio." "El espacio de almacenamiento de tu dispositivo Android TV está lleno. Elimina algunos archivos para liberar espacio." "Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio." - "{count,plural, =1{Autoridad de certificación instalada}other{Autoridades de certificación instaladas}}" + "{count,plural, =1{Autoridad de certificación instalada}many{Autoridades de certificación instaladas}other{Autoridades de certificación instaladas}}" "Por un tercero desconocido" "Por el administrador de tu perfil de trabajo" "Por %s" @@ -254,7 +255,7 @@ "Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, introducir más información sobre el problema y hacer capturas de pantalla. Es posible que se omitan algunas secciones menos utilizadas y que requieran más tiempo." "Informe completo" "Utiliza esta opción para que la interferencia del sistema sea mínima cuando el dispositivo no responda o funcione demasiado lento, o bien cuando necesites todas las secciones del informe. No permite introducir más detalles ni hacer más capturas de pantalla." - "{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}" + "{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}many{La captura de pantalla para el informe de errores se hará en # segundos.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}" "Se ha hecho la captura de pantalla con el informe de errores" "No se ha podido hacer la captura de pantalla con el informe de errores" "Modo Silencio" @@ -1079,7 +1080,7 @@ "%1$s quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el teléfono." "Hace un mes" "Hace más de un mes" - "{count,plural, =1{Último día (#)}other{Últimos # días}}" + "{count,plural, =1{Último día (#)}many{Últimos # días}other{Últimos # días}}" "El mes pasado" "Anterior" "%s" @@ -1106,14 +1107,14 @@ "en %dh" "en %d d" "en %da" - "{count,plural, =1{Hace # minuto}other{Hace # minutos}}" - "{count,plural, =1{Hace # hora}other{Hace # horas}}" - "{count,plural, =1{Hace # día}other{Hace # días}}" - "{count,plural, =1{Hace # año}other{Hace # años}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# día}other{# días}}" - "{count,plural, =1{# año}other{# años}}" + "{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}" + "{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}" + "{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}" + "{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# día}many{# días}other{# días}}" + "{count,plural, =1{# año}many{# años}other{# años}}" "Incidencias con el vídeo" "Este vídeo no se puede transmitir al dispositivo." "No se puede reproducir el vídeo." @@ -1501,7 +1502,7 @@ "Saltar" "No hay coincidencias." "Buscar en la página" - "{count,plural, =1{# coincidencia}other{# de {total}}}" + "{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}" "Hecho" "Borrando almacenamiento compartido…" "Compartir" @@ -1854,14 +1855,14 @@ "Para reducir el uso de datos, Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano. Si estás usando una aplicación, podrá acceder a datos, pero con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques." "¿Activar Ahorro de datos?" "Activar" - "{count,plural, =1{Durante un minuto (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Durante un minuto (hasta las {formattedTime})}many{Durante # minutos (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 min (hasta las {formattedTime})}many{Durante # min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}many{Durante # horas (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 h (hasta las {formattedTime})}many{Durante # h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Hasta las %1$s" "Hasta %1$s" "Hasta las %1$s (próxima alarma)" @@ -1990,7 +1991,7 @@ "Guardar en la función Autocompletar" "El contenido no se puede autocompletar" "No hay sugerencias de Autocompletar" - "{count,plural, =1{1 sugerencia de Autocompletar}other{# sugerencias de Autocompletar}}" + "{count,plural, =1{1 sugerencia de Autocompletar}many{# sugerencias de Autocompletar}other{# sugerencias de Autocompletar}}" "¿Guardar en ""%1$s""?" "¿Guardar %1$s en ""%2$s""?" "¿Guardar %1$s y %2$s en ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentación %1$s" "El Bluetooth seguirá activado en el modo Avión" "Cargando" - "{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}" + "{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}" "No hay sugerencias de personas con las que compartir" "Lista de aplicaciones" "Esta aplicación no tiene permiso para grabar, pero podría capturar audio con este dispositivo USB." diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 476a2ce1f849..558a163c50a7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -52,6 +52,7 @@ "Opération infructueuse. Activez le verrouillage SIM/RUIM." Il vous reste %d tentative avant que votre carte SIM soit verrouillée. + You have %d remaining attempts before SIM is locked. Il vous reste %d tentatives avant que votre carte SIM soit verrouillée. "Code IIEM" @@ -180,7 +181,7 @@ "La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace." "L\'espace de stockage de l\'appareil Android TV est plein. Supprimez des fichiers pour libérer de l\'espace." "La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace." - "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}" + "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}" "Par un tiers inconnu" "Par l\'administrateur de votre profil professionnel" "Par %s" @@ -254,7 +255,7 @@ "Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, d\'entrer plus d\'information sur le problème et d\'effectuer des saisies d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises." "Rapport complet" "Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information." - "{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}" + "{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}many{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}" "Capture d\'écran prise avec le rapport de bogue" "Échec de la prise de capture d\'écran avec le rapport de bogue" "Mode silencieux" @@ -1079,7 +1080,7 @@ "%1$s souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes." "Il y a 1 mois" "Il y a plus d\'un mois" - "{count,plural, =1{# dernier jour}one{# dernier jour}other{# derniers jours}}" + "{count,plural, =1{# dernier jour}one{# dernier jour}many{# derniers jours}other{# derniers jours}}" "Le mois dernier" "Précédent" "le %s" @@ -1106,14 +1107,14 @@ "dans %d h" "dans %d j" "dans %d a" - "{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}" - "{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}" - "{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}" - "{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}" - "{count,plural, =1{# minute}one{# minute}other{# minutes}}" - "{count,plural, =1{# heure}one{# heure}other{# heures}}" - "{count,plural, =1{# jour}one{# jour}other{# jours}}" - "{count,plural, =1{# an}one{# an}other{# ans}}" + "{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}" + "{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}" + "{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}" + "{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}" + "{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}" + "{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}" + "{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}" + "{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}" "Problème vidéo" "Impossible de lire cette vidéo en continu sur cet appareil." "Impossible de lire la vidéo." @@ -1501,7 +1502,7 @@ "Ignorer" "Aucune partie" "Rechercher sur la page" - "{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}" + "{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}" "Terminé" "Effacement du stockage partagé en cours…" "Partager" @@ -1854,14 +1855,14 @@ "Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez." "Activer l\'économiseur de données?" "Activer" - "{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant une minute}one{Pendant # minute}other{Pendant # minutes}}" - "{count,plural, =1{Pendant 1 m}one{Pendant # m}other{Pendant # m}}" - "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}" - "{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}" + "{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}many{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant une minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}" + "{count,plural, =1{Pendant 1 m}one{Pendant # m}many{Pendant # m}other{Pendant # m}}" + "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}" + "{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}" "Jusqu\'à %1$s" "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" @@ -1990,7 +1991,7 @@ "Enregistrer pour le remplissage automatique" "Le contenu ne peut pas être entré automatiquement" "Aucune suggestion de remplissage automatique" - "{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}other{# suggestions de remplissage automatique}}" + "{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}many{# suggestions de remplissage automatique}other{# suggestions de remplissage automatique}}" "Enregistrer sous ""%1$s""?" "Enregistrer %1$s sous ""%2$s""?" "Enregistrer %1$s et %2$s sous ""%3$s""?" @@ -2100,7 +2101,7 @@ "Présentation %1$s" "Le Bluetooth restera activé en mode Avion" "Chargement en cours…" - "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}" + "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}" "Aucune recommandation de personnes avec lesquelles effectuer un partage" "Liste des applications" "Cette application n\'a pas été autorisée à effectuer des enregistrements, mais elle pourrait capturer du contenu audio par l\'intermédiaire de cet appareil USB." diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 0854cc786385..024cf3e89b34 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -52,6 +52,7 @@ "Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM." Il vous reste %d tentative avant que votre carte SIM ne soit verrouillée. + You have %d remaining attempts before SIM is locked. Il vous reste %d tentatives avant que votre carte SIM ne soit verrouillée. "Code IMEI" @@ -180,7 +181,7 @@ "La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace." "L\'espace de stockage de l\'appareil Android TV est saturé. Supprimez certains fichiers pour libérer de l\'espace." "La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace." - "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}" + "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}" "Par un tiers inconnu" "Par l\'administrateur de votre profil professionnel" "Par %s" @@ -254,7 +255,7 @@ "Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, de saisir plus d\'informations sur le problème et d\'effectuer des captures d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises." "Rapport complet" "Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information." - "{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}" + "{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}many{Capture d\'écran pour le rapport de bug dans # secondes.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}" "Capture d\'écran avec rapport de bug effectuée" "Échec de la capture d\'écran avec le rapport de bug" "Mode silencieux" @@ -1079,7 +1080,7 @@ "%1$s souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes." "Il y a 1 mois" "Il y a plus d\'un mois" - "{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}other{# derniers jours}}" + "{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}many{# derniers jours}other{# derniers jours}}" "Le mois dernier" "Préc." "le %s" @@ -1106,14 +1107,14 @@ "dans %d h" "dans %d j" "dans %d an" - "{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}" - "{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}" - "{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}" - "{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}" - "{count,plural, =1{# minute}one{# minute}other{# minutes}}" - "{count,plural, =1{# heure}one{# heure}other{# heures}}" - "{count,plural, =1{# jour}one{# jour}other{# jours}}" - "{count,plural, =1{# an}one{# an}other{# ans}}" + "{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}" + "{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}" + "{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}" + "{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}" + "{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}" + "{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}" + "{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}" + "{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}" "Problème vidéo" "Impossible de lire cette vidéo en streaming sur cet appareil." "Impossible de lire la vidéo." @@ -1501,7 +1502,7 @@ "Ignorer" "Aucune correspondance" "Rechercher sur la page" - "{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}" + "{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}" "OK" "Suppression de l\'espace de stockage partagé…" "Partager" @@ -1854,14 +1855,14 @@ "Pour réduire la consommation des données, l\'Économiseur de données empêche certaines applis d\'envoyer ou de recevoir des données en arrière-plan. Les applis que vous utiliserez pourront toujours accéder aux données, mais le feront moins fréquemment. Par exemple, les images pourront ne pas s\'afficher tant que vous n\'aurez pas appuyé dessus." "Activer l\'Économiseur de données ?" "Activer" - "{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 minute}one{Pendant # minute}other{Pendant # minutes}}" - "{count,plural, =1{Pendant 1 min}one{Pendant # min}other{Pendant # min}}" - "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}" - "{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}" + "{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}many{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}" + "{count,plural, =1{Pendant 1 min}one{Pendant # min}many{Pendant # min}other{Pendant # min}}" + "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}" + "{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}" "Jusqu\'à %1$s" "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" @@ -1990,7 +1991,7 @@ "Enregistrer pour la saisie automatique" "Le contenu ne peut pas être saisi automatiquement" "Aucune suggestion de saisie automatique" - "{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}other{# suggestions de saisie automatique}}" + "{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}many{# suggestions de saisie automatique}other{# suggestions de saisie automatique}}" "Enregistrer dans ""%1$s"" ?" "Enregistrer la %1$s dans ""%2$s"" ?" "Enregistrer %1$s et %2$s dans ""%3$s"" ?" @@ -2100,7 +2101,7 @@ "Présentation %1$s" "Le Bluetooth restera activé en mode Avion" "Chargement…" - "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}" + "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}" "Aucune recommandation de personnes avec lesquelles effectuer un partage" "Liste des applications" "Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB." diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 13f897c01c46..ec9af29bf032 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -307,7 +307,7 @@ "मैसेज (एसएमएस) भेजें और देखें" "फ़ाइलें" "अपने डिवाइस में मौजूद फ़ाइलों का ऐक्सेस दें" - "संगीत और ऑडियो के ऐक्सेस" + "संगीत और ऑडियो" "आपके डिवाइस पर संगीत और ऑडियो को ऐक्सेस करने की अनुमति" "फ़ोटो और वीडियो के ऐक्सेस" "आपके डिवाइस पर फ़ोटो और वीडियो को ऐक्सेस करने की अनुमति" @@ -1849,8 +1849,8 @@ "आपके व्यवस्थापक ने अपडेट किया है" "आपके व्यवस्थापक ने हटा दिया है" "ठीक है" - "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है." - "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है." + "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ खास सुविधाएं कम या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते." + "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ सुविधाएं सीमित या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते." "डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, जिस ऐप्लिकेशन का इस्तेमाल किया जा रहा है वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी, जब तक उन पर टैप नहीं किया जाएगा." "डेटा बचाने की सेटिंग चालू करें?" "चालू करें" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 01f43a73274c..47e9d6586260 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -51,6 +51,7 @@ "Digita il PUK2 per sbloccare la SIM." "Operazione non riuscita; attiva blocco SIM/RUIM." + You have %d remaining attempts before SIM is locked. Hai ancora %d tentativi a disposizione prima che la SIM venga bloccata. Hai ancora %d tentativo a disposizione prima che la SIM venga bloccata. @@ -180,7 +181,7 @@ "La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio." "Lo spazio di archiviazione del dispositivo Android TV è pieno. Elimina alcuni file per liberare spazio." "Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio." - "{count,plural, =1{Autorità di certificazione installata}other{Autorità di certificazione installate}}" + "{count,plural, =1{Autorità di certificazione installata}many{Autorità di certificazione installate}other{Autorità di certificazione installate}}" "Da una terza parte sconosciuta" "Dall\'amministratore del tuo profilo di lavoro" "Da %s" @@ -254,7 +255,7 @@ "Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento della segnalazione, di inserire maggiori dettagli relativi al problema e di acquisire screenshot. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nella segnalazione richiede molto tempo." "Report completo" "Utilizza questa opzione per ridurre al minimo l\'interferenza di sistema quando il dispositivo non risponde, è troppo lento oppure quando ti servono tutte le sezioni della segnalazione. Non puoi inserire altri dettagli o acquisire altri screenshot." - "{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}" + "{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}many{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}" "Screenshot con segnalazione di bug effettuato correttamente" "Impossibile acquisire screenshot con segnalazione di bug" "Modalità silenziosa" @@ -1079,7 +1080,7 @@ "%1$s vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il telefono tramite gesti." "1 mese fa" "Oltre 1 mese fa" - "{count,plural, =1{Ultimo giorno}other{Ultimi # giorni}}" + "{count,plural, =1{Ultimo giorno}many{Ultimi # giorni}other{Ultimi # giorni}}" "Ultimo mese" "Precedente" "%s" @@ -1106,14 +1107,14 @@ "tra %d h" "tra %d g" "tra %d a" - "{count,plural, =1{# minuto fa}other{# minuti fa}}" - "{count,plural, =1{# ora fa}other{# ore fa}}" - "{count,plural, =1{# giorno fa}other{# giorni fa}}" - "{count,plural, =1{# anno fa}other{# anni fa}}" - "{count,plural, =1{# minuto}other{# minuti}}" - "{count,plural, =1{# ora}other{# ore}}" - "{count,plural, =1{# giorno}other{# giorni}}" - "{count,plural, =1{# anno}other{# anni}}" + "{count,plural, =1{# minuto fa}many{# minuti fa}other{# minuti fa}}" + "{count,plural, =1{# ora fa}many{# ore fa}other{# ore fa}}" + "{count,plural, =1{# giorno fa}many{# giorni fa}other{# giorni fa}}" + "{count,plural, =1{# anno fa}many{# anni fa}other{# anni fa}}" + "{count,plural, =1{# minuto}many{# minuti}other{# minuti}}" + "{count,plural, =1{# ora}many{# ore}other{# ore}}" + "{count,plural, =1{# giorno}many{# giorni}other{# giorni}}" + "{count,plural, =1{# anno}many{# anni}other{# anni}}" "Problemi video" "Questo video non è valido per lo streaming su questo dispositivo." "Impossibile riprodurre il video." @@ -1501,7 +1502,7 @@ "Salta" "Nessuna corrispondenza" "Trova nella pagina" - "{count,plural, =1{# corrispondenza}other{# di {total}}}" + "{count,plural, =1{# corrispondenza}many{# di {total}}other{# di {total}}}" "Fine" "Cancellazione archivio condiviso…" "Condividi" @@ -1854,14 +1855,14 @@ "Per contribuire a ridurre l\'utilizzo dei dati, la funzionalità Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Per esempio, è possibile che le immagini non vengano visualizzate finché non le tocchi." "Attivare Risparmio dati?" "Attiva" - "{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per un minuto}other{Per # minuti}}" - "{count,plural, =1{Per 1 min}other{Per # min}}" - "{count,plural, =1{Per 1 ora}other{Per # ore}}" - "{count,plural, =1{Per 1 h}other{Per # h}}" + "{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}many{Per # minuti (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}many{Per # min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}many{Per # ore (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}many{Per # h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per un minuto}many{Per # minuti}other{Per # minuti}}" + "{count,plural, =1{Per 1 min}many{Per # min}other{Per # min}}" + "{count,plural, =1{Per 1 ora}many{Per # ore}other{Per # ore}}" + "{count,plural, =1{Per 1 h}many{Per # h}other{Per # h}}" "Fino a: %1$s" "Fino a %1$s" "Fino a %1$s (prossima sveglia)" @@ -1990,7 +1991,7 @@ "Salva per Compilazione automatica" "Impossibile compilare automaticamente i contenuti" "Nessun suggerimento di Compilazione automatica" - "{count,plural, =1{Un suggerimento di compilazione automatica}other{# suggerimenti di compilazione automatica}}" + "{count,plural, =1{Un suggerimento di compilazione automatica}many{# suggerimenti di compilazione automatica}other{# suggerimenti di compilazione automatica}}" "Vuoi salvare su ""%1$s""?" "Vuoi salvare la %1$s su ""%2$s""?" "Vuoi salvare %1$s e %2$s su ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentazione %1$s" "Il Bluetooth rimane attivo durante l\'uso della modalità aereo" "Caricamento" - "{count,plural, =1{{file_name} + # file}other{{file_name} + # file}}" + "{count,plural, =1{{file_name} + # file}many{{file_name} + # file}other{{file_name} + # file}}" "Nessuna persona consigliata per la condivisione" "Elenco di app" "A questa app non è stata concessa l\'autorizzazione di registrazione, ma l\'app potrebbe acquisire l\'audio tramite questo dispositivo USB." diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 55efc18a5983..79ac29a0d3c8 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -2034,7 +2034,7 @@ "ଶର୍ଟକଟ୍‍ ରିଷ୍ଟୋର୍‍ କରିହେଲା ନାହିଁ, କାରଣ ଏହି ଆପ୍‍ର ସ୍ୱାକ୍ଷର ମେଳ ହେଉନାହିଁ" "ଶର୍ଟକଟ୍‍ ରିଷ୍ଟୋର୍‍ କରିହେଲା ନାହିଁ" "ଶର୍ଟକଟ୍‍ ଅକ୍ଷମ କରାଯାଇଛି" - "ଅନଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ" + "ଅନଇନଷ୍ଟଲ କରନ୍ତୁ" "କୌଣସିମତେ ଖୋଲନ୍ତୁ" "ହାନିକାରକ ଆପ୍‌ ଚିହ୍ନଟ ହୋଇଛି" "ସମସ୍ତ ଡିଭାଇସ ଲଗକୁ ଆକ୍ସେସ କରିବା ପାଇଁ %sକୁ ଅନୁମତି ଦେବେ?" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index e66e32bdd1fd..bd93bfe1b01d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -52,6 +52,7 @@ "Falha. Ative o bloqueio do chip/R-UIM." Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. + You have %d remaining attempts before SIM is locked. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" @@ -180,7 +181,7 @@ "Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço." - "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}" + "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}" "Por terceiros desconhecidos" "Pelo administrador do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios." "Relatório completo" "Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais." - "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" + "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" "Captura de tela com o relatório do bug concluída" "Falha ao capturar a tela com o relatório do bug" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos." "1 mês atrás" "Antes de 1 mês atrás" - "{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}" + "{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}" "Mês passado" "Mais antigos" "em %s" @@ -1106,14 +1107,14 @@ "em %dh" "em %d dias" "em %da" - "{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}" - "{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}" - "{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}" - "{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}" - "{count,plural, =1{# minuto}one{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}one{# hora}other{# horas}}" - "{count,plural, =1{# dia}one{# dia}other{# dias}}" - "{count,plural, =1{# ano}one{# ano}other{# anos}}" + "{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}" + "{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}" + "{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}" + "{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}" + "{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste dispositivo." "Não é possível reproduzir este vídeo." @@ -1501,7 +1502,7 @@ "Pular" "Não encontrado" "Localizar na página" - "{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}" + "{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}" "Concluído" "Limpando armazenamento compartilhado…" "Compartilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas." "Ativar a Economia de dados?" "Ativar" - "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" - "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" - "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}" - "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" - "{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}" - "{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}" - "{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}" - "{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}" + "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" + "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" + "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}" + "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" + "{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}" + "{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}" + "{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}" + "{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" "Sem sugestões de preenchimento automático" - "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Salvar em ""%1$s""?" "Salvar %1$s em ""%2$s""?" "Salvar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação em %1$s" "O Bluetooth permanecerá ativado no modo avião" "Carregando" - "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}" + "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}" "Não há sugestões de pessoas para compartilhar" "Lista de apps" "Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB." diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index db2ec9b15647..9a49a601211f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -51,6 +51,7 @@ "Introduza o PUK2 para desbloquear o cartão SIM." "Ação sem êxito. Ative o bloqueio do SIM/RUIM." + You have %d remaining attempts before SIM is locked. Tem mais %d tentativas antes de o cartão SIM ficar bloqueado. Tem mais %d tentativa antes de o cartão SIM ficar bloqueado. @@ -180,7 +181,7 @@ "O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço." "O armazenamento do dispositivo Android TV está cheio. Elimine alguns ficheiros para libertar espaço." "O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço." - "{count,plural, =1{Autoridade de certificação instalada}other{Autoridades de certificação instaladas}}" + "{count,plural, =1{Autoridade de certificação instalada}many{Autoridades de certificação instaladas}other{Autoridades de certificação instaladas}}" "Por um terceiro desconhecido" "Pelo gestor do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Utilize esta opção na maioria das circunstâncias. Permite monitorizar o progresso do relatório, introduzir mais detalhes acerca do problema e tirar capturas de ecrã. Pode omitir algumas secções menos utilizadas que demoram muito tempo a comunicar." "Relatório completo" "Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais." - "{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}" + "{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}many{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}" "Captura de ecrã tirada com o relatório de erro." "Falha ao fazer captura de ecrã com o relatório de erro." "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel." "Há 1 mês" "Há mais de 1 mês" - "{count,plural, =1{# dia anterior}other{# dias anteriores}}" + "{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}" "Último mês" "Mais antiga" "a %s" @@ -1106,14 +1107,14 @@ "em %d h" "em %d d" "em %d a" - "{count,plural, =1{Há # minuto}other{Há # minutos}}" - "{count,plural, =1{Há # hora}other{Há # horas}}" - "{count,plural, =1{Há # dia}other{Há # dias}}" - "{count,plural, =1{Há # ano}other{Há # anos}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# dia}other{# dias}}" - "{count,plural, =1{# ano}other{# anos}}" + "{count,plural, =1{Há # minuto}many{Há # minutos}other{Há # minutos}}" + "{count,plural, =1{Há # hora}many{Há # horas}other{Há # horas}}" + "{count,plural, =1{Há # dia}many{Há # dias}other{Há # dias}}" + "{count,plural, =1{Há # ano}many{Há # anos}other{Há # anos}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste aparelho." "Não é possível reproduzir este vídeo." @@ -1501,7 +1502,7 @@ "Ignorar" "Sem correspondências" "Localizar na página" - "{count,plural, =1{# correspondência}other{# de {total}}}" + "{count,plural, =1{# correspondência}many{# de {total}}other{# de {total}}}" "Concluído" "A apagar o armazenamento partilhado…" "Partilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Uma determinada app que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas." "Ativar a Poupança de dados?" "Ativar" - "{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante um minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}many{Durante # minutos (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}many{Durante # min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}many{Durante # horas (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}many{Durante # h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante um minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Guardar para o Preenchimento automático" "Não é possível preencher automaticamente o conteúdo" "Sem sugestões do preenchimento automático" - "{count,plural, =1{Uma sugestão do preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão do preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Pretende guardar em ""%1$s""?" "Pretende guardar %1$s em ""%2$s""?" "Pretende guardar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação %1$s" "O Bluetooth continuará ativado durante o modo de avião." "A carregar…" - "{count,plural, =1{{file_name} + # ficheiro}other{{file_name} + # ficheiros}}" + "{count,plural, =1{{file_name} + # ficheiro}many{{file_name} + # ficheiros}other{{file_name} + # ficheiros}}" "Não existem pessoas recomendadas com quem partilhar" "Lista de aplicações" "Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB." diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e66e32bdd1fd..bd93bfe1b01d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -52,6 +52,7 @@ "Falha. Ative o bloqueio do chip/R-UIM." Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. + You have %d remaining attempts before SIM is locked. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" @@ -180,7 +181,7 @@ "Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço." - "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}" + "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}" "Por terceiros desconhecidos" "Pelo administrador do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios." "Relatório completo" "Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais." - "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" + "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" "Captura de tela com o relatório do bug concluída" "Falha ao capturar a tela com o relatório do bug" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos." "1 mês atrás" "Antes de 1 mês atrás" - "{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}" + "{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}" "Mês passado" "Mais antigos" "em %s" @@ -1106,14 +1107,14 @@ "em %dh" "em %d dias" "em %da" - "{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}" - "{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}" - "{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}" - "{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}" - "{count,plural, =1{# minuto}one{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}one{# hora}other{# horas}}" - "{count,plural, =1{# dia}one{# dia}other{# dias}}" - "{count,plural, =1{# ano}one{# ano}other{# anos}}" + "{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}" + "{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}" + "{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}" + "{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}" + "{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste dispositivo." "Não é possível reproduzir este vídeo." @@ -1501,7 +1502,7 @@ "Pular" "Não encontrado" "Localizar na página" - "{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}" + "{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}" "Concluído" "Limpando armazenamento compartilhado…" "Compartilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas." "Ativar a Economia de dados?" "Ativar" - "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" - "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" - "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}" - "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" - "{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}" - "{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}" - "{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}" - "{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}" + "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" + "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" + "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}" + "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" + "{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}" + "{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}" + "{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}" + "{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" "Sem sugestões de preenchimento automático" - "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Salvar em ""%1$s""?" "Salvar %1$s em ""%2$s""?" "Salvar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação em %1$s" "O Bluetooth permanecerá ativado no modo avião" "Carregando" - "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}" + "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}" "Não há sugestões de pessoas para compartilhar" "Lista de apps" "Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB." -- cgit v1.2.3 From 4384f0d5e1dd178bda2e7786d6ed40410f1b0532 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 09:30:23 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I655b214199e65535720b46eff67e2398778c09de --- core/res/res/values-am/strings.xml | 10 ++++---- core/res/res/values-ar/strings.xml | 2 +- core/res/res/values-bs/strings.xml | 2 +- core/res/res/values-cs/strings.xml | 4 +-- core/res/res/values-da/strings.xml | 2 +- core/res/res/values-es-rUS/strings.xml | 47 +++++++++++++++++----------------- core/res/res/values-es/strings.xml | 45 ++++++++++++++++---------------- core/res/res/values-et/strings.xml | 8 +++--- core/res/res/values-eu/strings.xml | 2 +- core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-fr-rCA/strings.xml | 47 +++++++++++++++++----------------- core/res/res/values-fr/strings.xml | 47 +++++++++++++++++----------------- core/res/res/values-gu/strings.xml | 2 +- core/res/res/values-hi/strings.xml | 8 +++--- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-it/strings.xml | 45 ++++++++++++++++---------------- core/res/res/values-km/strings.xml | 4 +-- core/res/res/values-ko/strings.xml | 2 +- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-mk/strings.xml | 4 +-- core/res/res/values-ml/strings.xml | 2 +- core/res/res/values-mr/strings.xml | 2 +- core/res/res/values-my/strings.xml | 4 +-- core/res/res/values-ne/strings.xml | 4 +-- core/res/res/values-nl/strings.xml | 2 +- core/res/res/values-or/strings.xml | 8 +++--- core/res/res/values-pt-rBR/strings.xml | 45 ++++++++++++++++---------------- core/res/res/values-pt-rPT/strings.xml | 47 +++++++++++++++++----------------- core/res/res/values-pt/strings.xml | 45 ++++++++++++++++---------------- core/res/res/values-ro/strings.xml | 4 +-- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-sv/strings.xml | 6 ++--- core/res/res/values-sw/strings.xml | 4 +-- core/res/res/values-th/strings.xml | 2 +- core/res/res/values-tl/strings.xml | 2 +- core/res/res/values-tr/strings.xml | 2 +- core/res/res/values-uz/strings.xml | 4 +-- core/res/res/values-vi/strings.xml | 4 +-- 38 files changed, 242 insertions(+), 234 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 030262902833..a49c923e9e5b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -111,8 +111,8 @@ "በዝውውር ላይ አመላካች በርቷል" "በዝውውር ላይ አመልካች ጠፍቷል" "በዝውውር ላይ አመልካች ብልጭ ብልጭ ይላል" - "ከጎረቤት ውጪ" - "ከህንፃ ውጪ" + "ከጎረቤት ውጭ" + "ከህንፃ ውጭ" "የዝውውር- ተመራጭ ስርዓት" "ዝውውር- ዝግጁ የሆነ ስርዓት" " የዝውውር- አጋር ስምምነት" @@ -433,7 +433,7 @@ "ይህ መተግበሪያ ሁሉንም በእርስዎ ጡባዊ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" "ይህ መተግበሪያ ሁሉንም በእርስዎ Android TV መሣሪያ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" "ይህ መተግበሪያ ሁሉንም በእርስዎ ስልክ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።" - "የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጪ ላክ።" + "የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጭ ላክ።" "ይህ መተግበሪያ በእርስዎ ጡባዊ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" "ይህ መተግበሪያ በእርስዎ Android TV መሣሪያ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" "ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።" @@ -1157,7 +1157,7 @@ "ትኩረት" "በመጫን ላይ…" "በ" - "ውጪ" + "ውጭ" "ምልክት ተደርጎበታል" "ምልክት አልተደረገበትም" "ተመርጧል" @@ -1470,7 +1470,7 @@ "ፈቃድ ተጠይቋል" \n" ለ%s መለያ ፈቃድ ተጠይቋል" "ለመለያ %2$s\nበ%1$s የተጠየቀ ፈቃድ።" - "ከስራ መገለጫዎ ውጪ ሆነው መተግበሪያ እየተጠቀሙ ነው" + "ከስራ መገለጫዎ ውጭ ሆነው መተግበሪያ እየተጠቀሙ ነው" "ይህን መተግበሪያ በእርስዎ የስራ መገለጫ ላይ እየተጠቀሙበት ነው" "ግቤት ስልት" "አስምር" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 08499953678d..35be8cac1ed5 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1420,7 +1420,7 @@ "جارٍ إخراج %s" "عدم الإزالة" "إعداد" - "إلغاء" + "إخراج" "استكشاف" "تبديل جهاز إخراج الصوت" "%s مفقود" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 7ae030c3759d..f4e72fd2e3f6 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1421,7 +1421,7 @@ "Istraži" "Prebacite izlaz" "%s nedostaje" - "Ponovo ubacite uređaj" + "Ponovo umetnite uređaj" "Premješta se %s" "Premještanje podataka" "Prijenos sadržaja je završen" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index f86e783f6b1d..1373873f310b 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1422,7 +1422,7 @@ "Otevřít" "Přepnout výstup" "%s chybí" - "Znovu vložte zařízení" + "Vložte zařízení znovu" "Přesouvání aplikace %s" "Probíhá přesun dat" "Přenos obsahu je dokončen" @@ -1561,7 +1561,7 @@ "%1$s – %2$s" "%1$s, %2$s – %3$s" "Interní sdílené úložiště" - "Karta SD" + "SD karta" "SD karta %s" "Jednotka USB" "Jednotka USB %s" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index f165cc3490ec..bea4410f0dcf 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1560,7 +1560,7 @@ "%1$s, %2$s, %3$s" "Intern delt lagerplads" "SD-kort" - "SD-kort fra %s" + "SD-kort (%s)" "USB-drev" "USB-drev fra %s" "USB-lager" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 93322da3adfc..ed9bd5b43247 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -51,6 +51,7 @@ "Escribir PUK2 para desbloquear la tarjeta SIM." "Error; habilita el bloqueo de SIM/RUIM." + You have %d remaining attempts before SIM is locked. Tienes %d intentos más antes de que se bloquee la tarjeta SIM. Tienes %d un intento más antes de que se bloquee la tarjeta SIM. @@ -180,7 +181,7 @@ "El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio." "El almacenamiento del dispositivo Android TV está lleno. Borra algunos archivos para liberar espacio." "Se ha agotado el espacio de almacenamiento del dispositivo. Elimina algunos archivos para liberar espacio." - "{count,plural, =1{Se instaló la autoridad certificadora}other{Se instalaron las autoridades certificadoras}}" + "{count,plural, =1{Se instaló la autoridad certificadora}many{Se instalaron las autoridades certificadoras}other{Se instalaron las autoridades certificadoras}}" "Por un tercero desconocido" "Por parte de tu administrador del perfil de trabajo" "Por %s" @@ -254,7 +255,7 @@ "Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, ingresar más detalles acerca del problema y tomar capturas de pantalla. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse." "Informe completo" "Usa esta opción para reducir al mínimo la interferencia del sistema cuando tu dispositivo no responde o funciona muy lento, o cuando necesitas todas las secciones del informe. No permite ingresar más detalles ni tomar capturas de pantalla adicionales." - "{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}" + "{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}many{Se tomará una captura de pantalla para el informe de errores en # segundos.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}" "Se tomó la captura de pantalla con el informe de errores" "No se pudo tomar la captura de pantalla con el informe de errores" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s desea activar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el dispositivo." "Hace 1 mes." "Anterior a 1 mes atrás" - "{count,plural, =1{Último # día}other{Últimos # días}}" + "{count,plural, =1{Último # día}many{Últimos # días}other{Últimos # días}}" "Último mes" "Antiguos" "activado %s" @@ -1106,14 +1107,14 @@ "en %d h" "en %d d" "en %d años" - "{count,plural, =1{Hace # minuto}other{Hace # minutos}}" - "{count,plural, =1{Hace # hora}other{Hace # horas}}" - "{count,plural, =1{Hace # día}other{Hace # días}}" - "{count,plural, =1{Hace # año}other{Hace # años}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# día}other{# días}}" - "{count,plural, =1{# año}other{# años}}" + "{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}" + "{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}" + "{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}" + "{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# día}many{# días}other{# días}}" + "{count,plural, =1{# año}many{# años}other{# años}}" "Problemas de video" "No es posible transmitir este video al dispositivo." "No se puede reproducir el video." @@ -1419,7 +1420,7 @@ "Expulsar" "Explorar" "Cambiar salida" - "No se encuentra dispositivo %s." + "Falta %s" "Vuelve a insertar dispositivo" "Transfiriendo la aplicación %s" "Transfiriendo los datos" @@ -1501,7 +1502,7 @@ "Omitir" "Sin coincidencias" "Buscar en la página" - "{count,plural, =1{# coincidencia}other{# de {total}}}" + "{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}" "Listo" "Borrando almacenamiento compartido…" "Compartir" @@ -1854,14 +1855,14 @@ "Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones." "¿Deseas activar Ahorro de datos?" "Activar" - "{count,plural, =1{Por un minuto (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}" - "{count,plural, =1{Durante 1 h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}" - "{count,plural, =1{Durante un minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Por un minuto (hasta {formattedTime})}many{Por # minutos (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 min (hasta {formattedTime})}many{Durante # min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (hasta {formattedTime})}many{Durante # horas (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}" + "{count,plural, =1{Durante 1 h (hasta {formattedTime})}many{Durante # h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}" + "{count,plural, =1{Durante un minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Hasta las %1$s" "Hasta la(s) %1$s" "Hasta la hora %1$s (próxima alarma)" @@ -1990,7 +1991,7 @@ "Guardar para Autocompletar" "El contenido no puede autocompletarse" "No hay sugerencias de Autocompletar" - "{count,plural, =1{Una sugerencia de autocompletar}other{# sugerencias de autocompletar}}" + "{count,plural, =1{Una sugerencia de autocompletar}many{# sugerencias de autocompletar}other{# sugerencias de autocompletar}}" "¿Quieres guardar en ""%1$s""?" "¿Quieres guardar la %1$s en ""%2$s""?" "¿Quieres guardar %1$s y %2$s en ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentación %1$s" "La conexión Bluetooth permanecerá activa durante el modo de avión" "Cargando" - "{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}" + "{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}" "No hay personas recomendadas con quienes compartir" "Lista de apps" "Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB." diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 819cc47a0cb9..96b813112c94 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -51,6 +51,7 @@ "Introduce el código PUK2 para desbloquear la tarjeta SIM." "Error, habilitar bloqueo de SIM/RUIM." + You have %d remaining attempts before SIM is locked. Te quedan %d intentos para bloquear la tarjeta SIM. Te queda %d intento para bloquear la tarjeta SIM. @@ -180,7 +181,7 @@ "El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio." "El espacio de almacenamiento de tu dispositivo Android TV está lleno. Elimina algunos archivos para liberar espacio." "Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio." - "{count,plural, =1{Autoridad de certificación instalada}other{Autoridades de certificación instaladas}}" + "{count,plural, =1{Autoridad de certificación instalada}many{Autoridades de certificación instaladas}other{Autoridades de certificación instaladas}}" "Por un tercero desconocido" "Por el administrador de tu perfil de trabajo" "Por %s" @@ -254,7 +255,7 @@ "Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, introducir más información sobre el problema y hacer capturas de pantalla. Es posible que se omitan algunas secciones menos utilizadas y que requieran más tiempo." "Informe completo" "Utiliza esta opción para que la interferencia del sistema sea mínima cuando el dispositivo no responda o funcione demasiado lento, o bien cuando necesites todas las secciones del informe. No permite introducir más detalles ni hacer más capturas de pantalla." - "{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}" + "{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}many{La captura de pantalla para el informe de errores se hará en # segundos.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}" "Se ha hecho la captura de pantalla con el informe de errores" "No se ha podido hacer la captura de pantalla con el informe de errores" "Modo Silencio" @@ -1079,7 +1080,7 @@ "%1$s quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el teléfono." "Hace un mes" "Hace más de un mes" - "{count,plural, =1{Último día (#)}other{Últimos # días}}" + "{count,plural, =1{Último día (#)}many{Últimos # días}other{Últimos # días}}" "El mes pasado" "Anterior" "%s" @@ -1106,14 +1107,14 @@ "en %dh" "en %d d" "en %da" - "{count,plural, =1{Hace # minuto}other{Hace # minutos}}" - "{count,plural, =1{Hace # hora}other{Hace # horas}}" - "{count,plural, =1{Hace # día}other{Hace # días}}" - "{count,plural, =1{Hace # año}other{Hace # años}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# día}other{# días}}" - "{count,plural, =1{# año}other{# años}}" + "{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}" + "{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}" + "{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}" + "{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# día}many{# días}other{# días}}" + "{count,plural, =1{# año}many{# años}other{# años}}" "Incidencias con el vídeo" "Este vídeo no se puede transmitir al dispositivo." "No se puede reproducir el vídeo." @@ -1501,7 +1502,7 @@ "Saltar" "No hay coincidencias." "Buscar en la página" - "{count,plural, =1{# coincidencia}other{# de {total}}}" + "{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}" "Hecho" "Borrando almacenamiento compartido…" "Compartir" @@ -1854,14 +1855,14 @@ "Para reducir el uso de datos, Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano. Si estás usando una aplicación, podrá acceder a datos, pero con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques." "¿Activar Ahorro de datos?" "Activar" - "{count,plural, =1{Durante un minuto (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}" - "{count,plural, =1{Durante 1 minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Durante un minuto (hasta las {formattedTime})}many{Durante # minutos (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 min (hasta las {formattedTime})}many{Durante # min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}many{Durante # horas (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 h (hasta las {formattedTime})}many{Durante # h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}" + "{count,plural, =1{Durante 1 minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Hasta las %1$s" "Hasta %1$s" "Hasta las %1$s (próxima alarma)" @@ -1990,7 +1991,7 @@ "Guardar en la función Autocompletar" "El contenido no se puede autocompletar" "No hay sugerencias de Autocompletar" - "{count,plural, =1{1 sugerencia de Autocompletar}other{# sugerencias de Autocompletar}}" + "{count,plural, =1{1 sugerencia de Autocompletar}many{# sugerencias de Autocompletar}other{# sugerencias de Autocompletar}}" "¿Guardar en ""%1$s""?" "¿Guardar %1$s en ""%2$s""?" "¿Guardar %1$s y %2$s en ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentación %1$s" "El Bluetooth seguirá activado en el modo Avión" "Cargando" - "{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}" + "{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}" "No hay sugerencias de personas con las que compartir" "Lista de aplicaciones" "Esta aplicación no tiene permiso para grabar, pero podría capturar audio con este dispositivo USB." diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index ec5e203234ab..8a8708c79afc 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1416,8 +1416,8 @@ "Üksuse %s väljutamine …" "Ärge eemaldage" "Seadistus" - "Eemaldamine" - "Avastamine" + "Eemalda" + "Avasta" "Vahetage väljundit" "Üksust %s pole" "Sisestage seade uuesti" @@ -1560,9 +1560,9 @@ "%1$s, %2$s, %3$s" "Sisemine jagatud mäluruum" "SD-kaart" - "Tootja %s SD-kaart" + "%s SD-kaart" "USB-ketas" - "Tootja %s USB-ketas" + "%s USB-ketas" "USB-mäluseade" "Muuda" "Andmekasutuse hoiatus" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index cb5a59140e96..56ec3bca1df6 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -57,7 +57,7 @@ "IMEIa" "MEID" "Sarrerako deien identifikazio-zerbitzua" - "Ezkutatu irteerako deitzailearen IDa" + "Ezkutatu irteerako deitzailearen identitatea" "Konektatutako linearen IDa" "Konektatutako linearen ID murriztapena" "Dei-desbideratzea" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 9636c86de480..abf3feee8d6a 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1416,7 +1416,7 @@ "درحال بیرون راندن %s" "جدا نکنید" "راه‌اندازی" - "بیرون راندن" + "خارج کردن" "کاوش" "تغییر خروجی" "%s وجود ندارد" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 363c89e7589e..558a163c50a7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -52,6 +52,7 @@ "Opération infructueuse. Activez le verrouillage SIM/RUIM." Il vous reste %d tentative avant que votre carte SIM soit verrouillée. + You have %d remaining attempts before SIM is locked. Il vous reste %d tentatives avant que votre carte SIM soit verrouillée. "Code IIEM" @@ -180,7 +181,7 @@ "La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace." "L\'espace de stockage de l\'appareil Android TV est plein. Supprimez des fichiers pour libérer de l\'espace." "La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace." - "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}" + "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}" "Par un tiers inconnu" "Par l\'administrateur de votre profil professionnel" "Par %s" @@ -254,7 +255,7 @@ "Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, d\'entrer plus d\'information sur le problème et d\'effectuer des saisies d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises." "Rapport complet" "Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information." - "{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}" + "{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}many{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}" "Capture d\'écran prise avec le rapport de bogue" "Échec de la prise de capture d\'écran avec le rapport de bogue" "Mode silencieux" @@ -1079,7 +1080,7 @@ "%1$s souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes." "Il y a 1 mois" "Il y a plus d\'un mois" - "{count,plural, =1{# dernier jour}one{# dernier jour}other{# derniers jours}}" + "{count,plural, =1{# dernier jour}one{# dernier jour}many{# derniers jours}other{# derniers jours}}" "Le mois dernier" "Précédent" "le %s" @@ -1106,14 +1107,14 @@ "dans %d h" "dans %d j" "dans %d a" - "{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}" - "{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}" - "{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}" - "{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}" - "{count,plural, =1{# minute}one{# minute}other{# minutes}}" - "{count,plural, =1{# heure}one{# heure}other{# heures}}" - "{count,plural, =1{# jour}one{# jour}other{# jours}}" - "{count,plural, =1{# an}one{# an}other{# ans}}" + "{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}" + "{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}" + "{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}" + "{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}" + "{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}" + "{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}" + "{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}" + "{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}" "Problème vidéo" "Impossible de lire cette vidéo en continu sur cet appareil." "Impossible de lire la vidéo." @@ -1417,7 +1418,7 @@ "Ne pas retirer" "Configurer" "Éjecter" - "Découvrir" + "Explorer" "Changer de sortie" "Mémoire de stockage %s manquante" "Insérez l\'appareil de nouveau" @@ -1501,7 +1502,7 @@ "Ignorer" "Aucune partie" "Rechercher sur la page" - "{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}" + "{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}" "Terminé" "Effacement du stockage partagé en cours…" "Partager" @@ -1854,14 +1855,14 @@ "Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez." "Activer l\'économiseur de données?" "Activer" - "{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant une minute}one{Pendant # minute}other{Pendant # minutes}}" - "{count,plural, =1{Pendant 1 m}one{Pendant # m}other{Pendant # m}}" - "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}" - "{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}" + "{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}many{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant une minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}" + "{count,plural, =1{Pendant 1 m}one{Pendant # m}many{Pendant # m}other{Pendant # m}}" + "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}" + "{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}" "Jusqu\'à %1$s" "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" @@ -1990,7 +1991,7 @@ "Enregistrer pour le remplissage automatique" "Le contenu ne peut pas être entré automatiquement" "Aucune suggestion de remplissage automatique" - "{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}other{# suggestions de remplissage automatique}}" + "{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}many{# suggestions de remplissage automatique}other{# suggestions de remplissage automatique}}" "Enregistrer sous ""%1$s""?" "Enregistrer %1$s sous ""%2$s""?" "Enregistrer %1$s et %2$s sous ""%3$s""?" @@ -2100,7 +2101,7 @@ "Présentation %1$s" "Le Bluetooth restera activé en mode Avion" "Chargement en cours…" - "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}" + "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}" "Aucune recommandation de personnes avec lesquelles effectuer un partage" "Liste des applications" "Cette application n\'a pas été autorisée à effectuer des enregistrements, mais elle pourrait capturer du contenu audio par l\'intermédiaire de cet appareil USB." diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 0f79218f949b..024cf3e89b34 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -52,6 +52,7 @@ "Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM." Il vous reste %d tentative avant que votre carte SIM ne soit verrouillée. + You have %d remaining attempts before SIM is locked. Il vous reste %d tentatives avant que votre carte SIM ne soit verrouillée. "Code IMEI" @@ -180,7 +181,7 @@ "La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace." "L\'espace de stockage de l\'appareil Android TV est saturé. Supprimez certains fichiers pour libérer de l\'espace." "La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace." - "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}" + "{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}" "Par un tiers inconnu" "Par l\'administrateur de votre profil professionnel" "Par %s" @@ -254,7 +255,7 @@ "Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, de saisir plus d\'informations sur le problème et d\'effectuer des captures d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises." "Rapport complet" "Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information." - "{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}" + "{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}many{Capture d\'écran pour le rapport de bug dans # secondes.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}" "Capture d\'écran avec rapport de bug effectuée" "Échec de la capture d\'écran avec le rapport de bug" "Mode silencieux" @@ -1079,7 +1080,7 @@ "%1$s souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes." "Il y a 1 mois" "Il y a plus d\'un mois" - "{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}other{# derniers jours}}" + "{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}many{# derniers jours}other{# derniers jours}}" "Le mois dernier" "Préc." "le %s" @@ -1106,14 +1107,14 @@ "dans %d h" "dans %d j" "dans %d an" - "{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}" - "{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}" - "{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}" - "{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}" - "{count,plural, =1{# minute}one{# minute}other{# minutes}}" - "{count,plural, =1{# heure}one{# heure}other{# heures}}" - "{count,plural, =1{# jour}one{# jour}other{# jours}}" - "{count,plural, =1{# an}one{# an}other{# ans}}" + "{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}" + "{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}" + "{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}" + "{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}" + "{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}" + "{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}" + "{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}" + "{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}" "Problème vidéo" "Impossible de lire cette vidéo en streaming sur cet appareil." "Impossible de lire la vidéo." @@ -1419,7 +1420,7 @@ "Éjecter" "Parcourir" "Changer de sortie" - "Mémoire de stockage \"%s\" manquante" + "Support \"%s\" manquant" "Insérez le périphérique" "Transfert de l\'application %s" "Déplacement des données en cours" @@ -1501,7 +1502,7 @@ "Ignorer" "Aucune correspondance" "Rechercher sur la page" - "{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}" + "{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}" "OK" "Suppression de l\'espace de stockage partagé…" "Partager" @@ -1854,14 +1855,14 @@ "Pour réduire la consommation des données, l\'Économiseur de données empêche certaines applis d\'envoyer ou de recevoir des données en arrière-plan. Les applis que vous utiliserez pourront toujours accéder aux données, mais le feront moins fréquemment. Par exemple, les images pourront ne pas s\'afficher tant que vous n\'aurez pas appuyé dessus." "Activer l\'Économiseur de données ?" "Activer" - "{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" - "{count,plural, =1{Pendant 1 minute}one{Pendant # minute}other{Pendant # minutes}}" - "{count,plural, =1{Pendant 1 min}one{Pendant # min}other{Pendant # min}}" - "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}" - "{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}" + "{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}many{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}" + "{count,plural, =1{Pendant 1 minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}" + "{count,plural, =1{Pendant 1 min}one{Pendant # min}many{Pendant # min}other{Pendant # min}}" + "{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}" + "{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}" "Jusqu\'à %1$s" "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" @@ -1990,7 +1991,7 @@ "Enregistrer pour la saisie automatique" "Le contenu ne peut pas être saisi automatiquement" "Aucune suggestion de saisie automatique" - "{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}other{# suggestions de saisie automatique}}" + "{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}many{# suggestions de saisie automatique}other{# suggestions de saisie automatique}}" "Enregistrer dans ""%1$s"" ?" "Enregistrer la %1$s dans ""%2$s"" ?" "Enregistrer %1$s et %2$s dans ""%3$s"" ?" @@ -2100,7 +2101,7 @@ "Présentation %1$s" "Le Bluetooth restera activé en mode Avion" "Chargement…" - "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}" + "{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}" "Aucune recommandation de personnes avec lesquelles effectuer un partage" "Liste des applications" "Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB." diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index f850bfbd6d3d..5c67c0cdab8d 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1420,7 +1420,7 @@ "અન્વેષણ કરો" "આઉટપુટ સ્વિચ કરો" "%s ખૂટે છે" - "ફરીથી ઉપકરણ દાખલ કરો" + "ફરીથી ડિવાઇસ દાખલ કરો" "%s ખસેડી રહ્યાં છીએ" "ડેટાને ખસેડી રહ્યાં છીએ" "કન્ટેન્ટ ટ્રાન્સફર કરવાનું પૂર્ણ થયું" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 2f7c69b92f8c..ec9af29bf032 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -307,7 +307,7 @@ "मैसेज (एसएमएस) भेजें और देखें" "फ़ाइलें" "अपने डिवाइस में मौजूद फ़ाइलों का ऐक्सेस दें" - "संगीत और ऑडियो के ऐक्सेस" + "संगीत और ऑडियो" "आपके डिवाइस पर संगीत और ऑडियो को ऐक्सेस करने की अनुमति" "फ़ोटो और वीडियो के ऐक्सेस" "आपके डिवाइस पर फ़ोटो और वीडियो को ऐक्सेस करने की अनुमति" @@ -1419,7 +1419,7 @@ "निकालें" "एक्सप्लोर करें" "आउटपुट बदलें" - "%s गुम है" + "%s नहीं मिल रहा है" "डिवाइस को दोबारा लगाएं" "%s को ले जाया जा रहा है" "डेटा ले जाया जा रहा है" @@ -1849,8 +1849,8 @@ "आपके व्यवस्थापक ने अपडेट किया है" "आपके व्यवस्थापक ने हटा दिया है" "ठीक है" - "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है." - "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है." + "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ खास सुविधाएं कम या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते." + "बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ सुविधाएं सीमित या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते." "डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, जिस ऐप्लिकेशन का इस्तेमाल किया जा रहा है वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी, जब तक उन पर टैप नहीं किया जाएगा." "डेटा बचाने की सेटिंग चालू करें?" "चालू करें" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 01d937586686..835cdcde94bb 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1416,7 +1416,7 @@ "%s հիշասարքն անջատվում է" "Չհեռացնեք սարքը" "Կարգավորել" - "Անջատել" + "Հանել" "Ուսումնասիրել" "Աուդիոելքի սարքի փոխարկում" "%s-ը տեղադրված չէ" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 01f43a73274c..47e9d6586260 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -51,6 +51,7 @@ "Digita il PUK2 per sbloccare la SIM." "Operazione non riuscita; attiva blocco SIM/RUIM." + You have %d remaining attempts before SIM is locked. Hai ancora %d tentativi a disposizione prima che la SIM venga bloccata. Hai ancora %d tentativo a disposizione prima che la SIM venga bloccata. @@ -180,7 +181,7 @@ "La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio." "Lo spazio di archiviazione del dispositivo Android TV è pieno. Elimina alcuni file per liberare spazio." "Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio." - "{count,plural, =1{Autorità di certificazione installata}other{Autorità di certificazione installate}}" + "{count,plural, =1{Autorità di certificazione installata}many{Autorità di certificazione installate}other{Autorità di certificazione installate}}" "Da una terza parte sconosciuta" "Dall\'amministratore del tuo profilo di lavoro" "Da %s" @@ -254,7 +255,7 @@ "Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento della segnalazione, di inserire maggiori dettagli relativi al problema e di acquisire screenshot. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nella segnalazione richiede molto tempo." "Report completo" "Utilizza questa opzione per ridurre al minimo l\'interferenza di sistema quando il dispositivo non risponde, è troppo lento oppure quando ti servono tutte le sezioni della segnalazione. Non puoi inserire altri dettagli o acquisire altri screenshot." - "{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}" + "{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}many{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}" "Screenshot con segnalazione di bug effettuato correttamente" "Impossibile acquisire screenshot con segnalazione di bug" "Modalità silenziosa" @@ -1079,7 +1080,7 @@ "%1$s vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il telefono tramite gesti." "1 mese fa" "Oltre 1 mese fa" - "{count,plural, =1{Ultimo giorno}other{Ultimi # giorni}}" + "{count,plural, =1{Ultimo giorno}many{Ultimi # giorni}other{Ultimi # giorni}}" "Ultimo mese" "Precedente" "%s" @@ -1106,14 +1107,14 @@ "tra %d h" "tra %d g" "tra %d a" - "{count,plural, =1{# minuto fa}other{# minuti fa}}" - "{count,plural, =1{# ora fa}other{# ore fa}}" - "{count,plural, =1{# giorno fa}other{# giorni fa}}" - "{count,plural, =1{# anno fa}other{# anni fa}}" - "{count,plural, =1{# minuto}other{# minuti}}" - "{count,plural, =1{# ora}other{# ore}}" - "{count,plural, =1{# giorno}other{# giorni}}" - "{count,plural, =1{# anno}other{# anni}}" + "{count,plural, =1{# minuto fa}many{# minuti fa}other{# minuti fa}}" + "{count,plural, =1{# ora fa}many{# ore fa}other{# ore fa}}" + "{count,plural, =1{# giorno fa}many{# giorni fa}other{# giorni fa}}" + "{count,plural, =1{# anno fa}many{# anni fa}other{# anni fa}}" + "{count,plural, =1{# minuto}many{# minuti}other{# minuti}}" + "{count,plural, =1{# ora}many{# ore}other{# ore}}" + "{count,plural, =1{# giorno}many{# giorni}other{# giorni}}" + "{count,plural, =1{# anno}many{# anni}other{# anni}}" "Problemi video" "Questo video non è valido per lo streaming su questo dispositivo." "Impossibile riprodurre il video." @@ -1501,7 +1502,7 @@ "Salta" "Nessuna corrispondenza" "Trova nella pagina" - "{count,plural, =1{# corrispondenza}other{# di {total}}}" + "{count,plural, =1{# corrispondenza}many{# di {total}}other{# di {total}}}" "Fine" "Cancellazione archivio condiviso…" "Condividi" @@ -1854,14 +1855,14 @@ "Per contribuire a ridurre l\'utilizzo dei dati, la funzionalità Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Per esempio, è possibile che le immagini non vengano visualizzate finché non le tocchi." "Attivare Risparmio dati?" "Attiva" - "{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}" - "{count,plural, =1{Per un minuto}other{Per # minuti}}" - "{count,plural, =1{Per 1 min}other{Per # min}}" - "{count,plural, =1{Per 1 ora}other{Per # ore}}" - "{count,plural, =1{Per 1 h}other{Per # h}}" + "{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}many{Per # minuti (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}many{Per # min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}many{Per # ore (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}many{Per # h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}" + "{count,plural, =1{Per un minuto}many{Per # minuti}other{Per # minuti}}" + "{count,plural, =1{Per 1 min}many{Per # min}other{Per # min}}" + "{count,plural, =1{Per 1 ora}many{Per # ore}other{Per # ore}}" + "{count,plural, =1{Per 1 h}many{Per # h}other{Per # h}}" "Fino a: %1$s" "Fino a %1$s" "Fino a %1$s (prossima sveglia)" @@ -1990,7 +1991,7 @@ "Salva per Compilazione automatica" "Impossibile compilare automaticamente i contenuti" "Nessun suggerimento di Compilazione automatica" - "{count,plural, =1{Un suggerimento di compilazione automatica}other{# suggerimenti di compilazione automatica}}" + "{count,plural, =1{Un suggerimento di compilazione automatica}many{# suggerimenti di compilazione automatica}other{# suggerimenti di compilazione automatica}}" "Vuoi salvare su ""%1$s""?" "Vuoi salvare la %1$s su ""%2$s""?" "Vuoi salvare %1$s e %2$s su ""%3$s""?" @@ -2100,7 +2101,7 @@ "Presentazione %1$s" "Il Bluetooth rimane attivo durante l\'uso della modalità aereo" "Caricamento" - "{count,plural, =1{{file_name} + # file}other{{file_name} + # file}}" + "{count,plural, =1{{file_name} + # file}many{{file_name} + # file}other{{file_name} + # file}}" "Nessuna persona consigliata per la condivisione" "Elenco di app" "A questa app non è stata concessa l\'autorizzazione di registrazione, ma l\'app potrebbe acquisire l\'audio tramite questo dispositivo USB." diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 28bcb257f929..7f505c89f2db 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1419,7 +1419,7 @@ "ដកចេញ" "រុករក" "លទ្ធផល Switch" - "បាត់ %s" + "បាត់%s" "បញ្ចូល​ឧបករណ៍​ម្តងទៀត" "កំពុងផ្លាស់ទី %s" "កំពុងផ្លាស់ទីទិន្នន័យ…" @@ -1559,7 +1559,7 @@ "%1$s, %2$s" "%1$s, %2$s, %3$s" "ទំហំផ្ទុករួមខាងក្នុង" - "កាត​អេសឌី" + "កាត SD" "កាត SD %s" "ឧបករណ៍ផ្ទុក USB" "ឧបករណ៍ផ្ទុក USB %s" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 98b2fa978ffe..9e1b3f0612fb 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1416,7 +1416,7 @@ "%s 마운트 해제 중" "외부 미디어를 제거하지 마세요." "설정" - "마운트 해제" + "꺼내기" "둘러보기" "출력 전환" "%s 없음" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index d8e20a073311..ccb03848061e 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1397,7 +1397,7 @@ "Жөндөө үчүн таптаңыз" "Жөндөө үчүн тандаңыз" "Түзмөктү форматташыңыз керек болушу мүмкүн. Чыгаруу үчүн таптап коюңуз." - "Сүрөттөрдү жана медиа өткөрүү үчүн" + "Сүрөттөрдү жана башка файлдарды өткөрүү үчүн" "Медиа файлдарды серептөө" "%s түзмөгүндө бир маселе бар" "%s иштебей жатат" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 040f50301cf2..5bf647c5accb 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1559,8 +1559,8 @@ "%1$s, %2$s" "%1$s, %2$s, %3$s" "Внатрешен споделен капацитет" - "СД картичка" - "%s СД-картичка" + "SD-картичка" + "%s SD-картичка" "USB-меморија" "%s USB-меморија" "USB меморија" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 199481d15e18..04ef9d494d69 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1416,7 +1416,7 @@ "%s ഒഴിവാക്കുന്നു" "നീക്കം ചെയ്യരുത്" "സജ്ജമാക്കുക" - "നിരസിക്കുക" + "ഒഴിവാക്കുക" "അടുത്തറിയുക" "ഔട്ട്പുട്ട് മാറുക" "%s കാണുന്നില്ല" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 6b8819e99624..d79f1c07cc78 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1397,7 +1397,7 @@ "सेट करण्यासाठी टॅप करा" "सेट अप करण्यासाठी निवडा" "तुम्हाला डिव्हाइस पुन्हा फॉरमॅट करावे लागू शकते. बाहेर काढण्यासाठी टॅप करा." - "फोटो आणि मीडिया स्थानांतरित करण्‍यासाठी" + "फोटो आणि मीडिया ट्रान्सफर करण्‍यासाठी" "मीडिया फाइल ब्राउझ करा" "%s सह समस्या" "%s काम करत नाही" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 2a114821fa79..fbea25125772 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1416,11 +1416,11 @@ "%s ကို ထုတ်နေသည်" "မဖယ်ရှားပါနှင့်" "သတ်မှတ်ရန်" - "ထုတ်မည်" + "ထုတ်ရန်" "စူးစမ်းရန်" "မီဒီယာအထွက် ပြောင်းရန်" "%s ပျောက်နေသည်" - "စက်ပစ္စည်းကို ထပ်မံထည့်သွင်းပါ" + "ကတ်ကို ထပ်မံထည့်သွင်းပါ" "%s ရွှေ့နေစဉ်" "ဒေတာများ ရွှေ့နေစဉ်" "အကြောင်းအရာ လွှဲပြောင်းပြီးပါပြီ" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index cc4d6a169f2d..efede375ac8e 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1397,7 +1397,7 @@ "सेटअप गर्न ट्याप गर्नुहोस्" "सेटअप गर्न चयन गर्नुहोस्" "तपाईंले यो डिभाइस पुनः फर्म्याट गर्नु पर्ने हुन सक्छ। यो डिभाइस हटाउन ट्याप गर्नुहोस्।" - "फोटोहरू र मिडिया स्थानान्तरणका लागि" + "फोटो र मिडिया ट्रान्सफरका लागि" "मिडिया फाइलहरू ब्राउज गर्नुहोस्" "%s मा समस्या देखियो" "%s ले काम गरिरहेको छैन" @@ -1420,7 +1420,7 @@ "अन्वेषण गर्नुहोस्" "आउटपुट बदल्नुहोस्" "%s हराइरहेको" - "यन्त्र फेरि घुसाउनुहोस्" + "डिभाइस फेरि हाल्नुहोस्" "%s सार्दै" "डेटा सार्दै..." "सामग्री स्थानान्तरण गरियो" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 6082855417a1..2ec06024ab58 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1420,7 +1420,7 @@ "Verkennen" "Uitvoer wijzigen" "%s ontbreekt" - "Voer apparaat opnieuw in" + "Voer het apparaat opnieuw in" "%s verplaatsen" "Gegevens verplaatsen" "Contentoverdracht is voltooid" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 20eb100d5aa9..79ac29a0d3c8 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -216,7 +216,7 @@ "ସାଇଲେଣ୍ଟ ମୋଡ୍" "ୱେୟାରଲେସ୍‌କୁ ଚାଲୁ କରନ୍ତୁ" "ୱେୟାରଲେସ୍‌କୁ ବନ୍ଦ କରନ୍ତୁ" - "ସ୍କ୍ରୀନ୍‌ ଲକ୍‌" + "ସ୍କ୍ରିନ ଲକ" "ପାୱାର ବନ୍ଦ ଅଛି" "ରିଙ୍ଗର୍‍ ଅଫ୍‍ ଅଛି" "ରିଙ୍ଗର୍‍ କମ୍ପନ" @@ -240,7 +240,7 @@ "ଟାବଲେଟ ବିକଳ୍ପ" "Android TVର ବିକଳ୍ପଗୁଡ଼ିକ" "ଫୋନ ବିକଳ୍ପ" - "ସ୍କ୍ରୀନ୍‌ ଲକ୍‌" + "ସ୍କ୍ରିନ ଲକ" "ପାୱାର ବନ୍ଦ ଅଛି" "ପାୱାର" "ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ" @@ -1397,7 +1397,7 @@ "ସେଟଅପ୍‌ କରିବା ପାଇଁ ଟାପ୍‌ କରନ୍ତୁ" "ସେଟ୍ ଅପ୍ କରିବାକୁ ଚୟନ କରନ୍ତୁ" "ଆପଣଙ୍କୁ ପୁଣି ଡିଭାଇସ୍ ଫର୍ମାଟ୍ କରିବାକୁ ପଡ଼ିପାରେ। ବାହାର କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।" - "ଫଟୋ ଓ ମିଡିଆ ସ୍ଥାନାନ୍ତର କରାଯିବା ପାଇଁ" + "ଫଟୋ ଓ ମିଡିଆ ସ୍ଥାନାନ୍ତର କରିବା ପାଇଁ" "ମିଡିଆ ଫାଇଲଗୁଡ଼ିକୁ ବ୍ରାଉଜ୍ କରନ୍ତୁ" "%s ସହ ସମସ୍ୟା" "%s କାମ କରୁନାହିଁ" @@ -2034,7 +2034,7 @@ "ଶର୍ଟକଟ୍‍ ରିଷ୍ଟୋର୍‍ କରିହେଲା ନାହିଁ, କାରଣ ଏହି ଆପ୍‍ର ସ୍ୱାକ୍ଷର ମେଳ ହେଉନାହିଁ" "ଶର୍ଟକଟ୍‍ ରିଷ୍ଟୋର୍‍ କରିହେଲା ନାହିଁ" "ଶର୍ଟକଟ୍‍ ଅକ୍ଷମ କରାଯାଇଛି" - "ଅନଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ" + "ଅନଇନଷ୍ଟଲ କରନ୍ତୁ" "କୌଣସିମତେ ଖୋଲନ୍ତୁ" "ହାନିକାରକ ଆପ୍‌ ଚିହ୍ନଟ ହୋଇଛି" "ସମସ୍ତ ଡିଭାଇସ ଲଗକୁ ଆକ୍ସେସ କରିବା ପାଇଁ %sକୁ ଅନୁମତି ଦେବେ?" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index e66e32bdd1fd..bd93bfe1b01d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -52,6 +52,7 @@ "Falha. Ative o bloqueio do chip/R-UIM." Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. + You have %d remaining attempts before SIM is locked. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" @@ -180,7 +181,7 @@ "Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço." - "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}" + "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}" "Por terceiros desconhecidos" "Pelo administrador do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios." "Relatório completo" "Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais." - "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" + "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" "Captura de tela com o relatório do bug concluída" "Falha ao capturar a tela com o relatório do bug" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos." "1 mês atrás" "Antes de 1 mês atrás" - "{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}" + "{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}" "Mês passado" "Mais antigos" "em %s" @@ -1106,14 +1107,14 @@ "em %dh" "em %d dias" "em %da" - "{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}" - "{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}" - "{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}" - "{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}" - "{count,plural, =1{# minuto}one{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}one{# hora}other{# horas}}" - "{count,plural, =1{# dia}one{# dia}other{# dias}}" - "{count,plural, =1{# ano}one{# ano}other{# anos}}" + "{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}" + "{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}" + "{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}" + "{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}" + "{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste dispositivo." "Não é possível reproduzir este vídeo." @@ -1501,7 +1502,7 @@ "Pular" "Não encontrado" "Localizar na página" - "{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}" + "{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}" "Concluído" "Limpando armazenamento compartilhado…" "Compartilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas." "Ativar a Economia de dados?" "Ativar" - "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" - "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" - "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}" - "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" - "{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}" - "{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}" - "{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}" - "{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}" + "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" + "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" + "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}" + "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" + "{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}" + "{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}" + "{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}" + "{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" "Sem sugestões de preenchimento automático" - "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Salvar em ""%1$s""?" "Salvar %1$s em ""%2$s""?" "Salvar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação em %1$s" "O Bluetooth permanecerá ativado no modo avião" "Carregando" - "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}" + "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}" "Não há sugestões de pessoas para compartilhar" "Lista de apps" "Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB." diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 93516bd2024c..9a49a601211f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -51,6 +51,7 @@ "Introduza o PUK2 para desbloquear o cartão SIM." "Ação sem êxito. Ative o bloqueio do SIM/RUIM." + You have %d remaining attempts before SIM is locked. Tem mais %d tentativas antes de o cartão SIM ficar bloqueado. Tem mais %d tentativa antes de o cartão SIM ficar bloqueado. @@ -180,7 +181,7 @@ "O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço." "O armazenamento do dispositivo Android TV está cheio. Elimine alguns ficheiros para libertar espaço." "O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço." - "{count,plural, =1{Autoridade de certificação instalada}other{Autoridades de certificação instaladas}}" + "{count,plural, =1{Autoridade de certificação instalada}many{Autoridades de certificação instaladas}other{Autoridades de certificação instaladas}}" "Por um terceiro desconhecido" "Pelo gestor do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Utilize esta opção na maioria das circunstâncias. Permite monitorizar o progresso do relatório, introduzir mais detalhes acerca do problema e tirar capturas de ecrã. Pode omitir algumas secções menos utilizadas que demoram muito tempo a comunicar." "Relatório completo" "Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais." - "{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}" + "{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}many{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}" "Captura de ecrã tirada com o relatório de erro." "Falha ao fazer captura de ecrã com o relatório de erro." "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel." "Há 1 mês" "Há mais de 1 mês" - "{count,plural, =1{# dia anterior}other{# dias anteriores}}" + "{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}" "Último mês" "Mais antiga" "a %s" @@ -1106,14 +1107,14 @@ "em %d h" "em %d d" "em %d a" - "{count,plural, =1{Há # minuto}other{Há # minutos}}" - "{count,plural, =1{Há # hora}other{Há # horas}}" - "{count,plural, =1{Há # dia}other{Há # dias}}" - "{count,plural, =1{Há # ano}other{Há # anos}}" - "{count,plural, =1{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}other{# horas}}" - "{count,plural, =1{# dia}other{# dias}}" - "{count,plural, =1{# ano}other{# anos}}" + "{count,plural, =1{Há # minuto}many{Há # minutos}other{Há # minutos}}" + "{count,plural, =1{Há # hora}many{Há # horas}other{Há # horas}}" + "{count,plural, =1{Há # dia}many{Há # dias}other{Há # dias}}" + "{count,plural, =1{Há # ano}many{Há # anos}other{Há # anos}}" + "{count,plural, =1{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste aparelho." "Não é possível reproduzir este vídeo." @@ -1420,7 +1421,7 @@ "Explorar" "Saída do interruptor" "%s em falta" - "Volte a inserir o dispositivo." + "Volte a inserir o dispositivo" "A mover %s" "A mover dados" "Transf. de conteúdo concluída" @@ -1501,7 +1502,7 @@ "Ignorar" "Sem correspondências" "Localizar na página" - "{count,plural, =1{# correspondência}other{# de {total}}}" + "{count,plural, =1{# correspondência}many{# de {total}}other{# de {total}}}" "Concluído" "A apagar o armazenamento partilhado…" "Partilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Uma determinada app que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas." "Ativar a Poupança de dados?" "Ativar" - "{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}" - "{count,plural, =1{Durante um minuto}other{Durante # minutos}}" - "{count,plural, =1{Durante 1 min}other{Durante # min}}" - "{count,plural, =1{Durante 1 hora}other{Durante # horas}}" - "{count,plural, =1{Durante 1 h}other{Durante # h}}" + "{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}many{Durante # minutos (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}many{Durante # min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}many{Durante # horas (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}many{Durante # h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}" + "{count,plural, =1{Durante um minuto}many{Durante # minutos}other{Durante # minutos}}" + "{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}" + "{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}" + "{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Guardar para o Preenchimento automático" "Não é possível preencher automaticamente o conteúdo" "Sem sugestões do preenchimento automático" - "{count,plural, =1{Uma sugestão do preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão do preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Pretende guardar em ""%1$s""?" "Pretende guardar %1$s em ""%2$s""?" "Pretende guardar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação %1$s" "O Bluetooth continuará ativado durante o modo de avião." "A carregar…" - "{count,plural, =1{{file_name} + # ficheiro}other{{file_name} + # ficheiros}}" + "{count,plural, =1{{file_name} + # ficheiro}many{{file_name} + # ficheiros}other{{file_name} + # ficheiros}}" "Não existem pessoas recomendadas com quem partilhar" "Lista de aplicações" "Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB." diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e66e32bdd1fd..bd93bfe1b01d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -52,6 +52,7 @@ "Falha. Ative o bloqueio do chip/R-UIM." Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. + You have %d remaining attempts before SIM is locked. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" @@ -180,7 +181,7 @@ "Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço." "O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço." - "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}" + "{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}" "Por terceiros desconhecidos" "Pelo administrador do seu perfil de trabalho" "Por %s" @@ -254,7 +255,7 @@ "Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios." "Relatório completo" "Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais." - "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" + "{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}" "Captura de tela com o relatório do bug concluída" "Falha ao capturar a tela com o relatório do bug" "Modo silencioso" @@ -1079,7 +1080,7 @@ "%1$s quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos." "1 mês atrás" "Antes de 1 mês atrás" - "{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}" + "{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}" "Mês passado" "Mais antigos" "em %s" @@ -1106,14 +1107,14 @@ "em %dh" "em %d dias" "em %da" - "{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}" - "{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}" - "{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}" - "{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}" - "{count,plural, =1{# minuto}one{# minuto}other{# minutos}}" - "{count,plural, =1{# hora}one{# hora}other{# horas}}" - "{count,plural, =1{# dia}one{# dia}other{# dias}}" - "{count,plural, =1{# ano}one{# ano}other{# anos}}" + "{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}" + "{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}" + "{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}" + "{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}" + "{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}" + "{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}" + "{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}" + "{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}" "Problema com o vídeo" "Este vídeo não é válido para transmissão neste dispositivo." "Não é possível reproduzir este vídeo." @@ -1501,7 +1502,7 @@ "Pular" "Não encontrado" "Localizar na página" - "{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}" + "{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}" "Concluído" "Limpando armazenamento compartilhado…" "Compartilhar" @@ -1854,14 +1855,14 @@ "Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas." "Ativar a Economia de dados?" "Ativar" - "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" - "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" - "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}" - "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" - "{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}" - "{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}" - "{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}" - "{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}" + "{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}" + "{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}" + "{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}" + "{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}" + "{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}" + "{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}" + "{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}" + "{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}" "Até %1$s" "Até às %1$s" "Até %1$s (próximo alarme)" @@ -1990,7 +1991,7 @@ "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" "Sem sugestões de preenchimento automático" - "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}" + "{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}" "Salvar em ""%1$s""?" "Salvar %1$s em ""%2$s""?" "Salvar %1$s e %2$s em ""%3$s""?" @@ -2100,7 +2101,7 @@ "Apresentação em %1$s" "O Bluetooth permanecerá ativado no modo avião" "Carregando" - "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}" + "{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}" "Não há sugestões de pessoas para compartilhar" "Lista de apps" "Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB." diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 150c0dc04c30..0db3ffac08f6 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -960,7 +960,7 @@ "Pentru a debloca, conectați-vă folosind Contul Google." "Nume de utilizator (e-mail)" "Parolă" - "Conectați-vă" + "Conectează-te" "Nume de utilizator sau parolă nevalide." "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică..." @@ -1649,7 +1649,7 @@ "Pentru a debloca, conectați-vă cu Contul dvs. Google." "Nume de utilizator (e-mail)" "Parolă" - "Conectați-vă" + "Conectează-te" "Nume de utilizator sau parolă nevalide." "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică contul…" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index ab1b5915cad6..d6d5816d61dc 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1421,7 +1421,7 @@ "Извлечь" "Обзор" "Сменить устройство вывода" - "%s не найден" + "Устройство \"%s\" не найдено" "Подключите накопитель снова." "Перенос приложения %s" "Перенос данных" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index b9b4fd4def04..01231bb4afaf 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -242,7 +242,7 @@ "Telefonalternativ" "Skärmlås" "Stäng av" - "Strömbrytare" + "Av/på" "Starta om" "Nödsituation" "Felrapport" @@ -1242,11 +1242,11 @@ "Appar startas." "Uppgraderingen är klar." "Vill du fortsätta med konfigureringen?" - "Du tryckte på strömbrytaren, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt när du konfigurerar fingeravtrycket." + "Du tryckte på av/på-knappen, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt när du konfigurerar fingeravtrycket." "Stäng av skärmen" "Fortsätt konfigurera" "Vill du verifiera ditt fingeravtryck?" - "Du tryckte på strömbrytaren, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt för att verifiera ditt fingeravtryck." + "Du tryckte på av/på-knappen, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt för att verifiera ditt fingeravtryck." "Stäng av skärmen" "Fortsätt" "%1$s körs" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index d9684ecc51d7..d64b7e6d9c54 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1397,7 +1397,7 @@ "Gusa ili uweke mipangilio" "Chagua ili uweke mipangilio" "Huenda ukahitaji kubadilisha mipangilio ya kifaa. Gusa ili uondoe." - "Kwa ajili ya kuhamisha picha na maudhui" + "Ya kuhamisha picha na maudhui" "Vinjari faili za maudhui" "Tatizo limetokea kwenye %s" "%s haifanyi kazi" @@ -1560,7 +1560,7 @@ "%1$s, %2$s, %3$s" "Hifadhi ya ndani ya pamoja" "Kadi ya SD" - "Kadi ya SD iliyotengenezwa na %s" + "Kadi ya SD ya %s" "Hifadhi ya USB" "Hifadhi ya USB iliyotengenezwa na %s" "Hifadhi ya USB" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index b0576b856b34..947b3acfc52a 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1419,7 +1419,7 @@ "นำอุปกรณ์ออก" "สำรวจ" "เปลี่ยนเอาต์พุต" - "ไม่มี %s" + "ไม่มี%s" "ใส่อุปกรณ์อีกครั้ง" "กำลังย้าย %s" "กำลังย้ายข้อมูล" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 17085e72f30c..5179d3eaa40d 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1420,7 +1420,7 @@ "I-explore" "Ilipat ang output" "Nawawala ang %s" - "Ikabit muli ang device" + "Ikabit ulit ang device" "Inililipat ang %s" "Naglilipat ng data" "Tapos na ang paglipat ng content" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 0bee062367f4..6cc8774a0f50 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1588,7 +1588,7 @@ "Geçerlilik:" "Yayınlanma tarihi:" "Sona erme tarihi:" - "Seri numara:" + "Seri numarası:" "Parmak izleri:" "SHA-256 parmak izi:" "SHA-1 parmak izi:" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 2d814a1422f5..f3dcadd12730 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1417,10 +1417,10 @@ "Chiqarib olinmasin" "Sozlash" "Chiqarish" - "O‘rganish" + "Ochish" "Audio chiqishni almashtirish" "%s topilmadi" - "Qurilmani yana ulang" + "Qurilmani qayta ulang" "%s ko‘chirib o‘tkazilmoqda" "Ma’lumotlar ko‘chirilmoqda" "Kontent ko‘chirildi" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index ce47bc509826..bbbedfab23de 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1397,7 +1397,7 @@ "Hãy nhấn để thiết lập" "Chọn để thiết lập" "Bạn có thể phải định dạng lại thiết bị. Nhấn để ngắt kết nối." - "Để chuyển ảnh và phương tiện" + "Để truyền ảnh và nội dung nghe nhìn" "Duyệt xem các tệp nội dung nghe nhìn" "Vấn đề với %s" "%s không hoạt động" @@ -1416,7 +1416,7 @@ "Đang ngắt kết nối %s" "Không tháo" "Thiết lập" - "Tháo" + "Ngắt kết nối" "Khám phá" "Chuyển đổi đầu ra" "%s bị thiếu" -- cgit v1.2.3 From 47b77e3949857faba7cde2c9d04ba5bcceb80dc4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 09:38:16 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I92575f5ee9729c214b2c01f8fadbb453eae64ceb --- packages/BackupRestoreConfirmation/res/values-or/strings.xml | 2 +- packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/BackupRestoreConfirmation/res/values-or/strings.xml b/packages/BackupRestoreConfirmation/res/values-or/strings.xml index 1c54569d6837..cb610921d93d 100644 --- a/packages/BackupRestoreConfirmation/res/values-or/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-or/strings.xml @@ -20,7 +20,7 @@ "ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍‌" "ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍‌ କମ୍ପ୍ୟୁଟର୍‌କୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍‌ କରିବାକୁ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହିପରି କରିବାକୁ ଚାହିଁବେ?\n\nଯଦି ଆପଣ ନିଜେ ବ୍ୟାକଅପ୍‌ର ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହି କାମକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ।" "ମୋ ଡାଟାର ବ୍ୟାକଅପ୍‌ ନିଆଯାଉ" - "ବ୍ୟାକଅପ୍‌ ନିଆନଯାଉ" + "ବେକଅପ ନିଅନ୍ତୁ ନାହିଁ" "ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍‌ କମ୍ପ୍ୟୁଟର୍‌ରୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍‌ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହାକୁ ଅନୁମତି ଦେବାକୁ ଚାହିଁବେ କି?\n\nଯଦି ଆପଣ ନିଜେ ରିଷ୍ଟୋର୍‌ ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହା କାର୍ଯ୍ୟକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ। ଏହା ବର୍ତ୍ତମାନ ଡିଭାଇସ୍‍ରେ ଥିବା ଯେକୌଣସି ଡାଟାକୁ ବଦଳାଇଦେବ!" "ମୋ ଡାଟାକୁ ରିଷ୍ଟୋର୍‌ କରାଯାଉ" "ରିଷ୍ଟୋର୍‍ କରନ୍ତୁ ନାହିଁ।" diff --git a/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml b/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml index a1e61676402a..1f6be8329d4c 100644 --- a/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml @@ -20,7 +20,7 @@ "Restauro completo" "Foi solicitada uma cópia de segurança completa de todos os dados para um computador. Permitir esta operação?\n\nCaso não tenha solicitado a cópia de segurança, não permita que a operação prossiga." "Fazer cópia de seg. dos dados" - "Não efetuar cópia de seg." + "Não fazer cópia de seg." "Foi solicitado um restauro completo de todos os dados a partir de um computador. Permitir esta operação?\n\nCaso não tenha solicitado o restauro, não permita que a operação prossiga. Isto substituirá os dados existentes no equipamento!" "Restaurar os meus dados" "Não restaurar" -- cgit v1.2.3 From ff2ad8753c8667518a30db15a442b9b43c8d60a4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 11:08:24 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2bf3a51577bc0f9744e7fdad9cbbe7652a575b7b --- packages/InputDevices/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml index 55fc5bfb6152..c3291a0d0a44 100644 --- a/packages/InputDevices/res/values-hi/strings.xml +++ b/packages/InputDevices/res/values-hi/strings.xml @@ -35,7 +35,7 @@ "पुर्तगाली" "स्लोवाक" "स्लोवेनियाई" - "तुर्की" + "तुर्किये" "Turkish F" "यूक्रेनियाई" "अरबी" -- cgit v1.2.3 From 6bfb88c91e40d93581ed8c6ecdccb8369f705bac Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 11:09:41 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iebd1cfeb43970bfdcdcba2d16b9e2c03f02a7636 --- packages/InputDevices/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml index 55fc5bfb6152..c3291a0d0a44 100644 --- a/packages/InputDevices/res/values-hi/strings.xml +++ b/packages/InputDevices/res/values-hi/strings.xml @@ -35,7 +35,7 @@ "पुर्तगाली" "स्लोवाक" "स्लोवेनियाई" - "तुर्की" + "तुर्किये" "Turkish F" "यूक्रेनियाई" "अरबी" -- cgit v1.2.3 From 1d2b48e66e8b599865fe32c16d0c02d4a6882852 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 11:39:09 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I196c4664f94dc647d3cd2db93afe7f29dc0e3320 --- packages/PrintSpooler/res/values-am/strings.xml | 2 +- packages/PrintSpooler/res/values-es-rUS/strings.xml | 2 ++ packages/PrintSpooler/res/values-es/strings.xml | 2 ++ packages/PrintSpooler/res/values-fr-rCA/strings.xml | 2 ++ packages/PrintSpooler/res/values-fr/strings.xml | 2 ++ packages/PrintSpooler/res/values-it/strings.xml | 2 ++ packages/PrintSpooler/res/values-pt-rBR/strings.xml | 2 ++ packages/PrintSpooler/res/values-pt-rPT/strings.xml | 2 ++ packages/PrintSpooler/res/values-pt/strings.xml | 2 ++ 9 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 832b8551f5d6..c1cec384be33 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -41,7 +41,7 @@ "%1$d/%2$d" "ገጽ %1$d%2$d" "ማጠቃለያ፣ ቅጂዎች %1$s፣ የወረቀት መጠን %2$s" - "እጀታን ወደ ውጪ ላክ" + "እጀታን ወደ ውጭ ላክ" "እጀታን ሰብስብ" "አትም" "ወደ ፔዲኤፍ አስቀምጥ" diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 441ae73877c0..90c1937a2891 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -56,6 +56,7 @@ "Seleccionar impresora" "No recordar impresora" + %1$s printers found Se encontraron %1$s impresoras. Se encontró %1$s impresora. @@ -76,6 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" + Install to discover %1$s printers Instala para ver %1$s impresoras Instala para ver %1$s impresora diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index c1ff28207ac3..18e56dbcd6fc 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -56,6 +56,7 @@ "Seleccionar impresora" "Olvidar impresora" + %1$s printers found Se han encontrado %1$s impresoras Se ha encontrado %1$s impresora @@ -76,6 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" + Install to discover %1$s printers Instalar para descubrir %1$s impresoras Instalar para descubrir %1$s impresora diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index 3b7775a97dde..082c148746a3 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -57,6 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée + %1$s printers found %1$s imprimante trouvées "%1$s - %2$s" @@ -77,6 +78,7 @@ "Tous les services" Installer pour détecter %1$s imprimante + Install to discover %1$s printers Installer pour détecter %1$s imprimantes "Impression de %1$s en cours…" diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index f6e901de8393..560c5dcfe924 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -57,6 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée + %1$s printers found %1$s imprimantes trouvées "%1$s%2$s" @@ -77,6 +78,7 @@ "Tous les services" Installer pour détecter %1$s imprimante + Install to discover %1$s printers Installer pour détecter %1$s imprimantes "Impression de \"%1$s\" en cours…" diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 96751ea12081..569bbc2ef045 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -56,6 +56,7 @@ "Seleziona stampante" "Elimina stampante" + %1$s printers found %1$s stampanti trovate %1$s stampante trovata @@ -76,6 +77,7 @@ "Servizi disattivati" "Tutti i servizi" + Install to discover %1$s printers Installa per rilevare %1$s stampanti Installa per rilevare %1$s stampante diff --git a/packages/PrintSpooler/res/values-pt-rBR/strings.xml b/packages/PrintSpooler/res/values-pt-rBR/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -57,6 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas + %1$s printers found %1$s impressoras encontradas "%1$s - %2$s" @@ -77,6 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras + Install to discover %1$s printers Instale para encontrar %1$s impressoras "Imprimindo %1$s" diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index 4517efe0934a..8c1087e463a0 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -56,6 +56,7 @@ "Selecionar impressora" "Esquecer impressora" + %1$s printers found %1$s impressoras encontradas %1$s impressora encontrada @@ -76,6 +77,7 @@ "Serviços desativados" "Todos os serviços" + Install to discover %1$s printers Instale para detetar %1$s impressoras Instale para detetar %1$s impressora diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -57,6 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas + %1$s printers found %1$s impressoras encontradas "%1$s - %2$s" @@ -77,6 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras + Install to discover %1$s printers Instale para encontrar %1$s impressoras "Imprimindo %1$s" -- cgit v1.2.3 From 259bd30617d3df34640cd4069572954a15587a42 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 11:53:21 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I32d09335e11a2f90e239e763ab72272b47667299 --- packages/Shell/res/values-nb/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/Shell/res/values-nb/strings.xml b/packages/Shell/res/values-nb/strings.xml index 625b15a0101a..ce3938581b7f 100644 --- a/packages/Shell/res/values-nb/strings.xml +++ b/packages/Shell/res/values-nb/strings.xml @@ -18,8 +18,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Kommandoliste" "Feilrapporter" - "Feilrapporten #%d blir generert" - "Feilrapporten #%d er fullført" + "Feilrapport #%d blir generert" + "Feilrapport #%d er fullført" "Legger til detaljer i feilrapporten" "Vent litt" "Feilrapporten vises snart på telefonen" @@ -38,7 +38,7 @@ "Skjermdump" "Skjermdumpen er tatt." "Skjermdumpen kunne ikke tas." - "Detaljer om feilrapporten #%d" + "Detaljer om feilrapport #%d" "Filnavn" "Navn på feil" "Oppsummering av feil" -- cgit v1.2.3 From 679847aae9c142236c42903ca0336a8c4f3f1855 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 12:01:18 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2aa3590dc4ec69eece226b44fe0a24948f05e9ab --- packages/SystemUI/res-keyguard/values-es-rUS/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-es/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-fr/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-it/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt/strings.xml | 6 +++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index d9adc7c980da..1246b430ae66 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -53,7 +53,7 @@ "Patrón incorrecto" "Contraseña incorrecta" "PIN incorrecto" - "{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}" + "{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}" "Ingresa el PIN de la tarjeta SIM." "Ingresa el PIN de la tarjeta SIM de \"%1$s\"." "%1$s Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil." @@ -69,11 +69,13 @@ "Dibujaste tu patrón de desbloqueo %1$d veces de manera incorrecta. \n\nVuelve a intentarlo en %2$d segundos." "El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con tu proveedor para desbloquear el dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. El código PIN de la tarjeta SIM es incorrecto. Te quedan %d intentos más. El código PIN de la tarjeta SIM es incorrecto. Te queda %d intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo. "La tarjeta SIM no se puede usar. Comunícate con tu proveedor." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. El código PUK de la tarjeta SIM es incorrecto. Tienes %d intentos más antes de que la tarjeta SIM quede inutilizable de manera permanente. El código PUK de la tarjeta SIM es incorrecto. Tienes %d intento antes de que la tarjeta SIM quede inutilizable de manera permanente. @@ -92,10 +94,12 @@ "No se reconoció" "Para usar Desbloqueo facial, activa el ""Acceso a la cámara"" en Configuración y privacidad" + Enter SIM PIN. You have %d remaining attempts. Ingresa el PIN de la SIM. Quedan %d intentos más. Ingresa el PIN de la SIM. Queda %d intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan %d intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda %d intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 84016da04a75..4f61f3f1a6d2 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -53,7 +53,7 @@ "Patrón incorrecto" "Contraseña incorrecta" "PIN incorrecto" - "{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}" + "{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}" "Introduce el PIN de la tarjeta SIM." "Introduce el PIN de la tarjeta SIM de %1$s." "%1$s Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil." @@ -69,11 +69,13 @@ "Has fallado %1$d veces al dibujar el patrón de desbloqueo. \n\nVuelve a intentarlo dentro de %2$d segundos." "El código PIN de la tarjeta SIM es incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. El código PIN de la tarjeta SIM es incorrecto. Quedan %d intentos. El código PIN de la tarjeta SIM es incorrecto. Queda %d intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo. "La tarjeta SIM no se puede utilizar. Ponte en contacto con tu operador." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. El código PUK de la tarjeta SIM es incorrecto. Quedan %d intentos paraa que la tarjeta SIM no se pueda utilizar de forma permanente. El código PUK de la tarjeta SIM es incorrecto. Queda %d intento para que la tarjeta SIM no se pueda utilizar de forma permanente. @@ -92,10 +94,12 @@ "No se reconoce" "Para usar Desbloqueo Facial, habilita el ""acceso a la cámara"" en Ajustes y privacidad" + Enter SIM PIN. You have %d remaining attempts. Introduce el PIN de la tarjeta SIM. Te quedan %d intentos. Introduce el PIN de la tarjeta SIM. Te queda %d intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan %d intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda %d intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index da81aa3ee965..bfc8991ea6fb 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -53,7 +53,7 @@ "Schéma incorrect" "Mot de passe incorrect" "NIP incorrect" - "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}" + "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}" "Entrez le NIP de la carte SIM." "Entrez le NIP de la carte SIM pour « %1$s »." "%1$s Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire." @@ -70,11 +70,13 @@ "NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil." Le NIP de la carte SIM incorrect. Il vous reste %d tentative. + Incorrect SIM PIN code, you have %d remaining attempts. Le NIP de la carte SIM incorrect. Il vous reste %d tentatives. "La carte SIM est inutilisable. Communiquez avec votre fournisseur de services." Le code PUK de la carte SIM est incorrect. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Le code PUK de la carte SIM est incorrect. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. "Le déverrouillage par NIP de la carte SIM a échoué." @@ -93,10 +95,12 @@ "Pour utiliser le déverrouillage par reconnaissance faciale, activez l\'""accès à l\'appareil photo"" dans Paramètres > Confidentialité" Entrez le NIP de votre carte SIM. Il vous reste %d tentative. + Enter SIM PIN. You have %d remaining attempts. Entrez le NIP de votre carte SIM. Il vous reste %d tentatives. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. "Par défaut" diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index e1cde72a0239..b9de6ff2c84a 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -53,7 +53,7 @@ "Schéma incorrect" "Mot de passe incorrect" "Code incorrect" - "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}" + "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}" "Saisissez le code PIN de la carte SIM." "Saisissez le code PIN de la carte SIM \"%1$s\"." "%1$s Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile." @@ -70,11 +70,13 @@ "Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil." Code PIN de la carte SIM incorrect. Il vous reste %d tentative. + Incorrect SIM PIN code, you have %d remaining attempts. Code PIN de la carte SIM incorrect. Il vous reste %d tentatives. "La carte SIM est inutilisable. Contactez votre opérateur." Clé PUK de la carte SIM incorrecte. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Clé PUK de la carte SIM incorrecte. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. "Échec du déverrouillage à l\'aide du code PIN de la carte SIM." @@ -93,10 +95,12 @@ "Pour utiliser le déverrouillage par reconnaissance faciale, activez ""Accès à l\'appareil photo"" dans Paramètres > Confidentialité" Saisissez le code de la carte SIM. %d tentative restante. + Enter SIM PIN. You have %d remaining attempts. Saisissez le code de la carte SIM. %d tentatives restantes. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. "Par défaut" diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index f912a28d0342..bbfb0b51294e 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -53,7 +53,7 @@ "Sequenza errata" "Password errata" "PIN errato" - "{count,plural, =1{Riprova fra # secondo.}other{Riprova fra # secondi.}}" + "{count,plural, =1{Riprova fra # secondo.}many{Riprova fra # secondi.}other{Riprova fra # secondi.}}" "Inserisci il PIN della SIM." "Inserisci il PIN della SIM \"%1$s\"." "%1$s Disattiva la eSIM per usare il dispositivo senza servizio dati mobile." @@ -69,11 +69,13 @@ "%1$d tentativi errati di inserimento della sequenza di sblocco. \n\nRiprova tra %2$d secondi." "Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. Codice PIN della SIM errato. Hai ancora %d tentativi a disposizione. Codice PIN della SIM errato. Hai ancora %d tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo. "SIM inutilizzabile. Contatta il tuo operatore." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Codice PUK della SIM errato. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Codice PUK della SIM errato. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. @@ -92,10 +94,12 @@ "Non riconosciuto" "Per utilizzare lo sblocco con il volto, attiva ""l\'accesso alla fotocamera"" in Impostazioni > Privacy" + Enter SIM PIN. You have %d remaining attempts. Inserisci il codice PIN della SIM. Hai ancora %d tentativi a disposizione. Inserisci il codice PIN della SIM. Hai ancora %d tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index aecc5f205a5b..6bf242e6a813 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto" "Senha incorreta" "PIN incorreto" - "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}" + "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}" "Informe o PIN do chip." "Informe o PIN do chip para \"%1$s\"." "%1$s Desative o eSIM para usar o dispositivo sem serviço móvel." @@ -70,11 +70,13 @@ "Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo." Código PIN do chip incorreto. Tentativas restantes: %d. + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do chip incorreto. Tentativas restantes: %d. "O chip não pode ser utilizado. Entre em contato com a operadora." Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. "Falha na operação de PIN do chip." @@ -93,10 +95,12 @@ "Para usar o Desbloqueio facial, ative o ""acesso à câmera"" em Configurações > Privacidade" Informe o PIN do chip. Você tem %d tentativa restante. + Enter SIM PIN. You have %d remaining attempts. Informe o PIN do chip. Você tem %d tentativas restantes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. "Padrão" diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index a8d8f349ca1e..8851067b946b 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto." "Palavra-passe incorreta." "PIN incorreto" - "{count,plural, =1{Tente novamente dentro de # segundo.}other{Tente novamente dentro de # segundos.}}" + "{count,plural, =1{Tente novamente dentro de # segundo.}many{Tente novamente dentro de # segundos.}other{Tente novamente dentro de # segundos.}}" "Introduza o PIN do cartão SIM." "Introduza o PIN do cartão SIM \"%1$s\"." "%1$s Desative o eSIM para utilizar o dispositivo sem serviço móvel." @@ -69,11 +69,13 @@ "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do cartão SIM incorreto. Tem mais %d tentativas. Código PIN do cartão SIM incorreto. Tem mais %d tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo. "Cartão SIM inutilizável. Contacte o seu operador." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do cartão SIM incorreto. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Código PUK do cartão SIM incorreto. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. @@ -92,10 +94,12 @@ "Não reconhecido." "Para utilizar o Desbloqueio facial, ative o ""Acesso à câmara"" em Definições > Privacidade" + Enter SIM PIN. You have %d remaining attempts. Introduza o PIN do cartão SIM. Tem mais %d tentativas. Introduza o PIN do cartão SIM. Tem mais %d tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index aecc5f205a5b..6bf242e6a813 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto" "Senha incorreta" "PIN incorreto" - "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}" + "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}" "Informe o PIN do chip." "Informe o PIN do chip para \"%1$s\"." "%1$s Desative o eSIM para usar o dispositivo sem serviço móvel." @@ -70,11 +70,13 @@ "Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo." Código PIN do chip incorreto. Tentativas restantes: %d. + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do chip incorreto. Tentativas restantes: %d. "O chip não pode ser utilizado. Entre em contato com a operadora." Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. "Falha na operação de PIN do chip." @@ -93,10 +95,12 @@ "Para usar o Desbloqueio facial, ative o ""acesso à câmera"" em Configurações > Privacidade" Informe o PIN do chip. Você tem %d tentativa restante. + Enter SIM PIN. You have %d remaining attempts. Informe o PIN do chip. Você tem %d tentativas restantes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. "Padrão" -- cgit v1.2.3 From f154164de116660e93c7bb019a2d081af0a153bb Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 12:18:55 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5a74c1908714b2303a0c2dcf4a234cd48339cd91 --- packages/SystemUI/res-keyguard/values-es-rUS/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-es/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-fr/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-it/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml | 6 +++++- packages/SystemUI/res-keyguard/values-pt/strings.xml | 6 +++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index d9adc7c980da..1246b430ae66 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -53,7 +53,7 @@ "Patrón incorrecto" "Contraseña incorrecta" "PIN incorrecto" - "{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}" + "{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}" "Ingresa el PIN de la tarjeta SIM." "Ingresa el PIN de la tarjeta SIM de \"%1$s\"." "%1$s Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil." @@ -69,11 +69,13 @@ "Dibujaste tu patrón de desbloqueo %1$d veces de manera incorrecta. \n\nVuelve a intentarlo en %2$d segundos." "El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con tu proveedor para desbloquear el dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. El código PIN de la tarjeta SIM es incorrecto. Te quedan %d intentos más. El código PIN de la tarjeta SIM es incorrecto. Te queda %d intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo. "La tarjeta SIM no se puede usar. Comunícate con tu proveedor." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. El código PUK de la tarjeta SIM es incorrecto. Tienes %d intentos más antes de que la tarjeta SIM quede inutilizable de manera permanente. El código PUK de la tarjeta SIM es incorrecto. Tienes %d intento antes de que la tarjeta SIM quede inutilizable de manera permanente. @@ -92,10 +94,12 @@ "No se reconoció" "Para usar Desbloqueo facial, activa el ""Acceso a la cámara"" en Configuración y privacidad" + Enter SIM PIN. You have %d remaining attempts. Ingresa el PIN de la SIM. Quedan %d intentos más. Ingresa el PIN de la SIM. Queda %d intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan %d intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda %d intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 84016da04a75..4f61f3f1a6d2 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -53,7 +53,7 @@ "Patrón incorrecto" "Contraseña incorrecta" "PIN incorrecto" - "{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}" + "{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}" "Introduce el PIN de la tarjeta SIM." "Introduce el PIN de la tarjeta SIM de %1$s." "%1$s Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil." @@ -69,11 +69,13 @@ "Has fallado %1$d veces al dibujar el patrón de desbloqueo. \n\nVuelve a intentarlo dentro de %2$d segundos." "El código PIN de la tarjeta SIM es incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. El código PIN de la tarjeta SIM es incorrecto. Quedan %d intentos. El código PIN de la tarjeta SIM es incorrecto. Queda %d intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo. "La tarjeta SIM no se puede utilizar. Ponte en contacto con tu operador." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. El código PUK de la tarjeta SIM es incorrecto. Quedan %d intentos paraa que la tarjeta SIM no se pueda utilizar de forma permanente. El código PUK de la tarjeta SIM es incorrecto. Queda %d intento para que la tarjeta SIM no se pueda utilizar de forma permanente. @@ -92,10 +94,12 @@ "No se reconoce" "Para usar Desbloqueo Facial, habilita el ""acceso a la cámara"" en Ajustes y privacidad" + Enter SIM PIN. You have %d remaining attempts. Introduce el PIN de la tarjeta SIM. Te quedan %d intentos. Introduce el PIN de la tarjeta SIM. Te queda %d intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan %d intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda %d intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index da81aa3ee965..bfc8991ea6fb 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -53,7 +53,7 @@ "Schéma incorrect" "Mot de passe incorrect" "NIP incorrect" - "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}" + "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}" "Entrez le NIP de la carte SIM." "Entrez le NIP de la carte SIM pour « %1$s »." "%1$s Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire." @@ -70,11 +70,13 @@ "NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil." Le NIP de la carte SIM incorrect. Il vous reste %d tentative. + Incorrect SIM PIN code, you have %d remaining attempts. Le NIP de la carte SIM incorrect. Il vous reste %d tentatives. "La carte SIM est inutilisable. Communiquez avec votre fournisseur de services." Le code PUK de la carte SIM est incorrect. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Le code PUK de la carte SIM est incorrect. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. "Le déverrouillage par NIP de la carte SIM a échoué." @@ -93,10 +95,12 @@ "Pour utiliser le déverrouillage par reconnaissance faciale, activez l\'""accès à l\'appareil photo"" dans Paramètres > Confidentialité" Entrez le NIP de votre carte SIM. Il vous reste %d tentative. + Enter SIM PIN. You have %d remaining attempts. Entrez le NIP de votre carte SIM. Il vous reste %d tentatives. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. "Par défaut" diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index e1cde72a0239..b9de6ff2c84a 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -53,7 +53,7 @@ "Schéma incorrect" "Mot de passe incorrect" "Code incorrect" - "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}" + "{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}" "Saisissez le code PIN de la carte SIM." "Saisissez le code PIN de la carte SIM \"%1$s\"." "%1$s Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile." @@ -70,11 +70,13 @@ "Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil." Code PIN de la carte SIM incorrect. Il vous reste %d tentative. + Incorrect SIM PIN code, you have %d remaining attempts. Code PIN de la carte SIM incorrect. Il vous reste %d tentatives. "La carte SIM est inutilisable. Contactez votre opérateur." Clé PUK de la carte SIM incorrecte. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Clé PUK de la carte SIM incorrecte. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. "Échec du déverrouillage à l\'aide du code PIN de la carte SIM." @@ -93,10 +95,12 @@ "Pour utiliser le déverrouillage par reconnaissance faciale, activez ""Accès à l\'appareil photo"" dans Paramètres > Confidentialité" Saisissez le code de la carte SIM. %d tentative restante. + Enter SIM PIN. You have %d remaining attempts. Saisissez le code de la carte SIM. %d tentatives restantes. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. "Par défaut" diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index f912a28d0342..bbfb0b51294e 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -53,7 +53,7 @@ "Sequenza errata" "Password errata" "PIN errato" - "{count,plural, =1{Riprova fra # secondo.}other{Riprova fra # secondi.}}" + "{count,plural, =1{Riprova fra # secondo.}many{Riprova fra # secondi.}other{Riprova fra # secondi.}}" "Inserisci il PIN della SIM." "Inserisci il PIN della SIM \"%1$s\"." "%1$s Disattiva la eSIM per usare il dispositivo senza servizio dati mobile." @@ -69,11 +69,13 @@ "%1$d tentativi errati di inserimento della sequenza di sblocco. \n\nRiprova tra %2$d secondi." "Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. Codice PIN della SIM errato. Hai ancora %d tentativi a disposizione. Codice PIN della SIM errato. Hai ancora %d tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo. "SIM inutilizzabile. Contatta il tuo operatore." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Codice PUK della SIM errato. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Codice PUK della SIM errato. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. @@ -92,10 +94,12 @@ "Non riconosciuto" "Per utilizzare lo sblocco con il volto, attiva ""l\'accesso alla fotocamera"" in Impostazioni > Privacy" + Enter SIM PIN. You have %d remaining attempts. Inserisci il codice PIN della SIM. Hai ancora %d tentativi a disposizione. Inserisci il codice PIN della SIM. Hai ancora %d tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index aecc5f205a5b..6bf242e6a813 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto" "Senha incorreta" "PIN incorreto" - "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}" + "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}" "Informe o PIN do chip." "Informe o PIN do chip para \"%1$s\"." "%1$s Desative o eSIM para usar o dispositivo sem serviço móvel." @@ -70,11 +70,13 @@ "Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo." Código PIN do chip incorreto. Tentativas restantes: %d. + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do chip incorreto. Tentativas restantes: %d. "O chip não pode ser utilizado. Entre em contato com a operadora." Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. "Falha na operação de PIN do chip." @@ -93,10 +95,12 @@ "Para usar o Desbloqueio facial, ative o ""acesso à câmera"" em Configurações > Privacidade" Informe o PIN do chip. Você tem %d tentativa restante. + Enter SIM PIN. You have %d remaining attempts. Informe o PIN do chip. Você tem %d tentativas restantes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. "Padrão" diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index a8d8f349ca1e..8851067b946b 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto." "Palavra-passe incorreta." "PIN incorreto" - "{count,plural, =1{Tente novamente dentro de # segundo.}other{Tente novamente dentro de # segundos.}}" + "{count,plural, =1{Tente novamente dentro de # segundo.}many{Tente novamente dentro de # segundos.}other{Tente novamente dentro de # segundos.}}" "Introduza o PIN do cartão SIM." "Introduza o PIN do cartão SIM \"%1$s\"." "%1$s Desative o eSIM para utilizar o dispositivo sem serviço móvel." @@ -69,11 +69,13 @@ "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo." + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do cartão SIM incorreto. Tem mais %d tentativas. Código PIN do cartão SIM incorreto. Tem mais %d tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo. "Cartão SIM inutilizável. Contacte o seu operador." + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do cartão SIM incorreto. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Código PUK do cartão SIM incorreto. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. @@ -92,10 +94,12 @@ "Não reconhecido." "Para utilizar o Desbloqueio facial, ative o ""Acesso à câmara"" em Definições > Privacidade" + Enter SIM PIN. You have %d remaining attempts. Introduza o PIN do cartão SIM. Tem mais %d tentativas. Introduza o PIN do cartão SIM. Tem mais %d tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index aecc5f205a5b..6bf242e6a813 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -53,7 +53,7 @@ "Padrão incorreto" "Senha incorreta" "PIN incorreto" - "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}" + "{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}" "Informe o PIN do chip." "Informe o PIN do chip para \"%1$s\"." "%1$s Desative o eSIM para usar o dispositivo sem serviço móvel." @@ -70,11 +70,13 @@ "Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo." Código PIN do chip incorreto. Tentativas restantes: %d. + Incorrect SIM PIN code, you have %d remaining attempts. Código PIN do chip incorreto. Tentativas restantes: %d. "O chip não pode ser utilizado. Entre em contato com a operadora." Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. + Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. Código PUK do chip incorreto. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip se tornará permanentemente inutilizável. "Falha na operação de PIN do chip." @@ -93,10 +95,12 @@ "Para usar o Desbloqueio facial, ative o ""acesso à câmera"" em Configurações > Privacidade" Informe o PIN do chip. Você tem %d tentativa restante. + Enter SIM PIN. You have %d remaining attempts. Informe o PIN do chip. Você tem %d tentativas restantes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. "Padrão" -- cgit v1.2.3 From 09b3489907203e407eae502dbda8a34d39c9440d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 15:56:44 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I09f5e396a86fa492fe964a8ea3911e80c79d7110 --- packages/SettingsLib/res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 6af38bbf7159..ba504f309a0f 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -595,7 +595,7 @@ "கெஸ்ட் அமர்வை மீட்டமை" "கெஸ்ட்டை மீட்டமைக்கவா?" "கெஸ்ட் பயனரை அகற்றவா?" - "மீட்டமை" + "ரீசெட்" "அகற்று" "கெஸ்ட்டை மீட்டமைக்கிறது…" "படமெடுங்கள்" -- cgit v1.2.3 From 58506c51d344c937d25d6bd4b4bb1dafe92f59bd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 15:59:09 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iece94f22fc300eed3cd11d137a0c32943336ef43 --- packages/SettingsLib/res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 6af38bbf7159..ba504f309a0f 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -595,7 +595,7 @@ "கெஸ்ட் அமர்வை மீட்டமை" "கெஸ்ட்டை மீட்டமைக்கவா?" "கெஸ்ட் பயனரை அகற்றவா?" - "மீட்டமை" + "ரீசெட்" "அகற்று" "கெஸ்ட்டை மீட்டமைக்கிறது…" "படமெடுங்கள்" -- cgit v1.2.3 From 78b25a9f844c3334d89ea8d9ce323e7230bf86f2 Mon Sep 17 00:00:00 2001 From: Sam Delmerico Date: Tue, 26 Apr 2022 18:33:10 +0000 Subject: disable usage of plugins as static libs Test: m intdef-annotation-processor-test Test: atest intdef-annotation-processor-test Test: m view-inspector-annotation-processor-test Test: atest view-inspector-annotation-processor-test Bug: 225388628 Bug: 244779180 Change-Id: I70ea1510a886998f07ef2b002895b6905b81c0eb Merged-In: I70ea1510a886998f07ef2b002895b6905b81c0eb --- tools/processors/intdef_mappings/Android.bp | 22 ++++++++++++++-------- tools/processors/view_inspector/Android.bp | 18 +++++++++++++----- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/tools/processors/intdef_mappings/Android.bp b/tools/processors/intdef_mappings/Android.bp index 82a5dac21160..7059c52ddc76 100644 --- a/tools/processors/intdef_mappings/Android.bp +++ b/tools/processors/intdef_mappings/Android.bp @@ -7,27 +7,33 @@ package { default_applicable_licenses: ["frameworks_base_license"], } -java_plugin { - name: "intdef-annotation-processor", - - processor_class: "android.processor.IntDefProcessor", +java_library_host { + name: "libintdef-annotation-processor", srcs: [ ":framework-annotations", "src/**/*.java", - "src/**/*.kt" + "src/**/*.kt", ], use_tools_jar: true, } +java_plugin { + name: "intdef-annotation-processor", + + processor_class: "android.processor.IntDefProcessor", + + static_libs: ["libintdef-annotation-processor"], +} + java_test_host { name: "intdef-annotation-processor-test", srcs: [ "test/**/*.java", - "test/**/*.kt" - ], + "test/**/*.kt", + ], java_resource_dirs: ["test/resources"], static_libs: [ @@ -35,7 +41,7 @@ java_test_host { "truth-prebuilt", "junit", "guava", - "intdef-annotation-processor" + "libintdef-annotation-processor", ], test_suites: ["general-tests"], diff --git a/tools/processors/view_inspector/Android.bp b/tools/processors/view_inspector/Android.bp index ea9974f06a64..877a1d2b5fb3 100644 --- a/tools/processors/view_inspector/Android.bp +++ b/tools/processors/view_inspector/Android.bp @@ -7,10 +7,8 @@ package { default_applicable_licenses: ["frameworks_base_license"], } -java_plugin { - name: "view-inspector-annotation-processor", - - processor_class: "android.processor.view.inspector.PlatformInspectableProcessor", +java_library_host { + name: "libview-inspector-annotation-processor", srcs: ["src/java/**/*.java"], java_resource_dirs: ["src/resources"], @@ -23,6 +21,16 @@ java_plugin { use_tools_jar: true, } +java_plugin { + name: "view-inspector-annotation-processor", + + processor_class: "android.processor.view.inspector.PlatformInspectableProcessor", + + static_libs: [ + "libview-inspector-annotation-processor", + ], +} + java_test_host { name: "view-inspector-annotation-processor-test", @@ -32,7 +40,7 @@ java_test_host { static_libs: [ "junit", "guava", - "view-inspector-annotation-processor" + "libview-inspector-annotation-processor", ], test_suites: ["general-tests"], -- cgit v1.2.3 From 1c36dbb35ab55e76a21885cdde2c756d4a07a2cc Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Mon, 12 Sep 2022 16:03:27 +0000 Subject: Remove VibrationEffect javadocs to methods not available in public APIs. Change already landed in aosp/2214741. Need to land this fix in tm-dev for it to show up in the published reference docs. Change-Id: Idf5a339a5fb0ffd510e7fda0e3784916c8505eae Merged-In: Idf5a339a5fb0ffd510e7fda0e3784916c8505eae Bug: 245491186 Test: N/A --- core/java/android/os/VibrationEffect.java | 32 +------------------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index ec1c57d675c1..f7d4be3960f8 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -830,29 +830,8 @@ public abstract class VibrationEffect implements Parcelable { * .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 1.0f, 100) * .compose();} * - *

Composition elements can also be {@link VibrationEffect} instances, including other - * compositions, and off durations, which are periods of time when the vibrator will be - * turned off. Here is an example of a composition that "warms up" with a light tap, - * a stronger double tap, then repeats a vibration pattern indefinitely: - * - *

-     * {@code VibrationEffect repeatingEffect = VibrationEffect.startComposition()
-     *     .addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK)
-     *     .addOffDuration(Duration.ofMillis(10))
-     *     .addEffect(VibrationEffect.createPredefined(VibrationEffect.EFFECT_DOUBLE_CLICK))
-     *     .addOffDuration(Duration.ofMillis(50))
-     *     .addEffect(VibrationEffect.createWaveform(pattern, repeatIndex))
-     *     .compose();}
- * *

When choosing to play a composed effect, you should check that individual components are - * supported by the device by using the appropriate vibrator method: - * - *

+ * supported by the device by using {@link Vibrator#arePrimitivesSupported}. * * @see VibrationEffect#startComposition() */ @@ -1021,9 +1000,6 @@ public abstract class VibrationEffect implements Parcelable { * * @param primitiveId The primitive to add * @return This {@link Composition} object to enable adding multiple elements in one chain. - * - * @throws UnreachableAfterRepeatingIndefinitelyException if the composition is currently - * ending with a repeating effect. */ @NonNull public Composition addPrimitive(@PrimitiveType int primitiveId) { @@ -1038,9 +1014,6 @@ public abstract class VibrationEffect implements Parcelable { * @param primitiveId The primitive to add * @param scale The scale to apply to the intensity of the primitive. * @return This {@link Composition} object to enable adding multiple elements in one chain. - * - * @throws UnreachableAfterRepeatingIndefinitelyException if the composition is currently - * ending with a repeating effect. */ @NonNull public Composition addPrimitive(@PrimitiveType int primitiveId, @@ -1056,9 +1029,6 @@ public abstract class VibrationEffect implements Parcelable { * @param delay The amount of time in milliseconds to wait before playing this primitive, * starting at the time the previous element in this composition is finished. * @return This {@link Composition} object to enable adding multiple elements in one chain. - * - * @throws UnreachableAfterRepeatingIndefinitelyException if the composition is currently - * ending with a repeating effect. */ @NonNull public Composition addPrimitive(@PrimitiveType int primitiveId, -- cgit v1.2.3 From 3ac6aa1e4daeb646bdb40813e988d1013d72150c Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../core/java/com/android/server/pm/DeletePackageHelper.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index c3b479219853..0915c21dda59 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -657,6 +657,18 @@ final class DeletePackageHelper { final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + if (mPm.mProtectedPackages.isPackageDataProtected(userId, packageName)) { + mPm.mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + try { if (mPm.mInjector.getLocalService(ActivityTaskManagerInternal.class) .isBaseOfLockedTask(packageName)) { -- cgit v1.2.3 From 2e42c393f2d5521d20acd9281d411a0fbc6196c3 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5161b9f4614d..28f1d7900107 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -18348,6 +18348,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; synchronized (mPackages) { // Normalize package name to handle renamed packages and static libs -- cgit v1.2.3 From fcdc62081c934d35a55ff7e511590337cb4e277a Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1f7f0ee44959..93c83f7ad7cd 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -18181,6 +18181,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; synchronized (mLock) { // Normalize package name to handle renamed packages and static libs -- cgit v1.2.3 From 538654167ad1086e8e1f0ee11eca982c25e14164 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index adde1c63ccd6..26c6ee3152b9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -18207,6 +18207,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; try { -- cgit v1.2.3 From dba7ceb57ecdf9485bcfe8eb554510ccf9ad773c Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76c9c0031c43..9836679c1dee 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21229,6 +21229,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; try { -- cgit v1.2.3 From 2d6eae165b74dd52233b0a2fbde37875774dd9d0 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6249eca78ccb..a4542f61624e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21359,6 +21359,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; try { -- cgit v1.2.3 From cbda45eb956ec1f9105b45c5f995c1a15fba1c07 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 9 Sep 2022 14:50:31 -0700 Subject: [pm] forbid deletion of protected packages BUG: 242996180 Test: adb shell pm uninstall --user 0 com.google.android.apps.work.oobconfig Test: Verified with the command above. Before this CL, the package can be deleted. After this CL, the deletion will fail. Change-Id: Iba408e536b340ea5d66ab499442c0c4f828fa36f (cherry picked from commit 15f85c7fa97fe9faa540e6ad9e850990f46a5cca) Merged-In: Iba408e536b340ea5d66ab499442c0c4f828fa36f --- .../java/com/android/server/pm/PackageManagerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4c47ffd80db3..0397d3edd2b1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21354,6 +21354,20 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + + if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + + final String internalPackageName; try { -- cgit v1.2.3 From 87f37319bf7ee22c6e7c29432b6c9bbce0fdb591 Mon Sep 17 00:00:00 2001 From: Alex Johnston Date: Tue, 5 Oct 2021 11:44:37 +0000 Subject: Stop managed profile owner granting READ_SMS Reason: There is only one telephony stack shared between the personal and work profile. Bug: 194382185 Bug: 189942529 Test: build Change-Id: If0d27a317a7c0ee46af371b30208327e5636c7cf --- core/java/android/app/admin/DevicePolicyManager.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 0d650583af2c..c72234f8fea4 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -9655,6 +9655,15 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#M} the app-op matching the permission is set to * {@link android.app.AppOpsManager#MODE_IGNORED}, but the permission stays granted. * + * Control over the following permissions are restricted for managed profile owners: + *
    + *
  • Manifest.permission.READ_SMS
  • + *
+ *

+ * A managed profile owner may not grant these permissions (i.e. call this method with any of + * the permissions listed above and {@code grantState} of + * {@code #PERMISSION_GRANT_STATE_GRANTED}), but may deny them. + * * @param admin Which profile or device owner this request is associated with. * @param packageName The application to grant or revoke a permission to. * @param permission The permission to grant or revoke. -- cgit v1.2.3 From 7da08c6bd31584744e91eb6b3914166344ecae33 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Wed, 14 Sep 2022 16:10:04 +0800 Subject: [RESTRICT AUTOMERGE] Allow activity to be reparent while allowTaskReparenting is applied MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Any malicious application could hijack tasks by android:allowTaskReparenting. This vulnerability can perform UI spoofing or spying on user’s activities. This CL only allows activities to be reparent while android:allowTaskReparenting is applied and the affinity of activity is same with the target task. Bug: 240663194 Test: atest IntentTests Change-Id: I73abb9ec05af95bc14f887ae825a9ada9600f771 --- services/core/java/com/android/server/wm/ResetTargetTaskHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java index 32de699eaae9..bf206a3a6bff 100644 --- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java +++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java @@ -148,15 +148,16 @@ class ResetTargetTaskHelper { return false; } else { - mResultActivities.add(r); if (r.resultTo != null) { // If this activity is sending a reply to a previous activity, we can't do // anything with it now until we reach the start of the reply chain. // NOTE: that we are assuming the result is always to the previous activity, // which is almost always the case but we really shouldn't count on. + mResultActivities.add(r); return false; } else if (mTargetTaskFound && allowTaskReparenting && mTargetTask.affinity != null && mTargetTask.affinity.equals(r.taskAffinity)) { + mResultActivities.add(r); // This activity has an affinity for our task. Either remove it if we are // clearing or move it over to our task. Note that we currently punt on the case // where we are resetting a task that is not at the top but who has activities -- cgit v1.2.3 From 7af50c4d5f0354438872167b0e446930caca9deb Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Wed, 14 Sep 2022 17:32:53 +0800 Subject: [RESTRICT AUTOMERGE] Allow activity to be reparent while allowTaskReparenting is applied MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Any malicious application could hijack tasks by android:allowTaskReparenting. This vulnerability can perform UI spoofing or spying on user’s activities. This CL only allows activities to be reparent while android:allowTaskReparenting is applied and the affinity of activity is same with the target task. Bug: 240663194 Test: atest IntentTests Change-Id: I73abb9ec05af95bc14f887ae825a9ada9600f771 --- services/core/java/com/android/server/wm/ResetTargetTaskHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java index 2626b87b93e5..7e479679e1a2 100644 --- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java +++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java @@ -146,15 +146,16 @@ class ResetTargetTaskHelper { return false; } else { - mResultActivities.add(r); if (r.resultTo != null) { // If this activity is sending a reply to a previous activity, we can't do // anything with it now until we reach the start of the reply chain. // NOTE: that we are assuming the result is always to the previous activity, // which is almost always the case but we really shouldn't count on. + mResultActivities.add(r); return false; } else if (mTargetTaskFound && allowTaskReparenting && mTargetTask.affinity != null && mTargetTask.affinity.equals(r.taskAffinity)) { + mResultActivities.add(r); // This activity has an affinity for our task. Either remove it if we are // clearing or move it over to our task. Note that we currently punt on the case // where we are resetting a task that is not at the top but who has activities -- cgit v1.2.3 From a30148b8a40a36cababba1ff434d053cfd7dd6e3 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 18 Aug 2022 12:04:43 +0000 Subject: [DO NOT MERGE] Do not dismiss keyguard after SIM PUK unlock After PUK unlock, multiple calls to KeyguardSecurityContainerController#dismiss() were being called from the KeyguardSimPukViewController, which begins the transition to the next security screen, if any. At the same time, other parts of the system, also listening to SIM events, recognize the PUK unlock and call KeyguardSecurityContainer#showSecurityScreen, which updates which security method comes next. After boot, this should be one of PIN, Password, Pattern, assuming they have a security method. If one of the first dismiss() calls comes AFTER the security method changes, this is incorrectly recognized by the code as a successful PIN/pattern/password unlock. This causes the keyguard to be marked as done, causing screen flickers and incorrect system state. The solution: every call to dismiss() should include a new parameter for the security method used. If there is a difference between this parameter and the current value in KeyguardSecurityContainerCallback, ignore the request, as the system state has changed. Bug: 218500036 Test: atest KeyguardSecurityContainerTest Merged-In: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 Change-Id: I30226bc7b5eda9480d471b35fe81e106b0491ff8 --- .../android/keyguard/KeyguardAbsKeyInputView.java | 4 ++- .../src/com/android/keyguard/KeyguardHostView.java | 13 +++++---- .../src/com/android/keyguard/KeyguardPINView.java | 6 ++++ .../com/android/keyguard/KeyguardPasswordView.java | 6 ++++ .../com/android/keyguard/KeyguardPatternView.java | 3 +- .../android/keyguard/KeyguardSecurityCallback.java | 5 +++- .../keyguard/KeyguardSecurityContainer.java | 32 +++++++++++++++++----- .../com/android/keyguard/KeyguardSimPinView.java | 10 ++++++- .../com/android/keyguard/KeyguardSimPukView.java | 12 ++++++-- 9 files changed, 73 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 2ff7266baecf..7b40f77f53b4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -30,6 +30,7 @@ import android.view.KeyEvent; import android.view.View; import android.widget.LinearLayout; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternChecker; import com.android.internal.widget.LockPatternUtils; @@ -96,6 +97,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout protected abstract int getPasswordTextViewId(); protected abstract void resetState(); + protected abstract SecurityMode getSecurityMode(); @Override protected void onFinishInflate() { @@ -203,7 +205,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mDismissing = true; - mCallback.dismiss(true, userId); + mCallback.dismiss(true, userId, getSecurityMode()); } } else { if (isValidPassword) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java index 14ead0427478..331f188c21d8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java @@ -83,7 +83,7 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { // the user proved presence via some other way to the trust agent. Log.i(TAG, "TrustAgent dismissed Keyguard."); } - dismiss(false /* authenticated */, userId); + dismiss(false /* authenticated */, userId, SecurityMode.Invalid); } else { mViewMediatorCallback.playTrustedSound(); } @@ -187,12 +187,13 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { * @return True if the keyguard is done. */ public boolean dismiss(int targetUserId) { - return dismiss(false, targetUserId); + return dismiss(false, targetUserId, getCurrentSecurityMode()); } public boolean handleBackKey() { if (mSecurityContainer.getCurrentSecuritySelection() != SecurityMode.None) { - mSecurityContainer.dismiss(false, KeyguardUpdateMonitor.getCurrentUser()); + mSecurityContainer.dismiss(false, KeyguardUpdateMonitor.getCurrentUser(), + getCurrentSecurityMode()); return true; } return false; @@ -203,8 +204,10 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { } @Override - public boolean dismiss(boolean authenticated, int targetUserId) { - return mSecurityContainer.showNextSecurityScreenOrFinish(authenticated, targetUserId); + public boolean dismiss(boolean authenticated, int targetUserId, + SecurityMode expectedSecurityMode) { + return mSecurityContainer.showNextSecurityScreenOrFinish(authenticated, targetUserId, + expectedSecurityMode); } /** diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 6808c0f73998..cc98db8606d8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -22,6 +22,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; @@ -181,4 +182,9 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { public boolean hasOverlappingRendering() { return false; } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.PIN; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index 963921561f67..ff444d45ec2d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -37,6 +37,7 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.android.internal.widget.TextViewInputDisabler; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import java.util.List; /** @@ -393,4 +394,9 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView } return bytes; } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.Password; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index d8086da277f2..5f2adf6a7d2f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -39,6 +39,7 @@ import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternChecker; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternView; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.settingslib.animation.AppearAnimationCreator; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; @@ -345,7 +346,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); - mCallback.dismiss(true, userId); + mCallback.dismiss(true, userId, SecurityMode.Pattern); } } else { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index cbfbffbe50a4..4efb8b5ca238 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,14 +15,17 @@ */ package com.android.keyguard; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + public interface KeyguardSecurityCallback { /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId); + void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); /** * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 6cd971d25610..bf0263c79145 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -99,7 +99,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe // Used to notify the container when something interesting happens. public interface SecurityCallback { - public boolean dismiss(boolean authenticated, int targetUserId); + public boolean dismiss(boolean authenticated, int targetUserId, + SecurityMode expectedSecurityMode); public void userActivity(); public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput); @@ -473,10 +474,20 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe * @param authenticated true if the user entered the correct authentication * @param targetUserId a user that needs to be the foreground user at the finish (if called) * completion. + * @param expectedSecurityMode SecurityMode that is invoking this request. SecurityMode.Invalid + * indicates that no check should be done * @return true if keyguard is done */ - boolean showNextSecurityScreenOrFinish(boolean authenticated, int targetUserId) { + boolean showNextSecurityScreenOrFinish(boolean authenticated, int targetUserId, + SecurityMode expectedSecurityMode) { if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); + if (expectedSecurityMode != SecurityMode.Invalid + && expectedSecurityMode != getCurrentSecurityMode()) { + Log.w(TAG, "Attempted to invoke showNextSecurityScreenOrFinish with securityMode " + + expectedSecurityMode + ", but current mode is " + getCurrentSecurityMode()); + return false; + } + boolean finish = false; boolean strongAuth = false; int eventSubtype = -1; @@ -591,8 +602,13 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } } - public void dismiss(boolean authenticated, int targetId) { - mSecurityCallback.dismiss(authenticated, targetId); + /** + * Potentially dismiss the current security screen, after validating that all device + * security has been unlocked. Otherwise show the next screen. + */ + public void dismiss(boolean authenticated, int targetId, + SecurityMode expectedSecurityMode) { + mSecurityCallback.dismiss(authenticated, targetId, expectedSecurityMode); } public boolean isVerifyUnlockOnly() { @@ -633,7 +649,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe @Override public boolean isVerifyUnlockOnly() { return false; } @Override - public void dismiss(boolean securityVerified, int targetUserId) { } + public void dismiss(boolean securityVerified, int targetUserId, + SecurityMode expectedSecurityMode) { } @Override public void reset() {} }; @@ -683,8 +700,9 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe return mCurrentSecuritySelection; } - public void dismiss(boolean authenticated, int targetUserId) { - mCallback.dismiss(authenticated, targetUserId); + public void dismiss(boolean authenticated, int targetUserId, + SecurityMode expectedSecurityMode) { + mCallback.dismiss(authenticated, targetUserId, expectedSecurityMode); } public boolean needsInput() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index fb3a586677aa..014db40a51a4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -41,6 +41,8 @@ import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.PhoneConstants; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + /** * Displays a PIN pad for unlocking. @@ -342,7 +344,8 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPin); } } else { mShowDefaultMessage = false; @@ -390,5 +393,10 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return getContext().getString( com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock); } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.SimPin; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 27f71d1ae2be..7f48ed6d28e1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -40,6 +40,7 @@ import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.PhoneConstants; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; /** @@ -78,7 +79,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { // mCallback can be null if onSimStateChanged callback is called when keyguard // isn't active. if (mCallback != null) { - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPuk); } break; } @@ -413,7 +415,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPuk); } } else { mShowDefaultMessage = false; @@ -468,6 +471,11 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return getContext().getString( com.android.internal.R.string.keyguard_accessibility_sim_puk_unlock); } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.SimPuk; + } } -- cgit v1.2.3 From 1e7087f1136989b67c9b72c470617e5fb8c80501 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 4 Aug 2022 13:00:39 +0000 Subject: [DO NOT MERGE] Do not dismiss keyguard after SIM PUK unlock After PUK unlock, multiple calls to KeyguardSecurityContainerController#dismiss() were being called from the KeyguardSimPukViewController, which begins the transition to the next security screen, if any. At the same time, other parts of the system, also listening to SIM events, recognize the PUK unlock and call KeyguardSecurityContainer#showSecurityScreen, which updates which security method comes next. After boot, this should be one of PIN, Password, Pattern, assuming they have a security method. If one of the first dismiss() calls comes AFTER the security method changes, this is incorrectly recognized by the code as a successful PIN/pattern/password unlock. This causes the keyguard to be marked as done, causing screen flickers and incorrect system state. The solution: every call to dismiss() should include a new parameter for the security method used. If there is a difference between this parameter and the current value in KeyguardSecurityContainerCallback, ignore the request, as the system state has changed. Fixes: 238804980 Bug: 218500036 Test: atest KeyguardSecurityContainerTest AdminSecondaryLockScreenControllerTest KeyguardHostViewControllerTest KeyguardSecurityContainerControllerTest Change-Id: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 Merged-In: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 (cherry picked from commit 37aeb26b0ae28a48c1ed40f008d5808d8a84be23) --- .../AdminSecondaryLockScreenController.java | 3 +- .../KeyguardAbsKeyInputViewController.java | 2 +- .../keyguard/KeyguardHostViewController.java | 15 ++++---- .../keyguard/KeyguardInputViewController.java | 5 +-- .../keyguard/KeyguardPatternViewController.java | 2 +- .../android/keyguard/KeyguardSecurityCallback.java | 9 +++-- .../keyguard/KeyguardSecurityContainer.java | 7 +++- .../KeyguardSecurityContainerController.java | 31 ++++++++++++---- .../keyguard/KeyguardSimPinViewController.java | 3 +- .../keyguard/KeyguardSimPukViewController.java | 6 ++-- .../AdminSecondaryLockScreenControllerTest.java | 3 +- .../KeyguardSecurityContainerControllerTest.java | 42 ++++++++++++++++++++++ 12 files changed, 102 insertions(+), 26 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java index 23195af8bdea..00f1c0108d0b 100644 --- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java +++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java @@ -33,6 +33,7 @@ import android.view.SurfaceView; import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.systemui.dagger.qualifiers.Main; @@ -208,7 +209,7 @@ public class AdminSecondaryLockScreenController { hide(); if (mKeyguardCallback != null) { mKeyguardCallback.dismiss(/* securityVerified= */ true, userId, - /* bypassSecondaryLockScreen= */true); + /* bypassSecondaryLockScreen= */true, SecurityMode.Invalid); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index 1c4559eb0364..725c1490cd88 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -173,7 +173,7 @@ public abstract class KeyguardAbsKeyInputViewController Log.i(TAG, "TrustAgent dismissed Keyguard."); } mSecurityCallback.dismiss(false /* authenticated */, userId, - /* bypassSecondaryLockScreen */ false); + /* bypassSecondaryLockScreen */ false, SecurityMode.Invalid); } else { mViewMediatorCallback.playTrustedSound(); } @@ -105,9 +105,9 @@ public class KeyguardHostViewController extends ViewController @Override public boolean dismiss(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen) { + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { return mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( - authenticated, targetUserId, bypassSecondaryLockScreen); + authenticated, targetUserId, bypassSecondaryLockScreen, expectedSecurityMode); } @Override @@ -215,7 +215,8 @@ public class KeyguardHostViewController extends ViewController * @return True if the keyguard is done. */ public boolean dismiss(int targetUserId) { - return mSecurityCallback.dismiss(false, targetUserId, false); + return mSecurityCallback.dismiss(false, targetUserId, false, + getCurrentSecurityMode()); } /** @@ -352,10 +353,10 @@ public class KeyguardHostViewController extends ViewController } public boolean handleBackKey() { - if (mKeyguardSecurityContainerController.getCurrentSecurityMode() - != SecurityMode.None) { + SecurityMode securityMode = mKeyguardSecurityContainerController.getCurrentSecurityMode(); + if (securityMode != SecurityMode.None) { mKeyguardSecurityContainerController.dismiss( - false, KeyguardUpdateMonitor.getCurrentUser()); + false, KeyguardUpdateMonitor.getCurrentUser(), securityMode); return true; } return false; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 97d3a5a4cd18..39b1dd1580e0 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -58,10 +58,11 @@ public abstract class KeyguardInputViewController return false; } @Override - public void dismiss(boolean securityVerified, int targetUserId) { } + public void dismiss(boolean securityVerified, int targetUserId, + SecurityMode expectedSecurityMode) { } @Override public void dismiss(boolean authenticated, int targetId, - boolean bypassSecondaryLockScreen) { } + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { } @Override public void onUserInput() { } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index d5be7bacaadc..e0546886ccd9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -164,7 +164,7 @@ public class KeyguardPatternViewController if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); - getKeyguardSecurityCallback().dismiss(true, userId); + getKeyguardSecurityCallback().dismiss(true, userId, SecurityMode.Pattern); } } else { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index e38472745234..bc72f7979a74 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,14 +15,17 @@ */ package com.android.keyguard; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + public interface KeyguardSecurityCallback { /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId); + void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); /** * Dismiss the given security screen. @@ -30,8 +33,10 @@ public interface KeyguardSecurityCallback { * @param targetUserId a user that needs to be the foreground user at the dismissal completion. * @param bypassSecondaryLockScreen true if the user can bypass the secondary lock screen, * if any, during this dismissal. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen); + void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); /** * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index ca4d73b6de5d..0002d7a68109 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -173,7 +173,12 @@ public class KeyguardSecurityContainer extends FrameLayout { // Used to notify the container when something interesting happens. public interface SecurityCallback { - boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen); + /** + * Potentially dismiss the current security screen, after validating that all device + * security has been unlocked. Otherwise show the next screen. + */ + boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); void userActivity(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index dd7c7ea6b5a5..fc9c5dddbee5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -120,14 +120,17 @@ public class KeyguardSecurityContainerController extends ViewController Date: Wed, 30 Mar 2022 16:01:10 -0400 Subject: [DO NOT MERGE] Update window with FLAG_SECURE when bouncer is showing This will prevent bouncer interactions from showing up in screenrecords or screenshots. Fixes: 215005011 Test: atest NotificationShadeWindowControllerImpl && take screenshot with bouncer up Change-Id: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 Merged-In: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 (cherry picked from commit 6888543d3a6cde5a9e16f9accb0a4256152aba2d) --- .../NotificationShadeWindowControllerImpl.java | 11 ++++++++++ .../NotificationShadeWindowControllerImplTest.java | 24 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index c26782b017c6..28ab225c0554 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.os.Binder; +import android.os.Build; import android.os.RemoteException; import android.os.Trace; import android.util.Log; @@ -319,6 +320,16 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW Trace.setCounter("display_max_refresh_rate", (long) mLpChanged.preferredMaxDisplayRefreshRate); } + + if (state.mBouncerShowing && !isDebuggable()) { + mLpChanged.flags |= LayoutParams.FLAG_SECURE; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_SECURE; + } + } + + protected boolean isDebuggable() { + return Build.IS_DEBUGGABLE; } private void adjustScreenOrientation(State state) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java index 90b8a74d88be..df844d46a165 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.google.common.truth.Truth.assertThat; @@ -89,7 +90,12 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController, mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController, mColorExtractor, mDumpManager, mKeyguardStateController, - mUnlockedScreenOffAnimationController, mAuthController); + mUnlockedScreenOffAnimationController, mAuthController) { + @Override + protected boolean isDebuggable() { + return false; + } + }; mNotificationShadeWindowController.setScrimsVisibilityListener((visibility) -> {}); mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView); @@ -225,4 +231,20 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { assertThat((mLayoutParameters.getValue().flags & FLAG_NOT_FOCUSABLE) != 0).isTrue(); assertThat((mLayoutParameters.getValue().flags & FLAG_ALT_FOCUSABLE_IM) == 0).isTrue(); } + + @Test + public void setKeyguardShowing_enablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(true); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) != 0).isTrue(); + } + + @Test + public void setKeyguardNotShowing_disablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(false); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) == 0).isTrue(); + } } -- cgit v1.2.3 From bcebd3e9b935f4af10afc798bdb8c9b41992d3d8 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Wed, 30 Mar 2022 16:01:10 -0400 Subject: [DO NOT MERGE] Update window with FLAG_SECURE when bouncer is showing This will prevent bouncer interactions from showing up in screenrecords or screenshots. Fixes: 215005011 Test: atest NotificationShadeWindowControllerImpl && take screenshot with bouncer up Change-Id: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 Merged-In: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 (cherry picked from commit 6888543d3a6cde5a9e16f9accb0a4256152aba2d) --- .../NotificationShadeWindowControllerImpl.java | 11 ++++++++++ .../NotificationShadeWindowControllerImplTest.java | 24 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index 8c76a1bf4f83..787f9852c1f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.os.Binder; +import android.os.Build; import android.os.RemoteException; import android.os.Trace; import android.util.Log; @@ -325,6 +326,16 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW Trace.setCounter("display_max_refresh_rate", (long) mLpChanged.preferredMaxDisplayRefreshRate); } + + if (state.mBouncerShowing && !isDebuggable()) { + mLpChanged.flags |= LayoutParams.FLAG_SECURE; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_SECURE; + } + } + + protected boolean isDebuggable() { + return Build.IS_DEBUGGABLE; } private void adjustScreenOrientation(State state) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java index cb468108880a..2b954f189ef9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.google.common.truth.Truth.assertThat; @@ -90,7 +91,12 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController, mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController, mColorExtractor, mDumpManager, mKeyguardStateController, - mUnlockedScreenOffAnimationController, mAuthController); + mUnlockedScreenOffAnimationController, mAuthController) { + @Override + protected boolean isDebuggable() { + return false; + } + }; mNotificationShadeWindowController.setScrimsVisibilityListener((visibility) -> {}); mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView); @@ -239,4 +245,20 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { }); verify(mWindowManager).updateViewLayout(any(), any()); } + + @Test + public void setKeyguardShowing_enablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(true); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) != 0).isTrue(); + } + + @Test + public void setKeyguardNotShowing_disablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(false); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) == 0).isTrue(); + } } -- cgit v1.2.3 From e53e389f587a78793c78cd3a93fd1078e0c55232 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 4 Aug 2022 13:00:39 +0000 Subject: [DO NOT MERGE] Do not dismiss keyguard after SIM PUK unlock After PUK unlock, multiple calls to KeyguardSecurityContainerController#dismiss() were being called from the KeyguardSimPukViewController, which begins the transition to the next security screen, if any. At the same time, other parts of the system, also listening to SIM events, recognize the PUK unlock and call KeyguardSecurityContainer#showSecurityScreen, which updates which security method comes next. After boot, this should be one of PIN, Password, Pattern, assuming they have a security method. If one of the first dismiss() calls comes AFTER the security method changes, this is incorrectly recognized by the code as a successful PIN/pattern/password unlock. This causes the keyguard to be marked as done, causing screen flickers and incorrect system state. The solution: every call to dismiss() should include a new parameter for the security method used. If there is a difference between this parameter and the current value in KeyguardSecurityContainerCallback, ignore the request, as the system state has changed. Fixes: 238804980 Bug: 218500036 Test: atest KeyguardSecurityContainerTest AdminSecondaryLockScreenControllerTest KeyguardHostViewControllerTest KeyguardSecurityContainerControllerTest Change-Id: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 Merged-In: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 (cherry picked from commit 37aeb26b0ae28a48c1ed40f008d5808d8a84be23) --- .../AdminSecondaryLockScreenController.java | 3 +- .../KeyguardAbsKeyInputViewController.java | 2 +- .../keyguard/KeyguardHostViewController.java | 15 ++++---- .../keyguard/KeyguardInputViewController.java | 5 +-- .../keyguard/KeyguardPatternViewController.java | 2 +- .../android/keyguard/KeyguardSecurityCallback.java | 9 +++-- .../keyguard/KeyguardSecurityContainer.java | 7 +++- .../KeyguardSecurityContainerController.java | 31 ++++++++++++---- .../keyguard/KeyguardSimPinViewController.java | 3 +- .../keyguard/KeyguardSimPukViewController.java | 6 ++-- .../AdminSecondaryLockScreenControllerTest.java | 3 +- .../KeyguardSecurityContainerControllerTest.java | 41 ++++++++++++++++++++++ 12 files changed, 101 insertions(+), 26 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java index 23195af8bdea..00f1c0108d0b 100644 --- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java +++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java @@ -33,6 +33,7 @@ import android.view.SurfaceView; import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.systemui.dagger.qualifiers.Main; @@ -208,7 +209,7 @@ public class AdminSecondaryLockScreenController { hide(); if (mKeyguardCallback != null) { mKeyguardCallback.dismiss(/* securityVerified= */ true, userId, - /* bypassSecondaryLockScreen= */true); + /* bypassSecondaryLockScreen= */true, SecurityMode.Invalid); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index 1c4559eb0364..725c1490cd88 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -173,7 +173,7 @@ public abstract class KeyguardAbsKeyInputViewController Log.i(TAG, "TrustAgent dismissed Keyguard."); } mSecurityCallback.dismiss(false /* authenticated */, userId, - /* bypassSecondaryLockScreen */ false); + /* bypassSecondaryLockScreen */ false, SecurityMode.Invalid); } else { mViewMediatorCallback.playTrustedSound(); } @@ -105,9 +105,9 @@ public class KeyguardHostViewController extends ViewController @Override public boolean dismiss(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen) { + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { return mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( - authenticated, targetUserId, bypassSecondaryLockScreen); + authenticated, targetUserId, bypassSecondaryLockScreen, expectedSecurityMode); } @Override @@ -215,7 +215,8 @@ public class KeyguardHostViewController extends ViewController * @return True if the keyguard is done. */ public boolean dismiss(int targetUserId) { - return mSecurityCallback.dismiss(false, targetUserId, false); + return mSecurityCallback.dismiss(false, targetUserId, false, + getCurrentSecurityMode()); } /** @@ -356,10 +357,10 @@ public class KeyguardHostViewController extends ViewController } public boolean handleBackKey() { - if (mKeyguardSecurityContainerController.getCurrentSecurityMode() - != SecurityMode.None) { + SecurityMode securityMode = mKeyguardSecurityContainerController.getCurrentSecurityMode(); + if (securityMode != SecurityMode.None) { mKeyguardSecurityContainerController.dismiss( - false, KeyguardUpdateMonitor.getCurrentUser()); + false, KeyguardUpdateMonitor.getCurrentUser(), securityMode); return true; } return false; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 75425e1e6ca3..06440b6670c8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -59,10 +59,11 @@ public abstract class KeyguardInputViewController return false; } @Override - public void dismiss(boolean securityVerified, int targetUserId) { } + public void dismiss(boolean securityVerified, int targetUserId, + SecurityMode expectedSecurityMode) { } @Override public void dismiss(boolean authenticated, int targetId, - boolean bypassSecondaryLockScreen) { } + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { } @Override public void onUserInput() { } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index 94e07b713915..15a7d4d03cb3 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -168,7 +168,7 @@ public class KeyguardPatternViewController if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); - getKeyguardSecurityCallback().dismiss(true, userId); + getKeyguardSecurityCallback().dismiss(true, userId, SecurityMode.Pattern); } } else { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index e38472745234..bc72f7979a74 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,14 +15,17 @@ */ package com.android.keyguard; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + public interface KeyguardSecurityCallback { /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId); + void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); /** * Dismiss the given security screen. @@ -30,8 +33,10 @@ public interface KeyguardSecurityCallback { * @param targetUserId a user that needs to be the foreground user at the dismissal completion. * @param bypassSecondaryLockScreen true if the user can bypass the secondary lock screen, * if any, during this dismissal. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen); + void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); /** * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 0328b5a62b06..ce7b45aba06b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -181,7 +181,12 @@ public class KeyguardSecurityContainer extends FrameLayout { // Used to notify the container when something interesting happens. public interface SecurityCallback { - boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen); + /** + * Potentially dismiss the current security screen, after validating that all device + * security has been unlocked. Otherwise show the next screen. + */ + boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); void userActivity(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index d4d3d5b3ea2d..d501ccdd5103 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -136,14 +136,17 @@ public class KeyguardSecurityContainerController extends ViewController Date: Wed, 14 Sep 2022 18:05:29 +0000 Subject: [DO NOT MERGE] Update window with FLAG_SECURE when bouncer is showing This will prevent bouncer interactions from showing up in screenrecords or screenshots. Fixes: 215005011 Test: atest NotificationShadeWindowControllerImpl && take screenshot with bouncer up Merged-In: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 Change-Id: Icde7849a181ce8e0c1074537f6dde897aedd8bb3 --- .../phone/NotificationShadeWindowController.java | 11 ++++++++++ .../NotificationShadeWindowControllerTest.java | 24 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java index 5164440c1463..3e613532dd6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java @@ -29,6 +29,7 @@ import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Binder; +import android.os.Build; import android.os.RemoteException; import android.os.SystemProperties; import android.os.Trace; @@ -264,6 +265,16 @@ public class NotificationShadeWindowController implements Callback, Dumpable, } Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId); } + + if (state.mBouncerShowing && !isDebuggable()) { + mLpChanged.flags |= LayoutParams.FLAG_SECURE; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_SECURE; + } + } + + protected boolean isDebuggable() { + return Build.IS_DEBUGGABLE; } private void adjustScreenOrientation(State state) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java index 8c37cf1514fd..6bdc13fa7d59 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.google.common.truth.Truth.assertThat; @@ -83,7 +84,12 @@ public class NotificationShadeWindowControllerTest extends SysuiTestCase { mNotificationShadeWindowController = new NotificationShadeWindowController(mContext, mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController, mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController, - mColorExtractor, mDumpManager); + mColorExtractor, mDumpManager) { + @Override + protected boolean isDebuggable() { + return false; + } + }; mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView); mNotificationShadeWindowController.attach(); @@ -183,4 +189,20 @@ public class NotificationShadeWindowControllerTest extends SysuiTestCase { assertThat((mLayoutParameters.getValue().flags & FLAG_NOT_FOCUSABLE) != 0).isTrue(); assertThat((mLayoutParameters.getValue().flags & FLAG_ALT_FOCUSABLE_IM) == 0).isTrue(); } + + @Test + public void setKeyguardShowing_enablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(true); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) != 0).isTrue(); + } + + @Test + public void setKeyguardNotShowing_disablesSecureFlag() { + mNotificationShadeWindowController.setBouncerShowing(false); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) == 0).isTrue(); + } } -- cgit v1.2.3 From c27cf661a6b14849bd13ba69b5ee40c9066fcf2c Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 18 Aug 2022 12:04:43 +0000 Subject: [DO NOT MERGE] Do not dismiss keyguard after SIM PUK unlock After PUK unlock, multiple calls to KeyguardSecurityContainerController#dismiss() were being called from the KeyguardSimPukViewController, which begins the transition to the next security screen, if any. At the same time, other parts of the system, also listening to SIM events, recognize the PUK unlock and call KeyguardSecurityContainer#showSecurityScreen, which updates which security method comes next. After boot, this should be one of PIN, Password, Pattern, assuming they have a security method. If one of the first dismiss() calls comes AFTER the security method changes, this is incorrectly recognized by the code as a successful PIN/pattern/password unlock. This causes the keyguard to be marked as done, causing screen flickers and incorrect system state. The solution: every call to dismiss() should include a new parameter for the security method used. If there is a difference between this parameter and the current value in KeyguardSecurityContainerCallback, ignore the request, as the system state has changed. Bug: 218500036 Test: atest KeyguardSecurityContainerTest Merged-In: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 Change-Id: I30226bc7b5eda9480d471b35fe81e106b0491ff8 --- .../AdminSecondaryLockScreenController.java | 3 +- .../android/keyguard/KeyguardAbsKeyInputView.java | 4 ++- .../src/com/android/keyguard/KeyguardHostView.java | 11 +++---- .../src/com/android/keyguard/KeyguardPINView.java | 6 ++++ .../com/android/keyguard/KeyguardPasswordView.java | 6 ++++ .../com/android/keyguard/KeyguardPatternView.java | 3 +- .../android/keyguard/KeyguardSecurityCallback.java | 9 ++++-- .../keyguard/KeyguardSecurityContainer.java | 34 +++++++++++++++------- .../com/android/keyguard/KeyguardSimPinView.java | 9 +++++- .../com/android/keyguard/KeyguardSimPukView.java | 13 +++++++-- .../AdminSecondaryLockScreenControllerTest.java | 3 +- 11 files changed, 76 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java index e99245fa438f..f9e4340b4fc8 100644 --- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java +++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java @@ -33,6 +33,7 @@ import android.view.SurfaceView; import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import java.util.NoSuchElementException; @@ -204,7 +205,7 @@ public class AdminSecondaryLockScreenController { hide(); if (mKeyguardCallback != null) { mKeyguardCallback.dismiss(/* securityVerified= */ true, userId, - /* bypassSecondaryLockScreen= */true); + /* bypassSecondaryLockScreen= */true, SecurityMode.Invalid); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 88f4176f5eac..1626b710c2df 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -30,6 +30,7 @@ import android.view.KeyEvent; import android.view.View; import android.widget.LinearLayout; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternChecker; import com.android.internal.widget.LockPatternUtils; @@ -99,6 +100,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout protected abstract int getPasswordTextViewId(); protected abstract void resetState(); + protected abstract SecurityMode getSecurityMode(); @Override protected void onFinishInflate() { @@ -208,7 +210,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mDismissing = true; - mCallback.dismiss(true, userId); + mCallback.dismiss(true, userId, getSecurityMode()); } } else { if (isValidPassword) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java index 57b3761c294f..b733d1cfc2c4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java @@ -87,7 +87,7 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { Log.i(TAG, "TrustAgent dismissed Keyguard."); } dismiss(false /* authenticated */, userId, - /* bypassSecondaryLockScreen */ false); + /* bypassSecondaryLockScreen */ false, SecurityMode.Invalid); } else { mViewMediatorCallback.playTrustedSound(); } @@ -193,12 +193,13 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { * @return True if the keyguard is done. */ public boolean dismiss(int targetUserId) { - return dismiss(false, targetUserId, false); + return dismiss(false, targetUserId, false, getCurrentSecurityMode()); } public boolean handleBackKey() { if (mSecurityContainer.getCurrentSecuritySelection() != SecurityMode.None) { - mSecurityContainer.dismiss(false, KeyguardUpdateMonitor.getCurrentUser()); + mSecurityContainer.dismiss(false, KeyguardUpdateMonitor.getCurrentUser(), + getCurrentSecurityMode()); return true; } return false; @@ -210,9 +211,9 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { @Override public boolean dismiss(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen) { + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { return mSecurityContainer.showNextSecurityScreenOrFinish(authenticated, targetUserId, - bypassSecondaryLockScreen); + bypassSecondaryLockScreen, expectedSecurityMode); } /** diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 12ea1d586e10..c15201a8e488 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -22,6 +22,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; import com.android.systemui.Dependency; @@ -183,4 +184,9 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { public boolean hasOverlappingRendering() { return false; } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.PIN; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index 97317cf5580f..1a8a26c07d0a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -38,6 +38,7 @@ import android.widget.TextView.OnEditorActionListener; import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.TextViewInputDisabler; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.R; import java.util.List; @@ -387,4 +388,9 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView return getContext().getString( com.android.internal.R.string.keyguard_accessibility_password_unlock); } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.Password; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index c4a9fcb45284..e1a4effe5021 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -40,6 +40,7 @@ import com.android.internal.widget.LockPatternChecker; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternView; import com.android.internal.widget.LockscreenCredential; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.settingslib.animation.AppearAnimationCreator; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; @@ -352,7 +353,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); - mCallback.dismiss(true, userId); + mCallback.dismiss(true, userId, SecurityMode.Pattern); } } else { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index e38472745234..bc72f7979a74 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,14 +15,17 @@ */ package com.android.keyguard; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + public interface KeyguardSecurityCallback { /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId); + void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); /** * Dismiss the given security screen. @@ -30,8 +33,10 @@ public interface KeyguardSecurityCallback { * @param targetUserId a user that needs to be the foreground user at the dismissal completion. * @param bypassSecondaryLockScreen true if the user can bypass the secondary lock screen, * if any, during this dismissal. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen); + void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); /** * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 1db2e32b8cdb..e603ef96764d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -189,7 +189,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe // Used to notify the container when something interesting happens. public interface SecurityCallback { public boolean dismiss(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen); + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode); public void userActivity(); public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput); @@ -676,11 +676,20 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe * completion. * @param bypassSecondaryLockScreen true if the user is allowed to bypass the secondary * secondary lock screen requirement, if any. + * @param expectedSecurityMode SecurityMode that is invoking this request. SecurityMode.Invalid + * indicates that no check should be done * @return true if keyguard is done */ boolean showNextSecurityScreenOrFinish(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen) { + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); + if (expectedSecurityMode != SecurityMode.Invalid + && expectedSecurityMode != getCurrentSecurityMode()) { + Log.w(TAG, "Attempted to invoke showNextSecurityScreenOrFinish with securityMode " + + expectedSecurityMode + ", but current mode is " + getCurrentSecurityMode()); + return false; + } + boolean finish = false; boolean strongAuth = false; int eventSubtype = -1; @@ -819,14 +828,17 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } @Override - public void dismiss(boolean authenticated, int targetId) { - dismiss(authenticated, targetId, /* bypassSecondaryLockScreen */ false); + public void dismiss(boolean authenticated, int targetId, + SecurityMode expectedSecurityMode) { + dismiss(authenticated, targetId, /* bypassSecondaryLockScreen */ false, + expectedSecurityMode); } @Override public void dismiss(boolean authenticated, int targetId, - boolean bypassSecondaryLockScreen) { - mSecurityCallback.dismiss(authenticated, targetId, bypassSecondaryLockScreen); + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { + mSecurityCallback.dismiss(authenticated, targetId, bypassSecondaryLockScreen, + expectedSecurityMode); } public boolean isVerifyUnlockOnly() { @@ -878,10 +890,11 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe @Override public boolean isVerifyUnlockOnly() { return false; } @Override - public void dismiss(boolean securityVerified, int targetUserId) { } + public void dismiss(boolean securityVerified, int targetUserId, + SecurityMode expectedSecurityMode) { } @Override public void dismiss(boolean authenticated, int targetId, - boolean bypassSecondaryLockScreen) { } + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { } @Override public void onUserInput() { } @Override @@ -933,8 +946,9 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe return mCurrentSecuritySelection; } - public void dismiss(boolean authenticated, int targetUserId) { - mCallback.dismiss(authenticated, targetUserId); + public void dismiss(boolean authenticated, int targetUserId, + SecurityMode expectedSecurityMode) { + mCallback.dismiss(authenticated, targetUserId, expectedSecurityMode); } public boolean needsInput() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index 76adf04b21e7..6be80c49bd06 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -37,6 +37,7 @@ import android.view.View; import android.view.WindowManager; import android.widget.ImageView; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -348,7 +349,8 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPin); } } else { mShowDefaultMessage = false; @@ -398,5 +400,10 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return getContext().getString( com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock); } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.SimPin; + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 10dcbd6f9182..eaf6476ecbb7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -36,6 +36,7 @@ import android.view.View; import android.view.WindowManager; import android.widget.ImageView; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -76,7 +77,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { // mCallback can be null if onSimStateChanged callback is called when keyguard // isn't active. if (mCallback != null) { - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPuk); } break; } @@ -422,8 +424,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { - mCallback.dismiss(true, - KeyguardUpdateMonitor.getCurrentUser()); + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), + SecurityMode.SimPuk); } } else { mShowDefaultMessage = false; @@ -479,6 +481,11 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return getContext().getString( com.android.internal.R.string.keyguard_accessibility_sim_puk_unlock); } + + @Override + public SecurityMode getSecurityMode() { + return SecurityMode.SimPuk; + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java index 9be2d124026c..3114b0a99e97 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java @@ -46,6 +46,7 @@ import android.widget.FrameLayout; import androidx.test.filters.SmallTest; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.SysuiTestCase; import org.junit.After; @@ -191,7 +192,7 @@ public class AdminSecondaryLockScreenControllerTest extends SysuiTestCase { private void verifyViewDismissed(SurfaceView v) throws Exception { verify(mParent).removeView(v); - verify(mKeyguardCallback).dismiss(true, TARGET_USER_ID, true); + verify(mKeyguardCallback).dismiss(true, TARGET_USER_ID, true, SecurityMode.Invalid); assertThat(mContext.isBound(mComponentName)).isFalse(); } } -- cgit v1.2.3 From 2a506d89f88c665c3d8252bf3762b5843aff1fdf Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index 267b2ff818a6..4d33bfd1e94a 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -90,6 +90,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -104,16 +110,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader(), android.net.Uri.class), source.readString(), source.readString(), @@ -240,4 +249,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From 73ad3844ac30ba7ca7c269bf50982427e8703354 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index 4f324f9e35bf..9a2a86af2b09 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -90,6 +90,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -104,16 +110,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -240,4 +249,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From 14ceb8a5e7107fabd9867204dfa4d8330a417143 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index 4f324f9e35bf..9a2a86af2b09 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -90,6 +90,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -104,16 +110,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -240,4 +249,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From c561831af7af834b66ce0df3a169fffc08d2d3b5 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Wed, 14 Sep 2022 19:08:02 +0000 Subject: [DO NOT MERGE] Update window with FLAG_SECURE when bouncer is showing This will prevent bouncer interactions from showing up in screenrecords or screenshots. Fixes: 215005011 Test: atest StatusBarWindowControllerTest && take screenshot with bouncer up Merged-In: I3f59df865dc2dd13d4b9ac54bb2dacb7b23f0aa1 Change-Id: I8df2258863b8cede5ba112331e0446f534267ba2 --- .../statusbar/phone/StatusBarWindowController.java | 11 +++++++ .../phone/StatusBarWindowControllerTest.java | 38 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 8621b7293711..b55cb2adcebb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -27,6 +27,7 @@ import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Binder; +import android.os.Build; import android.os.RemoteException; import android.os.SystemProperties; import android.util.Log; @@ -204,6 +205,16 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } else { mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; } + + if (state.bouncerShowing && !isDebuggable()) { + mLpChanged.flags |= LayoutParams.FLAG_SECURE; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_SECURE; + } + } + + protected boolean isDebuggable() { + return Build.IS_DEBUGGABLE; } private void adjustScreenOrientation(State state) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java index fea41a441065..41b37712517c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -38,6 +40,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -54,6 +57,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { private ViewGroup mStatusBarView; @Mock private IActivityManager mActivityManager; + @Captor + private ArgumentCaptor mLayoutParameters; private StatusBarWindowController mStatusBarWindowController; @@ -63,24 +68,27 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { when(mDozeParameters.getAlwaysOn()).thenReturn(true); mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters) { + @Override + protected boolean isDebuggable() { + return false; + } + }; mStatusBarWindowController.add(mStatusBarView, 100 /* height */); } @Test public void testSetDozing_hidesSystemOverlays() { mStatusBarWindowController.setDozing(true); - ArgumentCaptor captor = - ArgumentCaptor.forClass(WindowManager.LayoutParams.class); - verify(mWindowManager).updateViewLayout(any(), captor.capture()); - int flag = captor.getValue().privateFlags + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + int flag = mLayoutParameters.getValue().privateFlags & WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; assertThat(flag).isNotEqualTo(0); reset(mWindowManager); mStatusBarWindowController.setDozing(false); - verify(mWindowManager).updateViewLayout(any(), captor.capture()); - flag = captor.getValue().privateFlags + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + flag = mLayoutParameters.getValue().privateFlags & WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; assertThat(flag).isEqualTo(0); } @@ -103,4 +111,20 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { mActivityManager, mDozeParameters); mStatusBarWindowController.setForcePluginOpen(true); } + + @Test + public void setKeyguardShowing_enablesSecureFlag() { + mStatusBarWindowController.setBouncerShowing(true); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) != 0).isTrue(); + } + + @Test + public void setKeyguardNotShowing_disablesSecureFlag() { + mStatusBarWindowController.setBouncerShowing(false); + + verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); + assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) == 0).isTrue(); + } } -- cgit v1.2.3 From 7059638be9271303e22b7b3e8aa6d58677f6143b Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index 4f324f9e35bf..9a2a86af2b09 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -90,6 +90,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -104,16 +110,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -240,4 +249,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From d0839c4aafd8cad600fd76fbe081c5137764cfb3 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index cf57e2590c9c..0057d3e872ed 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -89,6 +89,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -103,16 +109,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -239,4 +248,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From 80c0fcf06d5a862c4b05be9896a5d320d2f71fb2 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index cf57e2590c9c..0057d3e872ed 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -89,6 +89,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -103,16 +109,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -239,4 +248,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From 5cb217fff3bc7184bd776a9dc2991e7fce5e25bd Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Tue, 13 Sep 2022 12:53:19 -0400 Subject: Limit lengths of fields in Condition to a max length. This app-generated input needs to not be too long to avoid errors in the process of writing to disk. Bug: 242846316 Test: cts ConditionTest; atest ConditionTest; manually verified exploit apk is OK Change-Id: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 Merged-In: Ic2fa8f06cc7a4c1f262115764fbd1be2a226b4b9 (cherry picked from commit 81352c3775949c622441e10b468766441e35edc7) --- .../android/service/notification/Condition.java | 38 +++++++- .../service/notification/ConditionTest.java | 101 +++++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 core/tests/coretests/src/android/service/notification/ConditionTest.java diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index e506509bb1be..50597ec3972e 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -89,6 +89,12 @@ public final class Condition implements Parcelable { public final int flags; public final int icon; + /** + * The maximum string length for any string contained in this condition. + * @hide + */ + public static final int MAX_STRING_LENGTH = 1000; + /** * An object representing the current state of a {@link android.app.AutomaticZenRule}. * @param id the {@link android.app.AutomaticZenRule#getConditionId()} of the zen rule @@ -103,16 +109,19 @@ public final class Condition implements Parcelable { if (id == null) throw new IllegalArgumentException("id is required"); if (summary == null) throw new IllegalArgumentException("summary is required"); if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state); - this.id = id; - this.summary = summary; - this.line1 = line1; - this.line2 = line2; + this.id = getTrimmedUri(id); + this.summary = getTrimmedString(summary); + this.line1 = getTrimmedString(line1); + this.line2 = getTrimmedString(line2); this.icon = icon; this.state = state; this.flags = flags; } public Condition(Parcel source) { + // This constructor passes all fields directly into the constructor that takes all the + // fields as arguments; that constructor will trim each of the input strings to + // max length if necessary. this((Uri)source.readParcelable(Condition.class.getClassLoader()), source.readString(), source.readString(), @@ -239,4 +248,25 @@ public final class Condition implements Parcelable { return new Condition[size]; } }; + + /** + * Returns a truncated copy of the string if the string is longer than MAX_STRING_LENGTH. + */ + private static String getTrimmedString(String input) { + if (input != null && input.length() > MAX_STRING_LENGTH) { + return input.substring(0, MAX_STRING_LENGTH); + } + return input; + } + + /** + * Returns a truncated copy of the Uri by trimming the string representation to the maximum + * string length. + */ + private static Uri getTrimmedUri(Uri input) { + if (input != null && input.toString().length() > MAX_STRING_LENGTH) { + return Uri.parse(getTrimmedString(input.toString())); + } + return input; + } } diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java new file mode 100644 index 000000000000..42629ba41287 --- /dev/null +++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.google.common.base.Strings; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConditionTest { + private static final String CLASS = "android.service.notification.Condition"; + + @Test + public void testLongFields_inConstructors() { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + + // Confirm strings are truncated via short constructor + Condition cond1 = new Condition(longUri, longString, Condition.STATE_TRUE); + + assertEquals(Condition.MAX_STRING_LENGTH, cond1.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond1.summary.length()); + + // Confirm strings are truncated via long constructor + Condition cond2 = new Condition(longUri, longString, longString, longString, + -1, Condition.STATE_TRUE, Condition.FLAG_RELEVANT_ALWAYS); + + assertEquals(Condition.MAX_STRING_LENGTH, cond2.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, cond2.line2.length()); + } + + @Test + public void testLongFields_viaParcel() { + // Set fields via reflection to force them to be long, then parcel and unparcel to make sure + // it gets truncated upon unparcelling. + Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder", + Condition.STATE_TRUE); + + try { + String longString = Strings.repeat("A", 65536); + Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530)); + Field id = Class.forName(CLASS).getDeclaredField("id"); + id.setAccessible(true); + id.set(cond, longUri); + Field summary = Class.forName(CLASS).getDeclaredField("summary"); + summary.setAccessible(true); + summary.set(cond, longString); + Field line1 = Class.forName(CLASS).getDeclaredField("line1"); + line1.setAccessible(true); + line1.set(cond, longString); + Field line2 = Class.forName(CLASS).getDeclaredField("line2"); + line2.setAccessible(true); + line2.set(cond, longString); + } catch (NoSuchFieldException e) { + fail(e.toString()); + } catch (ClassNotFoundException e) { + fail(e.toString()); + } catch (IllegalAccessException e) { + fail(e.toString()); + } + + Parcel parcel = Parcel.obtain(); + cond.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + Condition fromParcel = new Condition(parcel); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.id.toString().length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.summary.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line1.length()); + assertEquals(Condition.MAX_STRING_LENGTH, fromParcel.line2.length()); + } +} -- cgit v1.2.3 From f63ee3bb84b6a6ebf34475f433471cf4c28fb3c7 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Mon, 5 Sep 2022 21:38:50 +0800 Subject: Allow activity to be reparent while allowTaskReparenting is applied MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Any malicious application could hijack tasks by android:allowTaskReparenting. This vulnerability can perform UI spoofing or spying on user’s activities. This CL only allows activities to be reparent while android:allowTaskReparenting is applied and the affinity of activity is same with the target task. Bug: 240663194 Test: atest IntentTests Change-Id: I73abb9ec05af95bc14f887ae825a9ada9600f771 Merged-In: I73abb9ec05af95bc14f887ae825a9ada9600f771 (cherry picked from commit f19d69f26fefb95d2f349cc66459691f434ac0a6) --- services/core/java/com/android/server/wm/ResetTargetTaskHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java index 1fd66fc2c2bc..d497d8cbf9cd 100644 --- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java +++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java @@ -141,15 +141,16 @@ class ResetTargetTaskHelper implements Consumer, Predicate return false; } else { - mResultActivities.add(r); if (r.resultTo != null) { // If this activity is sending a reply to a previous activity, we can't do // anything with it now until we reach the start of the reply chain. // NOTE: that we are assuming the result is always to the previous activity, // which is almost always the case but we really shouldn't count on. + mResultActivities.add(r); return false; } else if (mTargetTaskFound && allowTaskReparenting && mTargetTask.affinity != null && mTargetTask.affinity.equals(r.taskAffinity)) { + mResultActivities.add(r); // This activity has an affinity for our task. Either remove it if we are // clearing or move it over to our task. Note that we currently punt on the case // where we are resetting a task that is not at the top but who has activities -- cgit v1.2.3 From 3d89cc5df6729cab8d98c967d73e03e23048d52b Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 4 Aug 2022 13:00:39 +0000 Subject: Do not dismiss keyguard after SIM PUK unlock After PUK unlock, multiple calls to KeyguardSecurityContainerController#dismiss() were being called from the KeyguardSimPukViewController, which begins the transition to the next security screen, if any. At the same time, other parts of the system, also listening to SIM events, recognize the PUK unlock and call KeyguardSecurityContainer#showSecurityScreen, which updates which security method comes next. After boot, this should be one of PIN, Password, Pattern, assuming they have a security method. If one of the first dismiss() calls comes AFTER the security method changes, this is incorrectly recognized by the code as a successful PIN/pattern/password unlock. This causes the keyguard to be marked as done, causing screen flickers and incorrect system state. The solution: every call to dismiss() should include a new parameter for the security method used. If there is a difference between this parameter and the current value in KeyguardSecurityContainerCallback, ignore the request, as the system state has changed. Fixes: 238804980 Bug: 218500036 Test: atest KeyguardSecurityContainerTest AdminSecondaryLockScreenControllerTest KeyguardHostViewControllerTest KeyguardSecurityContainerControllerTest Change-Id: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 Merged-In: I7c8714a177bc85fbce92f6e8fe911f74ca2ac243 (cherry picked from commit 37aeb26b0ae28a48c1ed40f008d5808d8a84be23) --- .../AdminSecondaryLockScreenController.java | 3 +- .../KeyguardAbsKeyInputViewController.java | 2 +- .../keyguard/KeyguardHostViewController.java | 15 ++++---- .../keyguard/KeyguardInputViewController.java | 5 +-- .../keyguard/KeyguardPatternViewController.java | 2 +- .../android/keyguard/KeyguardSecurityCallback.java | 9 +++-- .../keyguard/KeyguardSecurityContainer.java | 7 +++- .../KeyguardSecurityContainerController.java | 31 ++++++++++++---- .../keyguard/KeyguardSimPinViewController.java | 3 +- .../keyguard/KeyguardSimPukViewController.java | 6 ++-- .../AdminSecondaryLockScreenControllerTest.java | 3 +- .../KeyguardSecurityContainerControllerTest.java | 42 ++++++++++++++++++++++ 12 files changed, 102 insertions(+), 26 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java index 23195af8bdea..00f1c0108d0b 100644 --- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java +++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java @@ -33,6 +33,7 @@ import android.view.SurfaceView; import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.systemui.dagger.qualifiers.Main; @@ -208,7 +209,7 @@ public class AdminSecondaryLockScreenController { hide(); if (mKeyguardCallback != null) { mKeyguardCallback.dismiss(/* securityVerified= */ true, userId, - /* bypassSecondaryLockScreen= */true); + /* bypassSecondaryLockScreen= */true, SecurityMode.Invalid); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index eb418ff3b142..b8fcb103402d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -179,7 +179,7 @@ public abstract class KeyguardAbsKeyInputViewController Log.i(TAG, "TrustAgent dismissed Keyguard."); } mSecurityCallback.dismiss(false /* authenticated */, userId, - /* bypassSecondaryLockScreen */ false); + /* bypassSecondaryLockScreen */ false, SecurityMode.Invalid); } else { mViewMediatorCallback.playTrustedSound(); } @@ -102,9 +102,9 @@ public class KeyguardHostViewController extends ViewController @Override public boolean dismiss(boolean authenticated, int targetUserId, - boolean bypassSecondaryLockScreen) { + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { return mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( - authenticated, targetUserId, bypassSecondaryLockScreen); + authenticated, targetUserId, bypassSecondaryLockScreen, expectedSecurityMode); } @Override @@ -212,7 +212,8 @@ public class KeyguardHostViewController extends ViewController * @return True if the keyguard is done. */ public boolean dismiss(int targetUserId) { - return mSecurityCallback.dismiss(false, targetUserId, false); + return mSecurityCallback.dismiss(false, targetUserId, false, + getCurrentSecurityMode()); } /** @@ -355,10 +356,10 @@ public class KeyguardHostViewController extends ViewController } public boolean handleBackKey() { - if (mKeyguardSecurityContainerController.getCurrentSecurityMode() - != SecurityMode.None) { + SecurityMode securityMode = mKeyguardSecurityContainerController.getCurrentSecurityMode(); + if (securityMode != SecurityMode.None) { mKeyguardSecurityContainerController.dismiss( - false, KeyguardUpdateMonitor.getCurrentUser()); + false, KeyguardUpdateMonitor.getCurrentUser(), securityMode); return true; } return false; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 98ac640bf703..87300c3f0504 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -59,10 +59,11 @@ public abstract class KeyguardInputViewController return false; } @Override - public void dismiss(boolean securityVerified, int targetUserId) { } + public void dismiss(boolean securityVerified, int targetUserId, + SecurityMode expectedSecurityMode) { } @Override public void dismiss(boolean authenticated, int targetId, - boolean bypassSecondaryLockScreen) { } + boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { } @Override public void onUserInput() { } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index 39c394981193..1a59b820c1bd 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -171,7 +171,7 @@ public class KeyguardPatternViewController if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); - getKeyguardSecurityCallback().dismiss(true, userId); + getKeyguardSecurityCallback().dismiss(true, userId, SecurityMode.Pattern); } } else { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index e38472745234..bc72f7979a74 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,14 +15,17 @@ */ package com.android.keyguard; +import com.android.keyguard.KeyguardSecurityModel.SecurityMode; + public interface KeyguardSecurityCallback { /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId); + void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); /** * Dismiss the given security screen. @@ -30,8 +33,10 @@ public interface KeyguardSecurityCallback { * @param targetUserId a user that needs to be the foreground user at the dismissal completion. * @param bypassSecondaryLockScreen true if the user can bypass the secondary lock screen, * if any, during this dismissal. + * @param expectedSecurityMode The security mode that is invoking this dismiss. */ - void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen); + void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); /** * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index cce516d981a5..12bb47b81d7f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -233,7 +233,12 @@ public class KeyguardSecurityContainer extends FrameLayout { // Used to notify the container when something interesting happens. public interface SecurityCallback { - boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen); + /** + * Potentially dismiss the current security screen, after validating that all device + * security has been unlocked. Otherwise show the next screen. + */ + boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen, + SecurityMode expectedSecurityMode); void userActivity(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 19a2d9ed5b7b..2b9553d3eda2 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -153,14 +153,17 @@ public class KeyguardSecurityContainerController extends ViewController Date: Mon, 19 Sep 2022 10:20:46 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia13c0945bd00b520d45b5163e4e1a28be772e31c --- core/res/res/values-or/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 4 +- core/res/res/values-ro/strings.xml | 150 ++++++++++++++++----------------- core/res/res/values-zh-rCN/strings.xml | 2 +- core/res/res/values-zh-rHK/strings.xml | 2 +- 5 files changed, 80 insertions(+), 80 deletions(-) diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 79ac29a0d3c8..dd424a1c50d4 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1267,7 +1267,7 @@ "ରିଙ୍ଗର୍‌ ଭଲ୍ୟୁମ୍" "ମିଡିଆ ଭଲ୍ୟୁମ୍‌" "ବ୍ଲୁଟୂଥ୍‍ ମାଧ୍ୟମରେ ଚାଲୁଛି" - "ରିଙ୍ଗଟୋନ୍‍‍କୁ ନିରବ ଭାବେ ସେଟ୍ କରାଯାଇଛି" + "ସାଇଲେଣ୍ଟ ରିଂଟୋନ ସେଟ ହୋଇଛି" "ଇନ୍‍-କଲ୍‍ ଭଲ୍ୟୁମ୍‌" "ବ୍ଲୁଟୂଥ୍‍ ଇନ୍-କଲ୍ ଭଲ୍ୟୁମ୍‌" "ଆଲାରାମ୍ ଭଲ୍ୟୁମ୍‌" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 9a49a601211f..c170d1c8fe15 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -58,7 +58,7 @@ "IMEI" "MEID" "ID do Autor da Chamada" - "Ocultar identificação do autor da chamada efetuada" + "Ocultar identificação do autor da chamada feita" "ID de linha ligada" "Restrição de ID de linha ligada" "Encaminhamento de chamadas" @@ -355,7 +355,7 @@ "desinstalar atalhos" "Permite que a app remova atalhos do Ecrã principal sem a intervenção do utilizador." "redirecionar as chamadas efetuadas" - "Permite que a app veja o número que é marcado durante uma chamada efetuada, com a opção de redirecionar a chamada para um número diferente ou terminar a chamada." + "Permite que a app veja o número que é marcado durante uma chamada feita, com a opção de redirecionar a chamada para um número diferente ou terminar a chamada." "atender chamadas telefónicas" "Permite que a app atenda chamadas recebidas." "receber mensagens de texto (SMS)" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0db3ffac08f6..9eb707529f90 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -45,10 +45,10 @@ "Codul PIN vechi introdus nu este corect." "Codul PUK introdus nu este corect." "Codurile PIN introduse nu se potrivesc." - "Introduceți un cod PIN alcătuit din 4 până la 8 cifre." - "Introduceți un cod PUK care să aibă 8 cifre sau mai mult." - "Cardul SIM este blocat cu codul PUK. Introduceți codul PUK pentru a-l debloca." - "Introduceți codul PUK2 pentru a debloca cardul SIM." + "Introdu un cod PIN alcătuit din 4 până la 8 cifre." + "Introdu un cod PUK care să aibă 8 cifre sau mai mult." + "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." + "Introdu codul PUK2 pentru a debloca cardul SIM." "Operațiunea nu a reușit. Activați blocarea cardului SIM/RUIM." V-au mai rămas %d încercări până la blocarea cardului SIM. @@ -627,10 +627,10 @@ "Deblocare facială" "Problemă cu Deblocarea facială" "Atingeți pentru a șterge modelul facial, apoi adăugați din nou fața" - "Configurați Deblocarea facială" + "Configurează Deblocarea facială" "Deblocați-vă telefonul uitându-vă la acesta" "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" - "Configurați mai multe moduri de deblocare" + "Configurează mai multe moduri de deblocare" "Atingeți ca să adăugați o amprentă" "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" @@ -898,13 +898,13 @@ "Serviciu" "Altul" "Nu s-a găsit nicio aplicație pentru a afișa această persoană de contact." - "Introduceți codul PIN" - "Introduceți codul PUK și noul cod PIN" + "Introdu codul PIN" + "Introdu codul PUK și noul cod PIN" "Codul PUK" "Noul cod PIN" "Atingeți ca să introduceți parola" - "Introduceți parola pentru a debloca" - "Introduceți codul PIN pentru a debloca" + "Introdu parola pentru a debloca" + "Introdu codul PIN pentru a debloca" "Cod PIN incorect." "Pentru a debloca, apăsați Meniu, apoi 0." "Număr de urgență" @@ -924,8 +924,8 @@ "Nu există card SIM în computerul tablet PC." "Nu există un card SIM în dispozitivul Android TV." "Telefonul nu are card SIM." - "Introduceți un card SIM." - "Cardul SIM lipsește sau nu poate fi citit. Introduceți un card SIM." + "Introdu un card SIM." + "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." "Melodia anterioară" @@ -1073,7 +1073,7 @@ "Căutați" "Interogare de căutare" "Ștergeți interogarea" - "Trimiteți interogarea" + "Trimite interogarea" "Căutare vocală" "Activați Explorați prin atingere?" "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu tableta." @@ -1136,7 +1136,7 @@ "Ștergeți" "Copiați adresa URL" "Selectați text" - "Anulați" + "Anulează" "Repetați" "Completare automată" "Selectare text" @@ -1152,9 +1152,9 @@ "%1$s rulează acum" "Atingeți pentru mai multe informații sau pentru a opri aplicația." "OK" - "Anulați" + "Anulează" "OK" - "Anulați" + "Anulează" "Atenție" "Se încarcă…" "DA" @@ -1178,12 +1178,12 @@ "Editați cu" "Editați cu %1$s" "Editați" - "Trimiteți" + "Trimite" "Distribuiți cu %1$s" - "Trimiteți" - "Trimiteți folosind" - "Trimiteți folosind %1$s" - "Trimiteți" + "Trimite" + "Trimite folosind" + "Trimite folosind %1$s" + "Trimite" "Selectați o aplicație de pe ecranul de pornire" "Utilizați %1$s ca ecran de pornire" "Fotografiați" @@ -1193,15 +1193,15 @@ "Se utilizează în mod prestabilit pentru această acțiune." "Utilizați altă aplicație" "Ștergeți setările prestabilite din Setări de sistem > Aplicații > Descărcate." - "Alegeți o acțiune" - "Alegeți o aplicație pentru dispozitivul USB" + "Alege o acțiune" + "Alege o aplicație pentru dispozitivul USB" "Această acțiune nu poate fi efectuată de nicio aplicație." "%1$s s-a oprit" "%1$s s-a oprit" "%1$s se oprește încontinuu" "%1$s se oprește încontinuu" "Deschideți din nou aplicația" - "Trimiteți feedback" + "Trimite feedback" "Închideți" "Dezactivați până la repornirea dispozitivului" "Așteptați" @@ -1252,7 +1252,7 @@ "Continuați" "Rulează %1$s" "Atingeți pentru a reveni la joc" - "Alegeți jocul" + "Alege jocul" "Pentru o performanță mai bună, se poate deschide un singur joc odată." "Reveniți la %1$s" "Deschideți %1$s" @@ -1260,11 +1260,11 @@ "%1$s a depășit limita de memorie" "Datele privind memoria heap %1$s sunt gata" "Datele privind memoria au fost culese. Atingeți pentru a trimite." - "Trimiteți datele privind memoria?" + "Trimiți datele privind memoria?" "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." - "Alegeți o acțiune pentru text" + "Alege o acțiune pentru text" "Volum sonerie" "Volum media" "Redare prin Bluetooth" @@ -1309,17 +1309,17 @@ "un tip de rețea necunoscut" "Acceptați" - "Refuzați" - "Introduceți caracterul" + "Refuz" + "Introdu caracterul" "Se trimit mesaje SMS" "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiteți acestei aplicații să trimită în continuare mesaje?" "Permiteți" - "Refuzați" + "Refuz" "<b>%1$s</b> intenționează să trimită un mesaj la <b>%2$s</b>." "Acest lucru ""poate genera costuri"" în contul dvs. mobil." "Acest lucru va genera costuri în contul dvs. mobil." - "Trimiteți" - "Anulați" + "Trimite" + "Anulează" "Doresc să se rețină opțiunea" "Puteți modifica ulterior în Setări > Aplicații" "Permiteți întotdeauna" @@ -1373,15 +1373,15 @@ "Portul USB poate fi folosit" "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" - "Trimiteți raportul de eroare?" + "Trimiți raportul de eroare?" "Se trimite raportul de eroare…" "Administratorul dvs. a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la date și aplicații." "TRIMITEȚI" "REFUZAȚI" - "Alegeți metoda de introducere de text" + "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" "Afișați tastatura virtuală" - "Configurați tastatura fizică" + "Configurează tastatura fizică" "Atingeți pentru a selecta limba și aspectul" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1411,12 +1411,12 @@ "Selectați pentru a configura %s într-un format acceptat." "Poate fi nevoie să reformatați dispozitivul" "%s scos pe neașteptate" - "Deconectați din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" + "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" "S-a eliminat %s" - "Funcționarea ar putea fi necorespunzătoare. Introduceți un dispozitiv de stocare nou." + "Funcționarea ar putea fi necorespunzătoare. Introdu un dispozitiv de stocare nou." "Se deconectează %s" "Nu scoateți" - "Configurați" + "Configurează" "Scoateți" "Explorați" "Schimbați ieșirea" @@ -1456,7 +1456,7 @@ "Nu s-a putut adăuga widgetul." "Accesați" "Căutați" - "Trimiteți" + "Trimite" "Înainte" "Terminat" "Înapoi" @@ -1467,7 +1467,7 @@ "Permiteți această solicitare?" "Solicitare de acces" "Permiteți" - "Refuzați" + "Refuz" "Permisiune solicitată" "Permisiune solicitată\npentru contul %s." "Permisiune solicitată de %1$s\npentru contul %2$s." @@ -1491,10 +1491,10 @@ "Deconectat de la rețeaua VPN activată permanent" "Nu s-a putut conecta la rețeaua VPN activată permanent" "Modificați setările de rețea sau VPN" - "Alegeți un fișier" + "Alege un fișier" "Nu au fost găsite fișiere" "Resetați" - "Trimiteți" + "Trimite" "Aplicația pentru condus rulează" "Atingeți ca să ieșiți din aplicația pentru condus." "Înapoi" @@ -1518,9 +1518,9 @@ "Limita pentru ștergere a fost depășită" "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" "Ștergeți elementele" - "Anulați aceste ștergeri" + "Anulează aceste ștergeri" "Nu trebuie să luați nicio măsură deocamdată" - "Alegeți un cont" + "Alege un cont" "Adăugați un cont" "Adăugați un cont" "Creșteți" @@ -1542,13 +1542,13 @@ "Luna trecută" "Luna viitoare" "Alt" - "Anulați" + "Anulează" "Ștergeți" "Terminat" "Schimbarea modului" "Shift" "Enter" - "Alegeți o aplicație" + "Alege o aplicație" "Nu s-a putut lansa %s" "Permiteți accesul pentru" "Permiteți accesul pentru %s" @@ -1594,11 +1594,11 @@ "Amprentă SHA-256:" "Amprentă SHA-1:" "Afișați-le pe toate" - "Alegeți activitatea" + "Alege activitatea" "Distribuiți pentru" "Se trimite..." "Lansați browserul?" - "Acceptați apelul?" + "Accepți apelul?" "Întotdeauna" "Numai o dată" "%1$s nu acceptă profilul de serviciu" @@ -1612,12 +1612,12 @@ "Sistem" "Audio Bluetooth" "Ecran wireless" - "Trimiteți" + "Trimite" "Conectați-vă la dispozitiv" "Proiectați ecranul pe dispozitiv" "Se caută dispozitive..." "Setări" - "Deconectați-vă" + "Deconectează-te" "Se scanează..." "Se conectează..." "Disponibilă" @@ -1633,15 +1633,15 @@ "Parolă greșită" "Cod PIN greșit" "Desenați modelul" - "Introduceți codul PIN al cardului SIM" - "Introduceți codul PIN" - "Introduceți parola" + "Introdu codul PIN al cardului SIM" + "Introdu codul PIN" + "Introdu parola" "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." - "Introduceți codul PIN dorit" + "Introdu codul PIN dorit" "Confirmați codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." - "Introduceți un cod PIN format din 4 până la 8 cifre." + "Introdu un cod PIN format din 4 până la 8 cifre." "Codul PUK trebuie să conțină 8 numere." "Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." "Codurile PIN nu coincid" @@ -1686,10 +1686,10 @@ "Vă vede interacțiunile și le realizează" "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." "Permiteți" - "Refuzați" + "Refuz" "Atingeți o funcție ca să începeți să o folosiți:" "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" - "Alegeți funcțiile pentru comanda rapidă a butonului de volum" + "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" "Editați comenzile rapide" "Gata" @@ -1819,8 +1819,8 @@ "Serviciul de printare nu este activat" "Serviciul %s a fost instalat" "Atingeți pentru a activa" - "Introduceți codul PIN de administrator" - "Introduceți codul PIN" + "Introdu codul PIN de administrator" + "Introdu codul PIN" "Incorect" "Codul PIN actual" "Codul PIN nou" @@ -1926,7 +1926,7 @@ "Aplicația nu este disponibilă" "Momentan, aplicația %1$s nu este disponibilă. Aceasta este gestionată de %2$s." "Aflați mai multe" - "Anulați întreruperea aplicației" + "Anulează întreruperea aplicației" "Activați aplicațiile pentru lucru?" "Obțineți acces la aplicațiile pentru lucru și notificări" "Activați" @@ -1960,8 +1960,8 @@ "Atingeți pentru a vedea fișierele" "Fixați" "Fixați %1$s" - "Anulați fixarea" - "Anulați fixarea pentru %1$s" + "Anulează fixarea" + "Anulează fixarea pentru %1$s" "Informații despre aplicație" "−%1$s" "Se pornește demonstrația…" @@ -1983,8 +1983,8 @@ "oră" "minut" "Setați ora" - "Introduceți o oră validă" - "Introduceți ora" + "Introdu o oră validă" + "Introdu ora" "Pentru a introduce ora, comutați la modul de introducere a textului." "Pentru a introduce ora, comutați la modul ceas." "Opțiuni de completare automată" @@ -2152,23 +2152,23 @@ "Codul PIN de deblocare SIM corporativă" "Codul PIN de deblocare SIM privind furnizorul de servicii" "Codul PIN de deblocare SIM" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" "Codul PIN de deblocare RUIM Network1" "Codul PIN de deblocare RUIM Network2" "Codul PIN de deblocare RUIM Hrpd" "Codul PIN de deblocare RUIM corporativă" "Codul PIN de deblocare RUIM privind furnizorii de servicii" "Codul PIN de deblocare RUIM" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" "Codul PIN de deblocare SPN" "Codul PIN de deblocare privind furnizorul de servicii și Equivalent Home PLMN" "Codul PIN de deblocare ICCID" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 418b95cf68de..3c030a78aace 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1476,7 +1476,7 @@ "同步" "无障碍" "壁纸" - "更改壁纸" + "更换壁纸" "通知侦听器" "VR 监听器" "条件提供程序" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index eac22644a293..bae4e4f03fbc 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1559,7 +1559,7 @@ "%1$s:%2$s" "%1$s (%2$s):%3$s" "內部共用儲存空間" - "SD 記憶卡" + "SD 卡" "%s SD 卡" "USB 驅動器" "%s USB 驅動器" -- cgit v1.2.3 From efbb91582e72d48d50e1417a8393aa562f8e7cd9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 10:35:14 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ifc2223e08f27357151be75c06310bbfc03fefa5f --- core/res/res/values-or/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 4 +- core/res/res/values-ro/strings.xml | 150 ++++++++++++++++----------------- core/res/res/values-zh-rCN/strings.xml | 2 +- core/res/res/values-zh-rHK/strings.xml | 2 +- 5 files changed, 80 insertions(+), 80 deletions(-) diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 79ac29a0d3c8..dd424a1c50d4 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1267,7 +1267,7 @@ "ରିଙ୍ଗର୍‌ ଭଲ୍ୟୁମ୍" "ମିଡିଆ ଭଲ୍ୟୁମ୍‌" "ବ୍ଲୁଟୂଥ୍‍ ମାଧ୍ୟମରେ ଚାଲୁଛି" - "ରିଙ୍ଗଟୋନ୍‍‍କୁ ନିରବ ଭାବେ ସେଟ୍ କରାଯାଇଛି" + "ସାଇଲେଣ୍ଟ ରିଂଟୋନ ସେଟ ହୋଇଛି" "ଇନ୍‍-କଲ୍‍ ଭଲ୍ୟୁମ୍‌" "ବ୍ଲୁଟୂଥ୍‍ ଇନ୍-କଲ୍ ଭଲ୍ୟୁମ୍‌" "ଆଲାରାମ୍ ଭଲ୍ୟୁମ୍‌" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 9a49a601211f..c170d1c8fe15 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -58,7 +58,7 @@ "IMEI" "MEID" "ID do Autor da Chamada" - "Ocultar identificação do autor da chamada efetuada" + "Ocultar identificação do autor da chamada feita" "ID de linha ligada" "Restrição de ID de linha ligada" "Encaminhamento de chamadas" @@ -355,7 +355,7 @@ "desinstalar atalhos" "Permite que a app remova atalhos do Ecrã principal sem a intervenção do utilizador." "redirecionar as chamadas efetuadas" - "Permite que a app veja o número que é marcado durante uma chamada efetuada, com a opção de redirecionar a chamada para um número diferente ou terminar a chamada." + "Permite que a app veja o número que é marcado durante uma chamada feita, com a opção de redirecionar a chamada para um número diferente ou terminar a chamada." "atender chamadas telefónicas" "Permite que a app atenda chamadas recebidas." "receber mensagens de texto (SMS)" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0db3ffac08f6..9eb707529f90 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -45,10 +45,10 @@ "Codul PIN vechi introdus nu este corect." "Codul PUK introdus nu este corect." "Codurile PIN introduse nu se potrivesc." - "Introduceți un cod PIN alcătuit din 4 până la 8 cifre." - "Introduceți un cod PUK care să aibă 8 cifre sau mai mult." - "Cardul SIM este blocat cu codul PUK. Introduceți codul PUK pentru a-l debloca." - "Introduceți codul PUK2 pentru a debloca cardul SIM." + "Introdu un cod PIN alcătuit din 4 până la 8 cifre." + "Introdu un cod PUK care să aibă 8 cifre sau mai mult." + "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." + "Introdu codul PUK2 pentru a debloca cardul SIM." "Operațiunea nu a reușit. Activați blocarea cardului SIM/RUIM." V-au mai rămas %d încercări până la blocarea cardului SIM. @@ -627,10 +627,10 @@ "Deblocare facială" "Problemă cu Deblocarea facială" "Atingeți pentru a șterge modelul facial, apoi adăugați din nou fața" - "Configurați Deblocarea facială" + "Configurează Deblocarea facială" "Deblocați-vă telefonul uitându-vă la acesta" "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" - "Configurați mai multe moduri de deblocare" + "Configurează mai multe moduri de deblocare" "Atingeți ca să adăugați o amprentă" "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" @@ -898,13 +898,13 @@ "Serviciu" "Altul" "Nu s-a găsit nicio aplicație pentru a afișa această persoană de contact." - "Introduceți codul PIN" - "Introduceți codul PUK și noul cod PIN" + "Introdu codul PIN" + "Introdu codul PUK și noul cod PIN" "Codul PUK" "Noul cod PIN" "Atingeți ca să introduceți parola" - "Introduceți parola pentru a debloca" - "Introduceți codul PIN pentru a debloca" + "Introdu parola pentru a debloca" + "Introdu codul PIN pentru a debloca" "Cod PIN incorect." "Pentru a debloca, apăsați Meniu, apoi 0." "Număr de urgență" @@ -924,8 +924,8 @@ "Nu există card SIM în computerul tablet PC." "Nu există un card SIM în dispozitivul Android TV." "Telefonul nu are card SIM." - "Introduceți un card SIM." - "Cardul SIM lipsește sau nu poate fi citit. Introduceți un card SIM." + "Introdu un card SIM." + "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." "Melodia anterioară" @@ -1073,7 +1073,7 @@ "Căutați" "Interogare de căutare" "Ștergeți interogarea" - "Trimiteți interogarea" + "Trimite interogarea" "Căutare vocală" "Activați Explorați prin atingere?" "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu tableta." @@ -1136,7 +1136,7 @@ "Ștergeți" "Copiați adresa URL" "Selectați text" - "Anulați" + "Anulează" "Repetați" "Completare automată" "Selectare text" @@ -1152,9 +1152,9 @@ "%1$s rulează acum" "Atingeți pentru mai multe informații sau pentru a opri aplicația." "OK" - "Anulați" + "Anulează" "OK" - "Anulați" + "Anulează" "Atenție" "Se încarcă…" "DA" @@ -1178,12 +1178,12 @@ "Editați cu" "Editați cu %1$s" "Editați" - "Trimiteți" + "Trimite" "Distribuiți cu %1$s" - "Trimiteți" - "Trimiteți folosind" - "Trimiteți folosind %1$s" - "Trimiteți" + "Trimite" + "Trimite folosind" + "Trimite folosind %1$s" + "Trimite" "Selectați o aplicație de pe ecranul de pornire" "Utilizați %1$s ca ecran de pornire" "Fotografiați" @@ -1193,15 +1193,15 @@ "Se utilizează în mod prestabilit pentru această acțiune." "Utilizați altă aplicație" "Ștergeți setările prestabilite din Setări de sistem > Aplicații > Descărcate." - "Alegeți o acțiune" - "Alegeți o aplicație pentru dispozitivul USB" + "Alege o acțiune" + "Alege o aplicație pentru dispozitivul USB" "Această acțiune nu poate fi efectuată de nicio aplicație." "%1$s s-a oprit" "%1$s s-a oprit" "%1$s se oprește încontinuu" "%1$s se oprește încontinuu" "Deschideți din nou aplicația" - "Trimiteți feedback" + "Trimite feedback" "Închideți" "Dezactivați până la repornirea dispozitivului" "Așteptați" @@ -1252,7 +1252,7 @@ "Continuați" "Rulează %1$s" "Atingeți pentru a reveni la joc" - "Alegeți jocul" + "Alege jocul" "Pentru o performanță mai bună, se poate deschide un singur joc odată." "Reveniți la %1$s" "Deschideți %1$s" @@ -1260,11 +1260,11 @@ "%1$s a depășit limita de memorie" "Datele privind memoria heap %1$s sunt gata" "Datele privind memoria au fost culese. Atingeți pentru a trimite." - "Trimiteți datele privind memoria?" + "Trimiți datele privind memoria?" "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." - "Alegeți o acțiune pentru text" + "Alege o acțiune pentru text" "Volum sonerie" "Volum media" "Redare prin Bluetooth" @@ -1309,17 +1309,17 @@ "un tip de rețea necunoscut" "Acceptați" - "Refuzați" - "Introduceți caracterul" + "Refuz" + "Introdu caracterul" "Se trimit mesaje SMS" "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiteți acestei aplicații să trimită în continuare mesaje?" "Permiteți" - "Refuzați" + "Refuz" "<b>%1$s</b> intenționează să trimită un mesaj la <b>%2$s</b>." "Acest lucru ""poate genera costuri"" în contul dvs. mobil." "Acest lucru va genera costuri în contul dvs. mobil." - "Trimiteți" - "Anulați" + "Trimite" + "Anulează" "Doresc să se rețină opțiunea" "Puteți modifica ulterior în Setări > Aplicații" "Permiteți întotdeauna" @@ -1373,15 +1373,15 @@ "Portul USB poate fi folosit" "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" - "Trimiteți raportul de eroare?" + "Trimiți raportul de eroare?" "Se trimite raportul de eroare…" "Administratorul dvs. a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la date și aplicații." "TRIMITEȚI" "REFUZAȚI" - "Alegeți metoda de introducere de text" + "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" "Afișați tastatura virtuală" - "Configurați tastatura fizică" + "Configurează tastatura fizică" "Atingeți pentru a selecta limba și aspectul" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1411,12 +1411,12 @@ "Selectați pentru a configura %s într-un format acceptat." "Poate fi nevoie să reformatați dispozitivul" "%s scos pe neașteptate" - "Deconectați din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" + "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" "S-a eliminat %s" - "Funcționarea ar putea fi necorespunzătoare. Introduceți un dispozitiv de stocare nou." + "Funcționarea ar putea fi necorespunzătoare. Introdu un dispozitiv de stocare nou." "Se deconectează %s" "Nu scoateți" - "Configurați" + "Configurează" "Scoateți" "Explorați" "Schimbați ieșirea" @@ -1456,7 +1456,7 @@ "Nu s-a putut adăuga widgetul." "Accesați" "Căutați" - "Trimiteți" + "Trimite" "Înainte" "Terminat" "Înapoi" @@ -1467,7 +1467,7 @@ "Permiteți această solicitare?" "Solicitare de acces" "Permiteți" - "Refuzați" + "Refuz" "Permisiune solicitată" "Permisiune solicitată\npentru contul %s." "Permisiune solicitată de %1$s\npentru contul %2$s." @@ -1491,10 +1491,10 @@ "Deconectat de la rețeaua VPN activată permanent" "Nu s-a putut conecta la rețeaua VPN activată permanent" "Modificați setările de rețea sau VPN" - "Alegeți un fișier" + "Alege un fișier" "Nu au fost găsite fișiere" "Resetați" - "Trimiteți" + "Trimite" "Aplicația pentru condus rulează" "Atingeți ca să ieșiți din aplicația pentru condus." "Înapoi" @@ -1518,9 +1518,9 @@ "Limita pentru ștergere a fost depășită" "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" "Ștergeți elementele" - "Anulați aceste ștergeri" + "Anulează aceste ștergeri" "Nu trebuie să luați nicio măsură deocamdată" - "Alegeți un cont" + "Alege un cont" "Adăugați un cont" "Adăugați un cont" "Creșteți" @@ -1542,13 +1542,13 @@ "Luna trecută" "Luna viitoare" "Alt" - "Anulați" + "Anulează" "Ștergeți" "Terminat" "Schimbarea modului" "Shift" "Enter" - "Alegeți o aplicație" + "Alege o aplicație" "Nu s-a putut lansa %s" "Permiteți accesul pentru" "Permiteți accesul pentru %s" @@ -1594,11 +1594,11 @@ "Amprentă SHA-256:" "Amprentă SHA-1:" "Afișați-le pe toate" - "Alegeți activitatea" + "Alege activitatea" "Distribuiți pentru" "Se trimite..." "Lansați browserul?" - "Acceptați apelul?" + "Accepți apelul?" "Întotdeauna" "Numai o dată" "%1$s nu acceptă profilul de serviciu" @@ -1612,12 +1612,12 @@ "Sistem" "Audio Bluetooth" "Ecran wireless" - "Trimiteți" + "Trimite" "Conectați-vă la dispozitiv" "Proiectați ecranul pe dispozitiv" "Se caută dispozitive..." "Setări" - "Deconectați-vă" + "Deconectează-te" "Se scanează..." "Se conectează..." "Disponibilă" @@ -1633,15 +1633,15 @@ "Parolă greșită" "Cod PIN greșit" "Desenați modelul" - "Introduceți codul PIN al cardului SIM" - "Introduceți codul PIN" - "Introduceți parola" + "Introdu codul PIN al cardului SIM" + "Introdu codul PIN" + "Introdu parola" "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." - "Introduceți codul PIN dorit" + "Introdu codul PIN dorit" "Confirmați codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." - "Introduceți un cod PIN format din 4 până la 8 cifre." + "Introdu un cod PIN format din 4 până la 8 cifre." "Codul PUK trebuie să conțină 8 numere." "Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." "Codurile PIN nu coincid" @@ -1686,10 +1686,10 @@ "Vă vede interacțiunile și le realizează" "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." "Permiteți" - "Refuzați" + "Refuz" "Atingeți o funcție ca să începeți să o folosiți:" "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" - "Alegeți funcțiile pentru comanda rapidă a butonului de volum" + "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" "Editați comenzile rapide" "Gata" @@ -1819,8 +1819,8 @@ "Serviciul de printare nu este activat" "Serviciul %s a fost instalat" "Atingeți pentru a activa" - "Introduceți codul PIN de administrator" - "Introduceți codul PIN" + "Introdu codul PIN de administrator" + "Introdu codul PIN" "Incorect" "Codul PIN actual" "Codul PIN nou" @@ -1926,7 +1926,7 @@ "Aplicația nu este disponibilă" "Momentan, aplicația %1$s nu este disponibilă. Aceasta este gestionată de %2$s." "Aflați mai multe" - "Anulați întreruperea aplicației" + "Anulează întreruperea aplicației" "Activați aplicațiile pentru lucru?" "Obțineți acces la aplicațiile pentru lucru și notificări" "Activați" @@ -1960,8 +1960,8 @@ "Atingeți pentru a vedea fișierele" "Fixați" "Fixați %1$s" - "Anulați fixarea" - "Anulați fixarea pentru %1$s" + "Anulează fixarea" + "Anulează fixarea pentru %1$s" "Informații despre aplicație" "−%1$s" "Se pornește demonstrația…" @@ -1983,8 +1983,8 @@ "oră" "minut" "Setați ora" - "Introduceți o oră validă" - "Introduceți ora" + "Introdu o oră validă" + "Introdu ora" "Pentru a introduce ora, comutați la modul de introducere a textului." "Pentru a introduce ora, comutați la modul ceas." "Opțiuni de completare automată" @@ -2152,23 +2152,23 @@ "Codul PIN de deblocare SIM corporativă" "Codul PIN de deblocare SIM privind furnizorul de servicii" "Codul PIN de deblocare SIM" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" "Codul PIN de deblocare RUIM Network1" "Codul PIN de deblocare RUIM Network2" "Codul PIN de deblocare RUIM Hrpd" "Codul PIN de deblocare RUIM corporativă" "Codul PIN de deblocare RUIM privind furnizorii de servicii" "Codul PIN de deblocare RUIM" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" - "Introduceți codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" + "Introdu codul PUK" "Codul PIN de deblocare SPN" "Codul PIN de deblocare privind furnizorul de servicii și Equivalent Home PLMN" "Codul PIN de deblocare ICCID" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 418b95cf68de..3c030a78aace 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1476,7 +1476,7 @@ "同步" "无障碍" "壁纸" - "更改壁纸" + "更换壁纸" "通知侦听器" "VR 监听器" "条件提供程序" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index eac22644a293..bae4e4f03fbc 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1559,7 +1559,7 @@ "%1$s:%2$s" "%1$s (%2$s):%3$s" "內部共用儲存空間" - "SD 記憶卡" + "SD 卡" "%s SD 卡" "USB 驅動器" "%s USB 驅動器" -- cgit v1.2.3 From 39549af0ee0385569cfb7cb869571684a18760d1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 10:43:41 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I73487918a00ab3d2f4ac65c44ead062a17cec7ba --- .../res/values-ro/strings.xml | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml index fccef23bc89d..9147ccdc9329 100644 --- a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml @@ -16,22 +16,22 @@ - "Copiere de rezervă completă" + "Backup complet" "Restabilire completă" - "S-a solicitat crearea unei copii de rezervă complete a tuturor datelor pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu ați solicitat dvs. copierea de rezervă, nu permiteți ca operațiunea să continue." - "Faceți backup pentru date" - "Nu creați copii de rezervă" - "S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu dvs. ați solicitat această restabilire, nu permiteți continuarea operațiunii. Acest proces va înlocui toate datele existente în prezent pe dispozitiv!" - "Restabiliți datele dvs." - "Nu restabiliți" - "Introduceți mai jos parola actuală pentru copia de rezervă:" - "Introduceți mai jos parola pentru criptarea dispozitivului." - "Introduceți mai jos parola de criptare a dispozitivului. Aceasta va fi utilizată, de asemenea, pentru a cripta arhiva copiei de rezervă." - "Introduceți o parolă pentru a o utiliza la criptarea datelor copiei de rezervă complete. Dacă acest câmp rămâne necompletat, pentru copierea de rezervă se va utiliza parola dvs. actuală." - "Dacă doriți să criptați datele copiei de rezervă complete, introduceți o parolă mai jos:" - "Dacă datele pentru restabilire sunt criptate, introduceți parola mai jos:" - "Se începe copierea de rezervă..." - "Copierea de rezervă a fost finalizată" + "S-a solicitat crearea unui backup complet pentru toate datele pe un computer desktop conectat. Permiți acest lucru?\n\nDacă nu tu ai solicitat backupul, nu permite ca operațiunea să continue." + "Fă backup pentru date" + "Nu face backup" + "S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Permiți acest lucru?\n\nDacă nu tu ai solicitat această restabilire, nu permite continuarea operațiunii. Acest proces va înlocui toate datele existente pe dispozitiv!" + "Restabilește datele" + "Nu restabili" + "Introdu mai jos parola actuală pentru backup:" + "Introdu mai jos parola pentru criptarea dispozitivului." + "Introdu mai jos parola de criptare a dispozitivului. Aceasta va fi folosită și pentru a cripta arhiva backupului." + "Introdu o parolă pentru a o folosi la criptarea datelor backupului complet. Dacă acest câmp rămâne necompletat, pentru backup se va folosi parola actuală:" + "Dacă vrei să criptezi datele backupului complet, introdu o parolă mai jos:" + "Dacă datele pentru restabilire sunt criptate, introdu parola mai jos:" + "Se începe backupul..." + "Backup terminat" "Se pornește restabilirea..." "Restabilirea s-a încheiat" "Operația a expirat" -- cgit v1.2.3 From 3d6ad7680418a32f7f8b3775cf654da2ec882e7c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 10:47:06 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ief1c606913895a76481da9ffedda0080c2a7d8e1 --- .../res/values-ro/strings.xml | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml index fccef23bc89d..9147ccdc9329 100644 --- a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml @@ -16,22 +16,22 @@ - "Copiere de rezervă completă" + "Backup complet" "Restabilire completă" - "S-a solicitat crearea unei copii de rezervă complete a tuturor datelor pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu ați solicitat dvs. copierea de rezervă, nu permiteți ca operațiunea să continue." - "Faceți backup pentru date" - "Nu creați copii de rezervă" - "S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu dvs. ați solicitat această restabilire, nu permiteți continuarea operațiunii. Acest proces va înlocui toate datele existente în prezent pe dispozitiv!" - "Restabiliți datele dvs." - "Nu restabiliți" - "Introduceți mai jos parola actuală pentru copia de rezervă:" - "Introduceți mai jos parola pentru criptarea dispozitivului." - "Introduceți mai jos parola de criptare a dispozitivului. Aceasta va fi utilizată, de asemenea, pentru a cripta arhiva copiei de rezervă." - "Introduceți o parolă pentru a o utiliza la criptarea datelor copiei de rezervă complete. Dacă acest câmp rămâne necompletat, pentru copierea de rezervă se va utiliza parola dvs. actuală." - "Dacă doriți să criptați datele copiei de rezervă complete, introduceți o parolă mai jos:" - "Dacă datele pentru restabilire sunt criptate, introduceți parola mai jos:" - "Se începe copierea de rezervă..." - "Copierea de rezervă a fost finalizată" + "S-a solicitat crearea unui backup complet pentru toate datele pe un computer desktop conectat. Permiți acest lucru?\n\nDacă nu tu ai solicitat backupul, nu permite ca operațiunea să continue." + "Fă backup pentru date" + "Nu face backup" + "S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Permiți acest lucru?\n\nDacă nu tu ai solicitat această restabilire, nu permite continuarea operațiunii. Acest proces va înlocui toate datele existente pe dispozitiv!" + "Restabilește datele" + "Nu restabili" + "Introdu mai jos parola actuală pentru backup:" + "Introdu mai jos parola pentru criptarea dispozitivului." + "Introdu mai jos parola de criptare a dispozitivului. Aceasta va fi folosită și pentru a cripta arhiva backupului." + "Introdu o parolă pentru a o folosi la criptarea datelor backupului complet. Dacă acest câmp rămâne necompletat, pentru backup se va folosi parola actuală:" + "Dacă vrei să criptezi datele backupului complet, introdu o parolă mai jos:" + "Dacă datele pentru restabilire sunt criptate, introdu parola mai jos:" + "Se începe backupul..." + "Backup terminat" "Se pornește restabilirea..." "Restabilirea s-a încheiat" "Operația a expirat" -- cgit v1.2.3 From c6f1ef3f16b6c5cd89f3e8c3a487add1aad00986 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 10:56:41 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6a191fcd31b0e560c3b5e1b44b6a4bcfb55a2f9b --- packages/VpnDialogs/res/values-ro/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml index 5bda87e5c257..191736e0088f 100644 --- a/packages/VpnDialogs/res/values-ro/strings.xml +++ b/packages/VpnDialogs/res/values-ro/strings.xml @@ -24,14 +24,14 @@ "Durată:" "Trimise:" "Primite:" - "%1$s octeți/%2$s pachete" + "%1$s byți/%2$s pachete" "Nu se poate conecta la rețeaua VPN activată permanent" "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Telefonul dvs. va folosi o rețea publică până când se va putea reconecta la %1$s." "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Nu veți avea conexiune până când se va putea reconecta rețeaua VPN." " " "Modificați setările VPN" - "Configurați" - "Deconectați" + "Configurează" + "Deconectează" "Deschideți aplicația" "Închideți" -- cgit v1.2.3 From 753d359ba4c2e38816165703ed8ec26a3ae0b647 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 11:43:56 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0efc1ba1281d2347216567629ba4b61e4476e954 --- libs/WindowManager/Shell/res/values-ro/strings_tv.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml index 56dadb2e5e65..ad872f8be9ba 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml @@ -19,12 +19,12 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Picture-in-picture" "(Program fără titlu)" - "Închideți" + "Închide" "Ecran complet" "Mutați" "Extindeți" "Restrângeți" - " Apăsați de două ori ""butonul ecran de pornire"" pentru comenzi" + " Apasă de două ori ""butonul ecran de pornire"" pentru comenzi" "Meniu picture-in-picture." "Mutați spre stânga" "Mutați spre dreapta" -- cgit v1.2.3 From 9548c9c54f75ce84de9d4bbd06967b7b6cfa1eff Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 11:48:23 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8364898da8b76e0d17a226f308299cf9e292fb86 --- libs/WindowManager/Shell/res/values-ro/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 804d34f980ff..d71e0126001b 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -17,7 +17,7 @@ - "Închideți" + "Închide" "Extindeți" "Setări" "Accesați ecranul împărțit" @@ -30,7 +30,7 @@ "Treceți la cel anterior" "Redimensionați" "Stocați" - "Anulați stocarea" + "Anulează stocarea" "Este posibil ca aplicația să nu funcționeze cu ecranul împărțit." "Aplicația nu acceptă ecranul împărțit." "Este posibil ca aplicația să nu funcționeze pe un ecran secundar." @@ -52,7 +52,7 @@ "Părăsiți modul cu o mână" "Setări pentru baloanele %1$s" "Suplimentar" - "Adăugați înapoi în stivă" + "Adaugă înapoi în stivă" "%1$s de la %2$s" "%1$s de la %2$s și încă %3$d" "Mutați în stânga sus" @@ -60,7 +60,7 @@ "Mutați în stânga jos" "Mutați în dreapta jos" "Setări %1$s" - "Închideți balonul" + "Închide balonul" "Nu afișați conversația în balon" "Chat cu baloane" "Conversațiile noi apar ca pictograme flotante sau baloane. Atingeți pentru a deschide balonul. Trageți pentru a-l muta." @@ -77,8 +77,8 @@ "Nu ați remediat problema?\nAtingeți pentru a reveni" "Nu aveți probleme cu camera foto? Atingeți pentru a închide." "Unele aplicații funcționează cel mai bine în orientarea portret" - "Încercați una dintre aceste opțiuni pentru a profita din plin de spațiu" + "Încearcă una dintre aceste opțiuni pentru a profita din plin de spațiu" "Rotiți dispozitivul pentru a trece în modul ecran complet" - "Atingeți de două ori lângă o aplicație pentru a o repoziționa" + "Atinge de două ori lângă o aplicație pentru a o repoziționa" "OK" -- cgit v1.2.3 From 1a0d129a4e1dbf3aaa439d59c071972846d77b09 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 11:53:09 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5a2e2814c623607137d0aa993d59e8c1e146223e --- packages/CompanionDeviceManager/res/values-hi/strings.xml | 2 +- packages/CompanionDeviceManager/res/values-ko/strings.xml | 2 +- packages/CompanionDeviceManager/res/values-pl/strings.xml | 2 +- packages/CompanionDeviceManager/res/values-ro/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml index 1ac399946cbe..dfe5038541ea 100644 --- a/packages/CompanionDeviceManager/res/values-hi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml @@ -34,7 +34,7 @@ "इससे सभी सूचनाएं देखी जा सकती हैं. इसमें संपर्क, मैसेज, और फ़ोटो जैसी जानकारी शामिल होती है" "फ़ोटो और मीडिया" - "Google Play सेवाएं" + "Google Play services" "%1$s आपके %2$s की ओर से, डिवाइसों के बीच ऐप्लिकेशन को स्ट्रीम करने की अनुमति मांग रहा है" "डिवाइस" diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml index 4451cb93456c..5c0e005bbb68 100644 --- a/packages/CompanionDeviceManager/res/values-ko/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml @@ -23,7 +23,7 @@ "이 앱은 %1$s 프로필을 관리하는 데 필요합니다. %2$s에서 알림과 상호작용하고 내 전화, SMS, 연락처, Calendar, 통화 기록, 근처 기기에 대한 권한을 갖게 됩니다." "앱" "휴대전화의 앱을 스트리밍합니다." - "<strong>%1$s</strong> 앱이 휴대전화에서 이 정보에 액세스하도록 허용합니다." + "<strong>%1$s</strong>이 휴대전화의 이 정보에 액세스하도록 허용합니다." "교차 기기 서비스" "%1$s에서 %2$s 대신 휴대전화의 사진, 미디어, 알림에 액세스할 수 있는 권한을 요청하고 있습니다." diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml index 08f6880afa9c..814bc0c775bb 100644 --- a/packages/CompanionDeviceManager/res/values-pl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml @@ -23,7 +23,7 @@ "Ta aplikacja jest niezbędna do zarządzania profilem %1$s. Aplikacja %2$s będzie mogła korzystać z powiadomień oraz uprawnień dotyczących telefonu, SMS-ów, kontaktów, kalendarza, rejestrów połączeń i urządzeń w pobliżu." "Aplikacje" "Odtwarzaj strumieniowo aplikacje z telefonu" - "Zezwól aplikacji <strong>%1$s</strong> na dostęp do tych informacji na Twoim telefonie" + "Zezwól urządzeniu <strong>%1$s</strong> na dostęp do tych informacji na Twoim telefonie" "Usługi na innym urządzeniu" "Aplikacja %1$s prosi w imieniu urządzenia %2$s o uprawnienia dotyczące dostępu do zdjęć, multimediów i powiadomień na telefonie" diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml index b6f8ff7a89b7..8870335318a8 100644 --- a/packages/CompanionDeviceManager/res/values-ro/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml @@ -19,7 +19,7 @@ "Manager de dispozitiv Companion" "Permiteți ca <strong>%1$s</strong> să vă acceseze dispozitivul <strong>%2$s</strong>" "ceas" - "Alegeți un profil %1$s pe care să îl gestioneze <strong>%2$s</strong>" + "Alege un profil %1$s pe care să îl gestioneze <strong>%2$s</strong>" "Această aplicație este necesară pentru a gestiona %1$s. %2$s va putea să interacționeze cu notificările dvs. și să vă acceseze permisiunile pentru Telefon, SMS, Agendă, Calendar, Jurnale de apeluri și Dispozitive din apropiere." "Aplicații" "Să redea în stream aplicațiile telefonului" -- cgit v1.2.3 From 54c6bf03fc603bd6f00ef726a654dfe55e9980c0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 12:25:06 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iae2cdba22e0faa11288da03c5c754fb3326c4258 --- .../DynamicSystemInstallationService/res/values-ro/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml index 27b88db6eef4..22a46d5ec748 100644 --- a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -1,16 +1,16 @@ - "Introduceți parola și accesați Actualizările de sistem dinamice" + "Introdu parola și accesați Actualizările de sistem dinamice" "Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul." "Se instalează" "Instalarea nu a reușit" "Nu s-a validat imaginea. Abandonați instalarea." - "Rulăm un sistem dinamic. Reporniți pentru a folosi versiunea Android inițială." - "Anulați" + "Rulăm un sistem dinamic. Repornește pentru a folosi versiunea Android inițială." + "Anulează" "Renunțați" - "Reporniți" - "Reporniți" + "Repornește" + "Repornește" "S-a renunțat la sistemul dinamic" "Nu se poate reporni sau încărca sistemul dinamic" "Sistemul dinamic nu a fost dezactivat" -- cgit v1.2.3 From c3da8cb0bdf867bb26ff1cd0401561d403978141 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 12:27:09 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I662f7ac072174ec8309376766f5614d0a748a10a --- .../DynamicSystemInstallationService/res/values-ro/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml index 27b88db6eef4..22a46d5ec748 100644 --- a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -1,16 +1,16 @@ - "Introduceți parola și accesați Actualizările de sistem dinamice" + "Introdu parola și accesați Actualizările de sistem dinamice" "Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul." "Se instalează" "Instalarea nu a reușit" "Nu s-a validat imaginea. Abandonați instalarea." - "Rulăm un sistem dinamic. Reporniți pentru a folosi versiunea Android inițială." - "Anulați" + "Rulăm un sistem dinamic. Repornește pentru a folosi versiunea Android inițială." + "Anulează" "Renunțați" - "Reporniți" - "Reporniți" + "Repornește" + "Repornește" "S-a renunțat la sistemul dinamic" "Nu se poate reporni sau încărca sistemul dinamic" "Sistemul dinamic nu a fost dezactivat" -- cgit v1.2.3 From 905660aea2ef4fdce0e1654c2e40409349431371 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:06:22 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I45cc9697a205c966916f92dd14f53d5f96b13c21 --- packages/PackageInstaller/res/values-ro/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 03cb145e84da..1f156190b5fd 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -17,10 +17,10 @@ "Program de instalare a pachetelor" - "Instalați" - "Actualizați" + "Instalează" + "Actualizează" "Gata" - "Anulați" + "Anulează" "Se instalează…" "Se instalează %1$s…" "Aplicație instalată." @@ -36,7 +36,7 @@ "Aplicația %1$s nu a putut fi instalată pe tableta dvs." "Aplicația %1$s nu a putut fi instalată pe televizorul dvs." "Aplicația %1$s nu a putut fi instalată pe telefonul dvs." - "Deschideți" + "Deschide" "Administratorul nu permite instalarea aplicațiilor obținute din surse necunoscute" "Aplicațiile necunoscute nu pot fi instalate de acest utilizator" "Acest utilizator nu are permisiunea să instaleze aplicații" -- cgit v1.2.3 From 3429b29ce3e250295d86c1fc60f6cccc963c6ce1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:08:02 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I084abca9265b57b4e905f29bec6d8a561aaca897 --- packages/PackageInstaller/res/values-it/strings.xml | 2 +- packages/PackageInstaller/res/values-ro/strings.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index 74f7d908120f..3fe7ba4d8884 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -37,7 +37,7 @@ "Impossibile installare %1$s sulla TV." "Impossibile installare %1$s sul telefono." "Apri" - "L\'amministratore non consente l\'installazione di app ottenute da fonti sconosciute" + "L\'amministratore non consente l\'installazione di app ottenute da origini sconosciute" "Questo utente non può installare app sconosciute" "L\'utente non è autorizzato a installare app" "OK" diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 03cb145e84da..1f156190b5fd 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -17,10 +17,10 @@ "Program de instalare a pachetelor" - "Instalați" - "Actualizați" + "Instalează" + "Actualizează" "Gata" - "Anulați" + "Anulează" "Se instalează…" "Se instalează %1$s…" "Aplicație instalată." @@ -36,7 +36,7 @@ "Aplicația %1$s nu a putut fi instalată pe tableta dvs." "Aplicația %1$s nu a putut fi instalată pe televizorul dvs." "Aplicația %1$s nu a putut fi instalată pe telefonul dvs." - "Deschideți" + "Deschide" "Administratorul nu permite instalarea aplicațiilor obținute din surse necunoscute" "Aplicațiile necunoscute nu pot fi instalate de acest utilizator" "Acest utilizator nu are permisiunea să instaleze aplicații" -- cgit v1.2.3 From b58f813c0951a1747441cd2f7b3e4fded999e5f1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:13:02 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iff3665156128ed7749d73cfbd15646c87f9cd393 --- packages/PrintSpooler/res/values-ro/strings.xml | 42 ++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index e0fb0b89ea88..507088fdbe03 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -27,15 +27,15 @@ "Față-verso" "Orientare" "Pagini" - "Selectați imprimanta" + "Selectează imprimanta" "Toate cele %1$s" "Intervalul de %1$s" "de ex. 1-5, 8, 11-13" - "Previzualizați printarea" - "Instalați PDF viewer pentru previzualizare" + "Previzualizează printarea" + "Instalează PDF viewer pentru previzualizare" "Aplicația de printare s-a blocat" "Se generează sarcină printare" - "Salvați ca PDF" + "Salvează ca PDF" "Toate imprimantele..." "Caseta de dialog de printare" "%1$d/%2$d" @@ -43,18 +43,18 @@ "Rezumat, copii %1$s, dimensiunea paginii %2$s" "Ghidaj de extindere" "Ghidaj de restrângere" - "Printați" - "Salvați în format PDF" + "Printează" + "Salvează în format PDF" "Opțiuni de printare extinse" "Opțiuni de printare restrânse" - "Căutați" + "Caută" "Toate imprimantele" - "Adăugați un serviciu" + "Adaugă un serviciu" "Caseta de căutare este afișată" "Caseta de căutare este ascunsă" - "Adăugați o imprimantă" - "Selectați imprimanta" - "Omiteți imprimanta" + "Adaugă o imprimantă" + "Selectează imprimanta" + "Omite imprimanta" %1$s imprimante găsite %1$s de imprimante găsite @@ -70,26 +70,26 @@ "Niciun serviciu de printare activat" "Nu au fost găsite imprimante" "Nu pot fi adăugate imprimante" - "Selectați pentru a adăuga o imprimantă" - "Selectați pentru a activa" + "Selectează pentru a adăuga o imprimantă" + "Selectează pentru a activa" "Servicii activate" "Servicii recomandate" "Servicii dezactivate" "Toate serviciile" - Instalați pentru a descoperi %1$s imprimante - Instalați pentru a descoperi %1$s de imprimante - Instalați pentru a descoperi %1$s imprimantă + Instalează pentru a descoperi %1$s imprimante + Instalează pentru a descoperi %1$s de imprimante + Instalează pentru a descoperi %1$s imprimantă "Se printează %1$s" "Se anulează %1$s" "Eroare de printare: %1$s" "Printare blocată: %1$s" - "Anulați" - "Reporniți" + "Anulează" + "Repornește" "Nu există conexiune la o imprimantă" "necunoscut" - "Folosiți %1$s?" + "Folosești %1$s?" "Documentul poate trece prin unul sau mai multe servere pe calea spre imprimantă." "Alb-negru" @@ -105,8 +105,8 @@ "Peisaj" "Nu s-a putut scrie în fișier." - "Ne pare rău, operațiunea nu a reușit. Încercați din nou." - "Reîncercați" + "Ne pare rău, operațiunea nu a reușit. Încearcă din nou." + "Reîncearcă" "Această imprimantă nu este disponibilă momentan." "Previzualizarea nu se poate afișa" "Se pregătește previzualizarea..." -- cgit v1.2.3 From e2348782a21ceb772efe707ad61fe6092d51e1ca Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:15:01 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib9a94b4696ed915f7911ecb142d7419928476086 --- packages/PrintSpooler/res/values-am/strings.xml | 2 +- .../PrintSpooler/res/values-es-rUS/strings.xml | 2 ++ packages/PrintSpooler/res/values-es/strings.xml | 2 ++ .../PrintSpooler/res/values-fr-rCA/strings.xml | 2 ++ packages/PrintSpooler/res/values-fr/strings.xml | 2 ++ packages/PrintSpooler/res/values-it/strings.xml | 2 ++ .../PrintSpooler/res/values-pt-rBR/strings.xml | 2 ++ .../PrintSpooler/res/values-pt-rPT/strings.xml | 2 ++ packages/PrintSpooler/res/values-pt/strings.xml | 2 ++ packages/PrintSpooler/res/values-ro/strings.xml | 42 +++++++++++----------- 10 files changed, 38 insertions(+), 22 deletions(-) diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 832b8551f5d6..c1cec384be33 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -41,7 +41,7 @@ "%1$d/%2$d" "ገጽ %1$d%2$d" "ማጠቃለያ፣ ቅጂዎች %1$s፣ የወረቀት መጠን %2$s" - "እጀታን ወደ ውጪ ላክ" + "እጀታን ወደ ውጭ ላክ" "እጀታን ሰብስብ" "አትም" "ወደ ፔዲኤፍ አስቀምጥ" diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 441ae73877c0..90c1937a2891 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -56,6 +56,7 @@ "Seleccionar impresora" "No recordar impresora" + %1$s printers found Se encontraron %1$s impresoras. Se encontró %1$s impresora. @@ -76,6 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" + Install to discover %1$s printers Instala para ver %1$s impresoras Instala para ver %1$s impresora diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index c1ff28207ac3..18e56dbcd6fc 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -56,6 +56,7 @@ "Seleccionar impresora" "Olvidar impresora" + %1$s printers found Se han encontrado %1$s impresoras Se ha encontrado %1$s impresora @@ -76,6 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" + Install to discover %1$s printers Instalar para descubrir %1$s impresoras Instalar para descubrir %1$s impresora diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index 3b7775a97dde..082c148746a3 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -57,6 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée + %1$s printers found %1$s imprimante trouvées "%1$s - %2$s" @@ -77,6 +78,7 @@ "Tous les services" Installer pour détecter %1$s imprimante + Install to discover %1$s printers Installer pour détecter %1$s imprimantes "Impression de %1$s en cours…" diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index f6e901de8393..560c5dcfe924 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -57,6 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée + %1$s printers found %1$s imprimantes trouvées "%1$s%2$s" @@ -77,6 +78,7 @@ "Tous les services" Installer pour détecter %1$s imprimante + Install to discover %1$s printers Installer pour détecter %1$s imprimantes "Impression de \"%1$s\" en cours…" diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 96751ea12081..569bbc2ef045 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -56,6 +56,7 @@ "Seleziona stampante" "Elimina stampante" + %1$s printers found %1$s stampanti trovate %1$s stampante trovata @@ -76,6 +77,7 @@ "Servizi disattivati" "Tutti i servizi" + Install to discover %1$s printers Installa per rilevare %1$s stampanti Installa per rilevare %1$s stampante diff --git a/packages/PrintSpooler/res/values-pt-rBR/strings.xml b/packages/PrintSpooler/res/values-pt-rBR/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -57,6 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas + %1$s printers found %1$s impressoras encontradas "%1$s - %2$s" @@ -77,6 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras + Install to discover %1$s printers Instale para encontrar %1$s impressoras "Imprimindo %1$s" diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index 4517efe0934a..8c1087e463a0 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -56,6 +56,7 @@ "Selecionar impressora" "Esquecer impressora" + %1$s printers found %1$s impressoras encontradas %1$s impressora encontrada @@ -76,6 +77,7 @@ "Serviços desativados" "Todos os serviços" + Install to discover %1$s printers Instale para detetar %1$s impressoras Instale para detetar %1$s impressora diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -57,6 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas + %1$s printers found %1$s impressoras encontradas "%1$s - %2$s" @@ -77,6 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras + Install to discover %1$s printers Instale para encontrar %1$s impressoras "Imprimindo %1$s" diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index e0fb0b89ea88..507088fdbe03 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -27,15 +27,15 @@ "Față-verso" "Orientare" "Pagini" - "Selectați imprimanta" + "Selectează imprimanta" "Toate cele %1$s" "Intervalul de %1$s" "de ex. 1-5, 8, 11-13" - "Previzualizați printarea" - "Instalați PDF viewer pentru previzualizare" + "Previzualizează printarea" + "Instalează PDF viewer pentru previzualizare" "Aplicația de printare s-a blocat" "Se generează sarcină printare" - "Salvați ca PDF" + "Salvează ca PDF" "Toate imprimantele..." "Caseta de dialog de printare" "%1$d/%2$d" @@ -43,18 +43,18 @@ "Rezumat, copii %1$s, dimensiunea paginii %2$s" "Ghidaj de extindere" "Ghidaj de restrângere" - "Printați" - "Salvați în format PDF" + "Printează" + "Salvează în format PDF" "Opțiuni de printare extinse" "Opțiuni de printare restrânse" - "Căutați" + "Caută" "Toate imprimantele" - "Adăugați un serviciu" + "Adaugă un serviciu" "Caseta de căutare este afișată" "Caseta de căutare este ascunsă" - "Adăugați o imprimantă" - "Selectați imprimanta" - "Omiteți imprimanta" + "Adaugă o imprimantă" + "Selectează imprimanta" + "Omite imprimanta" %1$s imprimante găsite %1$s de imprimante găsite @@ -70,26 +70,26 @@ "Niciun serviciu de printare activat" "Nu au fost găsite imprimante" "Nu pot fi adăugate imprimante" - "Selectați pentru a adăuga o imprimantă" - "Selectați pentru a activa" + "Selectează pentru a adăuga o imprimantă" + "Selectează pentru a activa" "Servicii activate" "Servicii recomandate" "Servicii dezactivate" "Toate serviciile" - Instalați pentru a descoperi %1$s imprimante - Instalați pentru a descoperi %1$s de imprimante - Instalați pentru a descoperi %1$s imprimantă + Instalează pentru a descoperi %1$s imprimante + Instalează pentru a descoperi %1$s de imprimante + Instalează pentru a descoperi %1$s imprimantă "Se printează %1$s" "Se anulează %1$s" "Eroare de printare: %1$s" "Printare blocată: %1$s" - "Anulați" - "Reporniți" + "Anulează" + "Repornește" "Nu există conexiune la o imprimantă" "necunoscut" - "Folosiți %1$s?" + "Folosești %1$s?" "Documentul poate trece prin unul sau mai multe servere pe calea spre imprimantă." "Alb-negru" @@ -105,8 +105,8 @@ "Peisaj" "Nu s-a putut scrie în fișier." - "Ne pare rău, operațiunea nu a reușit. Încercați din nou." - "Reîncercați" + "Ne pare rău, operațiunea nu a reușit. Încearcă din nou." + "Reîncearcă" "Această imprimantă nu este disponibilă momentan." "Previzualizarea nu se poate afișa" "Se pregătește previzualizarea..." -- cgit v1.2.3 From 5979843c35f31a22873bad2550c9bac7b65d806f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:23:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie9969f51a7e16169d13961c3e7478cadb3b06365 --- packages/SoundPicker/res/values-ro/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SoundPicker/res/values-ro/strings.xml b/packages/SoundPicker/res/values-ro/strings.xml index 6190f7f8eac3..58b5aeb4dca8 100644 --- a/packages/SoundPicker/res/values-ro/strings.xml +++ b/packages/SoundPicker/res/values-ro/strings.xml @@ -19,10 +19,10 @@ "Ton de apel prestabilit" "Sunet de notificare prestabilit" "Sunet de alarmă prestabilit" - "Adăugați un ton de sonerie" - "Adăugați o alarmă" - "Adăugați o notificare" - "Ștergeți" + "Adaugă un ton de sonerie" + "Adaugă o alarmă" + "Adaugă o notificare" + "Șterge" "Nu se poate adăuga tonul de sonerie personalizat" "Nu se poate șterge tonul de sonerie personalizat" "Sunete" -- cgit v1.2.3 From d02dd73053159f16d7fdcf52a1fd3336e3abc7cc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:26:25 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I87fb5e8f0776d0a92ee0be810c667eb905f1ff7c --- packages/SoundPicker/res/values-ro/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SoundPicker/res/values-ro/strings.xml b/packages/SoundPicker/res/values-ro/strings.xml index 6190f7f8eac3..58b5aeb4dca8 100644 --- a/packages/SoundPicker/res/values-ro/strings.xml +++ b/packages/SoundPicker/res/values-ro/strings.xml @@ -19,10 +19,10 @@ "Ton de apel prestabilit" "Sunet de notificare prestabilit" "Sunet de alarmă prestabilit" - "Adăugați un ton de sonerie" - "Adăugați o alarmă" - "Adăugați o notificare" - "Ștergeți" + "Adaugă un ton de sonerie" + "Adaugă o alarmă" + "Adaugă o notificare" + "Șterge" "Nu se poate adăuga tonul de sonerie personalizat" "Nu se poate șterge tonul de sonerie personalizat" "Sunete" -- cgit v1.2.3 From 885cc50af1917c7e69eb982b9d77ebe5ad7295b3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:32:15 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Icf49f1ceaa79f12fd64d1b55a48dce371fca9db7 --- packages/Shell/res/values-ro/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index 91b0b1e4cd59..73322d6bd721 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -21,14 +21,14 @@ "Raportul de eroare #%d se generează" "Raportul de eroare #%d a fost creat" "Se adaugă detaliile la raportul de eroare" - "Așteptați…" + "Te rugăm să aștepți…" "Raportul de eroare va apărea curând pe telefon" - "Selectați pentru a trimite raportul de eroare" - "Atingeți pentru a trimite raportul de eroare" - "Selectați pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Atingeți ca să trimiteți raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Atingeți ca să trimiteți raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le puteți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permiteți accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care aveți încredere." + "Selectează pentru a trimite raportul de eroare" + "Atinge pentru a trimite raportul de eroare" + "Selectează pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" + "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" + "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" + "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le poți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permite accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care ai încredere." "Nu mai afișa" "Rapoarte de erori" "Fișierul cu raportul de eroare nu a putut fi citit" @@ -42,6 +42,6 @@ "Numele fișierului" "Titlul erorii" "Rezumat privind eroarea" - "Salvați" - "Trimiteți raportul de eroare" + "Salvează" + "Trimite raportul de eroare" -- cgit v1.2.3 From 8c28e97f858e7bc4ec719bca4ffb48b367a2091f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:33:54 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I462a630a5e66225da587c8d18fcd82c6cb51dc4c --- packages/Shell/res/values-ro/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index 91b0b1e4cd59..73322d6bd721 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -21,14 +21,14 @@ "Raportul de eroare #%d se generează" "Raportul de eroare #%d a fost creat" "Se adaugă detaliile la raportul de eroare" - "Așteptați…" + "Te rugăm să aștepți…" "Raportul de eroare va apărea curând pe telefon" - "Selectați pentru a trimite raportul de eroare" - "Atingeți pentru a trimite raportul de eroare" - "Selectați pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Atingeți ca să trimiteți raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Atingeți ca să trimiteți raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" - "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le puteți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permiteți accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care aveți încredere." + "Selectează pentru a trimite raportul de eroare" + "Atinge pentru a trimite raportul de eroare" + "Selectează pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" + "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" + "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" + "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le poți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permite accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care ai încredere." "Nu mai afișa" "Rapoarte de erori" "Fișierul cu raportul de eroare nu a putut fi citit" @@ -42,6 +42,6 @@ "Numele fișierului" "Titlul erorii" "Rezumat privind eroarea" - "Salvați" - "Trimiteți raportul de eroare" + "Salvează" + "Trimite raportul de eroare" -- cgit v1.2.3 From f517346f584e0d894c1e1f112c4748dfa705a92b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:39:55 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iff6f018d268e1bd3e4f499b79f457f9918e05e51 --- packages/SystemUI/res/values-or/strings.xml | 2 +- packages/SystemUI/res/values-ro/strings.xml | 242 ++++++++++++++-------------- 2 files changed, 122 insertions(+), 122 deletions(-) diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index b62d04199bc8..589aa0aef5a5 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -176,7 +176,7 @@ "ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଦେଖନ୍ତୁ" "ଟେଲି-ଟାଇପରାଇଟର୍ ସକ୍ଷମ ଅଛି।" "ରିଙ୍ଗର୍‌ କମ୍ପନରେ ଅଛି।" - "ରିଙ୍ଗର୍‌ ସାଇଲେଣ୍ଟରେ ଅଛି।" + "ରିଂଗର ସାଇଲେଣ୍ଟରେ ଅଛି।" "ବିଜ୍ଞପ୍ତି ଶେଡ୍‍।" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a3b4ca55974e..e6dabc62bebc 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -32,35 +32,35 @@ "Activați" "Nu, mulțumesc" "Rotire automată a ecranului" - "Permiteți %1$s să acceseze %2$s?" - "Permiteți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." - "Permiteți ca %1$s să acceseze %2$s?" + "Permiți %1$s să acceseze %2$s?" + "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Permiți ca %1$s să acceseze %2$s?" "Deschideți %1$s ca să gestioneze %2$s?" "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Permiteți %1$s să acceseze %2$s?" + "Permiți %1$s să acceseze %2$s?" "Deschideți %1$s ca să gestioneze %2$s?" - "Deschideți %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Deschide %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Deschideți %1$s ca să gestioneze %2$s?" - "Aplic. instal. nu funcț. cu acest acces. USB. Aflați despre acest accesoriu la %1$s" + "Aplic. instal. nu funcț. cu acest acces. USB. Află despre acest accesoriu la %1$s" "Accesoriu USB" - "Afișați" - "Deschideți întotdeauna %1$s când este conectat %2$s" - "Deschideți întotdeauna %1$s când este conectat %2$s" - "Permiteți remedierea erorilor prin USB?" + "Afișează" + "Deschide întotdeauna %1$s când este conectat %2$s" + "Deschide întotdeauna %1$s când este conectat %2$s" + "Permiți remedierea erorilor prin USB?" "Amprenta din cheia RSA a computerului este:\n%1$s" - "Permiteți întotdeauna de pe acest computer" - "Permiteți" + "Permite întotdeauna de pe acest computer" + "Permite" "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." "Schimbați limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" "Schimbați limba" "Păstrați limba actuală" - "Permiteți remedierea erorilor wireless în această rețea?" + "Permiți remedierea erorilor wireless în această rețea?" "Numele rețelei (SSID)\n%1$s\n\nAdresa Wi‑Fi (BSSID)\n%2$s" - "Permiteți întotdeauna în această rețea" - "Permiteți" + "Permite întotdeauna în această rețea" + "Permite" "Remedierea erorilor wireless nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" @@ -81,9 +81,9 @@ "Administratorul IT a blocat crearea capturilor de ecran" "Editați" "Editați captura de ecran" - "Trimiteți captura de ecran" + "Trimite captura de ecran" "Surprindeți mai mult" - "Închideți captura de ecran" + "Închide captura de ecran" "Previzualizare a capturii de ecran" "Marginea de sus la %1$d %%" "Marginea de jos la %1$d %%" @@ -102,11 +102,11 @@ "Începeți" "Se înregistrează ecranul" "Se înregistrează ecranul și conținutul audio" - "Afișați atingerile de pe ecran" - "Opriți" - "Trimiteți" + "Afișează atingerile de pe ecran" + "Oprește" + "Trimite" "Înregistrarea ecranului a fost salvată" - "Atingeți pentru a afișa" + "Atinge pentru a afișa" "Eroare la ștergerea înregistrării ecranului" "Eroare la începerea înregistrării ecranului" "Înapoi" @@ -123,20 +123,20 @@ "Deblocați" "Dispozitiv blocat" "Scanarea chipului" - "Trimiteți" + "Trimite" "deschideți telefonul" "deschideți asistentul vocal" "deschideți camera foto" - "Anulați" + "Anulează" "Confirmați" - "Încercați din nou" - "Atingeți pentru a anula autentificarea" - "Încercați din nou" + "Încearcă din nou" + "Atinge pentru a anula autentificarea" + "Încearcă din nou" "Se caută chipul" "Chip autentificat" "Confirmat" "Atingeți Confirmați pentru a finaliza" - "S-a deblocat cu ajutorul feței. Apăsați pictograma de deblocare pentru a continua" + "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" "Autentificat" "Folosiți PIN-ul" "Folosiți modelul" @@ -144,8 +144,8 @@ "PIN greșit" "Model greșit" "Parolă greșită" - "Prea multe încercări incorecte.\nÎncercați din nou peste %d secunde." - "Încercați din nou. Încercarea %1$d din %2$d." + "Prea multe încercări incorecte.\nÎncearcă din nou peste %d secunde." + "Încearcă din nou. Încercarea %1$d din %2$d." "Datele dvs. vor fi șterse" "Dacă la următoarea încercare introduceți un model incorect, datele de pe acest dispozitiv vor fi șterse." "Dacă la următoarea încercare introduceți un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." @@ -156,7 +156,7 @@ "Dacă la următoarea încercare introduceți un model incorect, profilul de serviciu și datele sale vor fi șterse." "Dacă la următoarea încercare introduceți un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." - "Atingeți senzorul de amprente" + "Atinge senzorul de amprente" "Pictograma amprentă" "Chipul nu a fost recunoscut. Folosiți amprenta." @@ -173,7 +173,7 @@ "Baterie: %d la sută." "Procentul rămas din baterie este %1$s. În baza utilizării, timpul rămas este de aproximativ %2$s" "Bateria se încarcă, %d la sută." - "Vedeți toate notificările" + "Vezi toate notificările" "TeleTypewriter activat." "Vibrare sonerie." "Sonerie silențioasă." @@ -183,7 +183,7 @@ "Setări rapide." "Ecranul de blocare." "Ecran de blocare pentru serviciu" - "Închideți" + "Închide" "niciun sunet" "numai alarme" "Nu deranja." @@ -200,7 +200,7 @@ "Reluați" "Solicitări locație active" "Dezactivarea senzorilor este activă" - "Ștergeți toate notificările." + "Șterge toate notificările." "+ %s" Încă %s notificări în grup. @@ -246,7 +246,7 @@ "Corecția culorii" "Setări de utilizator" "Terminat" - "Închideți" + "Închide" "Conectat" "Conectat, bateria la %1$s" "Se conectează..." @@ -286,7 +286,7 @@ "Serviciul NFC este activat" "Înregistrarea ecranului" "Începeți" - "Opriți" + "Oprește" "Modul cu o mână" "Deblocați microfonul dispozitivului?" "Deblocați camera dispozitivului?" @@ -310,11 +310,11 @@ "Personalizați" "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri." "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor." - "Atingeți din nou pentru a deschide" - "Atingeți din nou" + "Atinge din nou pentru a deschide" + "Atinge din nou" "Glisați în sus pentru a deschide" - "Apăsați pictograma de deblocare pentru a deschide" - "S-a deblocat cu ajutorul feței. Apăsați pictograma de deblocare pentru a deschide" + "Apasă pictograma de deblocare pentru a deschide" + "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" "Deplasați spre stânga" "Deplasați în jos" @@ -360,14 +360,14 @@ "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Începeți să înregistrați sau să proiectați?" "Începeți să înregistrați sau să proiectați cu %s?" - "Ștergeți toate notificările" + "Șterge toate notificările" "Gestionați" "Istoric" "Noi" "Silențioase" "Notificări" "Conversații" - "Ștergeți toate notificările silențioase" + "Șterge toate notificările silențioase" "Notificări întrerupte prin „Nu deranja”" "Începeți acum" "Nicio notificare" @@ -394,8 +394,8 @@ "VPN" "Înregistrare în jurnal pentru rețea" "Certificate CA" - "Afișați politicile" - "Vedeți opțiunile" + "Afișează politicile" + "Vezi opțiunile" "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." @@ -409,13 +409,13 @@ "Aplicațiile dvs. pentru lucru sunt conectate la internet prin aplicația %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." " " - "Deschideți Setări VPN" + "Deschide Setări VPN" "Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului." "VPN" "Deblocat de TrustAgent" "%1$s. %2$s" "Setări de sunet" - "Adăugați subtitrări automate la fișierele media" + "Adaugă subtitrări automate la fișierele media" "Sfat pentru subtitrări" "Suprapunere pe subtitrări" "activați" @@ -424,7 +424,7 @@ "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea." "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea." "Astfel rămâne afișată până anulați fixarea. Glisați în sus și țineți apăsat pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulați fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." @@ -447,12 +447,12 @@ "Sonerie" "Vibrații" "Blocați" - "%1$s. Atingeți pentru a activa sunetul." - "%1$s. Atingeți pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." - "%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." - "%1$s. Atingeți pentru a seta pe vibrații." - "%1$s. Atingeți pentru a dezactiva sunetul." - "Atingeți pentru a schimba modul soneriei" + "%1$s. Atinge pentru a activa sunetul." + "%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." + "%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." + "%1$s. Atinge pentru a seta pe vibrații." + "%1$s. Atinge pentru a dezactiva sunetul." + "Atinge pentru a schimba modul soneriei" "dezactivați sunetul" "activați sunetul" "vibrații" @@ -462,16 +462,16 @@ "Bară de stare" "Mod demonstrativ pentru IU sistem" "Activați modul demonstrativ" - "Afișați modul demonstrativ" + "Afișează modul demonstrativ" "Ethernet" "Alarmă" "Portofel" "Configurați pentru a face achiziții mai rapide și mai sigure cu telefonul dvs." - "Afișați-le pe toate" - "Atingeți pentru a deschide" + "Afișează-le pe toate" + "Atinge pentru a deschide" "Se actualizează" "Deblocați pentru a folosi" - "A apărut o problemă la preluarea cardurilor. Încercați din nou mai târziu" + "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" "Scanați codul QR" "Profil de serviciu" @@ -520,23 +520,23 @@ "Acest grup de notificări nu poate fi configurat aici" "Notificare prin proxy" "Toate notificările din %1$s" - "Vedeți mai multe" + "Vezi mai multe" "Notificarea a fost <b>promovată automat la Prestabilită</b> de sistem." "Notificarea a fost <b>setată automat ca Silențioasă</b> de sistem." "Notificarea a fost <b>clasificată automat mai sus</b> în umbră." "Notificarea a fost <b>clasificată automat mai jos</b> în umbră." - "Trimiteți feedback dezvoltatorului. Este corect?" + "Trimite feedback dezvoltatorului. Este corect?" "Opțiunile privind notificările pentru %1$s sunt afișate" "Opțiunile privind notificările pentru %1$s nu sunt afișate" "Mai multe setări" "Personalizați" - "Afișați balonul" + "Afișează balonul" "Eliminați baloanele" "%1$s %2$s" "comenzile notificării" "opțiuni de amânare a notificării" "Reamintește-mi" - "Anulați" + "Anulează" "Amânată %1$s" %d ore @@ -562,17 +562,17 @@ "Enter" "Backspace" "Redați/Întrerupeți" - "Opriți" + "Oprește" "Înainte" "Înapoi" "Derulați înapoi" "Derulați rapid înainte" "O pagină mai sus" "O pagină mai jos" - "Ștergeți" + "Șterge" "La început" "La final" - "Inserați" + "Inserează" "Num Lock" "Tasta numerică %1$s" "Eliminați atașamentul" @@ -595,7 +595,7 @@ "Comandă rapidă din butoanele de volum" "Baterie" "Set căști-microfon" - "Deschideți setările" + "Deschide setările" "Căștile sunt conectate" "Setul căști-microfon este conectat" "Economizor de date" @@ -620,8 +620,8 @@ "Înclinat spre stânga" "Înclinat spre dreapta" - "Salvați" - "Resetați" + "Salvează" + "Resetează" "Clipboard" "Buton personalizat pentru navigare" "Codul de taste din stânga" @@ -644,41 +644,41 @@ "Afișează procentajul când se încarcă (prestabilit)" "Nu afișa această pictogramă" - "Afișați pictogramele de notificare cu prioritate redusă" + "Afișează pictogramele de notificare cu prioritate redusă" "Altele" "eliminați cardul" "adăugați cardul la sfârșit" - "Mutați cardul" - "Adăugați un card" - "Mutați pe poziția %1$d" - "Adăugați pe poziția %1$d" + "Mută cardul" + "Adaugă un card" + "Mută pe poziția %1$d" + "Adaugă pe poziția %1$d" "Poziția %1$d" "Cardul a fost adăugat" "Cardul a fost eliminat" "Editorul pentru setări rapide." "Notificare %1$s: %2$s" - "Deschideți setările." - "Deschideți setările rapide." - "Închideți setările rapide." + "Deschide setările." + "Deschide setările rapide." + "Închide setările rapide." "Conectat(ă) ca %s" "alege utilizatorul" "Fără conexiune la internet" - "Deschideți setările %s." + "Deschide setările %s." "Editați ordinea setărilor." "Meniul de pornire" "Pagina %1$d din %2$d" "Ecran de blocare" "Telefonul s-a oprit din cauza încălzirii" - "Acum telefonul funcționează normal.\nAtingeți pentru mai multe informații" + "Acum telefonul funcționează normal.\nAtinge pentru mai multe informații" "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosiți aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descărcați/încărcați fișiere mari;\n • folosiți telefonul la temperaturi ridicate." - "Vedeți pașii pentru îngrijire" + "Vezi pașii pentru îngrijire" "Telefonul se încălzește" - "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtingeți pentru mai multe informații" + "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" "Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." - "Vedeți pașii pentru îngrijire" - "Deconectați încărcătorul" + "Vezi pașii pentru îngrijire" + "Deconectează încărcătorul" "Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald." - "Vedeți pașii pentru îngrijire" + "Vezi pașii pentru îngrijire" "Comanda rapidă din stânga" "Comanda rapidă din dreapta" "Comanda rapidă din stânga și deblochează" @@ -702,7 +702,7 @@ "Aplicații instantanee" "%1$s rulează" "Aplicația a fost deschisă fără a fi instalată." - "Aplicația a fost deschisă fără a fi instalată. Atingeți pentru a afla mai multe." + "Aplicația a fost deschisă fără a fi instalată. Atinge pentru a afla mai multe." "Informații aplicație" "Accesați browserul" "Date mobile" @@ -715,21 +715,21 @@ "Funcția Nu deranja a fost activată de o aplicație (%s)." "Funcția Nu deranja a fost activată de o regulă automată sau de o aplicație." "Aplicațiile rulează în fundal" - "Atingeți pentru mai multe detalii privind bateria și utilizarea datelor" + "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" "Dezactivați datele mobile?" "Nu veți avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." "operatorul dvs." "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu vă pot verifica răspunsul." - "Permiteți %1$s să afișeze porțiuni din %2$s?" + "Permiți %1$s să afișeze porțiuni din %2$s?" "- Poate citi informații din %1$s" "- Poate efectua acțiuni în %1$s" - "Permiteți %1$s să afișeze porțiuni din orice aplicație" - "Permiteți" - "Refuzați" - "Atingeți pentru a programa Economisirea energiei" + "Permite %1$s să afișeze porțiuni din orice aplicație" + "Permite" + "Refuz" + "Atinge pentru a programa Economisirea energiei" "Porniți dacă este probabil ca bateria să se descarce" "Nu, mulțumesc" - "Extrageți memoria SysUI" + "Extrage memoria SysUI" "În uz" "Aplicațiile folosesc %s." ", " @@ -760,16 +760,16 @@ "Măriți o parte a ecranului" "Comutator" "Atingeți pentru a deschide funcțiile de accesibilitate. Personalizați sau înlocuiți butonul în Setări.\n\n""Afișați setările" - "Mutați butonul spre margine pentru a-l ascunde temporar" - "Mutați în stânga sus" - "Mutați în dreapta sus" - "Mutați în stânga jos" - "Mutați în dreapta jos" + "Mută butonul spre margine pentru a-l ascunde temporar" + "Mută în stânga sus" + "Mută în dreapta sus" + "Mută în stânga jos" + "Mută în dreapta jos" "Mutați în afară și ascundeți" "Mutați în afară și afișați" "Activați / dezactivați" "Comenzile dispozitivelor" - "Alegeți aplicația pentru a adăuga comenzi" + "Alege aplicația pentru a adăuga comenzi" S-au adăugat %s comenzi. S-au adăugat %s de comenzi. @@ -781,18 +781,18 @@ "S-a anulat marcarea ca preferată" "marcați ca preferată" "anulați marcarea ca preferată" - "Mutați pe poziția %d" + "Mută pe poziția %d" "Comenzi" - "Alegeți comenzile de accesat din Setările rapide" + "Alege comenzile de accesat din Setările rapide" "Țineți apăsat și trageți pentru a rearanja comenzile" "Au fost șterse toate comenzile" "Modificările nu au fost salvate" - "Vedeți alte aplicații" + "Vezi alte aplicații" "Comenzile nu au putut fi încărcate. Accesați aplicația %s pentru a vă asigura că setările aplicației nu s-au schimbat." "Nu sunt disponibile comenzi compatibile" "Altul" - "Adăugați la comenzile dispozitivelor" - "Adăugați" + "Adaugă la comenzile dispozitivelor" + "Adaugă" "Sugerat de %s" "Dispozitiv blocat" "Vedeți și controlați dispozitivele de pe ecranul de blocare?" @@ -804,8 +804,8 @@ "Codul PIN conține litere sau simboluri" "Verificați %s" "Cod PIN greșit" - "Introduceți codul PIN" - "Încercați alt cod PIN" + "Introdu codul PIN" + "Încearcă alt cod PIN" "Confirmați schimbarea pentru %s" "Glisați pentru a vedea mai multe" "Se încarcă recomandările" @@ -823,29 +823,29 @@ "Melodia următoare" "Se conectează" "Redați" - "Deschideți %1$s" + "Deschide %1$s" "Redați %1$s de la %2$s în %3$s" "Redați %1$s în %2$s" - "Anulați" + "Anulează" "Apropiați-vă pentru a reda pe %1$s" "Mergeți mai aproape de %1$s ca să redați acolo" "Se redă pe %1$s" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Inactiv, verificați aplicația" "Nu s-a găsit" "Comanda este indisponibilă" "Nu s-a putut accesa %1$s. Accesați aplicația %2$s pentru a vă asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." - "Deschideți aplicația" + "Deschide aplicația" "Starea nu se poate încărca" "Eroare, încercați din nou" - "Adăugați comenzi" + "Adaugă comenzi" "Editați comenzile" - "Adăugați ieșiri" + "Adaugă ieșiri" "Grup" "S-a selectat un dispozitiv" "S-au selectat %1$d dispozitive" "(deconectat)" - "Nu se poate comuta. Atingeți pentru a încerca din nou." + "Nu se poate comuta. Atinge pentru a încerca din nou." "Asociați un nou dispozitiv" "Pentru a proiecta această sesiune, deschideți aplicația." "Aplicație necunoscută" @@ -858,14 +858,14 @@ "Ca să asculte transmisia dvs., persoanele din apropiere cu dispozitive Bluetooth compatibile vă pot scana codul QR sau pot folosi numele și parola transmisiei." "Numele transmisiei" "Parolă" - "Salvați" + "Salvează" "Începe…" "Nu se poate transmite" - "Nu se poate salva. Încercați din nou." + "Nu se poate salva. Încearcă din nou." "Nu se poate salva." "Numărul versiunii" "Numărul versiunii s-a copiat în clipboard." - "Deschideți conversația" + "Deschide conversația" "Widgeturi pentru conversație" "Atingeți o conversație ca să o adăugați pe ecranul de pornire" "Conversațiile dvs. recente se vor afișa aici" @@ -894,7 +894,7 @@ "Conținutul va apărea în curând" "Apel nepreluat" "%d+" - "Vedeți mesaje recente, apeluri pierdute și actualizări de stare" + "Vezi mesaje recente, apeluri pierdute și actualizări de stare" "Conversație" "Întrerupt de Nu deranja" "%1$s a trimis un mesaj: %2$s" @@ -902,7 +902,7 @@ "%1$s are o nouă stare: %2$s" "Disponibil" "Problemă la citirea măsurării bateriei" - "Atingeți pentru mai multe informații" + "Atinge pentru mai multe informații" "Nicio alarmă setată" "Senzor de amprentă" "Autentificați-vă" @@ -928,9 +928,9 @@ "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" "Dezactivați modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" - "Adăugați un card" + "Adaugă un card" "Nu adăugați un card" - "Alegeți utilizatorul" + "Alege utilizatorul" %s aplicații sunt active %s de aplicații sunt active @@ -939,16 +939,16 @@ "Informații noi" "Aplicații active" "Aceste aplicații sunt active și rulează, chiar dacă nu le folosiți. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." - "Opriți" + "Oprește" "Oprită" "Gata" "S-a copiat" "Din %1$s" - "Închideți textul copiat" + "Închide textul copiat" "Editați textul copiat" "Editați imaginea copiată" - "Trimiteți către un dispozitiv din apropiere" - "Atingeți pentru a afișa" + "Trimite către un dispozitiv din apropiere" + "Atinge pentru a afișa" "Textul a fost copiat" "Imaginea a fost copiată" "Conținutul a fost copiat" @@ -956,7 +956,7 @@ "Clipboard" "Previzualizarea imaginii" "editați" - "Adăugați" + "Adaugă" "Gestionați utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." "Wi‑Fi indisponibil" -- cgit v1.2.3 From 68ae50a84311a9e1fd277515ed5243826d924abf Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:42:03 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib66aa28bbb64ca2ae8c6550160ed35ca48c8859e --- packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml index 3c628721aa5b..8b96b8c9615a 100644 --- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml @@ -89,7 +89,7 @@ "不可用" "关闭" - "开启" + "已开启" "不可用" -- cgit v1.2.3 From cef8deeaeff978d3565e87e617423d74ab16fd2c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:46:34 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5f325c7a070e17712869db521af5fcdb862f3d9d --- .../SystemUI/res-keyguard/values-ro/strings.xml | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 04fe6be2902f..6e2f92fa54a5 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -20,9 +20,9 @@ - "Introduceți codul PIN" - "Introduceți modelul" - "Introduceți parola" + "Introdu codul PIN" + "Introdu modelul" + "Introdu parola" "Card nevalid" "Încărcată" "%s • Se încarcă wireless" @@ -31,11 +31,11 @@ "%s • Se încarcă rapid" "%s • Se încarcă lent" "%s • Încărcare limitată temporar" - "Apăsați pe Meniu pentru a debloca." + "Apasă pe Meniu pentru a debloca." "Rețea blocată" "Niciun card SIM" - "Introduceți un card SIM." - "Cardul SIM lipsește sau nu poate fi citit. Introduceți un card SIM." + "Introdu un card SIM." + "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." "Cardul SIM este blocat." @@ -45,24 +45,24 @@ "Parola dispozitivului" "Zona codului PIN pentru cardul SIM" "Zona codului PUK pentru cardul SIM" - "Ștergeți" + "Șterge" "Dezactivați cardul eSIM" "Nu se poate dezactiva cardul eSIM" "Cardul eSIM nu poate fi dezactivat din cauza unei erori." - "Introduceți" + "Introdu" "Model greșit" "Parolă greșită" "Cod PIN greșit" - "{count,plural, =1{Reîncercați peste o secundă.}few{Reîncercați peste # secunde.}other{Reîncercați peste # de secunde.}}" - "Introduceți codul PIN al cardului SIM." - "Introduceți codul PIN al cardului SIM pentru „%1$s”." + "{count,plural, =1{Reîncearcă peste o secundă.}few{Reîncearcă peste # secunde.}other{Reîncearcă peste # de secunde.}}" + "Introdu codul PIN al cardului SIM." + "Introdu codul PIN al cardului SIM pentru „%1$s”." "%1$s Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." "Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." "Cardul SIM „%1$s\" este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." - "Introduceți codul PIN dorit" + "Introdu codul PIN dorit" "Confirmați codul PIN dorit" "Se deblochează cardul SIM…" - "Introduceți un cod PIN alcătuit din 4 până la 8 cifre." + "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Codul PUK trebuie să aibă minimum 8 cifre." "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." -- cgit v1.2.3 From 29f27c1ec89aa9a1b24f95020e8dbd93bd001801 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:47:39 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4fe4d2a7ed636b8583dd970311af3123c3c77f7f --- packages/SystemUI/res-product/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index 54dc73ae727c..b260f28d8f03 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Repoziționați telefonul pentru încărcare mai rapidă" "Repoziționați telefonul pentru încărcarea wireless" - "Dispozitivul Android TV se va opri în curând. Apăsați un buton pentru a-l menține pornit." - "Dispozitivul se va opri în curând. Apăsați pentru a-l menține pornit." + "Dispozitivul Android TV se va opri în curând. Apasă un buton pentru a-l menține pornit." + "Dispozitivul se va opri în curând. Apasă pentru a-l menține pornit." "Nu există card SIM în tabletă." "Nu există card SIM în telefon." "Codurile PIN nu coincid" -- cgit v1.2.3 From 55d44d7f66d51ccb727835dae9a8c233165856fa Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:49:17 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I77c9aafe7434a023e781cbbc101ac83dd4c0d9ad --- packages/SystemUI/res/values-ar/strings.xml | 2 +- packages/SystemUI/res/values-as/strings.xml | 6 +- packages/SystemUI/res/values-es-rUS/strings.xml | 9 +- packages/SystemUI/res/values-es/strings.xml | 9 +- packages/SystemUI/res/values-fa/strings.xml | 10 +- packages/SystemUI/res/values-fr-rCA/strings.xml | 9 +- packages/SystemUI/res/values-fr/strings.xml | 9 +- packages/SystemUI/res/values-it/strings.xml | 9 +- packages/SystemUI/res/values-ko/strings.xml | 2 +- packages/SystemUI/res/values-my/strings.xml | 2 +- packages/SystemUI/res/values-or/strings.xml | 2 +- packages/SystemUI/res/values-pt-rBR/strings.xml | 9 +- packages/SystemUI/res/values-pt-rPT/strings.xml | 9 +- packages/SystemUI/res/values-pt/strings.xml | 9 +- packages/SystemUI/res/values-ro/strings.xml | 242 ++++++++++++------------ packages/SystemUI/res/values-tr/strings.xml | 2 +- 16 files changed, 198 insertions(+), 142 deletions(-) diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 403f6e0a1999..a98c36420b01 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "واجهة مستخدم النظام" "هل تريد تفعيل ميزة \"توفير شحن البطارية\"؟" - "يتبقى لديك %s من شحن البطارية. يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وتقييد الأنشطة في الخلفية وتأخير الإشعارات." + "يتبقى لديك %s من شحن البطارية. يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وحظر الأنشطة في الخلفية وتأخير الإشعارات." "يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وتقييد الأنشطة في الخلفية وتأخير الإشعارات." "متبقي %s" "‏يتعذّر الشحن باستخدام USB." diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 173a33e7e88d..f35dd98d91c8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -305,7 +305,7 @@ "অৱলোকন ট’গল কৰক" "আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।" "আপুনি নিৰ্দিষ্ট কৰা এলাৰ্মৰ বাহিৰে আন কোনো ধ্বনি আৰু কম্পনৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।" - "নিজৰ উপযোগিতা অনুসৰি" + "কাষ্টমাইজ কৰক" "এই কার্যই এলার্ম, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আটাইবোৰৰ বাবে ধ্বনি আৰু কম্পন অৱৰোধ কৰিব। আপুনি ফ\'ন কল তথাপি কৰিবলৈ সক্ষম হ\'ব।" "এই কার্যই এলার্ম, মিউজিক, ভিডিঅ\' আৰু গেইমকে ধৰি আটাইবোৰৰ ধ্বনি আৰু কম্পন অৱৰোধ কৰে।" "খুলিবলৈ পুনৰাই টিপক" @@ -526,7 +526,7 @@ "%1$sৰ জাননী নিয়ন্ত্ৰণসমূহ খোলা অৱস্থাত আছে" "%1$sৰ জাননী নিয়ন্ত্ৰণসমূহ বন্ধ অৱস্থাত আছে" "অধিক ছেটিং" - "নিজৰ উপযোগিতা অনুসৰি" + "কাষ্টমাইজ কৰক" "বাবল হিচাপে দেখুৱাওক" "Bubbles আঁতৰাওক" "%1$s %2$s" @@ -672,7 +672,7 @@ "আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।" "যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক" "চ্চার্জাৰ আনপ্লাগ কৰক" - "এই ডিভাইচটো চ্চার্জ কৰোঁতে কিবা সমস্যা হৈছে। পাৱাৰ এডাপ্টাৰটো আনপ্লাগ কৰক, কেব’লডাল গৰম হ’ব পাৰে গতিকে সাবধান হ’ব।" + "এই ডিভাইচটো চাৰ্জ কৰোঁতে কিবা সমস্যা হৈছে। পাৱাৰ এডাপ্টাৰটো আনপ্লাগ কৰক আৰু কে’বলডাল গৰম হ’ব পাৰে; গতিকে সাবধান হ’ব।" "যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক" "বাওঁ শ্বৰ্টকাট" "সোঁ শ্বৰ্টকাট" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 0caa430b19c4..b24fe007cd01 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -203,6 +203,7 @@ "Eliminar todas las notificaciones" "%s más" + %s more notifications inside. %s notificaciones más en el grupo. %s notificación más en el grupo. @@ -253,6 +254,7 @@ "Activando…" "Ahorro de datos act." + %d devices %d dispositivos %d dispositivo @@ -347,6 +349,7 @@ "Sí, continuar" "Alcanzaste el límite de usuarios" + You can add up to %d users. Puedes agregar hasta %d usuarios. Solo se puede crear un usuario. @@ -536,10 +539,12 @@ "Deshacer" "Posponer %1$s" + %d hours %d horas %d hora + %d minutes %d minutos %d minuto @@ -766,6 +771,7 @@ "Controles de dispositivos" "Elige la app para agregar los controles" + %s controls added. Se agregaron %s controles. Se agregó %s control. @@ -926,6 +932,7 @@ "No agregar tarjeta" "Seleccionar usuario" + %s apps están activas %s apps están activas %s app está activa @@ -956,5 +963,5 @@ "Modo prioridad" "Se estableció la alarma" "La cámara y el micrófono están apagados" - "{count,plural, =1{# notificación}other{# notificaciones}}" + "{count,plural, =1{# notificación}many{# notificaciones}other{# notificaciones}}" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index c75fa56e4291..1d0bdd29f0cb 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -203,6 +203,7 @@ "Borrar todas las notificaciones" "%s más" + %s more notifications inside. %s notificaciones más dentro. %s notificación más dentro. @@ -253,6 +254,7 @@ "Activando…" "Ahorro de datos activado" + %d devices %d dispositivos %d dispositivo @@ -347,6 +349,7 @@ "Sí, continuar" "Has alcanzado el límite de usuarios" + You can add up to %d users. Puedes añadir hasta %d usuarios. Solo se puede crear un usuario. @@ -536,10 +539,12 @@ "Deshacer" "Volverá a mostrarse en %1$s" + %d hours %d horas %d hora + %d minutes %d minutos %d minuto @@ -766,6 +771,7 @@ "Control de dispositivos" "Elige una aplicación para añadir controles" + %s controls added. Se han añadido %s controles. Se ha añadido %s control. @@ -926,6 +932,7 @@ "No añadir recuadro" "Selecciona un usuario" + %s aplicaciones activas %s aplicaciones activas %s aplicación activa @@ -956,5 +963,5 @@ "Modo prioritario" "Alarma añadida" "La cámara y el micrófono están desactivados" - "{count,plural, =1{# notificación}other{# notificaciones}}" + "{count,plural, =1{# notificación}many{# notificaciones}other{# notificaciones}}" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 60e7b47428d4..fb3a29b711d0 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -554,8 +554,8 @@ "مرکز" "Tab" "Space" - "ورود" - "پس‌بر" + "Enter" + "Backspace" "پخش/مکث" "متوقف کردن" "بعدی" @@ -566,9 +566,9 @@ "صفحه قبل" "حذف" "ابتدا" - "انتها" - "درج" - "قفل اعداد" + "End" + "Insert" + "Num Lock" "صفحه‌کلید عددی %1$s" "برداشتن پیوست" "سیستم" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 69598089c416..c9ee3dbf38ea 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -204,6 +204,7 @@ "+ %s" %s autre notification à l\'intérieur. + %s more notifications inside. %s autres notifications à l\'intérieur. "L\'écran est verrouillé en mode paysage." @@ -254,6 +255,7 @@ "Écon. données activé" %d appareil + %d devices %d appareils "Lampe de poche" @@ -348,6 +350,7 @@ "Limite d\'utilisateurs atteinte" Vous pouvez ajouter jusqu\'à %d utilisateur. + You can add up to %d users. Vous pouvez ajouter jusqu\'à %d utilisateurs. "Supprimer l\'utilisateur?" @@ -537,10 +540,12 @@ "Reporté pour %1$s" %d heure + %d hours %d heures %d minute + %d minutes %d minutes "Économiseur de pile" @@ -767,6 +772,7 @@ "Sélectionnez l\'application pour laquelle ajouter des commandes" %s commande ajoutée. + %s controls added. %s commandes ajoutées. "Supprimé" @@ -927,6 +933,7 @@ "Choisir l\'utilisateur" %s application est active + %s d\'applications sont actives %s applications sont actives "Nouvelle information" @@ -956,5 +963,5 @@ "Mode priorité" "L\'alarme a été réglée" "L\'appareil photo et le micro sont désactivés" - "{count,plural, =1{# notification}one{# notification}other{# notifications}}" + "{count,plural, =1{# notification}one{# notification}many{# de notifications}other{# notifications}}" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 307d75d06279..554bff39492e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -204,6 +204,7 @@ "%s autres" %s autre notification à l\'intérieur. + %s more notifications inside. %s autres notifications à l\'intérieur. "L\'écran est verrouillé en mode paysage." @@ -254,6 +255,7 @@ "Écon. données activé" %d appareil + %d devices %d appareils "Lampe de poche" @@ -348,6 +350,7 @@ "Limite nombre utilisateurs atteinte" Vous pouvez ajouter %d profil utilisateur. + You can add up to %d users. Vous pouvez ajouter jusqu\'à %d profils utilisateur. "Supprimer l\'utilisateur ?" @@ -537,10 +540,12 @@ "Répétée après %1$s" %d heure + %d hours %d heures %d minute + %d minutes %d minutes "Économiseur de batterie" @@ -767,6 +772,7 @@ "Sélectionnez l\'appli pour laquelle ajouter des commandes" %s commande ajoutée. + %s controls added. %s commandes ajoutées. "Supprimé" @@ -927,6 +933,7 @@ "Choisir l\'utilisateur" %s appli est active + %s applis sont actives %s applis sont actives "Nouvelles informations" @@ -956,5 +963,5 @@ "Mode Prioritaire" "Alarme réglée" "Appareil photo et micro désactivés" - "{count,plural, =1{# notification}one{# notification}other{# notifications}}" + "{count,plural, =1{# notification}one{# notification}many{# notifications}other{# notifications}}" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index fff7abe0ea2c..1d87916753b8 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -203,6 +203,7 @@ "Cancella tutte le notifiche." "+ %s" + %s more notifications inside. Altre %s notifiche nel gruppo. %s altra notifica nel gruppo. @@ -253,6 +254,7 @@ "Attivazione…" "Risp. dati attivo" + %d devices %d dispositivi %d dispositivo @@ -347,6 +349,7 @@ "Sì, continua" "Limite di utenti raggiunto" + You can add up to %d users. Puoi aggiungere fino a %d utenti. È possibile creare un solo utente. @@ -536,10 +539,12 @@ "Annulla" "Posticipato di %1$s" + %d hours %d ore %d ora + %d minutes %d minuti %d minuto @@ -766,6 +771,7 @@ "Controllo dispositivi" "Scegli un\'app per aggiungere controlli" + %s controls added. %s controlli aggiunti. %s controllo aggiunto. @@ -926,6 +932,7 @@ "Non aggiungerlo" "Seleziona utente" + %s app attive %s app attive %s app attiva @@ -956,5 +963,5 @@ "Modalità Priorità" "Sveglia impostata" "Fotocamera e microfono non attivi" - "{count,plural, =1{# notifica}other{# notifiche}}" + "{count,plural, =1{# notifica}many{# notifiche}other{# notifiche}}" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 2591498e459c..0fc7511693e2 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -286,7 +286,7 @@ "시작" "중지" "한 손 사용 모드" - "기기 마이크를 차단 해제하시겠습니까?" + "기기 마이크를 &#173;차단 해제하시겠습니까?" "기기 카메라를 차단 해제하시겠습니까?" "기기 카메라 및 마이크를 차단 해제하시겠습니까?" "마이크를 사용할 수 있는 모든 앱 및 서비스에 대해 액세스가 차단 해제됩니다." diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 6d974000f3ae..a66b2144ddef 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -573,7 +573,7 @@ "ပူးတွဲပါဖိုင်ကို ဖယ်ရှားရန်" "စနစ်" "ပင်မ" - "လတ်တလော" + "မကြာသေးမီက" "နောက်သို့" "အကြောင်းကြားချက်များ" "ကီးဘုတ် ဖြတ်လမ်းများ" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index b62d04199bc8..589aa0aef5a5 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -176,7 +176,7 @@ "ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଦେଖନ୍ତୁ" "ଟେଲି-ଟାଇପରାଇଟର୍ ସକ୍ଷମ ଅଛି।" "ରିଙ୍ଗର୍‌ କମ୍ପନରେ ଅଛି।" - "ରିଙ୍ଗର୍‌ ସାଇଲେଣ୍ଟରେ ଅଛି।" + "ରିଂଗର ସାଇଲେଣ୍ଟରେ ଅଛି।" "ବିଜ୍ଞପ୍ତି ଶେଡ୍‍।" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 9322ae2fece1..22c5be686796 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -204,6 +204,7 @@ "Mais %s" Mais %s notificações no grupo. + %s more notifications inside. Mais %s notificações no grupo. "A tela está bloqueada na orientação paisagem." @@ -254,6 +255,7 @@ "Economia de dados ativada" %d dispositivo + %d devices %d dispositivos "Lanterna" @@ -348,6 +350,7 @@ "Limite de usuários atingido" É possível adicionar até %d usuário. + You can add up to %d users. É possível adicionar até %d usuários. "Remover usuário?" @@ -537,10 +540,12 @@ "Adiada para %1$s" %d hora + %d hours %d horas %d minuto + %d minutes %d minutos "Economia de bateria" @@ -767,6 +772,7 @@ "Escolha um app para adicionar controles" %s controle adicionado. + %s controls added. %s controles adicionados. "Removido" @@ -927,6 +933,7 @@ "Selecionar usuário" %s app está ativo + %s apps are active %s apps estão ativos "Nova informação" @@ -956,5 +963,5 @@ "Modo de prioridade" "Alarme definido" "A câmera e o microfone estão desativados" - "{count,plural, =1{# notificação}one{# notificação}other{# notificações}}" + "{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index f38b45144fdc..cb94df96a8da 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -203,6 +203,7 @@ "Limpar todas as notificações." "+ %s" + %s more notifications inside. Mais %s notificações no grupo. Mais %s notificação no grupo. @@ -253,6 +254,7 @@ "A ativar..." "Poup. dados ativada" + %d devices %d dispositivos %d dispositivo @@ -347,6 +349,7 @@ "Sim, continuar" "Limite de utilizadores alcançado" + You can add up to %d users. Pode adicionar até %d utilizadores. Apenas é possível criar um utilizador. @@ -536,10 +539,12 @@ "Anular" "Suspensa por %1$s" + %d hours %d horas %d hora + %d minutes %d minutos %d minuto @@ -766,6 +771,7 @@ "Controlos de dispositivos" "Escolha uma app para adicionar controlos" + %s controls added. %s controlos adicionados. %s controlo adicionado. @@ -926,6 +932,7 @@ "Não adicion. mosaico" "Selecione utilizador" + %s apps estão ativas %s apps estão ativas %s app está ativa @@ -956,5 +963,5 @@ "Modo Prioridade" "Alarme definido" "A câmara e o microfone estão desativados" - "{count,plural, =1{# notificação}other{# notificações}}" + "{count,plural, =1{# notificação}many{# notificações}other{# notificações}}" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 9322ae2fece1..22c5be686796 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -204,6 +204,7 @@ "Mais %s" Mais %s notificações no grupo. + %s more notifications inside. Mais %s notificações no grupo. "A tela está bloqueada na orientação paisagem." @@ -254,6 +255,7 @@ "Economia de dados ativada" %d dispositivo + %d devices %d dispositivos "Lanterna" @@ -348,6 +350,7 @@ "Limite de usuários atingido" É possível adicionar até %d usuário. + You can add up to %d users. É possível adicionar até %d usuários. "Remover usuário?" @@ -537,10 +540,12 @@ "Adiada para %1$s" %d hora + %d hours %d horas %d minuto + %d minutes %d minutos "Economia de bateria" @@ -767,6 +772,7 @@ "Escolha um app para adicionar controles" %s controle adicionado. + %s controls added. %s controles adicionados. "Removido" @@ -927,6 +933,7 @@ "Selecionar usuário" %s app está ativo + %s apps are active %s apps estão ativos "Nova informação" @@ -956,5 +963,5 @@ "Modo de prioridade" "Alarme definido" "A câmera e o microfone estão desativados" - "{count,plural, =1{# notificação}one{# notificação}other{# notificações}}" + "{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a3b4ca55974e..e6dabc62bebc 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -32,35 +32,35 @@ "Activați" "Nu, mulțumesc" "Rotire automată a ecranului" - "Permiteți %1$s să acceseze %2$s?" - "Permiteți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." - "Permiteți ca %1$s să acceseze %2$s?" + "Permiți %1$s să acceseze %2$s?" + "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Permiți ca %1$s să acceseze %2$s?" "Deschideți %1$s ca să gestioneze %2$s?" "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Permiteți %1$s să acceseze %2$s?" + "Permiți %1$s să acceseze %2$s?" "Deschideți %1$s ca să gestioneze %2$s?" - "Deschideți %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Deschide %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Deschideți %1$s ca să gestioneze %2$s?" - "Aplic. instal. nu funcț. cu acest acces. USB. Aflați despre acest accesoriu la %1$s" + "Aplic. instal. nu funcț. cu acest acces. USB. Află despre acest accesoriu la %1$s" "Accesoriu USB" - "Afișați" - "Deschideți întotdeauna %1$s când este conectat %2$s" - "Deschideți întotdeauna %1$s când este conectat %2$s" - "Permiteți remedierea erorilor prin USB?" + "Afișează" + "Deschide întotdeauna %1$s când este conectat %2$s" + "Deschide întotdeauna %1$s când este conectat %2$s" + "Permiți remedierea erorilor prin USB?" "Amprenta din cheia RSA a computerului este:\n%1$s" - "Permiteți întotdeauna de pe acest computer" - "Permiteți" + "Permite întotdeauna de pe acest computer" + "Permite" "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." "Schimbați limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" "Schimbați limba" "Păstrați limba actuală" - "Permiteți remedierea erorilor wireless în această rețea?" + "Permiți remedierea erorilor wireless în această rețea?" "Numele rețelei (SSID)\n%1$s\n\nAdresa Wi‑Fi (BSSID)\n%2$s" - "Permiteți întotdeauna în această rețea" - "Permiteți" + "Permite întotdeauna în această rețea" + "Permite" "Remedierea erorilor wireless nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" @@ -81,9 +81,9 @@ "Administratorul IT a blocat crearea capturilor de ecran" "Editați" "Editați captura de ecran" - "Trimiteți captura de ecran" + "Trimite captura de ecran" "Surprindeți mai mult" - "Închideți captura de ecran" + "Închide captura de ecran" "Previzualizare a capturii de ecran" "Marginea de sus la %1$d %%" "Marginea de jos la %1$d %%" @@ -102,11 +102,11 @@ "Începeți" "Se înregistrează ecranul" "Se înregistrează ecranul și conținutul audio" - "Afișați atingerile de pe ecran" - "Opriți" - "Trimiteți" + "Afișează atingerile de pe ecran" + "Oprește" + "Trimite" "Înregistrarea ecranului a fost salvată" - "Atingeți pentru a afișa" + "Atinge pentru a afișa" "Eroare la ștergerea înregistrării ecranului" "Eroare la începerea înregistrării ecranului" "Înapoi" @@ -123,20 +123,20 @@ "Deblocați" "Dispozitiv blocat" "Scanarea chipului" - "Trimiteți" + "Trimite" "deschideți telefonul" "deschideți asistentul vocal" "deschideți camera foto" - "Anulați" + "Anulează" "Confirmați" - "Încercați din nou" - "Atingeți pentru a anula autentificarea" - "Încercați din nou" + "Încearcă din nou" + "Atinge pentru a anula autentificarea" + "Încearcă din nou" "Se caută chipul" "Chip autentificat" "Confirmat" "Atingeți Confirmați pentru a finaliza" - "S-a deblocat cu ajutorul feței. Apăsați pictograma de deblocare pentru a continua" + "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" "Autentificat" "Folosiți PIN-ul" "Folosiți modelul" @@ -144,8 +144,8 @@ "PIN greșit" "Model greșit" "Parolă greșită" - "Prea multe încercări incorecte.\nÎncercați din nou peste %d secunde." - "Încercați din nou. Încercarea %1$d din %2$d." + "Prea multe încercări incorecte.\nÎncearcă din nou peste %d secunde." + "Încearcă din nou. Încercarea %1$d din %2$d." "Datele dvs. vor fi șterse" "Dacă la următoarea încercare introduceți un model incorect, datele de pe acest dispozitiv vor fi șterse." "Dacă la următoarea încercare introduceți un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." @@ -156,7 +156,7 @@ "Dacă la următoarea încercare introduceți un model incorect, profilul de serviciu și datele sale vor fi șterse." "Dacă la următoarea încercare introduceți un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." - "Atingeți senzorul de amprente" + "Atinge senzorul de amprente" "Pictograma amprentă" "Chipul nu a fost recunoscut. Folosiți amprenta." @@ -173,7 +173,7 @@ "Baterie: %d la sută." "Procentul rămas din baterie este %1$s. În baza utilizării, timpul rămas este de aproximativ %2$s" "Bateria se încarcă, %d la sută." - "Vedeți toate notificările" + "Vezi toate notificările" "TeleTypewriter activat." "Vibrare sonerie." "Sonerie silențioasă." @@ -183,7 +183,7 @@ "Setări rapide." "Ecranul de blocare." "Ecran de blocare pentru serviciu" - "Închideți" + "Închide" "niciun sunet" "numai alarme" "Nu deranja." @@ -200,7 +200,7 @@ "Reluați" "Solicitări locație active" "Dezactivarea senzorilor este activă" - "Ștergeți toate notificările." + "Șterge toate notificările." "+ %s" Încă %s notificări în grup. @@ -246,7 +246,7 @@ "Corecția culorii" "Setări de utilizator" "Terminat" - "Închideți" + "Închide" "Conectat" "Conectat, bateria la %1$s" "Se conectează..." @@ -286,7 +286,7 @@ "Serviciul NFC este activat" "Înregistrarea ecranului" "Începeți" - "Opriți" + "Oprește" "Modul cu o mână" "Deblocați microfonul dispozitivului?" "Deblocați camera dispozitivului?" @@ -310,11 +310,11 @@ "Personalizați" "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri." "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor." - "Atingeți din nou pentru a deschide" - "Atingeți din nou" + "Atinge din nou pentru a deschide" + "Atinge din nou" "Glisați în sus pentru a deschide" - "Apăsați pictograma de deblocare pentru a deschide" - "S-a deblocat cu ajutorul feței. Apăsați pictograma de deblocare pentru a deschide" + "Apasă pictograma de deblocare pentru a deschide" + "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" "Deplasați spre stânga" "Deplasați în jos" @@ -360,14 +360,14 @@ "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Începeți să înregistrați sau să proiectați?" "Începeți să înregistrați sau să proiectați cu %s?" - "Ștergeți toate notificările" + "Șterge toate notificările" "Gestionați" "Istoric" "Noi" "Silențioase" "Notificări" "Conversații" - "Ștergeți toate notificările silențioase" + "Șterge toate notificările silențioase" "Notificări întrerupte prin „Nu deranja”" "Începeți acum" "Nicio notificare" @@ -394,8 +394,8 @@ "VPN" "Înregistrare în jurnal pentru rețea" "Certificate CA" - "Afișați politicile" - "Vedeți opțiunile" + "Afișează politicile" + "Vezi opțiunile" "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." @@ -409,13 +409,13 @@ "Aplicațiile dvs. pentru lucru sunt conectate la internet prin aplicația %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." " " - "Deschideți Setări VPN" + "Deschide Setări VPN" "Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului." "VPN" "Deblocat de TrustAgent" "%1$s. %2$s" "Setări de sunet" - "Adăugați subtitrări automate la fișierele media" + "Adaugă subtitrări automate la fișierele media" "Sfat pentru subtitrări" "Suprapunere pe subtitrări" "activați" @@ -424,7 +424,7 @@ "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea." "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea." "Astfel rămâne afișată până anulați fixarea. Glisați în sus și țineți apăsat pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulați fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." @@ -447,12 +447,12 @@ "Sonerie" "Vibrații" "Blocați" - "%1$s. Atingeți pentru a activa sunetul." - "%1$s. Atingeți pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." - "%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." - "%1$s. Atingeți pentru a seta pe vibrații." - "%1$s. Atingeți pentru a dezactiva sunetul." - "Atingeți pentru a schimba modul soneriei" + "%1$s. Atinge pentru a activa sunetul." + "%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." + "%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." + "%1$s. Atinge pentru a seta pe vibrații." + "%1$s. Atinge pentru a dezactiva sunetul." + "Atinge pentru a schimba modul soneriei" "dezactivați sunetul" "activați sunetul" "vibrații" @@ -462,16 +462,16 @@ "Bară de stare" "Mod demonstrativ pentru IU sistem" "Activați modul demonstrativ" - "Afișați modul demonstrativ" + "Afișează modul demonstrativ" "Ethernet" "Alarmă" "Portofel" "Configurați pentru a face achiziții mai rapide și mai sigure cu telefonul dvs." - "Afișați-le pe toate" - "Atingeți pentru a deschide" + "Afișează-le pe toate" + "Atinge pentru a deschide" "Se actualizează" "Deblocați pentru a folosi" - "A apărut o problemă la preluarea cardurilor. Încercați din nou mai târziu" + "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" "Scanați codul QR" "Profil de serviciu" @@ -520,23 +520,23 @@ "Acest grup de notificări nu poate fi configurat aici" "Notificare prin proxy" "Toate notificările din %1$s" - "Vedeți mai multe" + "Vezi mai multe" "Notificarea a fost <b>promovată automat la Prestabilită</b> de sistem." "Notificarea a fost <b>setată automat ca Silențioasă</b> de sistem." "Notificarea a fost <b>clasificată automat mai sus</b> în umbră." "Notificarea a fost <b>clasificată automat mai jos</b> în umbră." - "Trimiteți feedback dezvoltatorului. Este corect?" + "Trimite feedback dezvoltatorului. Este corect?" "Opțiunile privind notificările pentru %1$s sunt afișate" "Opțiunile privind notificările pentru %1$s nu sunt afișate" "Mai multe setări" "Personalizați" - "Afișați balonul" + "Afișează balonul" "Eliminați baloanele" "%1$s %2$s" "comenzile notificării" "opțiuni de amânare a notificării" "Reamintește-mi" - "Anulați" + "Anulează" "Amânată %1$s" %d ore @@ -562,17 +562,17 @@ "Enter" "Backspace" "Redați/Întrerupeți" - "Opriți" + "Oprește" "Înainte" "Înapoi" "Derulați înapoi" "Derulați rapid înainte" "O pagină mai sus" "O pagină mai jos" - "Ștergeți" + "Șterge" "La început" "La final" - "Inserați" + "Inserează" "Num Lock" "Tasta numerică %1$s" "Eliminați atașamentul" @@ -595,7 +595,7 @@ "Comandă rapidă din butoanele de volum" "Baterie" "Set căști-microfon" - "Deschideți setările" + "Deschide setările" "Căștile sunt conectate" "Setul căști-microfon este conectat" "Economizor de date" @@ -620,8 +620,8 @@ "Înclinat spre stânga" "Înclinat spre dreapta" - "Salvați" - "Resetați" + "Salvează" + "Resetează" "Clipboard" "Buton personalizat pentru navigare" "Codul de taste din stânga" @@ -644,41 +644,41 @@ "Afișează procentajul când se încarcă (prestabilit)" "Nu afișa această pictogramă" - "Afișați pictogramele de notificare cu prioritate redusă" + "Afișează pictogramele de notificare cu prioritate redusă" "Altele" "eliminați cardul" "adăugați cardul la sfârșit" - "Mutați cardul" - "Adăugați un card" - "Mutați pe poziția %1$d" - "Adăugați pe poziția %1$d" + "Mută cardul" + "Adaugă un card" + "Mută pe poziția %1$d" + "Adaugă pe poziția %1$d" "Poziția %1$d" "Cardul a fost adăugat" "Cardul a fost eliminat" "Editorul pentru setări rapide." "Notificare %1$s: %2$s" - "Deschideți setările." - "Deschideți setările rapide." - "Închideți setările rapide." + "Deschide setările." + "Deschide setările rapide." + "Închide setările rapide." "Conectat(ă) ca %s" "alege utilizatorul" "Fără conexiune la internet" - "Deschideți setările %s." + "Deschide setările %s." "Editați ordinea setărilor." "Meniul de pornire" "Pagina %1$d din %2$d" "Ecran de blocare" "Telefonul s-a oprit din cauza încălzirii" - "Acum telefonul funcționează normal.\nAtingeți pentru mai multe informații" + "Acum telefonul funcționează normal.\nAtinge pentru mai multe informații" "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosiți aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descărcați/încărcați fișiere mari;\n • folosiți telefonul la temperaturi ridicate." - "Vedeți pașii pentru îngrijire" + "Vezi pașii pentru îngrijire" "Telefonul se încălzește" - "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtingeți pentru mai multe informații" + "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" "Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." - "Vedeți pașii pentru îngrijire" - "Deconectați încărcătorul" + "Vezi pașii pentru îngrijire" + "Deconectează încărcătorul" "Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald." - "Vedeți pașii pentru îngrijire" + "Vezi pașii pentru îngrijire" "Comanda rapidă din stânga" "Comanda rapidă din dreapta" "Comanda rapidă din stânga și deblochează" @@ -702,7 +702,7 @@ "Aplicații instantanee" "%1$s rulează" "Aplicația a fost deschisă fără a fi instalată." - "Aplicația a fost deschisă fără a fi instalată. Atingeți pentru a afla mai multe." + "Aplicația a fost deschisă fără a fi instalată. Atinge pentru a afla mai multe." "Informații aplicație" "Accesați browserul" "Date mobile" @@ -715,21 +715,21 @@ "Funcția Nu deranja a fost activată de o aplicație (%s)." "Funcția Nu deranja a fost activată de o regulă automată sau de o aplicație." "Aplicațiile rulează în fundal" - "Atingeți pentru mai multe detalii privind bateria și utilizarea datelor" + "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" "Dezactivați datele mobile?" "Nu veți avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." "operatorul dvs." "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu vă pot verifica răspunsul." - "Permiteți %1$s să afișeze porțiuni din %2$s?" + "Permiți %1$s să afișeze porțiuni din %2$s?" "- Poate citi informații din %1$s" "- Poate efectua acțiuni în %1$s" - "Permiteți %1$s să afișeze porțiuni din orice aplicație" - "Permiteți" - "Refuzați" - "Atingeți pentru a programa Economisirea energiei" + "Permite %1$s să afișeze porțiuni din orice aplicație" + "Permite" + "Refuz" + "Atinge pentru a programa Economisirea energiei" "Porniți dacă este probabil ca bateria să se descarce" "Nu, mulțumesc" - "Extrageți memoria SysUI" + "Extrage memoria SysUI" "În uz" "Aplicațiile folosesc %s." ", " @@ -760,16 +760,16 @@ "Măriți o parte a ecranului" "Comutator" "Atingeți pentru a deschide funcțiile de accesibilitate. Personalizați sau înlocuiți butonul în Setări.\n\n""Afișați setările" - "Mutați butonul spre margine pentru a-l ascunde temporar" - "Mutați în stânga sus" - "Mutați în dreapta sus" - "Mutați în stânga jos" - "Mutați în dreapta jos" + "Mută butonul spre margine pentru a-l ascunde temporar" + "Mută în stânga sus" + "Mută în dreapta sus" + "Mută în stânga jos" + "Mută în dreapta jos" "Mutați în afară și ascundeți" "Mutați în afară și afișați" "Activați / dezactivați" "Comenzile dispozitivelor" - "Alegeți aplicația pentru a adăuga comenzi" + "Alege aplicația pentru a adăuga comenzi" S-au adăugat %s comenzi. S-au adăugat %s de comenzi. @@ -781,18 +781,18 @@ "S-a anulat marcarea ca preferată" "marcați ca preferată" "anulați marcarea ca preferată" - "Mutați pe poziția %d" + "Mută pe poziția %d" "Comenzi" - "Alegeți comenzile de accesat din Setările rapide" + "Alege comenzile de accesat din Setările rapide" "Țineți apăsat și trageți pentru a rearanja comenzile" "Au fost șterse toate comenzile" "Modificările nu au fost salvate" - "Vedeți alte aplicații" + "Vezi alte aplicații" "Comenzile nu au putut fi încărcate. Accesați aplicația %s pentru a vă asigura că setările aplicației nu s-au schimbat." "Nu sunt disponibile comenzi compatibile" "Altul" - "Adăugați la comenzile dispozitivelor" - "Adăugați" + "Adaugă la comenzile dispozitivelor" + "Adaugă" "Sugerat de %s" "Dispozitiv blocat" "Vedeți și controlați dispozitivele de pe ecranul de blocare?" @@ -804,8 +804,8 @@ "Codul PIN conține litere sau simboluri" "Verificați %s" "Cod PIN greșit" - "Introduceți codul PIN" - "Încercați alt cod PIN" + "Introdu codul PIN" + "Încearcă alt cod PIN" "Confirmați schimbarea pentru %s" "Glisați pentru a vedea mai multe" "Se încarcă recomandările" @@ -823,29 +823,29 @@ "Melodia următoare" "Se conectează" "Redați" - "Deschideți %1$s" + "Deschide %1$s" "Redați %1$s de la %2$s în %3$s" "Redați %1$s în %2$s" - "Anulați" + "Anulează" "Apropiați-vă pentru a reda pe %1$s" "Mergeți mai aproape de %1$s ca să redați acolo" "Se redă pe %1$s" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Inactiv, verificați aplicația" "Nu s-a găsit" "Comanda este indisponibilă" "Nu s-a putut accesa %1$s. Accesați aplicația %2$s pentru a vă asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." - "Deschideți aplicația" + "Deschide aplicația" "Starea nu se poate încărca" "Eroare, încercați din nou" - "Adăugați comenzi" + "Adaugă comenzi" "Editați comenzile" - "Adăugați ieșiri" + "Adaugă ieșiri" "Grup" "S-a selectat un dispozitiv" "S-au selectat %1$d dispozitive" "(deconectat)" - "Nu se poate comuta. Atingeți pentru a încerca din nou." + "Nu se poate comuta. Atinge pentru a încerca din nou." "Asociați un nou dispozitiv" "Pentru a proiecta această sesiune, deschideți aplicația." "Aplicație necunoscută" @@ -858,14 +858,14 @@ "Ca să asculte transmisia dvs., persoanele din apropiere cu dispozitive Bluetooth compatibile vă pot scana codul QR sau pot folosi numele și parola transmisiei." "Numele transmisiei" "Parolă" - "Salvați" + "Salvează" "Începe…" "Nu se poate transmite" - "Nu se poate salva. Încercați din nou." + "Nu se poate salva. Încearcă din nou." "Nu se poate salva." "Numărul versiunii" "Numărul versiunii s-a copiat în clipboard." - "Deschideți conversația" + "Deschide conversația" "Widgeturi pentru conversație" "Atingeți o conversație ca să o adăugați pe ecranul de pornire" "Conversațiile dvs. recente se vor afișa aici" @@ -894,7 +894,7 @@ "Conținutul va apărea în curând" "Apel nepreluat" "%d+" - "Vedeți mesaje recente, apeluri pierdute și actualizări de stare" + "Vezi mesaje recente, apeluri pierdute și actualizări de stare" "Conversație" "Întrerupt de Nu deranja" "%1$s a trimis un mesaj: %2$s" @@ -902,7 +902,7 @@ "%1$s are o nouă stare: %2$s" "Disponibil" "Problemă la citirea măsurării bateriei" - "Atingeți pentru mai multe informații" + "Atinge pentru mai multe informații" "Nicio alarmă setată" "Senzor de amprentă" "Autentificați-vă" @@ -928,9 +928,9 @@ "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" "Dezactivați modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" - "Adăugați un card" + "Adaugă un card" "Nu adăugați un card" - "Alegeți utilizatorul" + "Alege utilizatorul" %s aplicații sunt active %s de aplicații sunt active @@ -939,16 +939,16 @@ "Informații noi" "Aplicații active" "Aceste aplicații sunt active și rulează, chiar dacă nu le folosiți. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." - "Opriți" + "Oprește" "Oprită" "Gata" "S-a copiat" "Din %1$s" - "Închideți textul copiat" + "Închide textul copiat" "Editați textul copiat" "Editați imaginea copiată" - "Trimiteți către un dispozitiv din apropiere" - "Atingeți pentru a afișa" + "Trimite către un dispozitiv din apropiere" + "Atinge pentru a afișa" "Textul a fost copiat" "Imaginea a fost copiată" "Conținutul a fost copiat" @@ -956,7 +956,7 @@ "Clipboard" "Previzualizarea imaginii" "editați" - "Adăugați" + "Adaugă" "Gestionați utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." "Wi‑Fi indisponibil" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index e3182e00e921..c99caeaf600b 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -579,7 +579,7 @@ "Klavye Kısayolları" "Klavye düzenini değiştir" "Uygulamalar" - "Asist" + "Asistan" "Tarayıcı" "Kişiler" "E-posta" -- cgit v1.2.3 From 805ac6e1d63f52b1ba1a0a4332abbe8952db9023 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 13:54:11 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I89a2b736c050bc81b3cbe2b363b959f2f7601385 --- packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml index 3c628721aa5b..8b96b8c9615a 100644 --- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml @@ -89,7 +89,7 @@ "不可用" "关闭" - "开启" + "已开启" "不可用" -- cgit v1.2.3 From d602d424496a667bbac57596d107957b2ad0c8b3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 14:05:40 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ibc3c0dc54afb5f65a280897f73933d1d07275dcb --- .../SystemUI/res-keyguard/values-ro/strings.xml | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 04fe6be2902f..6e2f92fa54a5 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -20,9 +20,9 @@ - "Introduceți codul PIN" - "Introduceți modelul" - "Introduceți parola" + "Introdu codul PIN" + "Introdu modelul" + "Introdu parola" "Card nevalid" "Încărcată" "%s • Se încarcă wireless" @@ -31,11 +31,11 @@ "%s • Se încarcă rapid" "%s • Se încarcă lent" "%s • Încărcare limitată temporar" - "Apăsați pe Meniu pentru a debloca." + "Apasă pe Meniu pentru a debloca." "Rețea blocată" "Niciun card SIM" - "Introduceți un card SIM." - "Cardul SIM lipsește sau nu poate fi citit. Introduceți un card SIM." + "Introdu un card SIM." + "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." "Cardul SIM este blocat." @@ -45,24 +45,24 @@ "Parola dispozitivului" "Zona codului PIN pentru cardul SIM" "Zona codului PUK pentru cardul SIM" - "Ștergeți" + "Șterge" "Dezactivați cardul eSIM" "Nu se poate dezactiva cardul eSIM" "Cardul eSIM nu poate fi dezactivat din cauza unei erori." - "Introduceți" + "Introdu" "Model greșit" "Parolă greșită" "Cod PIN greșit" - "{count,plural, =1{Reîncercați peste o secundă.}few{Reîncercați peste # secunde.}other{Reîncercați peste # de secunde.}}" - "Introduceți codul PIN al cardului SIM." - "Introduceți codul PIN al cardului SIM pentru „%1$s”." + "{count,plural, =1{Reîncearcă peste o secundă.}few{Reîncearcă peste # secunde.}other{Reîncearcă peste # de secunde.}}" + "Introdu codul PIN al cardului SIM." + "Introdu codul PIN al cardului SIM pentru „%1$s”." "%1$s Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." "Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." "Cardul SIM „%1$s\" este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." - "Introduceți codul PIN dorit" + "Introdu codul PIN dorit" "Confirmați codul PIN dorit" "Se deblochează cardul SIM…" - "Introduceți un cod PIN alcătuit din 4 până la 8 cifre." + "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Codul PUK trebuie să aibă minimum 8 cifre." "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." -- cgit v1.2.3 From 868a4d146a960c33be76178bf7a525887c38425b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 14:09:23 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia32fce2414e316d65ff19bd55bac50c37ce8ec49 --- packages/SystemUI/res-product/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index 54dc73ae727c..b260f28d8f03 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Repoziționați telefonul pentru încărcare mai rapidă" "Repoziționați telefonul pentru încărcarea wireless" - "Dispozitivul Android TV se va opri în curând. Apăsați un buton pentru a-l menține pornit." - "Dispozitivul se va opri în curând. Apăsați pentru a-l menține pornit." + "Dispozitivul Android TV se va opri în curând. Apasă un buton pentru a-l menține pornit." + "Dispozitivul se va opri în curând. Apasă pentru a-l menține pornit." "Nu există card SIM în tabletă." "Nu există card SIM în telefon." "Codurile PIN nu coincid" -- cgit v1.2.3 From bed84b278174f0bd35b8609f1ed9387e092cbd71 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 16:01:40 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Icf49d1206f45f3cf7d4faaf1e9acde39b616f1d2 --- packages/SettingsLib/FooterPreference/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/FooterPreference/res/values-ro/strings.xml b/packages/SettingsLib/FooterPreference/res/values-ro/strings.xml index 2b5011764508..66196840976d 100644 --- a/packages/SettingsLib/FooterPreference/res/values-ro/strings.xml +++ b/packages/SettingsLib/FooterPreference/res/values-ro/strings.xml @@ -17,5 +17,5 @@ - "Aflați mai multe" + "Află mai multe" -- cgit v1.2.3 From 3423fea185cd82db668c31789901a4f0bf1bf86e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 20:02:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8df9ba4642ad8b3dc9113e33ab3ed780dd47210f --- packages/SettingsLib/res/values-ca/strings.xml | 4 ++-- packages/SettingsLib/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 9387d0befbd4..7a21aec0c62c 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -656,7 +656,7 @@ "Si emets %1$s o canvies la sortida, l\'emissió actual s\'aturarà" "Emet %1$s" "Canvia la sortida" - "Animacions per a les accions de tornada predictives" - "Activa animacions del sistema per a la tornada predictiva." + "Animacions de retrocés predictiu" + "Activa animacions del sistema de retrocés predictiu." "Aquesta configuració activa animacions del sistema per a accions gestuals predictives. Requereix definir enableOnBackInvokedCallback com a \"true\" en cada aplicació al fitxer de manifest." diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 3eb219ff21fc..a6e2fdf97847 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -105,7 +105,7 @@ "已连接(无媒体信号),电量为 %1$s %2$s" "已连接(无手机或媒体信号),电量为 %1$s %2$s" "使用中,电池电量:%1$s" - "已启用,左:目前电量为 %1$s;右:目前电量为 %2$s" + "使用中,左:%1$s 电量,右:%2$s 电量" "%1$s 的电量" "左:目前电量为 %1$s;右:目前电量为 %2$s" "使用中" -- cgit v1.2.3 From 116dfdb7791480288fb3b206d74827fcfc6baa5b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Sep 2022 20:05:33 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I130387fd3e4f02f1c2981ebeaed5be9a12647540 --- packages/SettingsLib/res/values-ca/strings.xml | 4 ++-- packages/SettingsLib/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 9387d0befbd4..7a21aec0c62c 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -656,7 +656,7 @@ "Si emets %1$s o canvies la sortida, l\'emissió actual s\'aturarà" "Emet %1$s" "Canvia la sortida" - "Animacions per a les accions de tornada predictives" - "Activa animacions del sistema per a la tornada predictiva." + "Animacions de retrocés predictiu" + "Activa animacions del sistema de retrocés predictiu." "Aquesta configuració activa animacions del sistema per a accions gestuals predictives. Requereix definir enableOnBackInvokedCallback com a \"true\" en cada aplicació al fitxer de manifest." diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 3eb219ff21fc..a6e2fdf97847 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -105,7 +105,7 @@ "已连接(无媒体信号),电量为 %1$s %2$s" "已连接(无手机或媒体信号),电量为 %1$s %2$s" "使用中,电池电量:%1$s" - "已启用,左:目前电量为 %1$s;右:目前电量为 %2$s" + "使用中,左:%1$s 电量,右:%2$s 电量" "%1$s 的电量" "左:目前电量为 %1$s;右:目前电量为 %2$s" "使用中" -- cgit v1.2.3 From 9b0dd514d29bbf986f1d1a3c6cebc2ef2bcf782e Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 21 Sep 2022 23:03:11 +0000 Subject: [Do Not Merge] Ignore malformed shortcuts After an app publishes a shortcut that contains malformed intent, the system can be stuck in boot-loop due to uncaught exception caused by parsing the malformed intent. This CL ignores that particular malformed entry. Since shortcuts are constantly writes back into the xml from system memory, the malformed entry will be removed from the xml the next time system persists shortcuts from memory to file system. Bug: 246540168 Change-Id: Ie1e39005a5f9d8038bd703a5bc845779c2f46e94 Test: manual --- .../core/java/com/android/server/pm/ShortcutPackage.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 06c71baade42..c6bc7576147f 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1629,11 +1629,15 @@ class ShortcutPackage extends ShortcutPackageItem { continue; case TAG_SHORTCUT: - final ShortcutInfo si = parseShortcut(parser, packageName, - shortcutUser.getUserId(), fromBackup); - - // Don't use addShortcut(), we don't need to save the icon. - ret.mShortcuts.put(si.getId(), si); + try { + final ShortcutInfo si = parseShortcut(parser, packageName, + shortcutUser.getUserId(), fromBackup); + // Don't use addShortcut(), we don't need to save the icon. + ret.mShortcuts.put(si.getId(), si); + } catch (Exception e) { + // b/246540168 malformed shortcuts should be ignored + Slog.e(TAG, "Failed parsing shortcut.", e); + } continue; case TAG_SHARE_TARGET: ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); -- cgit v1.2.3 From a8fe41afb0a89979386ffd17213eb7b5f1c3739d Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 21 Sep 2022 23:06:31 +0000 Subject: [Do Not Merge] Ignore malformed shortcuts After an app publishes a shortcut that contains malformed intent, the system can be stuck in boot-loop due to uncaught exception caused by parsing the malformed intent. This CL ignores that particular malformed entry. Since shortcuts are constantly writes back into the xml from system memory, the malformed entry will be removed from the xml the next time system persists shortcuts from memory to file system. Bug: 246540168 Change-Id: I97d5979fc22ad50d0b36db9cc85099b2f28f6109 Test: manual --- .../core/java/com/android/server/pm/ShortcutPackage.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 9e27f65105eb..f2bfb2aa1405 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1798,11 +1798,15 @@ class ShortcutPackage extends ShortcutPackageItem { continue; case TAG_SHORTCUT: - final ShortcutInfo si = parseShortcut(parser, packageName, - shortcutUser.getUserId(), fromBackup); - - // Don't use addShortcut(), we don't need to save the icon. - ret.mShortcuts.put(si.getId(), si); + try { + final ShortcutInfo si = parseShortcut(parser, packageName, + shortcutUser.getUserId(), fromBackup); + // Don't use addShortcut(), we don't need to save the icon. + ret.mShortcuts.put(si.getId(), si); + } catch (Exception e) { + // b/246540168 malformed shortcuts should be ignored + Slog.e(TAG, "Failed parsing shortcut.", e); + } continue; case TAG_SHARE_TARGET: ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); -- cgit v1.2.3 From 36338a315218221e51c24a42e44c4f743d416f82 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Wed, 21 Sep 2022 23:40:21 +0000 Subject: [Do Not Merge] Ignore malformed shortcuts After an app publishes a shortcut that contains malformed intent, the system can be stuck in boot-loop due to uncaught exception caused by parsing the malformed intent. This CL ignores that particular malformed entry. Since shortcuts are constantly writes back into the xml from system memory, the malformed entry will be removed from the xml the next time system persists shortcuts from memory to file system. Bug: 246540168 Change-Id: Ibbfd0891eabdce72f76571798382fe949d8f453d Test: manual --- .../core/java/com/android/server/pm/ShortcutPackage.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index b4bd086af272..3506fd9be15d 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1967,10 +1967,15 @@ class ShortcutPackage extends ShortcutPackageItem { continue; case TAG_SHORTCUT: - final ShortcutInfo si = parseShortcut(parser, packageName, - shortcutUser.getUserId(), fromBackup); - // Don't use addShortcut(), we don't need to save the icon. - ret.mShortcuts.put(si.getId(), si); + try { + final ShortcutInfo si = parseShortcut(parser, packageName, + shortcutUser.getUserId(), fromBackup); + // Don't use addShortcut(), we don't need to save the icon. + ret.mShortcuts.put(si.getId(), si); + } catch (Exception e) { + // b/246540168 malformed shortcuts should be ignored + Slog.e(TAG, "Failed parsing shortcut.", e); + } continue; case TAG_SHARE_TARGET: ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); -- cgit v1.2.3 From 5238a70be8c3348f9592de5e625f6311e4d51032 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Tue, 20 Sep 2022 15:47:09 -0700 Subject: Ignore malformed shortcuts After an app publishes a shortcut that contains malformed intent, the system can be stuck in boot-loop due to uncaught exception caused by parsing the malformed intent. This CL ignores that particular malformed entry. Since shortcuts are constantly writes back into the xml from system memory, the malformed entry will be removed from the xml the next time system persists shortcuts from memory to file system. Bug: 246540168 Test: manual Change-Id: I9492fcbd499ab2792c1d08884e3af394c5a4c79f --- .../core/java/com/android/server/pm/ShortcutPackage.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 0c601bfde05a..890c89152a7c 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1962,10 +1962,15 @@ class ShortcutPackage extends ShortcutPackageItem { continue; case TAG_SHORTCUT: - final ShortcutInfo si = parseShortcut(parser, packageName, - shortcutUser.getUserId(), fromBackup); - // Don't use addShortcut(), we don't need to save the icon. - ret.mShortcuts.put(si.getId(), si); + try { + final ShortcutInfo si = parseShortcut(parser, packageName, + shortcutUser.getUserId(), fromBackup); + // Don't use addShortcut(), we don't need to save the icon. + ret.mShortcuts.put(si.getId(), si); + } catch (Exception e) { + // b/246540168 malformed shortcuts should be ignored + Slog.e(TAG, "Failed parsing shortcut.", e); + } continue; case TAG_SHARE_TARGET: ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); -- cgit v1.2.3 From 0ee21ef3e652c78c934d257632a4951bd6d38011 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Thu, 14 Jul 2022 11:25:54 -0700 Subject: Fix a security issue in app widget service. Bug: 234013191 Test: atest RemoteViewsAdapterTest Change-Id: Icd2eccb7a90124aca18a3dd463c3f79e3a595c20 Merged-In: Icd2eccb7a90124aca18a3dd463c3f79e3a595c20 (cherry picked from commit 263d7d0ba8818c471a27938c4e002bae33569f01) --- core/java/android/appwidget/AppWidgetManager.java | 4 +++- .../java/com/android/server/appwidget/AppWidgetServiceImpl.java | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index dbc1c199cb4d..437783c4f680 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -1095,7 +1095,9 @@ public class AppWidgetManager { * @param intent The intent of the service which will be providing the data to the * RemoteViewsAdapter. * @param connection The callback interface to be notified when a connection is made or lost. - * @param flags Flags used for binding to the service + * @param flags Flags used for binding to the service. Currently only + * {@link Context#BIND_AUTO_CREATE} and + * {@link Context#BIND_FOREGROUND_SERVICE_WHILE_AWAKE} are supported. * * @see Context#getServiceDispatcher(ServiceConnection, Handler, int) * @hide diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 39866a72ab98..2fe14e36ec51 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -1300,11 +1300,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku try { // Ask ActivityManager to bind it. Notice that we are binding the service with the // caller app instead of DevicePolicyManagerService. - if(ActivityManager.getService().bindService( + if (ActivityManager.getService().bindService( caller, activtiyToken, intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), - connection, flags, mContext.getOpPackageName(), - widget.provider.getUserId()) != 0) { + connection, flags & (Context.BIND_AUTO_CREATE + | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE), + mContext.getOpPackageName(), widget.provider.getUserId()) != 0) { // Add it to the mapping of RemoteViewsService to appWidgetIds so that we // can determine when we can call back to the RemoteViewsService later to -- cgit v1.2.3 From 3ffc423fe2f5fc286285ce37fa1d1b9cdeddcc7a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 00:30:14 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I65152691a7820aecd21568ef6911a39c6a1be57b --- packages/SettingsLib/res/values-kk/strings.xml | 2 +- packages/SettingsLib/res/values-ro/arrays.xml | 2 +- packages/SettingsLib/res/values-ro/strings.xml | 40 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 22774799a853..44d99b39e898 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -624,7 +624,7 @@ "LTE" "LTE+" "W+" - "Мобильдік деректер өшірулі" + "Мобильдік интернет өшірулі" "Деректерді пайдалануға реттелмеген." "Телефон жоқ." "Телефон бір баған." diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index d71274b1a20e..b4cd291d1f72 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -109,7 +109,7 @@ "96,0 kHz" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "44,1 kHz" "48,0 kHz" "88,2 kHz" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 28cf5b340682..d39f5360f34c 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -143,8 +143,8 @@ "Folosește pentru profilul pentru conținut media audio" "Folosește pentru componenta audio a telefonului" "Folosește pentru transferul de fișiere" - "Utilizați pentru introducere date" - "Folosiți pentru aparatele auditive" + "Folosește pentru introducere date" + "Folosește pentru aparatele auditive" "Folosește pentru LE_AUDIO" "Asociază" "CONECTEAZĂ" @@ -206,7 +206,7 @@ "%1$s nu este acceptată" "Se verifică…" "Setări pentru %s" - "Lansați setările motorului" + "Lansează setările motorului" "Motor preferat" "Preferințe generale" "Resetează tonalitatea vorbirii" @@ -289,11 +289,11 @@ "Versiunea AVRCP pentru Bluetooth" "Selectează versiunea AVRCP pentru Bluetooth" "Versiunea MAP pentru Bluetooth" - "Selectați versiunea MAP pentru Bluetooth" + "Selectează versiunea MAP pentru Bluetooth" "Codec audio Bluetooth" "Declanșează codecul audio Bluetooth\nSelecție" "Rată de eșantionare audio Bluetooth" - "Declanșați codecul audio Bluetooth\nSelecție: rată de eșantionare" + "Declanșează codecul audio Bluetooth\nSelecție: rată de eșantionare" "O opțiune inactivă înseamnă incompatibilitate cu telefonul sau setul căști-microfon" "Biți audio Bluetooth per eșantion" "Declanșează codecul audio Bluetooth\nSelecție: biți per eșantion" @@ -309,7 +309,7 @@ "Nume de gazdă al furnizorului de DNS privat" "Introdu numele de gazdă al furnizorului de DNS" "Nu s-a putut conecta" - "Afișați opțiunile pentru certificarea Ecran wireless" + "Afișează opțiunile pentru certificarea Ecran wireless" "Mărește nivelul de înregistrare prin Wi‑Fi, afișează după SSID RSSI în Selectorul Wi‑Fi" "Reduce descărcarea bateriei și îmbunătățește performanța rețelei" "Când acest mod este activat, adresa MAC a dispozitivului se poate schimba de fiecare dată când se conectează la o rețea care are activată randomizarea MAC." @@ -326,16 +326,16 @@ "Permite locațiile fictive" "Permite locațiile fictive" "Activează inspectarea atributelor de vizualizare" - "Păstrați întotdeauna conexiunea de date mobile activată, chiar și atunci când funcția Wi‑Fi este activată (pentru comutarea rapidă între rețele)." + "Păstrează întotdeauna conexiunea de date mobile activată, chiar și atunci când funcția Wi‑Fi este activată (pentru comutarea rapidă între rețele)." "Folosește accelerarea hardware pentru tethering, dacă este disponibilă" - "Permiteți remedierea erorilor prin USB?" - "Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Utilizați-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." + "Permiți remedierea erorilor prin USB?" + "Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Folosește-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." "Permiți remedierea erorilor wireless?" "Remedierea erorilor wireless are exclusiv scopuri de dezvoltare. Folosește-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." "Revoci accesul la remedierea erorilor prin USB de pe toate computerele pe care le-ai autorizat anterior?" "Permiți setările pentru dezvoltare?" "Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul tău și aplicațiile de pe acesta să nu mai funcționeze sau să funcționeze necorespunzător." - "Verificați aplicațiile prin USB" + "Verifică aplicațiile prin USB" "Verifică aplicațiile instalate utilizând ADB/ADT, pentru a detecta un comportament dăunător." "Vor fi afișate dispozitivele Bluetooth fără nume (numai adresele MAC)" "Dezactivează funcția Bluetooth de volum absolut în cazul problemelor de volum apărute la dispozitivele la distanță, cum ar fi volumul mult prea ridicat sau lipsa de control asupra acestuia." @@ -393,7 +393,7 @@ "Scară animație fereastră" "Scară tranziție animații" "Scară durată Animator" - "Simulați afișaje secundare" + "Simulează afișaje secundare" "Aplicații" "Nu păstra activitățile" "Elimină activitățile imediat ce utilizatorul le închide" @@ -404,10 +404,10 @@ "Afișează avertisment pe ecran când o aplicație postează o notificare fără canal valid" "Forțează accesul aplicațiilor la stocarea externă" "Permite scrierea oricărei aplicații eligibile în stocarea externă, indiferent de valorile manifestului" - "Forțați redimensionarea activităților" - "Permiteți redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului." + "Forțează redimensionarea activităților" + "Permite redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului." "Activează ferestrele cu formă liberă" - "Activați compatibilitatea pentru ferestrele experimentale cu formă liberă." + "Activează compatibilitatea pentru ferestrele experimentale cu formă liberă." "Parolă backup computer" "În prezent, backupurile complete pe computer nu sunt protejate" "Atinge ca să modifici sau să elimini parola pentru backupurile complete pe desktop" @@ -448,7 +448,7 @@ "Protanomalie (roșu-verde)" "Tritanomalie (albastru-galben)" "Corecția culorii" - "Corecția culorii poate fi utilă dacă doriți:<br/> <ol> <li>&nbsp;să vedeți mai precis culorile;</li> <li>&nbsp;să eliminați culorile pentru a vă concentra mai bine.</li> </ol>" + "Corecția culorii poate fi utilă dacă vrei:<br/> <ol> <li>&nbsp;să vezi mai precis culorile;</li> <li>&nbsp;să elimini culorile pentru a te concentra mai bine.</li> </ol>" "Valoare înlocuită de %1$s" "%1$s - %2$s" "Timp aproximativ rămas: %1$s" @@ -571,10 +571,10 @@ "Adaugi un utilizator nou?" "Poți să permiți accesul la acest dispozitiv altor persoane creând utilizatori suplimentari. Fiecare utilizator are propriul spațiu, pe care îl poate personaliza cu aplicații, imagini de fundal etc. De asemenea, utilizatorii pot ajusta setările dispozitivului, cum ar fi setările pentru Wi-Fi, care îi afectează pe toți ceilalți utilizatori.\n\nDupă ce adaugi un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOricare dintre utilizatori poate actualiza aplicațiile pentru toți ceilalți utilizatori. Este posibil ca setările de accesibilitate și serviciile să nu se transfere la noul utilizator." "Când adaugi un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori." - "Configurați utilizatorul acum?" + "Configurezi utilizatorul acum?" "Asigură-te că utilizatorul are posibilitatea de a prelua dispozitivul și de a-și configura spațiul" "Configurezi profilul acum?" - "Configurați acum" + "Configurează acum" "Nu acum" "Adaugă" "Utilizator nou" @@ -591,7 +591,7 @@ "Pseudonim" "Adaugă un utilizator" "Adăugați un invitat" - "Ștergeți invitatul" + "Șterge invitatul" "Resetezi sesiunea pentru invitați" "Resetezi invitatul?" "Excludeți invitatul?" @@ -600,7 +600,7 @@ "Se resetează invitatul…" "Fă o fotografie" "Alege o imagine" - "Selectați fotografia" + "Selectează fotografia" "Prea multe încercări incorecte. Datele de pe acest dispozitiv vor fi șterse." "Prea multe încercări incorecte. Acest utilizator va fi șters." "Prea multe încercări incorecte. Acest profil de serviciu și datele sale vor fi șterse." @@ -650,7 +650,7 @@ "Alege aspectul tastaturii" "Prestabilit" "Activează ecranul" - "Permiteți activarea ecranului" + "Permite activarea ecranului" "Permite unei aplicații să activeze ecranul. Dacă acorzi permisiunea, aplicația poate să activeze oricând ecranul, fără intenția ta explicită." "Oprești difuzarea %1$s?" "Dacă difuzezi %1$s sau schimbi rezultatul, difuzarea actuală se va opri" -- cgit v1.2.3 From 689232da700d6408d300d57c75e80c76d08ea177 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 00:32:49 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I623fffd2d7135a43730efdf08b2bf827fa82560d --- packages/SettingsLib/res/values-kk/strings.xml | 2 +- packages/SettingsLib/res/values-ro/arrays.xml | 2 +- packages/SettingsLib/res/values-ro/strings.xml | 40 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 22774799a853..44d99b39e898 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -624,7 +624,7 @@ "LTE" "LTE+" "W+" - "Мобильдік деректер өшірулі" + "Мобильдік интернет өшірулі" "Деректерді пайдалануға реттелмеген." "Телефон жоқ." "Телефон бір баған." diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index d71274b1a20e..b4cd291d1f72 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -109,7 +109,7 @@ "96,0 kHz" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "44,1 kHz" "48,0 kHz" "88,2 kHz" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 28cf5b340682..d39f5360f34c 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -143,8 +143,8 @@ "Folosește pentru profilul pentru conținut media audio" "Folosește pentru componenta audio a telefonului" "Folosește pentru transferul de fișiere" - "Utilizați pentru introducere date" - "Folosiți pentru aparatele auditive" + "Folosește pentru introducere date" + "Folosește pentru aparatele auditive" "Folosește pentru LE_AUDIO" "Asociază" "CONECTEAZĂ" @@ -206,7 +206,7 @@ "%1$s nu este acceptată" "Se verifică…" "Setări pentru %s" - "Lansați setările motorului" + "Lansează setările motorului" "Motor preferat" "Preferințe generale" "Resetează tonalitatea vorbirii" @@ -289,11 +289,11 @@ "Versiunea AVRCP pentru Bluetooth" "Selectează versiunea AVRCP pentru Bluetooth" "Versiunea MAP pentru Bluetooth" - "Selectați versiunea MAP pentru Bluetooth" + "Selectează versiunea MAP pentru Bluetooth" "Codec audio Bluetooth" "Declanșează codecul audio Bluetooth\nSelecție" "Rată de eșantionare audio Bluetooth" - "Declanșați codecul audio Bluetooth\nSelecție: rată de eșantionare" + "Declanșează codecul audio Bluetooth\nSelecție: rată de eșantionare" "O opțiune inactivă înseamnă incompatibilitate cu telefonul sau setul căști-microfon" "Biți audio Bluetooth per eșantion" "Declanșează codecul audio Bluetooth\nSelecție: biți per eșantion" @@ -309,7 +309,7 @@ "Nume de gazdă al furnizorului de DNS privat" "Introdu numele de gazdă al furnizorului de DNS" "Nu s-a putut conecta" - "Afișați opțiunile pentru certificarea Ecran wireless" + "Afișează opțiunile pentru certificarea Ecran wireless" "Mărește nivelul de înregistrare prin Wi‑Fi, afișează după SSID RSSI în Selectorul Wi‑Fi" "Reduce descărcarea bateriei și îmbunătățește performanța rețelei" "Când acest mod este activat, adresa MAC a dispozitivului se poate schimba de fiecare dată când se conectează la o rețea care are activată randomizarea MAC." @@ -326,16 +326,16 @@ "Permite locațiile fictive" "Permite locațiile fictive" "Activează inspectarea atributelor de vizualizare" - "Păstrați întotdeauna conexiunea de date mobile activată, chiar și atunci când funcția Wi‑Fi este activată (pentru comutarea rapidă între rețele)." + "Păstrează întotdeauna conexiunea de date mobile activată, chiar și atunci când funcția Wi‑Fi este activată (pentru comutarea rapidă între rețele)." "Folosește accelerarea hardware pentru tethering, dacă este disponibilă" - "Permiteți remedierea erorilor prin USB?" - "Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Utilizați-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." + "Permiți remedierea erorilor prin USB?" + "Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Folosește-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." "Permiți remedierea erorilor wireless?" "Remedierea erorilor wireless are exclusiv scopuri de dezvoltare. Folosește-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale." "Revoci accesul la remedierea erorilor prin USB de pe toate computerele pe care le-ai autorizat anterior?" "Permiți setările pentru dezvoltare?" "Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul tău și aplicațiile de pe acesta să nu mai funcționeze sau să funcționeze necorespunzător." - "Verificați aplicațiile prin USB" + "Verifică aplicațiile prin USB" "Verifică aplicațiile instalate utilizând ADB/ADT, pentru a detecta un comportament dăunător." "Vor fi afișate dispozitivele Bluetooth fără nume (numai adresele MAC)" "Dezactivează funcția Bluetooth de volum absolut în cazul problemelor de volum apărute la dispozitivele la distanță, cum ar fi volumul mult prea ridicat sau lipsa de control asupra acestuia." @@ -393,7 +393,7 @@ "Scară animație fereastră" "Scară tranziție animații" "Scară durată Animator" - "Simulați afișaje secundare" + "Simulează afișaje secundare" "Aplicații" "Nu păstra activitățile" "Elimină activitățile imediat ce utilizatorul le închide" @@ -404,10 +404,10 @@ "Afișează avertisment pe ecran când o aplicație postează o notificare fără canal valid" "Forțează accesul aplicațiilor la stocarea externă" "Permite scrierea oricărei aplicații eligibile în stocarea externă, indiferent de valorile manifestului" - "Forțați redimensionarea activităților" - "Permiteți redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului." + "Forțează redimensionarea activităților" + "Permite redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului." "Activează ferestrele cu formă liberă" - "Activați compatibilitatea pentru ferestrele experimentale cu formă liberă." + "Activează compatibilitatea pentru ferestrele experimentale cu formă liberă." "Parolă backup computer" "În prezent, backupurile complete pe computer nu sunt protejate" "Atinge ca să modifici sau să elimini parola pentru backupurile complete pe desktop" @@ -448,7 +448,7 @@ "Protanomalie (roșu-verde)" "Tritanomalie (albastru-galben)" "Corecția culorii" - "Corecția culorii poate fi utilă dacă doriți:<br/> <ol> <li>&nbsp;să vedeți mai precis culorile;</li> <li>&nbsp;să eliminați culorile pentru a vă concentra mai bine.</li> </ol>" + "Corecția culorii poate fi utilă dacă vrei:<br/> <ol> <li>&nbsp;să vezi mai precis culorile;</li> <li>&nbsp;să elimini culorile pentru a te concentra mai bine.</li> </ol>" "Valoare înlocuită de %1$s" "%1$s - %2$s" "Timp aproximativ rămas: %1$s" @@ -571,10 +571,10 @@ "Adaugi un utilizator nou?" "Poți să permiți accesul la acest dispozitiv altor persoane creând utilizatori suplimentari. Fiecare utilizator are propriul spațiu, pe care îl poate personaliza cu aplicații, imagini de fundal etc. De asemenea, utilizatorii pot ajusta setările dispozitivului, cum ar fi setările pentru Wi-Fi, care îi afectează pe toți ceilalți utilizatori.\n\nDupă ce adaugi un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOricare dintre utilizatori poate actualiza aplicațiile pentru toți ceilalți utilizatori. Este posibil ca setările de accesibilitate și serviciile să nu se transfere la noul utilizator." "Când adaugi un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori." - "Configurați utilizatorul acum?" + "Configurezi utilizatorul acum?" "Asigură-te că utilizatorul are posibilitatea de a prelua dispozitivul și de a-și configura spațiul" "Configurezi profilul acum?" - "Configurați acum" + "Configurează acum" "Nu acum" "Adaugă" "Utilizator nou" @@ -591,7 +591,7 @@ "Pseudonim" "Adaugă un utilizator" "Adăugați un invitat" - "Ștergeți invitatul" + "Șterge invitatul" "Resetezi sesiunea pentru invitați" "Resetezi invitatul?" "Excludeți invitatul?" @@ -600,7 +600,7 @@ "Se resetează invitatul…" "Fă o fotografie" "Alege o imagine" - "Selectați fotografia" + "Selectează fotografia" "Prea multe încercări incorecte. Datele de pe acest dispozitiv vor fi șterse." "Prea multe încercări incorecte. Acest utilizator va fi șters." "Prea multe încercări incorecte. Acest profil de serviciu și datele sale vor fi șterse." @@ -650,7 +650,7 @@ "Alege aspectul tastaturii" "Prestabilit" "Activează ecranul" - "Permiteți activarea ecranului" + "Permite activarea ecranului" "Permite unei aplicații să activeze ecranul. Dacă acorzi permisiunea, aplicația poate să activeze oricând ecranul, fără intenția ta explicită." "Oprești difuzarea %1$s?" "Dacă difuzezi %1$s sau schimbi rezultatul, difuzarea actuală se va opri" -- cgit v1.2.3 From 2f02352e4157be8dd681a4ccb41da29995926250 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 02:24:20 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7cf8aae26f3ee7720097b1b6df18a3925c54ca09 --- core/res/res/values-ca/strings.xml | 4 +- core/res/res/values-fa/strings.xml | 4 +- core/res/res/values-kk/strings.xml | 10 +- core/res/res/values-ro/strings.xml | 782 ++++++++++++++++++------------------- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-uk/strings.xml | 2 +- 6 files changed, 402 insertions(+), 402 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 850157b71982..e4a8f3919434 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1851,8 +1851,8 @@ "D\'acord" "Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals, determinades funcions i algunes connexions a la xarxa." "Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals, determinades funcions i algunes connexions a la xarxa." - "Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." - "Vols activar l\'Economitzador de dades?" + "Per reduir l\'ús de dades, la funció Estalvi de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." + "Vols activar l\'Estalvi de dades?" "Activa" "{count,plural, =1{Durant 1 minut (fins a les {formattedTime})}other{Durant # minuts (fins a les {formattedTime})}}" "{count,plural, =1{Durant 1 min (fins a les {formattedTime})}other{Durant # min (fins a les {formattedTime})}}" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index abf3feee8d6a..7300b44f59bf 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1485,8 +1485,8 @@ "‏VPN را %s فعال کرده است" "برای مدیریت شبکه ضربه بزنید." "به %s متصل شد. برای مدیریت شبکه ضربه بزنید." - "‏در حال اتصال VPN همیشه فعال…" - "‏VPN همیشه فعال متصل شد" + "‏درحال اتصال به VPN همیشه روشن…" + "‏VPN همیشه روشن متصل شد" "‏از «VPN همیشه روشن» قطع شد" "‏به «VPN همیشه روشن» متصل نشد" "‏تغییر شبکه یا تنظیمات VPN" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 1bff06b90643..6067b809b213 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -77,7 +77,7 @@ "Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелмеген. Келесі қоңырау: Шектелмеген" "Қызмет ұсынылмаған." "Қоңырау шалушы идентификаторы параметрін өзгерту мүмкін емес." - "Мобильдік деректер қызметі жоқ" + "Мобильдік интернет қызметі жоқ" "Жедел қызметке қоңырау шалу қолжетімді емес" "Дауыстық қоңыраулар қызметі жоқ" "Дауыс қызметі немесе жедел қызметке қоңырау шалу мүмкіндігі жоқ" @@ -90,7 +90,7 @@ "Дабылдар" "Қоңырауды басқа нөмірге бағыттау" "Шұғыл кері қоңырау шалу режимі" - "Мобильдік деректер күйі" + "Мобильдік интернет күйі" "SMS хабарлары" "Дауыстық пошта хабарлары" "Wi-Fi қоңыраулары" @@ -1300,7 +1300,7 @@ "Құрылғы %2$s желісінде интернетпен байланыс жоғалған жағдайда %1$s желісін пайдаланады. Деректер ақысы алынуы мүмкін." "%1$s желісінен %2$s желісіне ауысты" - "мобильдік деректер" + "мобильдік интернет" "Wi-Fi" "Bluetooth" "Ethernet" @@ -1567,7 +1567,7 @@ "Өзгерту" "Дерек шығыны туралы ескерту" "Деректің %s пайдаландыңыз" - "Мобильдік деректер шегіне жетті" + "Мобильдік интернет шегіне жетті" "Wi-Fi деректер шегіне жеттіңіз" "Деректер жіберу қалған цикл үшін тоқтатылды" "Мобильдік дерек шегінен астыңыз" @@ -1575,7 +1575,7 @@ "Сіз %s шегінен асып кеттіңіз" "Фондық деректер шектелген" "Шектеуді жою үшін түртіңіз." - "Мобильдік деректер көп жұмсалды" + "Мобильдік интернет көп жұмсалды" "Қолданбаларыңыз деректерді әдеттегіден көбірек пайдаланды" "%s қолданбасы деректерді әдеттегіден көбірек пайдаланды" "Қауіпсіздік сертификаты" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 9eb707529f90..7a0c6cb3b80f 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -34,7 +34,7 @@ "MSISDN1" "Problemă de conexiune sau cod MMI nevalid." "Operația este limitată la numerele cu apelări restricționate." - "Nu puteți schimba setările de redirecționare a apelurilor de pe telefon când sunteți în roaming." + "Nu poți schimba setările de redirecționare a apelurilor de pe telefon când ești în roaming." "Serviciul a fost activat." "Serviciul a fost activat pentru:" "Serviciul a fost dezactivat." @@ -49,7 +49,7 @@ "Introdu un cod PUK care să aibă 8 cifre sau mai mult." "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." "Introdu codul PUK2 pentru a debloca cardul SIM." - "Operațiunea nu a reușit. Activați blocarea cardului SIM/RUIM." + "Operațiunea nu a reușit. Activează blocarea cardului SIM/RUIM." V-au mai rămas %d încercări până la blocarea cardului SIM. V-au mai rămas %d de încercări până la blocarea cardului SIM. @@ -58,7 +58,7 @@ "IMEI" "MEID" "ID apelant de primire" - "Ascundeți ID-ul apelantului" + "Ascunde ID-ul apelantului" "ID-ul liniei conectate" "Restricționarea ID-ului liniei conectate" "Redirecționarea apelurilor" @@ -71,13 +71,13 @@ "Apelare de tip conferință" "Respingere apeluri supărătoare nedorite" "Se apelează serviciul de furnizare a numerelor" - "Nu deranjați" + "Nu deranja" "ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: restricționat" "ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: nerestricționat" "ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: Restricționat." "ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: nerestricționat" "Nu se asigură accesul la acest serviciu." - "Nu puteți să modificați setarea pentru ID-ul apelantului." + "Nu poți modifica setarea pentru ID-ul apelantului." "Fără serviciu de date mobile" "Apelurile de urgență nu sunt disponibile" "Fără servicii vocale" @@ -125,7 +125,7 @@ "Se caută serviciul" "Nu s-a putut configura apelarea prin Wi-Fi" - "Pentru a efectua apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" + "Pentru a face apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicită configurarea acestui serviciu la operator. Apoi, activează din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: %1$s" @@ -144,7 +144,7 @@ "Apelare prin Wi-Fi" "VoWifi" "Dezactivată" - "Apelați prin Wi-Fi" + "Apelează prin Wi-Fi" "Apelați prin rețeaua mobilă" "Numai Wi-Fi" @@ -164,7 +164,7 @@ "Nu s-a realizat autentificarea." "Autentificarea prin intermediul serverului proxy nu a reușit." "Nu s-a putut stabili conexiunea cu serverul." - "Nu s-a putut efectua comunicarea cu serverul. Încercați din nou mai târziu." + "Nu s-a putut efectua comunicarea cu serverul. Încearcă din nou mai târziu." "Conexiunea la server a expirat." "Pagina conține prea multe redirecționări de server." "Protocolul nu este acceptat." @@ -172,18 +172,18 @@ "Pagina nu a putut fi deschisă, deoarece adresa URL nu este validă." "Fișierul nu a putut fi accesat." "Nu s-a putut găsi fișierul solicitat." - "Există prea multe solicitări în curs de procesare. Încercați din nou mai târziu." + "Există prea multe solicitări în curs de procesare. Încearcă din nou mai târziu." "Eroare de conectare pentru %1$s" "Sincronizare" "Nu se poate sincroniza" "Ați încercat să ștergeți prea multe %s." - "Stocarea pe tabletă este plină. Ștergeți câteva fișiere pentru a elibera spațiu." - "Spațiul de stocare de pe ceas este plin! Ștergeți câteva fișiere pentru a elibera spațiu." - "Spațiul de stocare de pe dispozitivul Android TV este plin. Ștergeți câteva fișiere pentru a elibera spațiu." - "Stocarea pe telefon este plină. Ștergeți câteva fișiere pentru a elibera spațiu." + "Stocarea pe tabletă este plină. Șterge câteva fișiere pentru a elibera spațiu." + "Spațiul de stocare de pe ceas este plin! Șterge câteva fișiere pentru a elibera spațiu." + "Spațiul de stocare de pe dispozitivul Android TV este plin. Șterge câteva fișiere pentru a elibera spațiu." + "Stocarea pe telefon este plină. Șterge câteva fișiere pentru a elibera spațiu." "{count,plural, =1{S-a instalat o autoritate de certificare}few{S-au instalat autorități de certificare}other{S-au instalat autorități de certificare}}" "De o terță parte necunoscută" - "De administratorul profilului dvs. de serviciu" + "De administratorul profilului de serviciu" "De %s" "Profilul de serviciu a fost șters" "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul." @@ -193,7 +193,7 @@ "Dispozitivul este gestionat" "Organizația dvs. gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atingeți pentru mai multe detalii." "Aplicațiile vă pot accesa locația" - "Contactați administratorul IT pentru a afla mai multe" + "Contactează administratorul IT pentru a afla mai multe" "Serviciul de delimitare geografică" "Detector de țară" "Servicii de localizare" @@ -206,19 +206,19 @@ "Datele de pe dispozitiv vor fi șterse" "Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs." "Printare dezactivată de %s." - "Activați profilul de serviciu" + "Activează profilul de serviciu" "Aplicațiile personale sunt blocate până când activați profilul de serviciu" "Aplicațiile personale vor fi blocate pe %1$s, la %2$s. Administratorul IT nu permite ca profilul de serviciu să fie dezactivat mai mult de %3$d zile." - "Activați" + "Activează" "Eu" "Opțiuni tablet PC" "Opțiuni pentru Android TV" "Opțiuni telefon" "Mod Silențios" - "Activați funcția wireless" - "Dezactivați funcția wireless" - "Blocați ecranul" - "Opriți" + "Activează funcția wireless" + "Dezactivează funcția wireless" + "Blochează ecranul" + "Oprește" "Sonerie dezactivată" "Vibrare sonerie" "Sonerie activată" @@ -234,27 +234,27 @@ "Ceasul dvs. se va închide." "Telefonul dvs. se va închide." "Doriți să închideți?" - "Reporniți în modul sigur" - "Doriți să reporniți în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte pe care le-ați instalat. Acestea vor fi restabilite când reporniți din nou." + "Repornește în modul sigur" + "Repornești în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte instalate. Acestea vor fi restabilite când repornești dispozitivul." "Recente" "Nu există aplicații recente." "Opțiuni tablet PC" "Opțiuni pentru Android TV" "Opțiuni telefon" - "Blocați ecranul" - "Opriți" + "Blochează ecranul" + "Oprește" "Alimentare" - "Reporniți" + "Repornește" "Urgență" "Raport despre erori" - "Încheiați sesiunea" + "Încheie sesiunea" "Instantaneu" "Raport de eroare" "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis." "Raport interactiv" - "Folosiți această opțiune în majoritatea situațiilor. Astfel, puteți să urmăriți progresul raportului, să introduceți mai multe detalii în privința problemei și să creați capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." + "Folosește această opțiune în majoritatea situațiilor. Astfel, poți să urmărești progresul raportului, să introduci mai multe detalii în privința problemei și să creezi capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." "Raport complet" - "Folosiți această opțiune pentru a reduce la minimum interferențele cu sistemul când dispozitivul nu răspunde, funcționează prea lent sau când aveți nevoie de toate secțiunile raportului. Nu puteți să introduceți mai multe detalii sau să creați capturi de ecran suplimentare." + "Folosește această opțiune pentru a reduce la minimum interferențele cu sistemul când dispozitivul nu răspunde, funcționează prea lent sau când ai nevoie de toate secțiunile raportului. Nu poți să introduci mai multe detalii sau să creezi capturi de ecran suplimentare." "{count,plural, =1{Peste # secundă se va realiza o captură de ecran pentru raportul de eroare.}few{Peste # secunde se va realiza o captură de ecran pentru raportul de eroare.}other{Peste # de secunde se va realiza o captură de ecran pentru raportul de eroare.}}" "S-a realizat captura de ecran a raportului de eroare" "Nu s-a realizat captura de ecran a raportului de eroare" @@ -292,16 +292,16 @@ "Folosirea accesibilității" "%1$s folosește bateria" "%1$d aplicații folosesc bateria" - "Atingeți pentru mai multe detalii privind bateria și utilizarea datelor" + "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" "%1$s, %2$s" "Mod sigur" "Sistemul Android" "Comutați la profilul personal" "Comutați la profilul de serviciu" "Agendă" - "acceseze persoanele de contact" + "să acceseze agenda" "Locație" - "acceseze locația acestui dispozitiv" + "să acceseze locația acestui dispozitiv" "Calendar" "acceseze calendarul" "SMS" @@ -315,7 +315,7 @@ "Microfon" "înregistreze sunet" "Activitate fizică" - "accesați activitatea fizică" + "să acceseze activitatea fizică" "Camera foto" "fotografieze și să înregistreze videoclipuri" "Dispozitive din apropiere" @@ -323,14 +323,14 @@ "Jurnale de apeluri" "să citească și să scrie jurnalul de apeluri telefonice" "Telefon" - "inițieze și să gestioneze apeluri telefonice" + "să inițieze și să gestioneze apeluri telefonice" "Senzori corporali" - "acceseze datele de la senzori despre semnele vitale" + "să acceseze datele de la senzori despre semnele vitale" "Notificări" "să afișeze notificări" "Analizeze conținutul ferestrei" "Inspectează conținutul unei ferestre cu care interacționați." - "Activeze funcția Explorați prin atingere" + "să activeze funcția Explorează prin atingere" "Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi." "Remarce textul pe care îl introduceți" "Include date personale, cum ar fi numere ale cardurilor de credit sau parole." @@ -361,17 +361,17 @@ "primește mesaje text (SMS)" "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." "primește mesaje text (MMS)" - "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "Redirecționează mesajele cu transmisie celulară" "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." "Să gestioneze apelurile în desfășurare" "Permite unei aplicații să vadă detalii despre apelurile în desfășurare de pe dispozitiv și să gestioneze apelurile respective." "citește mesajele cu transmisie celulară" - "Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitivul dvs. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." + "Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitiv. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a te avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului când e primită o transmisie celulară de urgență." "citire feeduri abonat" "Permite aplicației să obțină detalii despre feedurile sincronizate în prezent." - "trimită și să vadă mesajele SMS" - "Permite aplicației să trimită mesaje SMS, ceea ce ar putea determina apariția unor taxe neașteptate. Aplicațiile rău intenționate pot acumula costuri prin trimiterea mesajelor fără confirmarea dvs." + "să trimită și să vadă mesajele SMS" + "Permite aplicației să trimită mesaje SMS, ceea ce ar putea duce la costuri neașteptate. Aplicațiile rău intenționate pot acumula costuri prin trimiterea mesajelor fără confirmarea ta." "citește mesajele text (SMS sau MMS)" "Această aplicație poate citi toate mesajele SMS stocate pe tabletă." "Această aplicație poate să citească toate mesajele SMS (texT) stocate pe dispozitivul Android TV." @@ -383,10 +383,10 @@ "să gestioneze profilul și proprietarii dispozitivului" "Permite aplicațiilor să seteze proprietarii de profiluri și proprietarul dispozitivului." "reordonare aplicații care rulează" - "Permite aplicației să mute activitățile în prim-plan și în fundal. Aplicația poate face acest lucru fără aportul dvs." + "Permite aplicației să mute activitățile în prim-plan și în fundal. Aplicația poate face acest lucru fără intervenția ta." "activare mod Mașină" "Permite aplicației să activeze modul Mașină." - "închide alte aplicații" + "să închidă alte aplicații" "Permite aplicației să oprească procesele derulate în fundal de alte aplicații. Acest lucru poate face ca respectivele aplicații să nu mai ruleze." "Această aplicație poate apărea deasupra altor aplicații" "Această aplicație poate apărea deasupra altor aplicații sau a altor părți ale ecranului. Acest lucru poate să afecteze utilizarea normală a aplicației și să schimbe modul în care se afișează alte aplicații." @@ -423,7 +423,7 @@ "citește jurnalul de apeluri" "Această aplicație poate citi istoricul apelurilor." "scrie jurnalul de apeluri" - "Permite aplicației să modifice jurnalul de apeluri al tabletei dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." + "Permite aplicației să modifice jurnalul de apeluri al tabletei, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al dispozitivului Android TV, inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." "Să acceseze date de la senzorii corporali, cum ar fi pulsul, în timpul folosirii" @@ -448,7 +448,7 @@ "Aplicația poate accesa locația oricând, chiar dacă nu este folosită." "modificare setări audio" "Permite aplicației să modifice setările audio globale, cum ar fi volumul și difuzorul care este utilizat pentru ieșire." - "înregistreze sunet" + "să înregistreze sunet" "Această aplicație poate să înregistreze conținut audio folosind microfonul când este în uz." "să înregistreze conținut audio în fundal" "Această aplicație poate înregistra conținut audio folosind microfonul oricând." @@ -460,14 +460,14 @@ "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto când este în uz." "să fotografieze și să înregistreze videoclipuri în fundal" "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto oricând." - "Permiteți unei aplicații sau unui serviciu accesul la camerele de sistem, ca să fotografieze și să înregistreze videoclipuri" + "Permite unei aplicații sau unui serviciu accesul la camerele de sistem, ca să fotografieze și să înregistreze videoclipuri" "Această aplicație de sistem privilegiată poate să fotografieze și să înregistreze videoclipuri folosind o cameră de sistem în orice moment. Necesită și permisiunea android.permission.CAMERA pentru aplicație" - "Permiteți unei aplicații sau unui serviciu să primească apeluri inverse atunci când sunt deschise sau închise dispozitive cu cameră." + "Permite unei aplicații sau unui serviciu să primească apeluri inverse atunci când sunt deschise sau închise dispozitive cu cameră." "Această aplicație poate primi apeluri inverse atunci când este deschis (de aplicație) sau închis orice dispozitiv cu cameră." "controlează vibrarea" "Permite aplicației să controleze mecanismul de vibrare." "Permite aplicației să acceseze modul de vibrații." - "apelare directă numere de telefon" + "să sune direct la numere de telefon" "Permite aplicației să apeleze numere de telefon fără intervenția dvs. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." "accesează serviciul de apelare IMS" "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția dvs." @@ -476,8 +476,8 @@ "să citească informații de bază, precum activitatea și starea telefonului" "Permite ca aplicația să acceseze funcțiile de telefonie de bază ale dispozitivului." "să direcționeze apelurile prin intermediul sistemului" - "Permiteți aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor." - "Vedeți și controlați apelurile prin intermediul sistemului." + "Permite aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor." + "Vezi și controlează apelurile prin intermediul sistemului." "Permite aplicației să vadă și să controleze apelurile în desfășurare pe dispozitiv. Aceasta include informații ca numerele pentru apeluri și starea apelurilor." "scutită de restricțiile pentru înregistrarea conținutului audio" "Scutiți aplicația de restricțiile pentru înregistrarea conținutului audio." @@ -506,10 +506,10 @@ "Permite aplicației să schimbe fusul orar al dispozitivului Android TV." "Permite aplicației să schimbe fusul orar al telefonului." "găsește conturi pe dispozitiv" - "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." + "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." - "vizualizează conexiunile la rețea" + "să vadă conexiunile la rețea" "Permite aplicației să vadă informațiile despre conexiunile la rețea, cum ar fi rețelele existente și cele care sunt conectate." "să aibă acces deplin la rețea" "Permite aplicației să creeze socluri de rețea și să utilizeze protocoale de rețea personalizate. Browserul și alte aplicații oferă mijloacele de trimitere a datelor pe internet, astfel încât această permisiune nu este necesară pentru trimiterea datelor pe internet." @@ -517,7 +517,7 @@ "Permite aplicației să modifice starea de conectivitate la rețea." "modificare conectivitate tethering" "Permite aplicației să modifice starea de conectivitate prin tethering la rețea." - "vizualizează conexiunile Wi-Fi" + "să vadă conexiunile Wi-Fi" "Permite aplicației să vadă informațiile despre rețelele Wi-Fi, de ex. dacă o rețea Wi-Fi este activată, precum și numele dispozitivelor conectate la rețeaua Wi-Fi." "se conectează și se deconectează de la Wi-Fi" "Permite aplicației să se conecteze și să se deconecteze de la punctele de acces Wi-Fi, precum și să efectueze modificări în configurația dispozitivului pentru rețelele Wi-Fi." @@ -531,12 +531,12 @@ "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se împerecheze cu dispozitive la distanță." "se conectează și se deconectează de la WiMAX" "Permite aplicației să stabilească dacă o rețea WiMAX este activată și să vadă informațiile cu privire la toate rețelele WiMAX conectate." - "schimbați starea WiMAX" + "schimbă starea WiMAX" "Permite aplicației să conecteze și să deconecteze tableta la și de la rețelele WiMAX." "Permite aplicației să conecteze și să deconecteze dispozitivul Android TV de la rețelele WiMAX." "Permite aplicației să conecteze și să deconecteze telefonul la și de la rețelele WiMAX." "conectează dispozitive Bluetooth" - "Permite aplicației să vadă configurația tabletei Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." + "Permite aplicației să vadă configurația tabletei Bluetooth, să facă și să accepte conexiuni cu dispozitive asociate." "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive împerecheate." "Permite aplicației să vadă configurația telefonului Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." "să descopere și să asocieze dispozitive Bluetooth din apropiere" @@ -546,7 +546,7 @@ "să transmită anunțuri pe dispozitive Bluetooth din apropiere" "Permite aplicației să difuzeze anunțuri pe dispozitive Bluetooth din apropiere" "să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" - "Permiteți-i aplicației să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" + "Permite-i aplicației să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" "să interacționeze cu dispozitive Wi‑Fi din apropiere" "Permite aplicației să se conecteze la dispozitive Wi-Fi din apropiere, să transmită anunțuri și să stabilească poziția relativă a acestora" "Informații despre serviciul de plăți NFC preferat" @@ -566,63 +566,63 @@ "folosește hardware-ul pentru amprentă" "Permite aplicației să folosească hardware pentru amprentă pentru autentificare" "modificați colecția de muzică" - "Permite aplicației să vă modifice colecția de muzică." + "Permite aplicației să modifice colecția de muzică." "modificați colecția de videoclipuri" "Permite aplicației să vă modifice colecția de videoclipuri." "modificați colecția de fotografii" "Permite aplicației să vă modifice colecția de fotografii." "citiți locațiile din colecția media" "Permite aplicației să citească locațiile din colecția dvs. media." - "Folosiți sistemele biometrice" - "Folosiți sistemele biometrice sau blocarea ecranului" + "Folosește sistemele biometrice" + "Folosește sistemele biometrice sau blocarea ecranului" "Confirmați-vă identitatea" - "Folosiți sistemele biometrice pentru a continua" - "Folosiți sistemele biometrice sau blocarea ecranului pentru a continua" + "Folosește sistemele biometrice pentru a continua" + "Folosește sistemele biometrice sau blocarea ecranului pentru a continua" "Hardware biometric indisponibil" "Autentificarea a fost anulată" "Nu este recunoscut" "Autentificarea a fost anulată" "Nu este setat niciun cod PIN, model sau parolă" "Eroare la autentificare" - "Folosiți blocarea ecranului" + "Folosește blocarea ecranului" "Introduceți blocarea ecranului ca să continuați" - "Apăsați ferm pe senzor" - "Amprenta nu a putut fi procesată. Încercați din nou." + "Apasă ferm pe senzor" + "Amprenta nu a putut fi procesată. Încearcă din nou." "Curățați senzorul de amprentă și încercați din nou" "Curățați senzorul și încercați din nou" - "Apăsați ferm pe senzor" - "Ați mișcat degetul prea lent. Încercați din nou." - "Încercați altă amprentă" + "Apasă ferm pe senzor" + "Ai mișcat degetul prea lent. Încearcă din nou." + "Încearcă altă amprentă" "Prea luminos" "Încercați să ajustați" - "Schimbați ușor poziția degetului de fiecare dată" + "Schimbă ușor poziția degetului de fiecare dată" "Amprenta nu a fost recunoscută" "Amprenta nu a fost recunoscută" "Amprentă autentificată" "Chip autentificat" - "Chip autentificat, apăsați Confirmați" + "Chip autentificat, apasă pe Confirmă" "Hardware-ul pentru amprentă nu este disponibil." "Nu se poate configura amprenta" - "Timpul pentru amprentare a expirat. Încercați din nou." + "Timpul pentru amprentare a expirat. Încearcă din nou." "Operațiunea privind amprenta a fost anulată." "Operațiunea privind amprenta a fost anulată de utilizator." - "Prea multe încercări. Încercați din nou mai târziu." + "Prea multe încercări. Încearcă din nou mai târziu." "Prea multe încercări. Senzorul de amprentă este dezactivat." - "Încercați din nou." + "Încearcă din nou." "Nu au fost înregistrate amprente." "Dispozitivul nu are senzor de amprentă." "Senzorul este dezactivat temporar." "Nu se poate folosi senzorul de amprentă. Vizitați un furnizor de servicii de reparații." "Degetul %d" - "Folosiți amprenta" - "Folosiți amprenta sau blocarea ecranului" - "Folosiți amprenta pentru a continua" - "Folosiți amprenta sau blocarea ecranului pentru a continua" + "Folosește amprenta" + "Folosește amprenta sau blocarea ecranului" + "Folosește amprenta pentru a continua" + "Folosește amprenta sau blocarea ecranului pentru a continua" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Pictograma amprentă" "Deblocare facială" "Problemă cu Deblocarea facială" @@ -635,22 +635,22 @@ "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" "Vizitați un furnizor de servicii de reparații." - "Nu s-a putut fotografia fața cu precizie. Încercați din nou." - "Prea luminos. Încercați o lumină mai slabă." - "Prea întunecat. Încercați o lumină mai puternică." - "Mutați telefonul mai departe." - "Mutați telefonul mai aproape." - "Mutați telefonul mai sus." - "Mutați telefonul mai jos." - "Mutați telefonul spre stânga." - "Mutați telefonul spre dreapta." + "Nu s-a putut fotografia fața cu precizie. Încearcă din nou." + "Prea luminos. Încearcă o lumină mai slabă." + "Prea întunecat. Încearcă o lumină mai puternică." + "Mută telefonul mai departe." + "Mută telefonul mai aproape." + "Mută telefonul mai sus." + "Mută telefonul mai jos." + "Mută telefonul spre stânga." + "Mută telefonul spre dreapta." "Priviți mai direct spre dispozitiv." "Stați cu capul direct în fața telefonului." "Prea multă mișcare. Țineți telefonul nemișcat." - "Reînregistrați-vă chipul." - "Nu se mai poate recunoaște fața. Încercați din nou." - "Prea asemănător, schimbați poziția." - "Întoarceți capul mai puțin." + "Reînregistrează-ți chipul." + "Nu se mai poate recunoaște fața. Încearcă din nou." + "Prea asemănător, schimbă poziția." + "Întoarce capul mai puțin." "Înclinați capul mai puțin." "Întoarceți capul mai puțin." "Eliminați orice vă ascunde chipul." @@ -658,27 +658,27 @@ "Nu se poate confirma fața. Hardware-ul nu este disponibil." - "Încercați din nou Deblocarea facială" - "Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi." + "Încearcă din nou Deblocarea facială" + "Nu se pot stoca date faciale noi. Șterge întâi unele vechi." "Operațiunea privind chipul a fost anulată." "Deblocarea facială a fost anulată de utilizator" - "Prea multe încercări. Reîncercați mai târziu." + "Prea multe încercări. Reîncearcă mai târziu." "Prea multe încercări. Deblocarea facială este dezactivată." - "Prea multe încercări. Folosiți blocarea ecranului." - "Nu se poate confirma fața. Încercați din nou." + "Prea multe încercări. Folosește blocarea ecranului." + "Nu se poate confirma fața. Încearcă din nou." "Nu ați configurat Deblocarea facială" "Deblocarea facială nu este acceptată pe acest dispozitiv" "Senzorul este dezactivat temporar." "Chip %d" - "Folosiți Deblocarea facială" - "Folosiți deblocarea facială sau ecranul de blocare" + "Folosește Deblocarea facială" + "Folosește deblocarea facială sau ecranul de blocare" "Folosiți-vă chipul ca să continuați" "Folosiți-vă chipul sau blocarea ecranului pentru a continua" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Pictograma chip" - "citire setări sincronizare" + "să citească setări sincronizare" "Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont." "activează/dezactivează sincronizarea" "Permite unei aplicații să modifice setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate activa sincronizarea aplicației Persoane cu un anumit cont." @@ -705,7 +705,7 @@ "interacțiune cu ecranul în timpul unui apel" "Permite aplicației să controleze când și cum vede utilizatorul ecranul în timpul unui apel." "să interacționeze cu servicii de telefonie" - "Permite aplicației să interacționeze cu servicii de telefonie pentru a da / a primi apeluri." + "Permite aplicației să interacționeze cu servicii de telefonie pentru a face / a primi apeluri." "oferă o experiență de utilizare în timpul unui apel" "Permite aplicației să ofere o experiență de utilizare în timpul unui apel." "citește utilizarea statistică a rețelei" @@ -740,7 +740,7 @@ "Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite." "accesează Nu deranja" "Permite aplicației să citească și să scrie configurația Nu deranja." - "porniți folosirea permisiunii de vizualizare" + "să înceapă folosirea permisiunii de vizualizare" "Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "să înceapă să examineze deciziile privind permisiunile" "Permite proprietarului să deschidă ecranul pentru a examina deciziile privind permisiunile. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." @@ -754,36 +754,36 @@ "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți datele acesteia dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele de pe acesta dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestui profil dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Să schimbe blocarea ecranului" - "Modificați blocarea ecranului." + "Modifică blocarea ecranului." "Să blocheze ecranul" - "Stabiliți modul și timpul în care se blochează ecranul." + "Stabilește cum și când se blochează ecranul." "Să șteargă toate datele" - "Ștergeți datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică." - "Ștergeți datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică." - "Ștergeți datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică." - "Ștergeți datele din telefon fără avertisment, efectuând resetarea configurării din fabrică." - "Ștergeți datele de profil" - "Ștergeți datele utilizatorului" - "Ștergeți datele acestui utilizator de pe această tabletă fără avertisment." - "Ștergeți datele acestui utilizator de pe acest dispozitiv Android TV fără avertisment" - "Ștergeți datele profilului din acest sistem de infotainment fără avertisment." - "Ștergeți datele acestui utilizator de pe acest telefon fără avertisment." - "Setați serverul proxy global pentru dispozitiv" - "Setați serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global." - "Setați expirarea parolei pentru blocarea ecranului" - "Modificați frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului." + "Șterge datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică." + "Șterge datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică." + "Șterge datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică." + "Șterge datele din telefon fără avertisment, revenind la setările din fabrică." + "Șterge datele de profil" + "Șterge datele utilizatorului" + "Șterge datele acestui utilizator de pe această tabletă fără avertisment." + "Șterge datele acestui utilizator de pe acest dispozitiv Android TV fără avertisment" + "Șterge datele profilului din acest sistem de infotainment fără avertisment." + "Șterge datele acestui utilizator de pe acest telefon fără avertisment." + "Setează serverul proxy global pentru dispozitiv" + "Setează serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global." + "Setează expirarea parolei pentru blocarea ecranului" + "Modifică frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului." "Să seteze criptarea stocării" "Necesită ca datele aplicației stocate să fie criptate." "Să dezactiveze camerele foto" - "Împiedicați utilizarea camerelor foto de pe dispozitiv." + "Împiedică folosirea camerelor foto de pe dispozitiv." "Să oprească funcții de blocare ecran" - "Împiedicați folosirea unor funcții de blocare a ecranului." + "Împiedică folosirea unor funcții de blocare a ecranului." "Domiciliu" "Mobil" @@ -902,23 +902,23 @@ "Introdu codul PUK și noul cod PIN" "Codul PUK" "Noul cod PIN" - "Atingeți ca să introduceți parola" + "Atinge ca să introduci parola" "Introdu parola pentru a debloca" "Introdu codul PIN pentru a debloca" "Cod PIN incorect." - "Pentru a debloca, apăsați Meniu, apoi 0." + "Pentru a debloca, apasă Meniu, apoi 0." "Număr de urgență" "Fără semnal" "Ecranul este blocat." - "Apăsați Meniu pentru a debloca sau pentru a efectua apeluri de urgență." - "Apăsați Meniu pentru deblocare." - "Desenați modelul pentru a debloca" + "Apasă Meniu pentru a debloca sau pentru a efectua apeluri de urgență." + "Apasă Meniu pentru deblocare." + "Desenează modelul pentru a debloca" "Urgență" "Reveniți la apel" "Corect!" - "Încercați din nou" - "Încercați din nou" - "Deblocați pentru toate funcțiile și datele" + "Încearcă din nou" + "Încearcă din nou" + "Deblochează pentru toate funcțiile și datele" "S-a depășit numărul maxim de încercări pentru Deblocare facială" "Fără SIM" "Nu există card SIM în computerul tablet PC." @@ -931,10 +931,10 @@ "Melodia anterioară" "Melodia următoare" "Pauză" - "Redați" - "Opriți" - "Derulați" - "Derulați rapid înainte" + "Redă" + "Oprește" + "Derulează" + "Derulează rapid înainte" "Numai apeluri de urgență" "Rețea blocată" "Cardul SIM este blocat cu codul PUK." @@ -943,18 +943,18 @@ "Se deblochează cardul SIM..." "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV prin conectarea la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va fi resetată la setările prestabilite din fabrică, iar toate datele de utilizator vor fi pierdute." - "Ați efectuat %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator vor fi pierdute." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV prin conectarea la Google.\n\n Încearcă din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." + "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acesta va fi acum resetat la setările prestabilite din fabrică." - "Încercați din nou peste %d secunde." - "Ați uitat modelul?" + "Încearcă din nou peste %d secunde." + "Ai uitat modelul?" "Deblocare cont" "Prea multe încercări de desenare a modelului" "Pentru a debloca, conectați-vă folosind Contul Google." @@ -964,7 +964,7 @@ "Nume de utilizator sau parolă nevalide." "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică..." - "Deblocați" + "Deblochează" "Sunet activat" "Sunet dezactivat" "Desenarea modelului a început" @@ -974,7 +974,7 @@ "Modelul a fost desenat" "Zonă model." "%1$s. Widget %2$d din %3$d." - "Adăugați un widget." + "Adaugă un widget." "Gol" "Zona de deblocare a fost extinsă." "Zona de deblocare a fost restrânsă." @@ -986,7 +986,7 @@ "A început reordonarea widgeturilor." "Reordonarea widgeturilor s-a încheiat." "Widgetul %1$s a fost eliminat." - "Extindeți zona de deblocare." + "Extinde zona de deblocare." "Deblocare prin glisare." "Deblocare cu model." "Deblocare facială." @@ -1006,18 +1006,18 @@ "Testarea de fabrică nu a reușit" "Acțiunea FACTORY_TEST este acceptată doar pentru pachetele instalate în /system/app." "Nu s-a găsit niciun pachet care să ofere acțiunea FACTORY_TEST." - "Reporniți" + "Repornește" "La pagina de la „%s” apare:" "JavaScript" - "Confirmați părăsirea paginii" - "Părăsiți această pagină" + "Confirmă părăsirea paginii" + "Părăsește această pagină" "Rămâneți în această pagină" - "%s\n\nSigur doriți să părăsiți această pagină?" - "Confirmați" - "Sfat: măriți și micșorați prin dublă atingere." + "%s\n\nSigur părăsești această pagină?" + "Confirmă" + "Sfat: mărește și micșorează prin dublă atingere." "Automat" "Conf.Compl.auto." - "Completați automat cu %1$s" + "Completează automat cu %1$s" " " "$1$2$3" ", " @@ -1048,9 +1048,9 @@ "Permite aplicației să modifice permisiunile privind locația geografică a browserului. Aplicațiile rău intenționate pot utiliza această permisiune pentru a permite trimiterea informațiilor privind locația către site-uri web arbitrare." "Doriți ca browserul să rețină această parolă?" "Nu acum" - "Rețineți" + "Reține" "Niciodată" - "Nu aveți permisiunea de a deschide această pagină." + "Nu ai permisiunea de a deschide această pagină." "Text copiat în clipboard." "%1$s a inserat date din %2$s" "%1$s a inserat din clipboard" @@ -1068,16 +1068,16 @@ "spațiu" "enter" "delete" - "Căutați" - "Căutați…" - "Căutați" + "Caută" + "Caută…" + "Caută" "Interogare de căutare" - "Ștergeți interogarea" + "Șterge interogarea" "Trimite interogarea" "Căutare vocală" "Activați Explorați prin atingere?" - "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu tableta." - "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu telefonul." + "%1$s vrea să activeze funcția Explorează prin atingere. Când e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu tableta." + "%1$s dorește să activeze funcția Explorează prin atingere. Când aceasta e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu telefonul." "cu 1 lună în urmă" "Cu mai mult de 1 lună în urmă" "{count,plural, =1{Ultima zi}few{Ultimele # zile}other{Ultimele # de zile}}" @@ -1126,22 +1126,22 @@ "Miezul nopții" "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "Selectați-le pe toate" - "Decupați" - "Copiați" + "Selectează-le pe toate" + "Decupează" + "Copiază" "Eroare la copierea în clipboard" - "Inserați" - "Inserați ca text simplu" + "Inserează" + "Inserează ca text simplu" "Înlocuiți..." - "Ștergeți" - "Copiați adresa URL" - "Selectați text" + "Șterge" + "Copiază adresa URL" + "Selectează text" "Anulează" - "Repetați" + "Repetă" "Completare automată" "Selectare text" - "Adăugați în dicționar" - "Ștergeți" + "Adaugă în dicționar" + "Șterge" "Metodă de intrare" "Acțiuni pentru text" "Înapoi" @@ -1150,7 +1150,7 @@ "Este posibil ca unele funcții de sistem să nu funcționeze" "Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți." "%1$s rulează acum" - "Atingeți pentru mai multe informații sau pentru a opri aplicația." + "Atinge pentru mai multe informații sau pentru a opri aplicația." "OK" "Anulează" "OK" @@ -1167,32 +1167,32 @@ "Finalizare acțiune utilizând" "Finalizați acțiunea utilizând %1$s" "Finalizați acțiunea" - "Deschideți cu" - "Deschideți cu %1$s" - "Deschideți" - "Deschideți linkurile %1$s cu" - "Deschideți linkurile cu" - "Deschideți linkurile cu %1$s" - "Deschideți linkurile %1$s cu %2$s" - "Permiteți accesul" - "Editați cu" - "Editați cu %1$s" - "Editați" + "Deschide cu" + "Deschide cu %1$s" + "Deschide" + "Deschide linkurile %1$s cu" + "Deschide linkurile cu" + "Deschide linkurile cu %1$s" + "Deschide linkurile %1$s cu %2$s" + "Permite accesul" + "Editează cu" + "Editează cu %1$s" + "Editează" "Trimite" - "Distribuiți cu %1$s" + "Distribuie cu %1$s" "Trimite" "Trimite folosind" "Trimite folosind %1$s" "Trimite" - "Selectați o aplicație de pe ecranul de pornire" + "Selectează o aplicație de pe ecranul de pornire" "Utilizați %1$s ca ecran de pornire" - "Fotografiați" - "Fotografiați cu" - "Fotografiați cu %1$s" - "Fotografiați" + "Fotografiază" + "Fotografiază cu" + "Fotografiază cu %1$s" + "Fotografiază" "Se utilizează în mod prestabilit pentru această acțiune." "Utilizați altă aplicație" - "Ștergeți setările prestabilite din Setări de sistem > Aplicații > Descărcate." + "Șterge setările prestabilite din Setări de sistem > Aplicații > Descărcate." "Alege o acțiune" "Alege o aplicație pentru dispozitivul USB" "Această acțiune nu poate fi efectuată de nicio aplicație." @@ -1200,12 +1200,12 @@ "%1$s s-a oprit" "%1$s se oprește încontinuu" "%1$s se oprește încontinuu" - "Deschideți din nou aplicația" + "Deschide din nou aplicația" "Trimite feedback" - "Închideți" - "Dezactivați până la repornirea dispozitivului" - "Așteptați" - "Închideți aplicația" + "Închide" + "Dezactivează până la repornirea dispozitivului" + "Așteaptă" + "Închide aplicația" "%2$s nu răspunde" "%1$s nu răspunde" @@ -1213,19 +1213,19 @@ "Procesul %1$s nu răspunde" "OK" "Raportați" - "Așteptați" - "Pagina a devenit inactivă.\n\nDoriți să o închideți?" + "Așteaptă" + "Pagina a devenit inactivă.\n\nO închizi?" "Aplicație redirecționată" "%1$s funcționează acum." "%1$s a fost lansată inițial." "Scară" - "Afișați întotdeauna" - "Reactivați acest mod din Setări de sistem > Aplicații > Descărcate." + "Afișează întotdeauna" + "Reactivează acest mod din Setări de sistem > Aplicații > Descărcate." "%1$s nu acceptă setarea actuală pentru Dimensiunea afișării și este posibil să aibă un comportament neașteptat." "Afișează întotdeauna" "%1$s a fost concepută pentru o versiune incompatibilă de sistem de operare Android și este posibil să se comporte în mod neprevăzut. Poate fi disponibilă o versiune actualizată a aplicației." - "Afișați întotdeauna" - "Căutați actualizări" + "Afișează întotdeauna" + "Caută actualizări" "Aplicația %1$s (procesul %2$s) a încălcat propria politică StrictMode." "Procesul %1$s a încălcat propria politică StrictMode." "Se actualizează telefonul.…" @@ -1244,24 +1244,24 @@ "Se finalizează pornirea." "Continuați configurarea?" "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor când vă configurați amprenta." - "Dezactivați ecranul" - "Continuați configurarea" + "Dezactivează ecranul" + "Continuă configurarea" "Continuați cu verificarea amprentei?" "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor pentru verificarea amprentei." - "Dezactivați ecranul" - "Continuați" + "Dezactivează ecranul" + "Continuă" "Rulează %1$s" - "Atingeți pentru a reveni la joc" + "Atinge pentru a reveni la joc" "Alege jocul" "Pentru o performanță mai bună, se poate deschide un singur joc odată." - "Reveniți la %1$s" - "Deschideți %1$s" + "Revino la %1$s" + "Deschide %1$s" "%1$s se va închide fără să salveze" "%1$s a depășit limita de memorie" "Datele privind memoria heap %1$s sunt gata" - "Datele privind memoria au fost culese. Atingeți pentru a trimite." + "Datele privind memoria au fost culese. Atinge pentru a trimite." "Trimiți datele privind memoria?" - "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." + "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Alege o acțiune pentru text" @@ -1286,12 +1286,12 @@ "Sunete de alarmă" "Sunete pentru notificare" "Necunoscut" - "Conectați-vă la rețeaua Wi-Fi" - "Conectați-vă la rețea" + "Conectează-te la rețeaua Wi-Fi" + "Conectează-te la rețea" "%1$s nu are acces la internet" - "Atingeți pentru opțiuni" + "Atinge pentru opțiuni" "Rețeaua mobilă nu are acces la internet" "Rețeaua nu are acces la internet" "Serverul DNS privat nu poate fi accesat" @@ -1312,33 +1312,33 @@ "Refuz" "Introdu caracterul" "Se trimit mesaje SMS" - "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiteți acestei aplicații să trimită în continuare mesaje?" - "Permiteți" + "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiți acestei aplicații să trimită în continuare mesaje?" + "Permite" "Refuz" "<b>%1$s</b> intenționează să trimită un mesaj la <b>%2$s</b>." - "Acest lucru ""poate genera costuri"" în contul dvs. mobil." - "Acest lucru va genera costuri în contul dvs. mobil." + "Acest lucru ""poate genera costuri"" în contul tău mobil." + "Acest lucru va genera costuri în contul tău mobil." "Trimite" "Anulează" "Doresc să se rețină opțiunea" - "Puteți modifica ulterior în Setări > Aplicații" - "Permiteți întotdeauna" - "Nu permiteți niciodată" + "Poți modifica ulterior în Setări > Aplicații" + "Permite întotdeauna" + "Nu permite niciodată" "Card SIM eliminat" "Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus." "Terminat" "Card SIM adăugat" - "Reporniți dispozitivul pentru a accesa rețeaua mobilă." - "Reporniți" - "Activați serviciul mobil" + "Repornește dispozitivul pentru a accesa rețeaua mobilă." + "Repornește" + "Activează serviciul mobil" "Descărcați aplicația operatorului pentru a vă activa noul card SIM" - "Descărcați aplicația %1$s pentru a vă activa noul card SIM" - "Descărcați aplicația" + "Descarcă aplicația %1$s pentru a-ți activa noul card SIM" + "Descarcă aplicația" "S-a introdus un card SIM nou" - "Atingeți pentru a-l configura" - "Setați ora" - "Setați data" - "Setați" + "Atinge pentru a-l configura" + "Setează ora" + "Setează data" + "Setează" "Terminat" "NOU: " "Furnizată de %1$s." @@ -1352,18 +1352,18 @@ "Tetheringul prin USB este activat" "MIDI prin USB este activat" "Accesoriu USB conectat" - "Atingeți pentru mai multe opțiuni." - "Se încarcă dispozitivul conectat. Atingeți pentru mai multe opțiuni." + "Atinge pentru mai multe opțiuni." + "Se încarcă dispozitivul conectat. Atinge pentru mai multe opțiuni." "S-a detectat un accesoriu audio analogic" - "Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe." + "Dispozitivul atașat nu este compatibil cu acest telefon. Atinge pentru a afla mai multe." "Remedierea erorilor prin USB conectată" - "Atingeți pentru a dezactiva." - "Selectați pentru a dezactiva remedierea erorilor prin USB." + "Atinge pentru a dezactiva." + "Selectează pentru a dezactiva remedierea erorilor prin USB." "Remedierea erorilor wireless este activă" "Atinge pentru a dezactiva remedierea erorilor wireless" - "Selectați pentru a dezactiva remedierea erorilor wireless." + "Selectează pentru a dezactiva remedierea erorilor wireless." "Modul Set de testare este activat" - "Reveniți la setările din fabrică pentru a dezactiva modul Set de testare." + "Revino la setările din fabrică pentru a dezactiva modul Set de testare." "Consola din serie este activată" "Performanța este afectată. Pentru a dezactiva, verificați programul bootloader." "MTE experimentală activată" @@ -1380,35 +1380,35 @@ "REFUZAȚI" "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" - "Afișați tastatura virtuală" + "Afișează tastatura virtuală" "Configurează tastatura fizică" - "Atingeți pentru a selecta limba și aspectul" + "Atinge pentru a selecta limba și aspectul" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "Afișare peste alte aplicații" "%s se afișează peste alte aplicații" "%s se afișează peste aplicații" "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." - "Dezactivați" + "Dezactivează" "Se verifică %s…" "Se examinează conținutul curent" "Se analizează spațiul de stocare media" "%s nou" "%s nu funcționează" - "Atingeți pentru a configura" - "Selectați pentru a configura" + "Atinge pentru a configura" + "Selectează pentru a configura" "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." "Pentru a transfera fotografii și fișiere media" "Răsfoiți fișierele media" "Problemă cu %s" "%s nu funcționează" - "Atingeți pentru a remedia" - "%s este corupt. Selectați pentru a remedia." + "Atinge pentru a remedia" + "%s este corupt. Selectează pentru a remedia." "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." "%s necompatibil" "%s nu funcționează" - "Dispozitivul nu este compatibil cu acest %s. Atingeți pentru configurare într-un format compatibil." - "Selectați pentru a configura %s într-un format acceptat." + "Dispozitivul nu este compatibil cu acest %s. Atinge pentru configurare într-un format compatibil." + "Selectează pentru a configura %s într-un format acceptat." "Poate fi nevoie să reformatați dispozitivul" "%s scos pe neașteptate" "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" @@ -1417,17 +1417,17 @@ "Se deconectează %s" "Nu scoateți" "Configurează" - "Scoateți" + "Scoate" "Explorați" - "Schimbați ieșirea" + "Schimbă ieșirea" "%s lipsește" - "Reintroduceți dispozitivul" + "Reintrodu dispozitivul" "Se mută %s" "Se mută datele" "Transfer de conținut încheiat" "Conținut mutat pe %s" "Nu s-a putut muta conținutul" - "Încercați să mutați din nou conținutul" + "Încearcă să muți din nou conținutul" "Eliminat" "Scos" "Se verifică..." @@ -1452,10 +1452,10 @@ "Permite unei aplicații să solicite permisiunea de a ignora optimizările bateriei pentru aplicația respectivă." "să interogheze toate pachetele" "Permite unei aplicații să vadă toate pachetele instalate." - "Apăsați de două ori pentru a controla mărirea/micșorarea" + "Apasă de două ori pentru a controla mărirea/micșorarea" "Nu s-a putut adăuga widgetul." - "Accesați" - "Căutați" + "Accesează" + "Caută" "Trimite" "Înainte" "Terminat" @@ -1464,48 +1464,48 @@ "Formați numărul\nutilizând %s" "Creați contactul\nutilizând %s" "Următoarele aplicații solicită permisiunea de a accesa contul dvs. acum și în viitor." - "Permiteți această solicitare?" + "Permiți această solicitare?" "Solicitare de acces" - "Permiteți" + "Permite" "Refuz" "Permisiune solicitată" "Permisiune solicitată\npentru contul %s." "Permisiune solicitată de %1$s\npentru contul %2$s." - "Utilizați această aplicație în afara profilului de serviciu" - "Utilizați această aplicație în profilul de serviciu" + "Folosești această aplicație în afara profilului de serviciu" + "Folosești această aplicație în profilul de serviciu" "Metodă de intrare" "Sincronizare" "Accesibilitate" "Imagine de fundal" - "Schimbați imaginea de fundal" + "Schimbă imaginea de fundal" "Serviciu de citire a notificărilor" "Instrument de ascultare pentru RV" "Furnizor de condiții" "Serviciul de clasificare a notificărilor" "VPN activat" "VPN este activată de %s" - "Apăsați pentru a gestiona rețeaua." - "Conectat la %s. Apăsați pentru a gestiona rețeaua." + "Apasă pentru a gestiona rețeaua." + "Conectat la %s. Apasă pentru a gestiona rețeaua." "Se efectuează conectarea la rețeaua VPN activată permanent…" "Conectat(ă) la rețeaua VPN activată permanent" "Deconectat de la rețeaua VPN activată permanent" "Nu s-a putut conecta la rețeaua VPN activată permanent" - "Modificați setările de rețea sau VPN" + "Modifică setările de rețea sau VPN" "Alege un fișier" "Nu au fost găsite fișiere" - "Resetați" + "Resetează" "Trimite" "Aplicația pentru condus rulează" - "Atingeți ca să ieșiți din aplicația pentru condus." + "Atinge ca să ieși din aplicația pentru condus." "Înapoi" "Înainte" - "Omiteți" + "Omite" "Nicio potrivire" "Găsiți pe pagină" "{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}}" "Terminat" "Se șterge spațiul de stocare distribuit..." - "Distribuiți" + "Distribuie" "Găsiți" "Căutare pe web" "Următorul rezultat" @@ -1517,25 +1517,25 @@ "Nu" "Limita pentru ștergere a fost depășită" "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" - "Ștergeți elementele" + "Șterge elementele" "Anulează aceste ștergeri" "Nu trebuie să luați nicio măsură deocamdată" "Alege un cont" - "Adăugați un cont" - "Adăugați un cont" + "Adaugă un cont" + "Adaugă un cont" "Creșteți" "Reduceți" "%s atingeți lung." - "Glisați în sus pentru a crește și în jos pentru a reduce." + "Glisează în sus pentru a crește și în jos pentru a reduce." "Creșteți valoarea pentru minute" - "Reduceți valoarea pentru minute" + "Redu valoarea pentru minute" "Creșteți valoarea pentru oră" - "Reduceți valoarea pentru oră" - "Setați valoarea PM" - "Setați valoarea AM" - "Creșteți valoarea pentru lună" + "Redu valoarea pentru oră" + "Setează valoarea PM" + "Setează valoarea AM" + "Mărește valoarea pentru lună" "Reduceți valoarea pentru lună" - "Creșteți valoarea pentru zi" + "Mărește valoarea pentru zi" "Reduceți valoarea pentru zi" "Creșteți valoarea pentru an" "Reduceți valoarea pentru an" @@ -1543,19 +1543,19 @@ "Luna viitoare" "Alt" "Anulează" - "Ștergeți" + "Șterge" "Terminat" "Schimbarea modului" "Shift" "Enter" "Alege o aplicație" "Nu s-a putut lansa %s" - "Permiteți accesul pentru" - "Permiteți accesul pentru %s" + "Permite accesul pentru" + "Permite accesul pentru %s" "Mâner glisant. Atingeți și țineți apăsat." - "Glisați pentru a debloca." - "Navigați la ecranul de pornire" - "Navigați în sus" + "Glisează pentru a debloca." + "Navighează la ecranul de pornire" + "Navighează în sus" "Mai multe opțiuni" "%1$s, %2$s" "%1$s, %2$s, %3$s" @@ -1565,19 +1565,19 @@ "Unitate USB" "Unitate USB %s" "Dsipozitiv de stocare USB" - "Editați" + "Editează" "Avertisment pentru date" - "Ați folosit %s din date" + "Ai folosit %s din date" "S-a atins limita de date mobile" - "Ați atins limita de date Wi-Fi" + "Ai atins limita de date Wi-Fi" "Datele au fost întrerupte pentru restul ciclului" "Peste limita de date mobile" "Peste limita de date Wi-Fi" - "Ați depășit limita stabilită cu %s" + "Ai depășit limita stabilită cu %s" "Datele de fundal restricționate" - "Atingeți ca să eliminați restricția." + "Atinge ca să elimini restricția." "Utilizare mare de date mobile" - "Aplicațiile dvs. au utilizat mai multe date decât de obicei" + "Aplicațiile au folosit mai multe date decât de obicei" "%s a utilizat mai multe date decât de obicei" "Certificat de securitate" "Certificatul este valid." @@ -1593,11 +1593,11 @@ "Amprente:" "Amprentă SHA-256:" "Amprentă SHA-1:" - "Afișați-le pe toate" + "Afișează-le pe toate" "Alege activitatea" - "Distribuiți pentru" + "Distribuie pentru" "Se trimite..." - "Lansați browserul?" + "Lansezi browserul?" "Accepți apelul?" "Întotdeauna" "Numai o dată" @@ -1613,8 +1613,8 @@ "Audio Bluetooth" "Ecran wireless" "Trimite" - "Conectați-vă la dispozitiv" - "Proiectați ecranul pe dispozitiv" + "Conectează-te la dispozitiv" + "Proiectează ecranul pe dispozitiv" "Se caută dispozitive..." "Setări" "Deconectează-te" @@ -1632,13 +1632,13 @@ "Model greșit" "Parolă greșită" "Cod PIN greșit" - "Desenați modelul" + "Desenează modelul" "Introdu codul PIN al cardului SIM" "Introdu codul PIN" "Introdu parola" "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." "Introdu codul PIN dorit" - "Confirmați codul PIN dorit" + "Confirmă codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." "Introdu un cod PIN format din 4 până la 8 cifre." @@ -1654,28 +1654,28 @@ "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică contul…" "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va fi resetată la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." + "Ați făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." + "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." "Ați efectuat %d încercări incorecte de deblocare a telefonului. Telefonul va fi acum resetat la setările prestabilite din fabrică." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." " — " - "Eliminați" + "Elimină" "Ridicați volumul mai sus de nivelul recomandat?\n\nAscultarea la volum ridicat pe perioade lungi de timp vă poate afecta auzul." "Utilizați comanda rapidă pentru accesibilitate?" "Atunci când comanda rapidă este activată, dacă apăsați ambele butoane de volum timp de trei secunde, veți lansa o funcție de accesibilitate." - "Activați comanda rapidă pentru funcțiile de accesibilitate?" + "Activezi comanda rapidă pentru funcțiile de accesibilitate?" "Dacă apăsați ambele taste de volum câteva secunde, activați funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPuteți schimba funcțiile selectate din Setări > Accesibilitate." " • %1$s\n" - "Activați comanda rapidă %1$s?" + "Activezi comanda rapidă %1$s?" "Dacă apăsați ambele taste de volum câteva secunde, activați funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPuteți alege altă funcție pentru această comandă în Setări > Accesibilitate." - "Activați" + "Activează" "Nu activați" "ACTIVAT" "DEZACTIVAT" @@ -1685,23 +1685,23 @@ "Poate citi tot conținutul de pe ecran și poate afișa conținut peste alte aplicații." "Vă vede interacțiunile și le realizează" "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." - "Permiteți" + "Permite" "Refuz" "Atingeți o funcție ca să începeți să o folosiți:" "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" - "Editați comenzile rapide" + "Editează comenzile rapide" "Gata" - "Dezactivați comanda rapidă" - "Utilizați comanda rapidă" + "Dezactivează comanda rapidă" + "Folosește comanda rapidă" "Inversarea culorilor" "Corecția culorii" "Modul cu o mână" "Luminozitate redusă suplimentar" "S-au apăsat lung tastele de volum. S-a activat %1$s." "S-au apăsat lung tastele de volum. S-a dezactivat %1$s." - "Apăsați ambele butoane de volum timp de trei secunde pentru a folosi %1$s" + "Apasă ambele butoane de volum timp de trei secunde pentru a folosi %1$s" "Alegeți o funcție pe care să o folosiți când atingeți butonul de accesibilitate:" "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):" "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):" @@ -1715,7 +1715,7 @@ "Proprietar" "Invitat" "Eroare" - "Această modificare nu este permisă de administratorul dvs." + "Această modificare nu este permisă de administrator" "Nicio aplicație pentru gestionarea acestei acțiuni" "Revocați" "ISO A0" @@ -1818,27 +1818,27 @@ "necunoscut" "Serviciul de printare nu este activat" "Serviciul %s a fost instalat" - "Atingeți pentru a activa" + "Atinge pentru a activa" "Introdu codul PIN de administrator" "Introdu codul PIN" "Incorect" "Codul PIN actual" "Codul PIN nou" - "Confirmați noul cod PIN" + "Confirmă noul cod PIN" "Creați un cod PIN pentru modificarea restricțiilor" "Codurile PIN nu se potrivesc. Încercați din nou." "Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre." - "Reîncercați mai târziu" + "Reîncearcă mai târziu" "Vizualizare pe ecran complet" "Pentru a ieși, glisați de sus în jos." "Am înțeles" "Terminat" "Selector circular pentru ore" "Selector circular pentru minute" - "Selectați orele" - "Selectați minutele" - "Selectați luna și ziua" - "Selectați anul" + "Selectează orele" + "Selectează minutele" + "Selectează luna și ziua" + "Selectează anul" "%1$s a fost șters" "%1$s de serviciu" "%1$s pentru serviciu (2)" @@ -1846,15 +1846,15 @@ "Solicită codul PIN înainte de a anula fixarea" "Solicită mai întâi modelul pentru deblocare" "Solicită parola înainte de a anula fixarea" - "Instalat de administratorul dvs." - "Actualizat de administratorul dvs." + "Instalat de administrator" + "Actualizat de administrator" "Șters de administratorul dvs." "OK" "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." - "Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți." - "Activați Economizorul de date?" - "Activați" + "Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosești poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingi." + "Activezi Economizorul de date?" + "Activează" "{count,plural, =1{Timp de un minut (până la {formattedTime})}few{Timp de # minute (până la {formattedTime})}other{Timp de # de minute (până la {formattedTime})}}" "{count,plural, =1{Timp de un min. (până la {formattedTime})}few{Timp de # min. (până la {formattedTime})}other{Timp de # min. (până la {formattedTime})}}" "{count,plural, =1{Timp de o oră (până la {formattedTime})}few{Timp de # ore (până la {formattedTime})}other{Timp de # de ore (până la {formattedTime})}}" @@ -1869,7 +1869,7 @@ "Până când dezactivați" "Până când dezactivați „Nu deranja”" "%1$s/%2$s" - "Restrângeți" + "Restrânge" "Nu deranja" "Inactivitate" "Nopțile din zilele lucrătoare" @@ -1878,7 +1878,7 @@ "Somn" "%1$s dezactivează anumite sunete" "A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică." - "A apărut o problemă internă pe dispozitiv. Pentru detalii, contactați producătorul." + "A apărut o problemă internă pe dispozitiv. Pentru detalii, contactează producătorul." "Solicitarea USSD a fost schimbată cu un apel obișnuit" "Solicitarea USSD a fost schimbată cu o solicitare SS" "Schimbat cu o solicitare USSD nouă" @@ -1891,18 +1891,18 @@ "Profil de serviciu" "Notificat" "Confirmat" - "Extindeți" - "Restrângeți" - "extindeți/restrângeți" + "Extinde" + "Restrânge" + "extinde/restrânge" "Port USB Android periferic" "Android" "Port USB periferic" "Mai multe opțiuni" - "Închideți meniul suplimentar" + "Închide meniul suplimentar" "Maximizați" - "Închideți" + "Închide" "%1$s: %2$s" - "Răspundeți" + "Răspunde" "Video" "Respingeți" "Încheiați" @@ -1910,54 +1910,54 @@ "Apel în desfășurare" "Se filtrează un apel primit" "Neclasificate" - "Dvs. setați importanța acestor notificări." + "Tu setezi importanța acestor notificări." "Notificarea este importantă având în vedere persoanele implicate." "Notificare de aplicație personalizată" - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s?" - "Adăugați un utilizator monitorizat" - "Adăugați o limbă" + "Permiți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" + "Permiți ca %1$s să creeze un nou utilizator folosind %2$s?" + "Adaugă un utilizator monitorizat" + "Adaugă o limbă" "Regiunea preferată" "Numele limbii" "Sugerate" "Toate limbile" "Toate regiunile" - "Căutați" + "Caută" "Aplicația nu este disponibilă" "Momentan, aplicația %1$s nu este disponibilă. Aceasta este gestionată de %2$s." - "Aflați mai multe" + "Află mai multe" "Anulează întreruperea aplicației" - "Activați aplicațiile pentru lucru?" + "Activezi aplicațiile pentru lucru?" "Obțineți acces la aplicațiile pentru lucru și notificări" - "Activați" + "Activează" "Aplicația nu este disponibilă" "%1$s nu este disponibilă momentan." "%1$s nu este disponibilă" "Necesită permisiune" "Camera video nu este disponibilă" - "Continuați pe telefon" + "Continuă pe telefon" "Microfon indisponibil" "Setările pentru Android TV sunt indisponibile" "Setările pentru tabletă sunt indisponibile" "Setările pentru telefon sunt indisponibile" - "Aplicația nu se poate accesa pe %1$s. Încercați pe dispozitivul Android TV." - "Aplicația nu se poate accesa pe %1$s. Încercați pe tabletă." - "Aplicația nu se poate accesa pe %1$s. Încercați pe telefon." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe dispozitivul Android TV." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe tabletă." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe telefon." - "Aplicația necesită securitate suplimentară. Încercați pe dispozitivul Android TV." - "Aplicația necesită securitate suplimentară. Încercați pe tabletă." - "Aplicația necesită securitate suplimentară. Încercați pe telefon." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe dispozitivul Android TV." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe tabletă." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe telefon." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe dispozitivul Android TV." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe tabletă." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe telefon." + "Aplicația necesită securitate suplimentară. Încearcă pe dispozitivul Android TV." + "Aplicația necesită securitate suplimentară. Încearcă pe tabletă." + "Aplicația necesită securitate suplimentară. Încearcă pe telefon." "Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul." - "Căutați actualizări" + "Caută actualizări" "Aveți mesaje noi" - "Deschideți aplicația pentru SMS-uri ca să vizualizați" + "Deschide aplicația pentru SMS-uri ca să vezi" "Unele funcții ar putea fi limitate" "Profil de serviciu blocat" - "Atingeți ca să deblocați" + "Atinge ca să deblochezi" "Conectat la %1$s" - "Atingeți pentru a vedea fișierele" + "Atinge pentru a vedea fișierele" "Fixați" "Fixați %1$s" "Anulează fixarea" @@ -1982,30 +1982,30 @@ "Remedierea erorilor prin USB" "oră" "minut" - "Setați ora" + "Setează ora" "Introdu o oră validă" "Introdu ora" "Pentru a introduce ora, comutați la modul de introducere a textului." - "Pentru a introduce ora, comutați la modul ceas." + "Pentru a introduce ora, comută la modul ceas." "Opțiuni de completare automată" - "Salvați pentru completare automată" + "Salvează pentru completare automată" "Conținutul nu poate fi completat automat" "Nicio sugestie de completare automată" "{count,plural, =1{O sugestie de completare automată}few{# sugestii de completare automată}other{# de sugestii de completare automată}}" - "Salvați în ""%1$s""?" - "Salvați %1$s în ""%2$s""?" - "Salvați %1$s și %2$s în ""%3$s""?" - "Salvați %1$s, %2$s și %3$s în ""%4$s""?" - "Actualizați în ""%1$s""?" - "Actualizați %1$s în ""%2$s""?" - "Actualizați %1$s și %2$s în ""%3$s""?" - "Actualizați aceste articole în ""%4$s"": %1$s, %2$s și %3$s?" - "Salvați" + "Salvezi în ""%1$s""?" + "Salvezi %1$s în ""%2$s""?" + "Salvezi %1$s și %2$s în ""%3$s""?" + "Salvezi %1$s, %2$s și %3$s în ""%4$s""?" + "Actualizezi în ""%1$s""?" + "Actualizezi %1$s în ""%2$s""?" + "Actualizezi %1$s și %2$s în ""%3$s""?" + "Actualizezi aceste articole în ""%4$s"": %1$s, %2$s și %3$s?" + "Salvează" "Nu, mulțumesc" "Nu acum" "Niciodată" - "Actualizați" - "Continuați" + "Actualizează" + "Continuă" "parolă" "adresă" "card de credit" @@ -2018,7 +2018,7 @@ "Părăsiți imediat zonele de coastă și din apropierea râurilor și îndreptați-vă spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." "Păstrați-vă calmul și căutați un adăpost în apropiere." "Testarea mesajelor de urgență" - "Răspundeți" + "Răspunde" "Cardul SIM nu este permis pentru voce" "Cardul SIM nu este activat pentru voce" @@ -2036,15 +2036,15 @@ "Nu s-a putut restabili comanda rapidă" "Comanda rapidă este dezactivată" "DEZINSTALAȚI" - "Deschideți oricum" + "Deschide oricum" "Aplicație dăunătoare detectată" - "Permiteți ca %s să acceseze toate jurnalele dispozitivului?" - "Permiteți accesul o dată" - "Nu permiteți" + "Permiți ca %s să acceseze toate jurnalele dispozitivului?" + "Permite accesul o dată" + "Nu permite" "Jurnalele dispozitivului înregistrează activitatea de pe dispozitivul dvs. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permiteți accesul la toate jurnalele dispozitivului doar aplicațiilor în care aveți încredere. \n\nDacă nu permiteți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. Este posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Aflați mai multe" "Nu mai afișa" "%1$s vrea să afișeze porțiuni din %2$s" - "Editați" + "Editează" "Apelurile și notificările vor vibra" "Apelurile și notificările vor avea sunetul dezactivat" "Modificări de sistem" @@ -2052,30 +2052,30 @@ "Funcția nouă Nu deranja ascunde notificările" "Atingeți ca să aflați mai multe și să modificați" "Funcția Nu deranja s-a schimbat" - "Atingeți pentru a verifica ce este blocat." + "Atinge pentru a verifica ce este blocat." "Examinați setările pentru notificări" "Începând cu Android 13, aplicațiile pe care le instalați necesită permisiunea de a trimite notificări. Atingeți ca să modificați permisiunea pentru aplicațiile existente." "Mai târziu" - "Închideți" + "Închide" "Sistem" "Setări" "Cameră foto" "Microfon" "se afișează peste alte aplicații de pe ecran" "Oferiți feedback" - "Notificarea a fost promovată la Prestabilită. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată în jos la Silențioasă. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată la un nivel superior. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată la un nivel inferior. Atingeți pentru a oferi feedback." + "Notificarea a fost promovată la Prestabilită. Atinge pentru a oferi feedback." + "Notificarea a fost mutată în jos la Silențioasă. Atinge pentru a oferi feedback." + "Notificarea a fost mutată la un nivel superior. Atinge pentru a oferi feedback." + "Notificarea a fost mutată la un nivel inferior. Atinge pentru a oferi feedback." "Notificări optimizate" "Acțiunile și răspunsurile sugerate sunt acum trimise prin notificări optimizate. Notificările adaptive Android nu mai sunt acceptate." "OK" - "Dezactivați" - "Aflați mai multe" + "Dezactivează" + "Află mai multe" "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și vă organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." "Notificare pentru informații despre modul Rutină" "Bateria se poate descărca înainte de încărcarea obișnuită" - "Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei" + "Economisirea bateriei este activată pentru a mări autonomia" "Economisirea bateriei" "Economisirea bateriei a fost dezactivată" "Telefonul este încărcat suficient. Funcțiile nu mai sunt limitate." @@ -2117,7 +2117,7 @@ "Comandă rapidă de accesibilitate de pe ecran" "Selector de comenzi rapide de accesibilitate de pe ecran" "Comandă rapidă de accesibilitate" - "Închideți fereastra de notificări" + "Închide fereastra de notificări" "Dpad sus" "Dpad jos" "Dpad stânga" @@ -2140,13 +2140,13 @@ "Acest conținut nu poate fi trimis cu aplicații personale" "Acest conținut nu poate fi deschis cu aplicații personale" "Profilul de serviciu este întrerupt" - "Atingeți pentru a activa" + "Atinge pentru a activa" "Nicio aplicație pentru lucru" "Nicio aplicație personală" - "Deschideți %s în profilul personal?" - "Deschideți %s în profilul de serviciu?" - "Folosiți browserul personal" - "Folosiți browserul de serviciu" + "Deschizi %s în profilul personal?" + "Deschizi %s în profilul de serviciu?" + "Folosește browserul personal" + "Folosește browserul de serviciu" "Codul PIN de deblocare SIM privind rețeaua" "Codul PIN de deblocare SIM privind subsetul de rețea" "Codul PIN de deblocare SIM corporativă" @@ -2261,12 +2261,12 @@ "Noi setări de mărire" "Acum puteți mări o parte a ecranului" - "Activați din Setări" + "Activează din Setări" "Respingeți" - "Deblocați microfonul dispozitivului" - "Deblocați camera dispozitivului" + "Deblochează microfonul dispozitivului" + "Deblochează camera dispozitivului" "Pentru <b>%s</b> și toate aplicațiile și serviciile" - "Deblocați" + "Deblochează" "Confidențialitatea privind senzorii" "Pictograma aplicației" "Imaginea de branding a aplicației" @@ -2277,8 +2277,8 @@ "Activitate de fundal" "O aplicație consumă bateria" "O aplicație este încă activă" - "%1$s rulează în fundal. Atingeți pentru a gestiona utilizarea bateriei." - "%1$s poate afecta autonomia bateriei. Atingeți pentru a examina aplicațiile active." + "%1$s rulează în fundal. Atinge pentru a gestiona utilizarea bateriei." + "%1$s poate afecta autonomia bateriei. Atinge pentru a examina aplicațiile active." "Verificați aplicațiile active" "Nu se poate accesa camera foto a telefonului de pe %1$s" "Nu se poate accesa camera foto a tabletei de pe %1$s" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d6d5816d61dc..f7b1da4bc900 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -268,7 +268,7 @@ "Настройки" "Помощник" "Аудиоподсказки" - "Блокировка" + "Блокировка входа" ">999" "Новое уведомление" "Виртуальная клавиатура" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index c86d11cb5317..d393d2d6b161 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1074,7 +1074,7 @@ "Пошук" "Пошуковий запит" "Очистити запит" - "Наіслати запит" + "Надіслати запит" "Голосовий пошук" "Увімкнути дослідження дотиком?" "%1$s хоче ввімкнути функцію дослідження дотиком. Увімкнувши функцію дослідження дотиком, можна чути або бачити опис елемента, розташованого під вашим пальцем, або виконувати жести для взаємодії з планшетним ПК." -- cgit v1.2.3 From 598f6f57ec63bf94615967822ce04389b01cf2b7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 02:38:27 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7c5bee97ee7ab3bfc7dde38aaba10cd3aede610a --- core/res/res/values-ca/strings.xml | 4 +- core/res/res/values-fa/strings.xml | 4 +- core/res/res/values-kk/strings.xml | 10 +- core/res/res/values-ro/strings.xml | 782 ++++++++++++++++++------------------- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-uk/strings.xml | 2 +- 6 files changed, 402 insertions(+), 402 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 850157b71982..e4a8f3919434 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1851,8 +1851,8 @@ "D\'acord" "Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals, determinades funcions i algunes connexions a la xarxa." "Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals, determinades funcions i algunes connexions a la xarxa." - "Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." - "Vols activar l\'Economitzador de dades?" + "Per reduir l\'ús de dades, la funció Estalvi de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." + "Vols activar l\'Estalvi de dades?" "Activa" "{count,plural, =1{Durant 1 minut (fins a les {formattedTime})}other{Durant # minuts (fins a les {formattedTime})}}" "{count,plural, =1{Durant 1 min (fins a les {formattedTime})}other{Durant # min (fins a les {formattedTime})}}" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index abf3feee8d6a..7300b44f59bf 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1485,8 +1485,8 @@ "‏VPN را %s فعال کرده است" "برای مدیریت شبکه ضربه بزنید." "به %s متصل شد. برای مدیریت شبکه ضربه بزنید." - "‏در حال اتصال VPN همیشه فعال…" - "‏VPN همیشه فعال متصل شد" + "‏درحال اتصال به VPN همیشه روشن…" + "‏VPN همیشه روشن متصل شد" "‏از «VPN همیشه روشن» قطع شد" "‏به «VPN همیشه روشن» متصل نشد" "‏تغییر شبکه یا تنظیمات VPN" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 1bff06b90643..6067b809b213 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -77,7 +77,7 @@ "Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелмеген. Келесі қоңырау: Шектелмеген" "Қызмет ұсынылмаған." "Қоңырау шалушы идентификаторы параметрін өзгерту мүмкін емес." - "Мобильдік деректер қызметі жоқ" + "Мобильдік интернет қызметі жоқ" "Жедел қызметке қоңырау шалу қолжетімді емес" "Дауыстық қоңыраулар қызметі жоқ" "Дауыс қызметі немесе жедел қызметке қоңырау шалу мүмкіндігі жоқ" @@ -90,7 +90,7 @@ "Дабылдар" "Қоңырауды басқа нөмірге бағыттау" "Шұғыл кері қоңырау шалу режимі" - "Мобильдік деректер күйі" + "Мобильдік интернет күйі" "SMS хабарлары" "Дауыстық пошта хабарлары" "Wi-Fi қоңыраулары" @@ -1300,7 +1300,7 @@ "Құрылғы %2$s желісінде интернетпен байланыс жоғалған жағдайда %1$s желісін пайдаланады. Деректер ақысы алынуы мүмкін." "%1$s желісінен %2$s желісіне ауысты" - "мобильдік деректер" + "мобильдік интернет" "Wi-Fi" "Bluetooth" "Ethernet" @@ -1567,7 +1567,7 @@ "Өзгерту" "Дерек шығыны туралы ескерту" "Деректің %s пайдаландыңыз" - "Мобильдік деректер шегіне жетті" + "Мобильдік интернет шегіне жетті" "Wi-Fi деректер шегіне жеттіңіз" "Деректер жіберу қалған цикл үшін тоқтатылды" "Мобильдік дерек шегінен астыңыз" @@ -1575,7 +1575,7 @@ "Сіз %s шегінен асып кеттіңіз" "Фондық деректер шектелген" "Шектеуді жою үшін түртіңіз." - "Мобильдік деректер көп жұмсалды" + "Мобильдік интернет көп жұмсалды" "Қолданбаларыңыз деректерді әдеттегіден көбірек пайдаланды" "%s қолданбасы деректерді әдеттегіден көбірек пайдаланды" "Қауіпсіздік сертификаты" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 9eb707529f90..7a0c6cb3b80f 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -34,7 +34,7 @@ "MSISDN1" "Problemă de conexiune sau cod MMI nevalid." "Operația este limitată la numerele cu apelări restricționate." - "Nu puteți schimba setările de redirecționare a apelurilor de pe telefon când sunteți în roaming." + "Nu poți schimba setările de redirecționare a apelurilor de pe telefon când ești în roaming." "Serviciul a fost activat." "Serviciul a fost activat pentru:" "Serviciul a fost dezactivat." @@ -49,7 +49,7 @@ "Introdu un cod PUK care să aibă 8 cifre sau mai mult." "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." "Introdu codul PUK2 pentru a debloca cardul SIM." - "Operațiunea nu a reușit. Activați blocarea cardului SIM/RUIM." + "Operațiunea nu a reușit. Activează blocarea cardului SIM/RUIM." V-au mai rămas %d încercări până la blocarea cardului SIM. V-au mai rămas %d de încercări până la blocarea cardului SIM. @@ -58,7 +58,7 @@ "IMEI" "MEID" "ID apelant de primire" - "Ascundeți ID-ul apelantului" + "Ascunde ID-ul apelantului" "ID-ul liniei conectate" "Restricționarea ID-ului liniei conectate" "Redirecționarea apelurilor" @@ -71,13 +71,13 @@ "Apelare de tip conferință" "Respingere apeluri supărătoare nedorite" "Se apelează serviciul de furnizare a numerelor" - "Nu deranjați" + "Nu deranja" "ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: restricționat" "ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: nerestricționat" "ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: Restricționat." "ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: nerestricționat" "Nu se asigură accesul la acest serviciu." - "Nu puteți să modificați setarea pentru ID-ul apelantului." + "Nu poți modifica setarea pentru ID-ul apelantului." "Fără serviciu de date mobile" "Apelurile de urgență nu sunt disponibile" "Fără servicii vocale" @@ -125,7 +125,7 @@ "Se caută serviciul" "Nu s-a putut configura apelarea prin Wi-Fi" - "Pentru a efectua apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" + "Pentru a face apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicită configurarea acestui serviciu la operator. Apoi, activează din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: %1$s" @@ -144,7 +144,7 @@ "Apelare prin Wi-Fi" "VoWifi" "Dezactivată" - "Apelați prin Wi-Fi" + "Apelează prin Wi-Fi" "Apelați prin rețeaua mobilă" "Numai Wi-Fi" @@ -164,7 +164,7 @@ "Nu s-a realizat autentificarea." "Autentificarea prin intermediul serverului proxy nu a reușit." "Nu s-a putut stabili conexiunea cu serverul." - "Nu s-a putut efectua comunicarea cu serverul. Încercați din nou mai târziu." + "Nu s-a putut efectua comunicarea cu serverul. Încearcă din nou mai târziu." "Conexiunea la server a expirat." "Pagina conține prea multe redirecționări de server." "Protocolul nu este acceptat." @@ -172,18 +172,18 @@ "Pagina nu a putut fi deschisă, deoarece adresa URL nu este validă." "Fișierul nu a putut fi accesat." "Nu s-a putut găsi fișierul solicitat." - "Există prea multe solicitări în curs de procesare. Încercați din nou mai târziu." + "Există prea multe solicitări în curs de procesare. Încearcă din nou mai târziu." "Eroare de conectare pentru %1$s" "Sincronizare" "Nu se poate sincroniza" "Ați încercat să ștergeți prea multe %s." - "Stocarea pe tabletă este plină. Ștergeți câteva fișiere pentru a elibera spațiu." - "Spațiul de stocare de pe ceas este plin! Ștergeți câteva fișiere pentru a elibera spațiu." - "Spațiul de stocare de pe dispozitivul Android TV este plin. Ștergeți câteva fișiere pentru a elibera spațiu." - "Stocarea pe telefon este plină. Ștergeți câteva fișiere pentru a elibera spațiu." + "Stocarea pe tabletă este plină. Șterge câteva fișiere pentru a elibera spațiu." + "Spațiul de stocare de pe ceas este plin! Șterge câteva fișiere pentru a elibera spațiu." + "Spațiul de stocare de pe dispozitivul Android TV este plin. Șterge câteva fișiere pentru a elibera spațiu." + "Stocarea pe telefon este plină. Șterge câteva fișiere pentru a elibera spațiu." "{count,plural, =1{S-a instalat o autoritate de certificare}few{S-au instalat autorități de certificare}other{S-au instalat autorități de certificare}}" "De o terță parte necunoscută" - "De administratorul profilului dvs. de serviciu" + "De administratorul profilului de serviciu" "De %s" "Profilul de serviciu a fost șters" "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul." @@ -193,7 +193,7 @@ "Dispozitivul este gestionat" "Organizația dvs. gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atingeți pentru mai multe detalii." "Aplicațiile vă pot accesa locația" - "Contactați administratorul IT pentru a afla mai multe" + "Contactează administratorul IT pentru a afla mai multe" "Serviciul de delimitare geografică" "Detector de țară" "Servicii de localizare" @@ -206,19 +206,19 @@ "Datele de pe dispozitiv vor fi șterse" "Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs." "Printare dezactivată de %s." - "Activați profilul de serviciu" + "Activează profilul de serviciu" "Aplicațiile personale sunt blocate până când activați profilul de serviciu" "Aplicațiile personale vor fi blocate pe %1$s, la %2$s. Administratorul IT nu permite ca profilul de serviciu să fie dezactivat mai mult de %3$d zile." - "Activați" + "Activează" "Eu" "Opțiuni tablet PC" "Opțiuni pentru Android TV" "Opțiuni telefon" "Mod Silențios" - "Activați funcția wireless" - "Dezactivați funcția wireless" - "Blocați ecranul" - "Opriți" + "Activează funcția wireless" + "Dezactivează funcția wireless" + "Blochează ecranul" + "Oprește" "Sonerie dezactivată" "Vibrare sonerie" "Sonerie activată" @@ -234,27 +234,27 @@ "Ceasul dvs. se va închide." "Telefonul dvs. se va închide." "Doriți să închideți?" - "Reporniți în modul sigur" - "Doriți să reporniți în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte pe care le-ați instalat. Acestea vor fi restabilite când reporniți din nou." + "Repornește în modul sigur" + "Repornești în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte instalate. Acestea vor fi restabilite când repornești dispozitivul." "Recente" "Nu există aplicații recente." "Opțiuni tablet PC" "Opțiuni pentru Android TV" "Opțiuni telefon" - "Blocați ecranul" - "Opriți" + "Blochează ecranul" + "Oprește" "Alimentare" - "Reporniți" + "Repornește" "Urgență" "Raport despre erori" - "Încheiați sesiunea" + "Încheie sesiunea" "Instantaneu" "Raport de eroare" "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis." "Raport interactiv" - "Folosiți această opțiune în majoritatea situațiilor. Astfel, puteți să urmăriți progresul raportului, să introduceți mai multe detalii în privința problemei și să creați capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." + "Folosește această opțiune în majoritatea situațiilor. Astfel, poți să urmărești progresul raportului, să introduci mai multe detalii în privința problemei și să creezi capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." "Raport complet" - "Folosiți această opțiune pentru a reduce la minimum interferențele cu sistemul când dispozitivul nu răspunde, funcționează prea lent sau când aveți nevoie de toate secțiunile raportului. Nu puteți să introduceți mai multe detalii sau să creați capturi de ecran suplimentare." + "Folosește această opțiune pentru a reduce la minimum interferențele cu sistemul când dispozitivul nu răspunde, funcționează prea lent sau când ai nevoie de toate secțiunile raportului. Nu poți să introduci mai multe detalii sau să creezi capturi de ecran suplimentare." "{count,plural, =1{Peste # secundă se va realiza o captură de ecran pentru raportul de eroare.}few{Peste # secunde se va realiza o captură de ecran pentru raportul de eroare.}other{Peste # de secunde se va realiza o captură de ecran pentru raportul de eroare.}}" "S-a realizat captura de ecran a raportului de eroare" "Nu s-a realizat captura de ecran a raportului de eroare" @@ -292,16 +292,16 @@ "Folosirea accesibilității" "%1$s folosește bateria" "%1$d aplicații folosesc bateria" - "Atingeți pentru mai multe detalii privind bateria și utilizarea datelor" + "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" "%1$s, %2$s" "Mod sigur" "Sistemul Android" "Comutați la profilul personal" "Comutați la profilul de serviciu" "Agendă" - "acceseze persoanele de contact" + "să acceseze agenda" "Locație" - "acceseze locația acestui dispozitiv" + "să acceseze locația acestui dispozitiv" "Calendar" "acceseze calendarul" "SMS" @@ -315,7 +315,7 @@ "Microfon" "înregistreze sunet" "Activitate fizică" - "accesați activitatea fizică" + "să acceseze activitatea fizică" "Camera foto" "fotografieze și să înregistreze videoclipuri" "Dispozitive din apropiere" @@ -323,14 +323,14 @@ "Jurnale de apeluri" "să citească și să scrie jurnalul de apeluri telefonice" "Telefon" - "inițieze și să gestioneze apeluri telefonice" + "să inițieze și să gestioneze apeluri telefonice" "Senzori corporali" - "acceseze datele de la senzori despre semnele vitale" + "să acceseze datele de la senzori despre semnele vitale" "Notificări" "să afișeze notificări" "Analizeze conținutul ferestrei" "Inspectează conținutul unei ferestre cu care interacționați." - "Activeze funcția Explorați prin atingere" + "să activeze funcția Explorează prin atingere" "Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi." "Remarce textul pe care îl introduceți" "Include date personale, cum ar fi numere ale cardurilor de credit sau parole." @@ -361,17 +361,17 @@ "primește mesaje text (SMS)" "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." "primește mesaje text (MMS)" - "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "Redirecționează mesajele cu transmisie celulară" "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." "Să gestioneze apelurile în desfășurare" "Permite unei aplicații să vadă detalii despre apelurile în desfășurare de pe dispozitiv și să gestioneze apelurile respective." "citește mesajele cu transmisie celulară" - "Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitivul dvs. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." + "Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitiv. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a te avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului când e primită o transmisie celulară de urgență." "citire feeduri abonat" "Permite aplicației să obțină detalii despre feedurile sincronizate în prezent." - "trimită și să vadă mesajele SMS" - "Permite aplicației să trimită mesaje SMS, ceea ce ar putea determina apariția unor taxe neașteptate. Aplicațiile rău intenționate pot acumula costuri prin trimiterea mesajelor fără confirmarea dvs." + "să trimită și să vadă mesajele SMS" + "Permite aplicației să trimită mesaje SMS, ceea ce ar putea duce la costuri neașteptate. Aplicațiile rău intenționate pot acumula costuri prin trimiterea mesajelor fără confirmarea ta." "citește mesajele text (SMS sau MMS)" "Această aplicație poate citi toate mesajele SMS stocate pe tabletă." "Această aplicație poate să citească toate mesajele SMS (texT) stocate pe dispozitivul Android TV." @@ -383,10 +383,10 @@ "să gestioneze profilul și proprietarii dispozitivului" "Permite aplicațiilor să seteze proprietarii de profiluri și proprietarul dispozitivului." "reordonare aplicații care rulează" - "Permite aplicației să mute activitățile în prim-plan și în fundal. Aplicația poate face acest lucru fără aportul dvs." + "Permite aplicației să mute activitățile în prim-plan și în fundal. Aplicația poate face acest lucru fără intervenția ta." "activare mod Mașină" "Permite aplicației să activeze modul Mașină." - "închide alte aplicații" + "să închidă alte aplicații" "Permite aplicației să oprească procesele derulate în fundal de alte aplicații. Acest lucru poate face ca respectivele aplicații să nu mai ruleze." "Această aplicație poate apărea deasupra altor aplicații" "Această aplicație poate apărea deasupra altor aplicații sau a altor părți ale ecranului. Acest lucru poate să afecteze utilizarea normală a aplicației și să schimbe modul în care se afișează alte aplicații." @@ -423,7 +423,7 @@ "citește jurnalul de apeluri" "Această aplicație poate citi istoricul apelurilor." "scrie jurnalul de apeluri" - "Permite aplicației să modifice jurnalul de apeluri al tabletei dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." + "Permite aplicației să modifice jurnalul de apeluri al tabletei, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al dispozitivului Android TV, inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." "Să acceseze date de la senzorii corporali, cum ar fi pulsul, în timpul folosirii" @@ -448,7 +448,7 @@ "Aplicația poate accesa locația oricând, chiar dacă nu este folosită." "modificare setări audio" "Permite aplicației să modifice setările audio globale, cum ar fi volumul și difuzorul care este utilizat pentru ieșire." - "înregistreze sunet" + "să înregistreze sunet" "Această aplicație poate să înregistreze conținut audio folosind microfonul când este în uz." "să înregistreze conținut audio în fundal" "Această aplicație poate înregistra conținut audio folosind microfonul oricând." @@ -460,14 +460,14 @@ "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto când este în uz." "să fotografieze și să înregistreze videoclipuri în fundal" "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto oricând." - "Permiteți unei aplicații sau unui serviciu accesul la camerele de sistem, ca să fotografieze și să înregistreze videoclipuri" + "Permite unei aplicații sau unui serviciu accesul la camerele de sistem, ca să fotografieze și să înregistreze videoclipuri" "Această aplicație de sistem privilegiată poate să fotografieze și să înregistreze videoclipuri folosind o cameră de sistem în orice moment. Necesită și permisiunea android.permission.CAMERA pentru aplicație" - "Permiteți unei aplicații sau unui serviciu să primească apeluri inverse atunci când sunt deschise sau închise dispozitive cu cameră." + "Permite unei aplicații sau unui serviciu să primească apeluri inverse atunci când sunt deschise sau închise dispozitive cu cameră." "Această aplicație poate primi apeluri inverse atunci când este deschis (de aplicație) sau închis orice dispozitiv cu cameră." "controlează vibrarea" "Permite aplicației să controleze mecanismul de vibrare." "Permite aplicației să acceseze modul de vibrații." - "apelare directă numere de telefon" + "să sune direct la numere de telefon" "Permite aplicației să apeleze numere de telefon fără intervenția dvs. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." "accesează serviciul de apelare IMS" "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția dvs." @@ -476,8 +476,8 @@ "să citească informații de bază, precum activitatea și starea telefonului" "Permite ca aplicația să acceseze funcțiile de telefonie de bază ale dispozitivului." "să direcționeze apelurile prin intermediul sistemului" - "Permiteți aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor." - "Vedeți și controlați apelurile prin intermediul sistemului." + "Permite aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor." + "Vezi și controlează apelurile prin intermediul sistemului." "Permite aplicației să vadă și să controleze apelurile în desfășurare pe dispozitiv. Aceasta include informații ca numerele pentru apeluri și starea apelurilor." "scutită de restricțiile pentru înregistrarea conținutului audio" "Scutiți aplicația de restricțiile pentru înregistrarea conținutului audio." @@ -506,10 +506,10 @@ "Permite aplicației să schimbe fusul orar al dispozitivului Android TV." "Permite aplicației să schimbe fusul orar al telefonului." "găsește conturi pe dispozitiv" - "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." + "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." - "vizualizează conexiunile la rețea" + "să vadă conexiunile la rețea" "Permite aplicației să vadă informațiile despre conexiunile la rețea, cum ar fi rețelele existente și cele care sunt conectate." "să aibă acces deplin la rețea" "Permite aplicației să creeze socluri de rețea și să utilizeze protocoale de rețea personalizate. Browserul și alte aplicații oferă mijloacele de trimitere a datelor pe internet, astfel încât această permisiune nu este necesară pentru trimiterea datelor pe internet." @@ -517,7 +517,7 @@ "Permite aplicației să modifice starea de conectivitate la rețea." "modificare conectivitate tethering" "Permite aplicației să modifice starea de conectivitate prin tethering la rețea." - "vizualizează conexiunile Wi-Fi" + "să vadă conexiunile Wi-Fi" "Permite aplicației să vadă informațiile despre rețelele Wi-Fi, de ex. dacă o rețea Wi-Fi este activată, precum și numele dispozitivelor conectate la rețeaua Wi-Fi." "se conectează și se deconectează de la Wi-Fi" "Permite aplicației să se conecteze și să se deconecteze de la punctele de acces Wi-Fi, precum și să efectueze modificări în configurația dispozitivului pentru rețelele Wi-Fi." @@ -531,12 +531,12 @@ "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se împerecheze cu dispozitive la distanță." "se conectează și se deconectează de la WiMAX" "Permite aplicației să stabilească dacă o rețea WiMAX este activată și să vadă informațiile cu privire la toate rețelele WiMAX conectate." - "schimbați starea WiMAX" + "schimbă starea WiMAX" "Permite aplicației să conecteze și să deconecteze tableta la și de la rețelele WiMAX." "Permite aplicației să conecteze și să deconecteze dispozitivul Android TV de la rețelele WiMAX." "Permite aplicației să conecteze și să deconecteze telefonul la și de la rețelele WiMAX." "conectează dispozitive Bluetooth" - "Permite aplicației să vadă configurația tabletei Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." + "Permite aplicației să vadă configurația tabletei Bluetooth, să facă și să accepte conexiuni cu dispozitive asociate." "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive împerecheate." "Permite aplicației să vadă configurația telefonului Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." "să descopere și să asocieze dispozitive Bluetooth din apropiere" @@ -546,7 +546,7 @@ "să transmită anunțuri pe dispozitive Bluetooth din apropiere" "Permite aplicației să difuzeze anunțuri pe dispozitive Bluetooth din apropiere" "să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" - "Permiteți-i aplicației să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" + "Permite-i aplicației să stabilească poziția relativă dintre dispozitivele Ultra-Wideband din apropiere" "să interacționeze cu dispozitive Wi‑Fi din apropiere" "Permite aplicației să se conecteze la dispozitive Wi-Fi din apropiere, să transmită anunțuri și să stabilească poziția relativă a acestora" "Informații despre serviciul de plăți NFC preferat" @@ -566,63 +566,63 @@ "folosește hardware-ul pentru amprentă" "Permite aplicației să folosească hardware pentru amprentă pentru autentificare" "modificați colecția de muzică" - "Permite aplicației să vă modifice colecția de muzică." + "Permite aplicației să modifice colecția de muzică." "modificați colecția de videoclipuri" "Permite aplicației să vă modifice colecția de videoclipuri." "modificați colecția de fotografii" "Permite aplicației să vă modifice colecția de fotografii." "citiți locațiile din colecția media" "Permite aplicației să citească locațiile din colecția dvs. media." - "Folosiți sistemele biometrice" - "Folosiți sistemele biometrice sau blocarea ecranului" + "Folosește sistemele biometrice" + "Folosește sistemele biometrice sau blocarea ecranului" "Confirmați-vă identitatea" - "Folosiți sistemele biometrice pentru a continua" - "Folosiți sistemele biometrice sau blocarea ecranului pentru a continua" + "Folosește sistemele biometrice pentru a continua" + "Folosește sistemele biometrice sau blocarea ecranului pentru a continua" "Hardware biometric indisponibil" "Autentificarea a fost anulată" "Nu este recunoscut" "Autentificarea a fost anulată" "Nu este setat niciun cod PIN, model sau parolă" "Eroare la autentificare" - "Folosiți blocarea ecranului" + "Folosește blocarea ecranului" "Introduceți blocarea ecranului ca să continuați" - "Apăsați ferm pe senzor" - "Amprenta nu a putut fi procesată. Încercați din nou." + "Apasă ferm pe senzor" + "Amprenta nu a putut fi procesată. Încearcă din nou." "Curățați senzorul de amprentă și încercați din nou" "Curățați senzorul și încercați din nou" - "Apăsați ferm pe senzor" - "Ați mișcat degetul prea lent. Încercați din nou." - "Încercați altă amprentă" + "Apasă ferm pe senzor" + "Ai mișcat degetul prea lent. Încearcă din nou." + "Încearcă altă amprentă" "Prea luminos" "Încercați să ajustați" - "Schimbați ușor poziția degetului de fiecare dată" + "Schimbă ușor poziția degetului de fiecare dată" "Amprenta nu a fost recunoscută" "Amprenta nu a fost recunoscută" "Amprentă autentificată" "Chip autentificat" - "Chip autentificat, apăsați Confirmați" + "Chip autentificat, apasă pe Confirmă" "Hardware-ul pentru amprentă nu este disponibil." "Nu se poate configura amprenta" - "Timpul pentru amprentare a expirat. Încercați din nou." + "Timpul pentru amprentare a expirat. Încearcă din nou." "Operațiunea privind amprenta a fost anulată." "Operațiunea privind amprenta a fost anulată de utilizator." - "Prea multe încercări. Încercați din nou mai târziu." + "Prea multe încercări. Încearcă din nou mai târziu." "Prea multe încercări. Senzorul de amprentă este dezactivat." - "Încercați din nou." + "Încearcă din nou." "Nu au fost înregistrate amprente." "Dispozitivul nu are senzor de amprentă." "Senzorul este dezactivat temporar." "Nu se poate folosi senzorul de amprentă. Vizitați un furnizor de servicii de reparații." "Degetul %d" - "Folosiți amprenta" - "Folosiți amprenta sau blocarea ecranului" - "Folosiți amprenta pentru a continua" - "Folosiți amprenta sau blocarea ecranului pentru a continua" + "Folosește amprenta" + "Folosește amprenta sau blocarea ecranului" + "Folosește amprenta pentru a continua" + "Folosește amprenta sau blocarea ecranului pentru a continua" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Pictograma amprentă" "Deblocare facială" "Problemă cu Deblocarea facială" @@ -635,22 +635,22 @@ "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" "Vizitați un furnizor de servicii de reparații." - "Nu s-a putut fotografia fața cu precizie. Încercați din nou." - "Prea luminos. Încercați o lumină mai slabă." - "Prea întunecat. Încercați o lumină mai puternică." - "Mutați telefonul mai departe." - "Mutați telefonul mai aproape." - "Mutați telefonul mai sus." - "Mutați telefonul mai jos." - "Mutați telefonul spre stânga." - "Mutați telefonul spre dreapta." + "Nu s-a putut fotografia fața cu precizie. Încearcă din nou." + "Prea luminos. Încearcă o lumină mai slabă." + "Prea întunecat. Încearcă o lumină mai puternică." + "Mută telefonul mai departe." + "Mută telefonul mai aproape." + "Mută telefonul mai sus." + "Mută telefonul mai jos." + "Mută telefonul spre stânga." + "Mută telefonul spre dreapta." "Priviți mai direct spre dispozitiv." "Stați cu capul direct în fața telefonului." "Prea multă mișcare. Țineți telefonul nemișcat." - "Reînregistrați-vă chipul." - "Nu se mai poate recunoaște fața. Încercați din nou." - "Prea asemănător, schimbați poziția." - "Întoarceți capul mai puțin." + "Reînregistrează-ți chipul." + "Nu se mai poate recunoaște fața. Încearcă din nou." + "Prea asemănător, schimbă poziția." + "Întoarce capul mai puțin." "Înclinați capul mai puțin." "Întoarceți capul mai puțin." "Eliminați orice vă ascunde chipul." @@ -658,27 +658,27 @@ "Nu se poate confirma fața. Hardware-ul nu este disponibil." - "Încercați din nou Deblocarea facială" - "Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi." + "Încearcă din nou Deblocarea facială" + "Nu se pot stoca date faciale noi. Șterge întâi unele vechi." "Operațiunea privind chipul a fost anulată." "Deblocarea facială a fost anulată de utilizator" - "Prea multe încercări. Reîncercați mai târziu." + "Prea multe încercări. Reîncearcă mai târziu." "Prea multe încercări. Deblocarea facială este dezactivată." - "Prea multe încercări. Folosiți blocarea ecranului." - "Nu se poate confirma fața. Încercați din nou." + "Prea multe încercări. Folosește blocarea ecranului." + "Nu se poate confirma fața. Încearcă din nou." "Nu ați configurat Deblocarea facială" "Deblocarea facială nu este acceptată pe acest dispozitiv" "Senzorul este dezactivat temporar." "Chip %d" - "Folosiți Deblocarea facială" - "Folosiți deblocarea facială sau ecranul de blocare" + "Folosește Deblocarea facială" + "Folosește deblocarea facială sau ecranul de blocare" "Folosiți-vă chipul ca să continuați" "Folosiți-vă chipul sau blocarea ecranului pentru a continua" - "A apărut o eroare. Încercați din nou." + "A apărut o eroare. Încearcă din nou." "Pictograma chip" - "citire setări sincronizare" + "să citească setări sincronizare" "Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont." "activează/dezactivează sincronizarea" "Permite unei aplicații să modifice setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate activa sincronizarea aplicației Persoane cu un anumit cont." @@ -705,7 +705,7 @@ "interacțiune cu ecranul în timpul unui apel" "Permite aplicației să controleze când și cum vede utilizatorul ecranul în timpul unui apel." "să interacționeze cu servicii de telefonie" - "Permite aplicației să interacționeze cu servicii de telefonie pentru a da / a primi apeluri." + "Permite aplicației să interacționeze cu servicii de telefonie pentru a face / a primi apeluri." "oferă o experiență de utilizare în timpul unui apel" "Permite aplicației să ofere o experiență de utilizare în timpul unui apel." "citește utilizarea statistică a rețelei" @@ -740,7 +740,7 @@ "Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite." "accesează Nu deranja" "Permite aplicației să citească și să scrie configurația Nu deranja." - "porniți folosirea permisiunii de vizualizare" + "să înceapă folosirea permisiunii de vizualizare" "Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "să înceapă să examineze deciziile privind permisiunile" "Permite proprietarului să deschidă ecranul pentru a examina deciziile privind permisiunile. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." @@ -754,36 +754,36 @@ "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți datele acesteia dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele de pe acesta dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestui profil dacă sunt introduse prea multe parole incorecte." "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Să schimbe blocarea ecranului" - "Modificați blocarea ecranului." + "Modifică blocarea ecranului." "Să blocheze ecranul" - "Stabiliți modul și timpul în care se blochează ecranul." + "Stabilește cum și când se blochează ecranul." "Să șteargă toate datele" - "Ștergeți datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică." - "Ștergeți datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică." - "Ștergeți datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică." - "Ștergeți datele din telefon fără avertisment, efectuând resetarea configurării din fabrică." - "Ștergeți datele de profil" - "Ștergeți datele utilizatorului" - "Ștergeți datele acestui utilizator de pe această tabletă fără avertisment." - "Ștergeți datele acestui utilizator de pe acest dispozitiv Android TV fără avertisment" - "Ștergeți datele profilului din acest sistem de infotainment fără avertisment." - "Ștergeți datele acestui utilizator de pe acest telefon fără avertisment." - "Setați serverul proxy global pentru dispozitiv" - "Setați serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global." - "Setați expirarea parolei pentru blocarea ecranului" - "Modificați frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului." + "Șterge datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică." + "Șterge datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică." + "Șterge datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică." + "Șterge datele din telefon fără avertisment, revenind la setările din fabrică." + "Șterge datele de profil" + "Șterge datele utilizatorului" + "Șterge datele acestui utilizator de pe această tabletă fără avertisment." + "Șterge datele acestui utilizator de pe acest dispozitiv Android TV fără avertisment" + "Șterge datele profilului din acest sistem de infotainment fără avertisment." + "Șterge datele acestui utilizator de pe acest telefon fără avertisment." + "Setează serverul proxy global pentru dispozitiv" + "Setează serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global." + "Setează expirarea parolei pentru blocarea ecranului" + "Modifică frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului." "Să seteze criptarea stocării" "Necesită ca datele aplicației stocate să fie criptate." "Să dezactiveze camerele foto" - "Împiedicați utilizarea camerelor foto de pe dispozitiv." + "Împiedică folosirea camerelor foto de pe dispozitiv." "Să oprească funcții de blocare ecran" - "Împiedicați folosirea unor funcții de blocare a ecranului." + "Împiedică folosirea unor funcții de blocare a ecranului." "Domiciliu" "Mobil" @@ -902,23 +902,23 @@ "Introdu codul PUK și noul cod PIN" "Codul PUK" "Noul cod PIN" - "Atingeți ca să introduceți parola" + "Atinge ca să introduci parola" "Introdu parola pentru a debloca" "Introdu codul PIN pentru a debloca" "Cod PIN incorect." - "Pentru a debloca, apăsați Meniu, apoi 0." + "Pentru a debloca, apasă Meniu, apoi 0." "Număr de urgență" "Fără semnal" "Ecranul este blocat." - "Apăsați Meniu pentru a debloca sau pentru a efectua apeluri de urgență." - "Apăsați Meniu pentru deblocare." - "Desenați modelul pentru a debloca" + "Apasă Meniu pentru a debloca sau pentru a efectua apeluri de urgență." + "Apasă Meniu pentru deblocare." + "Desenează modelul pentru a debloca" "Urgență" "Reveniți la apel" "Corect!" - "Încercați din nou" - "Încercați din nou" - "Deblocați pentru toate funcțiile și datele" + "Încearcă din nou" + "Încearcă din nou" + "Deblochează pentru toate funcțiile și datele" "S-a depășit numărul maxim de încercări pentru Deblocare facială" "Fără SIM" "Nu există card SIM în computerul tablet PC." @@ -931,10 +931,10 @@ "Melodia anterioară" "Melodia următoare" "Pauză" - "Redați" - "Opriți" - "Derulați" - "Derulați rapid înainte" + "Redă" + "Oprește" + "Derulează" + "Derulează rapid înainte" "Numai apeluri de urgență" "Rețea blocată" "Cardul SIM este blocat cu codul PUK." @@ -943,18 +943,18 @@ "Se deblochează cardul SIM..." "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV prin conectarea la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va fi resetată la setările prestabilite din fabrică, iar toate datele de utilizator vor fi pierdute." - "Ați efectuat %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator vor fi pierdute." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV prin conectarea la Google.\n\n Încearcă din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." + "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acesta va fi acum resetat la setările prestabilite din fabrică." - "Încercați din nou peste %d secunde." - "Ați uitat modelul?" + "Încearcă din nou peste %d secunde." + "Ai uitat modelul?" "Deblocare cont" "Prea multe încercări de desenare a modelului" "Pentru a debloca, conectați-vă folosind Contul Google." @@ -964,7 +964,7 @@ "Nume de utilizator sau parolă nevalide." "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică..." - "Deblocați" + "Deblochează" "Sunet activat" "Sunet dezactivat" "Desenarea modelului a început" @@ -974,7 +974,7 @@ "Modelul a fost desenat" "Zonă model." "%1$s. Widget %2$d din %3$d." - "Adăugați un widget." + "Adaugă un widget." "Gol" "Zona de deblocare a fost extinsă." "Zona de deblocare a fost restrânsă." @@ -986,7 +986,7 @@ "A început reordonarea widgeturilor." "Reordonarea widgeturilor s-a încheiat." "Widgetul %1$s a fost eliminat." - "Extindeți zona de deblocare." + "Extinde zona de deblocare." "Deblocare prin glisare." "Deblocare cu model." "Deblocare facială." @@ -1006,18 +1006,18 @@ "Testarea de fabrică nu a reușit" "Acțiunea FACTORY_TEST este acceptată doar pentru pachetele instalate în /system/app." "Nu s-a găsit niciun pachet care să ofere acțiunea FACTORY_TEST." - "Reporniți" + "Repornește" "La pagina de la „%s” apare:" "JavaScript" - "Confirmați părăsirea paginii" - "Părăsiți această pagină" + "Confirmă părăsirea paginii" + "Părăsește această pagină" "Rămâneți în această pagină" - "%s\n\nSigur doriți să părăsiți această pagină?" - "Confirmați" - "Sfat: măriți și micșorați prin dublă atingere." + "%s\n\nSigur părăsești această pagină?" + "Confirmă" + "Sfat: mărește și micșorează prin dublă atingere." "Automat" "Conf.Compl.auto." - "Completați automat cu %1$s" + "Completează automat cu %1$s" " " "$1$2$3" ", " @@ -1048,9 +1048,9 @@ "Permite aplicației să modifice permisiunile privind locația geografică a browserului. Aplicațiile rău intenționate pot utiliza această permisiune pentru a permite trimiterea informațiilor privind locația către site-uri web arbitrare." "Doriți ca browserul să rețină această parolă?" "Nu acum" - "Rețineți" + "Reține" "Niciodată" - "Nu aveți permisiunea de a deschide această pagină." + "Nu ai permisiunea de a deschide această pagină." "Text copiat în clipboard." "%1$s a inserat date din %2$s" "%1$s a inserat din clipboard" @@ -1068,16 +1068,16 @@ "spațiu" "enter" "delete" - "Căutați" - "Căutați…" - "Căutați" + "Caută" + "Caută…" + "Caută" "Interogare de căutare" - "Ștergeți interogarea" + "Șterge interogarea" "Trimite interogarea" "Căutare vocală" "Activați Explorați prin atingere?" - "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu tableta." - "%1$s dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu telefonul." + "%1$s vrea să activeze funcția Explorează prin atingere. Când e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu tableta." + "%1$s dorește să activeze funcția Explorează prin atingere. Când aceasta e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu telefonul." "cu 1 lună în urmă" "Cu mai mult de 1 lună în urmă" "{count,plural, =1{Ultima zi}few{Ultimele # zile}other{Ultimele # de zile}}" @@ -1126,22 +1126,22 @@ "Miezul nopții" "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "Selectați-le pe toate" - "Decupați" - "Copiați" + "Selectează-le pe toate" + "Decupează" + "Copiază" "Eroare la copierea în clipboard" - "Inserați" - "Inserați ca text simplu" + "Inserează" + "Inserează ca text simplu" "Înlocuiți..." - "Ștergeți" - "Copiați adresa URL" - "Selectați text" + "Șterge" + "Copiază adresa URL" + "Selectează text" "Anulează" - "Repetați" + "Repetă" "Completare automată" "Selectare text" - "Adăugați în dicționar" - "Ștergeți" + "Adaugă în dicționar" + "Șterge" "Metodă de intrare" "Acțiuni pentru text" "Înapoi" @@ -1150,7 +1150,7 @@ "Este posibil ca unele funcții de sistem să nu funcționeze" "Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți." "%1$s rulează acum" - "Atingeți pentru mai multe informații sau pentru a opri aplicația." + "Atinge pentru mai multe informații sau pentru a opri aplicația." "OK" "Anulează" "OK" @@ -1167,32 +1167,32 @@ "Finalizare acțiune utilizând" "Finalizați acțiunea utilizând %1$s" "Finalizați acțiunea" - "Deschideți cu" - "Deschideți cu %1$s" - "Deschideți" - "Deschideți linkurile %1$s cu" - "Deschideți linkurile cu" - "Deschideți linkurile cu %1$s" - "Deschideți linkurile %1$s cu %2$s" - "Permiteți accesul" - "Editați cu" - "Editați cu %1$s" - "Editați" + "Deschide cu" + "Deschide cu %1$s" + "Deschide" + "Deschide linkurile %1$s cu" + "Deschide linkurile cu" + "Deschide linkurile cu %1$s" + "Deschide linkurile %1$s cu %2$s" + "Permite accesul" + "Editează cu" + "Editează cu %1$s" + "Editează" "Trimite" - "Distribuiți cu %1$s" + "Distribuie cu %1$s" "Trimite" "Trimite folosind" "Trimite folosind %1$s" "Trimite" - "Selectați o aplicație de pe ecranul de pornire" + "Selectează o aplicație de pe ecranul de pornire" "Utilizați %1$s ca ecran de pornire" - "Fotografiați" - "Fotografiați cu" - "Fotografiați cu %1$s" - "Fotografiați" + "Fotografiază" + "Fotografiază cu" + "Fotografiază cu %1$s" + "Fotografiază" "Se utilizează în mod prestabilit pentru această acțiune." "Utilizați altă aplicație" - "Ștergeți setările prestabilite din Setări de sistem > Aplicații > Descărcate." + "Șterge setările prestabilite din Setări de sistem > Aplicații > Descărcate." "Alege o acțiune" "Alege o aplicație pentru dispozitivul USB" "Această acțiune nu poate fi efectuată de nicio aplicație." @@ -1200,12 +1200,12 @@ "%1$s s-a oprit" "%1$s se oprește încontinuu" "%1$s se oprește încontinuu" - "Deschideți din nou aplicația" + "Deschide din nou aplicația" "Trimite feedback" - "Închideți" - "Dezactivați până la repornirea dispozitivului" - "Așteptați" - "Închideți aplicația" + "Închide" + "Dezactivează până la repornirea dispozitivului" + "Așteaptă" + "Închide aplicația" "%2$s nu răspunde" "%1$s nu răspunde" @@ -1213,19 +1213,19 @@ "Procesul %1$s nu răspunde" "OK" "Raportați" - "Așteptați" - "Pagina a devenit inactivă.\n\nDoriți să o închideți?" + "Așteaptă" + "Pagina a devenit inactivă.\n\nO închizi?" "Aplicație redirecționată" "%1$s funcționează acum." "%1$s a fost lansată inițial." "Scară" - "Afișați întotdeauna" - "Reactivați acest mod din Setări de sistem > Aplicații > Descărcate." + "Afișează întotdeauna" + "Reactivează acest mod din Setări de sistem > Aplicații > Descărcate." "%1$s nu acceptă setarea actuală pentru Dimensiunea afișării și este posibil să aibă un comportament neașteptat." "Afișează întotdeauna" "%1$s a fost concepută pentru o versiune incompatibilă de sistem de operare Android și este posibil să se comporte în mod neprevăzut. Poate fi disponibilă o versiune actualizată a aplicației." - "Afișați întotdeauna" - "Căutați actualizări" + "Afișează întotdeauna" + "Caută actualizări" "Aplicația %1$s (procesul %2$s) a încălcat propria politică StrictMode." "Procesul %1$s a încălcat propria politică StrictMode." "Se actualizează telefonul.…" @@ -1244,24 +1244,24 @@ "Se finalizează pornirea." "Continuați configurarea?" "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor când vă configurați amprenta." - "Dezactivați ecranul" - "Continuați configurarea" + "Dezactivează ecranul" + "Continuă configurarea" "Continuați cu verificarea amprentei?" "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor pentru verificarea amprentei." - "Dezactivați ecranul" - "Continuați" + "Dezactivează ecranul" + "Continuă" "Rulează %1$s" - "Atingeți pentru a reveni la joc" + "Atinge pentru a reveni la joc" "Alege jocul" "Pentru o performanță mai bună, se poate deschide un singur joc odată." - "Reveniți la %1$s" - "Deschideți %1$s" + "Revino la %1$s" + "Deschide %1$s" "%1$s se va închide fără să salveze" "%1$s a depășit limita de memorie" "Datele privind memoria heap %1$s sunt gata" - "Datele privind memoria au fost culese. Atingeți pentru a trimite." + "Datele privind memoria au fost culese. Atinge pentru a trimite." "Trimiți datele privind memoria?" - "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." + "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." "Alege o acțiune pentru text" @@ -1286,12 +1286,12 @@ "Sunete de alarmă" "Sunete pentru notificare" "Necunoscut" - "Conectați-vă la rețeaua Wi-Fi" - "Conectați-vă la rețea" + "Conectează-te la rețeaua Wi-Fi" + "Conectează-te la rețea" "%1$s nu are acces la internet" - "Atingeți pentru opțiuni" + "Atinge pentru opțiuni" "Rețeaua mobilă nu are acces la internet" "Rețeaua nu are acces la internet" "Serverul DNS privat nu poate fi accesat" @@ -1312,33 +1312,33 @@ "Refuz" "Introdu caracterul" "Se trimit mesaje SMS" - "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiteți acestei aplicații să trimită în continuare mesaje?" - "Permiteți" + "<b>%1$s</b> trimite un număr mare de mesaje SMS. Permiți acestei aplicații să trimită în continuare mesaje?" + "Permite" "Refuz" "<b>%1$s</b> intenționează să trimită un mesaj la <b>%2$s</b>." - "Acest lucru ""poate genera costuri"" în contul dvs. mobil." - "Acest lucru va genera costuri în contul dvs. mobil." + "Acest lucru ""poate genera costuri"" în contul tău mobil." + "Acest lucru va genera costuri în contul tău mobil." "Trimite" "Anulează" "Doresc să se rețină opțiunea" - "Puteți modifica ulterior în Setări > Aplicații" - "Permiteți întotdeauna" - "Nu permiteți niciodată" + "Poți modifica ulterior în Setări > Aplicații" + "Permite întotdeauna" + "Nu permite niciodată" "Card SIM eliminat" "Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus." "Terminat" "Card SIM adăugat" - "Reporniți dispozitivul pentru a accesa rețeaua mobilă." - "Reporniți" - "Activați serviciul mobil" + "Repornește dispozitivul pentru a accesa rețeaua mobilă." + "Repornește" + "Activează serviciul mobil" "Descărcați aplicația operatorului pentru a vă activa noul card SIM" - "Descărcați aplicația %1$s pentru a vă activa noul card SIM" - "Descărcați aplicația" + "Descarcă aplicația %1$s pentru a-ți activa noul card SIM" + "Descarcă aplicația" "S-a introdus un card SIM nou" - "Atingeți pentru a-l configura" - "Setați ora" - "Setați data" - "Setați" + "Atinge pentru a-l configura" + "Setează ora" + "Setează data" + "Setează" "Terminat" "NOU: " "Furnizată de %1$s." @@ -1352,18 +1352,18 @@ "Tetheringul prin USB este activat" "MIDI prin USB este activat" "Accesoriu USB conectat" - "Atingeți pentru mai multe opțiuni." - "Se încarcă dispozitivul conectat. Atingeți pentru mai multe opțiuni." + "Atinge pentru mai multe opțiuni." + "Se încarcă dispozitivul conectat. Atinge pentru mai multe opțiuni." "S-a detectat un accesoriu audio analogic" - "Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe." + "Dispozitivul atașat nu este compatibil cu acest telefon. Atinge pentru a afla mai multe." "Remedierea erorilor prin USB conectată" - "Atingeți pentru a dezactiva." - "Selectați pentru a dezactiva remedierea erorilor prin USB." + "Atinge pentru a dezactiva." + "Selectează pentru a dezactiva remedierea erorilor prin USB." "Remedierea erorilor wireless este activă" "Atinge pentru a dezactiva remedierea erorilor wireless" - "Selectați pentru a dezactiva remedierea erorilor wireless." + "Selectează pentru a dezactiva remedierea erorilor wireless." "Modul Set de testare este activat" - "Reveniți la setările din fabrică pentru a dezactiva modul Set de testare." + "Revino la setările din fabrică pentru a dezactiva modul Set de testare." "Consola din serie este activată" "Performanța este afectată. Pentru a dezactiva, verificați programul bootloader." "MTE experimentală activată" @@ -1380,35 +1380,35 @@ "REFUZAȚI" "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" - "Afișați tastatura virtuală" + "Afișează tastatura virtuală" "Configurează tastatura fizică" - "Atingeți pentru a selecta limba și aspectul" + "Atinge pentru a selecta limba și aspectul" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "Afișare peste alte aplicații" "%s se afișează peste alte aplicații" "%s se afișează peste aplicații" "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." - "Dezactivați" + "Dezactivează" "Se verifică %s…" "Se examinează conținutul curent" "Se analizează spațiul de stocare media" "%s nou" "%s nu funcționează" - "Atingeți pentru a configura" - "Selectați pentru a configura" + "Atinge pentru a configura" + "Selectează pentru a configura" "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." "Pentru a transfera fotografii și fișiere media" "Răsfoiți fișierele media" "Problemă cu %s" "%s nu funcționează" - "Atingeți pentru a remedia" - "%s este corupt. Selectați pentru a remedia." + "Atinge pentru a remedia" + "%s este corupt. Selectează pentru a remedia." "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." "%s necompatibil" "%s nu funcționează" - "Dispozitivul nu este compatibil cu acest %s. Atingeți pentru configurare într-un format compatibil." - "Selectați pentru a configura %s într-un format acceptat." + "Dispozitivul nu este compatibil cu acest %s. Atinge pentru configurare într-un format compatibil." + "Selectează pentru a configura %s într-un format acceptat." "Poate fi nevoie să reformatați dispozitivul" "%s scos pe neașteptate" "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" @@ -1417,17 +1417,17 @@ "Se deconectează %s" "Nu scoateți" "Configurează" - "Scoateți" + "Scoate" "Explorați" - "Schimbați ieșirea" + "Schimbă ieșirea" "%s lipsește" - "Reintroduceți dispozitivul" + "Reintrodu dispozitivul" "Se mută %s" "Se mută datele" "Transfer de conținut încheiat" "Conținut mutat pe %s" "Nu s-a putut muta conținutul" - "Încercați să mutați din nou conținutul" + "Încearcă să muți din nou conținutul" "Eliminat" "Scos" "Se verifică..." @@ -1452,10 +1452,10 @@ "Permite unei aplicații să solicite permisiunea de a ignora optimizările bateriei pentru aplicația respectivă." "să interogheze toate pachetele" "Permite unei aplicații să vadă toate pachetele instalate." - "Apăsați de două ori pentru a controla mărirea/micșorarea" + "Apasă de două ori pentru a controla mărirea/micșorarea" "Nu s-a putut adăuga widgetul." - "Accesați" - "Căutați" + "Accesează" + "Caută" "Trimite" "Înainte" "Terminat" @@ -1464,48 +1464,48 @@ "Formați numărul\nutilizând %s" "Creați contactul\nutilizând %s" "Următoarele aplicații solicită permisiunea de a accesa contul dvs. acum și în viitor." - "Permiteți această solicitare?" + "Permiți această solicitare?" "Solicitare de acces" - "Permiteți" + "Permite" "Refuz" "Permisiune solicitată" "Permisiune solicitată\npentru contul %s." "Permisiune solicitată de %1$s\npentru contul %2$s." - "Utilizați această aplicație în afara profilului de serviciu" - "Utilizați această aplicație în profilul de serviciu" + "Folosești această aplicație în afara profilului de serviciu" + "Folosești această aplicație în profilul de serviciu" "Metodă de intrare" "Sincronizare" "Accesibilitate" "Imagine de fundal" - "Schimbați imaginea de fundal" + "Schimbă imaginea de fundal" "Serviciu de citire a notificărilor" "Instrument de ascultare pentru RV" "Furnizor de condiții" "Serviciul de clasificare a notificărilor" "VPN activat" "VPN este activată de %s" - "Apăsați pentru a gestiona rețeaua." - "Conectat la %s. Apăsați pentru a gestiona rețeaua." + "Apasă pentru a gestiona rețeaua." + "Conectat la %s. Apasă pentru a gestiona rețeaua." "Se efectuează conectarea la rețeaua VPN activată permanent…" "Conectat(ă) la rețeaua VPN activată permanent" "Deconectat de la rețeaua VPN activată permanent" "Nu s-a putut conecta la rețeaua VPN activată permanent" - "Modificați setările de rețea sau VPN" + "Modifică setările de rețea sau VPN" "Alege un fișier" "Nu au fost găsite fișiere" - "Resetați" + "Resetează" "Trimite" "Aplicația pentru condus rulează" - "Atingeți ca să ieșiți din aplicația pentru condus." + "Atinge ca să ieși din aplicația pentru condus." "Înapoi" "Înainte" - "Omiteți" + "Omite" "Nicio potrivire" "Găsiți pe pagină" "{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}}" "Terminat" "Se șterge spațiul de stocare distribuit..." - "Distribuiți" + "Distribuie" "Găsiți" "Căutare pe web" "Următorul rezultat" @@ -1517,25 +1517,25 @@ "Nu" "Limita pentru ștergere a fost depășită" "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" - "Ștergeți elementele" + "Șterge elementele" "Anulează aceste ștergeri" "Nu trebuie să luați nicio măsură deocamdată" "Alege un cont" - "Adăugați un cont" - "Adăugați un cont" + "Adaugă un cont" + "Adaugă un cont" "Creșteți" "Reduceți" "%s atingeți lung." - "Glisați în sus pentru a crește și în jos pentru a reduce." + "Glisează în sus pentru a crește și în jos pentru a reduce." "Creșteți valoarea pentru minute" - "Reduceți valoarea pentru minute" + "Redu valoarea pentru minute" "Creșteți valoarea pentru oră" - "Reduceți valoarea pentru oră" - "Setați valoarea PM" - "Setați valoarea AM" - "Creșteți valoarea pentru lună" + "Redu valoarea pentru oră" + "Setează valoarea PM" + "Setează valoarea AM" + "Mărește valoarea pentru lună" "Reduceți valoarea pentru lună" - "Creșteți valoarea pentru zi" + "Mărește valoarea pentru zi" "Reduceți valoarea pentru zi" "Creșteți valoarea pentru an" "Reduceți valoarea pentru an" @@ -1543,19 +1543,19 @@ "Luna viitoare" "Alt" "Anulează" - "Ștergeți" + "Șterge" "Terminat" "Schimbarea modului" "Shift" "Enter" "Alege o aplicație" "Nu s-a putut lansa %s" - "Permiteți accesul pentru" - "Permiteți accesul pentru %s" + "Permite accesul pentru" + "Permite accesul pentru %s" "Mâner glisant. Atingeți și țineți apăsat." - "Glisați pentru a debloca." - "Navigați la ecranul de pornire" - "Navigați în sus" + "Glisează pentru a debloca." + "Navighează la ecranul de pornire" + "Navighează în sus" "Mai multe opțiuni" "%1$s, %2$s" "%1$s, %2$s, %3$s" @@ -1565,19 +1565,19 @@ "Unitate USB" "Unitate USB %s" "Dsipozitiv de stocare USB" - "Editați" + "Editează" "Avertisment pentru date" - "Ați folosit %s din date" + "Ai folosit %s din date" "S-a atins limita de date mobile" - "Ați atins limita de date Wi-Fi" + "Ai atins limita de date Wi-Fi" "Datele au fost întrerupte pentru restul ciclului" "Peste limita de date mobile" "Peste limita de date Wi-Fi" - "Ați depășit limita stabilită cu %s" + "Ai depășit limita stabilită cu %s" "Datele de fundal restricționate" - "Atingeți ca să eliminați restricția." + "Atinge ca să elimini restricția." "Utilizare mare de date mobile" - "Aplicațiile dvs. au utilizat mai multe date decât de obicei" + "Aplicațiile au folosit mai multe date decât de obicei" "%s a utilizat mai multe date decât de obicei" "Certificat de securitate" "Certificatul este valid." @@ -1593,11 +1593,11 @@ "Amprente:" "Amprentă SHA-256:" "Amprentă SHA-1:" - "Afișați-le pe toate" + "Afișează-le pe toate" "Alege activitatea" - "Distribuiți pentru" + "Distribuie pentru" "Se trimite..." - "Lansați browserul?" + "Lansezi browserul?" "Accepți apelul?" "Întotdeauna" "Numai o dată" @@ -1613,8 +1613,8 @@ "Audio Bluetooth" "Ecran wireless" "Trimite" - "Conectați-vă la dispozitiv" - "Proiectați ecranul pe dispozitiv" + "Conectează-te la dispozitiv" + "Proiectează ecranul pe dispozitiv" "Se caută dispozitive..." "Setări" "Deconectează-te" @@ -1632,13 +1632,13 @@ "Model greșit" "Parolă greșită" "Cod PIN greșit" - "Desenați modelul" + "Desenează modelul" "Introdu codul PIN al cardului SIM" "Introdu codul PIN" "Introdu parola" "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." "Introdu codul PIN dorit" - "Confirmați codul PIN dorit" + "Confirmă codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." "Introdu un cod PIN format din 4 până la 8 cifre." @@ -1654,28 +1654,28 @@ "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." "Se verifică contul…" "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va fi resetată la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." + "Ați făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." + "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." "Ați efectuat %d încercări incorecte de deblocare a telefonului. Telefonul va fi acum resetat la setările prestabilite din fabrică." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." " — " - "Eliminați" + "Elimină" "Ridicați volumul mai sus de nivelul recomandat?\n\nAscultarea la volum ridicat pe perioade lungi de timp vă poate afecta auzul." "Utilizați comanda rapidă pentru accesibilitate?" "Atunci când comanda rapidă este activată, dacă apăsați ambele butoane de volum timp de trei secunde, veți lansa o funcție de accesibilitate." - "Activați comanda rapidă pentru funcțiile de accesibilitate?" + "Activezi comanda rapidă pentru funcțiile de accesibilitate?" "Dacă apăsați ambele taste de volum câteva secunde, activați funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPuteți schimba funcțiile selectate din Setări > Accesibilitate." " • %1$s\n" - "Activați comanda rapidă %1$s?" + "Activezi comanda rapidă %1$s?" "Dacă apăsați ambele taste de volum câteva secunde, activați funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPuteți alege altă funcție pentru această comandă în Setări > Accesibilitate." - "Activați" + "Activează" "Nu activați" "ACTIVAT" "DEZACTIVAT" @@ -1685,23 +1685,23 @@ "Poate citi tot conținutul de pe ecran și poate afișa conținut peste alte aplicații." "Vă vede interacțiunile și le realizează" "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." - "Permiteți" + "Permite" "Refuz" "Atingeți o funcție ca să începeți să o folosiți:" "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" - "Editați comenzile rapide" + "Editează comenzile rapide" "Gata" - "Dezactivați comanda rapidă" - "Utilizați comanda rapidă" + "Dezactivează comanda rapidă" + "Folosește comanda rapidă" "Inversarea culorilor" "Corecția culorii" "Modul cu o mână" "Luminozitate redusă suplimentar" "S-au apăsat lung tastele de volum. S-a activat %1$s." "S-au apăsat lung tastele de volum. S-a dezactivat %1$s." - "Apăsați ambele butoane de volum timp de trei secunde pentru a folosi %1$s" + "Apasă ambele butoane de volum timp de trei secunde pentru a folosi %1$s" "Alegeți o funcție pe care să o folosiți când atingeți butonul de accesibilitate:" "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):" "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):" @@ -1715,7 +1715,7 @@ "Proprietar" "Invitat" "Eroare" - "Această modificare nu este permisă de administratorul dvs." + "Această modificare nu este permisă de administrator" "Nicio aplicație pentru gestionarea acestei acțiuni" "Revocați" "ISO A0" @@ -1818,27 +1818,27 @@ "necunoscut" "Serviciul de printare nu este activat" "Serviciul %s a fost instalat" - "Atingeți pentru a activa" + "Atinge pentru a activa" "Introdu codul PIN de administrator" "Introdu codul PIN" "Incorect" "Codul PIN actual" "Codul PIN nou" - "Confirmați noul cod PIN" + "Confirmă noul cod PIN" "Creați un cod PIN pentru modificarea restricțiilor" "Codurile PIN nu se potrivesc. Încercați din nou." "Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre." - "Reîncercați mai târziu" + "Reîncearcă mai târziu" "Vizualizare pe ecran complet" "Pentru a ieși, glisați de sus în jos." "Am înțeles" "Terminat" "Selector circular pentru ore" "Selector circular pentru minute" - "Selectați orele" - "Selectați minutele" - "Selectați luna și ziua" - "Selectați anul" + "Selectează orele" + "Selectează minutele" + "Selectează luna și ziua" + "Selectează anul" "%1$s a fost șters" "%1$s de serviciu" "%1$s pentru serviciu (2)" @@ -1846,15 +1846,15 @@ "Solicită codul PIN înainte de a anula fixarea" "Solicită mai întâi modelul pentru deblocare" "Solicită parola înainte de a anula fixarea" - "Instalat de administratorul dvs." - "Actualizat de administratorul dvs." + "Instalat de administrator" + "Actualizat de administrator" "Șters de administratorul dvs." "OK" "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." - "Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți." - "Activați Economizorul de date?" - "Activați" + "Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosești poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingi." + "Activezi Economizorul de date?" + "Activează" "{count,plural, =1{Timp de un minut (până la {formattedTime})}few{Timp de # minute (până la {formattedTime})}other{Timp de # de minute (până la {formattedTime})}}" "{count,plural, =1{Timp de un min. (până la {formattedTime})}few{Timp de # min. (până la {formattedTime})}other{Timp de # min. (până la {formattedTime})}}" "{count,plural, =1{Timp de o oră (până la {formattedTime})}few{Timp de # ore (până la {formattedTime})}other{Timp de # de ore (până la {formattedTime})}}" @@ -1869,7 +1869,7 @@ "Până când dezactivați" "Până când dezactivați „Nu deranja”" "%1$s/%2$s" - "Restrângeți" + "Restrânge" "Nu deranja" "Inactivitate" "Nopțile din zilele lucrătoare" @@ -1878,7 +1878,7 @@ "Somn" "%1$s dezactivează anumite sunete" "A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică." - "A apărut o problemă internă pe dispozitiv. Pentru detalii, contactați producătorul." + "A apărut o problemă internă pe dispozitiv. Pentru detalii, contactează producătorul." "Solicitarea USSD a fost schimbată cu un apel obișnuit" "Solicitarea USSD a fost schimbată cu o solicitare SS" "Schimbat cu o solicitare USSD nouă" @@ -1891,18 +1891,18 @@ "Profil de serviciu" "Notificat" "Confirmat" - "Extindeți" - "Restrângeți" - "extindeți/restrângeți" + "Extinde" + "Restrânge" + "extinde/restrânge" "Port USB Android periferic" "Android" "Port USB periferic" "Mai multe opțiuni" - "Închideți meniul suplimentar" + "Închide meniul suplimentar" "Maximizați" - "Închideți" + "Închide" "%1$s: %2$s" - "Răspundeți" + "Răspunde" "Video" "Respingeți" "Încheiați" @@ -1910,54 +1910,54 @@ "Apel în desfășurare" "Se filtrează un apel primit" "Neclasificate" - "Dvs. setați importanța acestor notificări." + "Tu setezi importanța acestor notificări." "Notificarea este importantă având în vedere persoanele implicate." "Notificare de aplicație personalizată" - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s?" - "Adăugați un utilizator monitorizat" - "Adăugați o limbă" + "Permiți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" + "Permiți ca %1$s să creeze un nou utilizator folosind %2$s?" + "Adaugă un utilizator monitorizat" + "Adaugă o limbă" "Regiunea preferată" "Numele limbii" "Sugerate" "Toate limbile" "Toate regiunile" - "Căutați" + "Caută" "Aplicația nu este disponibilă" "Momentan, aplicația %1$s nu este disponibilă. Aceasta este gestionată de %2$s." - "Aflați mai multe" + "Află mai multe" "Anulează întreruperea aplicației" - "Activați aplicațiile pentru lucru?" + "Activezi aplicațiile pentru lucru?" "Obțineți acces la aplicațiile pentru lucru și notificări" - "Activați" + "Activează" "Aplicația nu este disponibilă" "%1$s nu este disponibilă momentan." "%1$s nu este disponibilă" "Necesită permisiune" "Camera video nu este disponibilă" - "Continuați pe telefon" + "Continuă pe telefon" "Microfon indisponibil" "Setările pentru Android TV sunt indisponibile" "Setările pentru tabletă sunt indisponibile" "Setările pentru telefon sunt indisponibile" - "Aplicația nu se poate accesa pe %1$s. Încercați pe dispozitivul Android TV." - "Aplicația nu se poate accesa pe %1$s. Încercați pe tabletă." - "Aplicația nu se poate accesa pe %1$s. Încercați pe telefon." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe dispozitivul Android TV." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe tabletă." - "Aplicația nu poate fi accesată pe %1$s momentan. Încercați pe telefon." - "Aplicația necesită securitate suplimentară. Încercați pe dispozitivul Android TV." - "Aplicația necesită securitate suplimentară. Încercați pe tabletă." - "Aplicația necesită securitate suplimentară. Încercați pe telefon." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe dispozitivul Android TV." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe tabletă." + "Aplicația nu se poate accesa pe %1$s. Încearcă pe telefon." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe dispozitivul Android TV." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe tabletă." + "Aplicația nu poate fi accesată pe %1$s momentan. Încearcă pe telefon." + "Aplicația necesită securitate suplimentară. Încearcă pe dispozitivul Android TV." + "Aplicația necesită securitate suplimentară. Încearcă pe tabletă." + "Aplicația necesită securitate suplimentară. Încearcă pe telefon." "Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul." - "Căutați actualizări" + "Caută actualizări" "Aveți mesaje noi" - "Deschideți aplicația pentru SMS-uri ca să vizualizați" + "Deschide aplicația pentru SMS-uri ca să vezi" "Unele funcții ar putea fi limitate" "Profil de serviciu blocat" - "Atingeți ca să deblocați" + "Atinge ca să deblochezi" "Conectat la %1$s" - "Atingeți pentru a vedea fișierele" + "Atinge pentru a vedea fișierele" "Fixați" "Fixați %1$s" "Anulează fixarea" @@ -1982,30 +1982,30 @@ "Remedierea erorilor prin USB" "oră" "minut" - "Setați ora" + "Setează ora" "Introdu o oră validă" "Introdu ora" "Pentru a introduce ora, comutați la modul de introducere a textului." - "Pentru a introduce ora, comutați la modul ceas." + "Pentru a introduce ora, comută la modul ceas." "Opțiuni de completare automată" - "Salvați pentru completare automată" + "Salvează pentru completare automată" "Conținutul nu poate fi completat automat" "Nicio sugestie de completare automată" "{count,plural, =1{O sugestie de completare automată}few{# sugestii de completare automată}other{# de sugestii de completare automată}}" - "Salvați în ""%1$s""?" - "Salvați %1$s în ""%2$s""?" - "Salvați %1$s și %2$s în ""%3$s""?" - "Salvați %1$s, %2$s și %3$s în ""%4$s""?" - "Actualizați în ""%1$s""?" - "Actualizați %1$s în ""%2$s""?" - "Actualizați %1$s și %2$s în ""%3$s""?" - "Actualizați aceste articole în ""%4$s"": %1$s, %2$s și %3$s?" - "Salvați" + "Salvezi în ""%1$s""?" + "Salvezi %1$s în ""%2$s""?" + "Salvezi %1$s și %2$s în ""%3$s""?" + "Salvezi %1$s, %2$s și %3$s în ""%4$s""?" + "Actualizezi în ""%1$s""?" + "Actualizezi %1$s în ""%2$s""?" + "Actualizezi %1$s și %2$s în ""%3$s""?" + "Actualizezi aceste articole în ""%4$s"": %1$s, %2$s și %3$s?" + "Salvează" "Nu, mulțumesc" "Nu acum" "Niciodată" - "Actualizați" - "Continuați" + "Actualizează" + "Continuă" "parolă" "adresă" "card de credit" @@ -2018,7 +2018,7 @@ "Părăsiți imediat zonele de coastă și din apropierea râurilor și îndreptați-vă spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." "Păstrați-vă calmul și căutați un adăpost în apropiere." "Testarea mesajelor de urgență" - "Răspundeți" + "Răspunde" "Cardul SIM nu este permis pentru voce" "Cardul SIM nu este activat pentru voce" @@ -2036,15 +2036,15 @@ "Nu s-a putut restabili comanda rapidă" "Comanda rapidă este dezactivată" "DEZINSTALAȚI" - "Deschideți oricum" + "Deschide oricum" "Aplicație dăunătoare detectată" - "Permiteți ca %s să acceseze toate jurnalele dispozitivului?" - "Permiteți accesul o dată" - "Nu permiteți" + "Permiți ca %s să acceseze toate jurnalele dispozitivului?" + "Permite accesul o dată" + "Nu permite" "Jurnalele dispozitivului înregistrează activitatea de pe dispozitivul dvs. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permiteți accesul la toate jurnalele dispozitivului doar aplicațiilor în care aveți încredere. \n\nDacă nu permiteți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. Este posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Aflați mai multe" "Nu mai afișa" "%1$s vrea să afișeze porțiuni din %2$s" - "Editați" + "Editează" "Apelurile și notificările vor vibra" "Apelurile și notificările vor avea sunetul dezactivat" "Modificări de sistem" @@ -2052,30 +2052,30 @@ "Funcția nouă Nu deranja ascunde notificările" "Atingeți ca să aflați mai multe și să modificați" "Funcția Nu deranja s-a schimbat" - "Atingeți pentru a verifica ce este blocat." + "Atinge pentru a verifica ce este blocat." "Examinați setările pentru notificări" "Începând cu Android 13, aplicațiile pe care le instalați necesită permisiunea de a trimite notificări. Atingeți ca să modificați permisiunea pentru aplicațiile existente." "Mai târziu" - "Închideți" + "Închide" "Sistem" "Setări" "Cameră foto" "Microfon" "se afișează peste alte aplicații de pe ecran" "Oferiți feedback" - "Notificarea a fost promovată la Prestabilită. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată în jos la Silențioasă. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată la un nivel superior. Atingeți pentru a oferi feedback." - "Notificarea a fost mutată la un nivel inferior. Atingeți pentru a oferi feedback." + "Notificarea a fost promovată la Prestabilită. Atinge pentru a oferi feedback." + "Notificarea a fost mutată în jos la Silențioasă. Atinge pentru a oferi feedback." + "Notificarea a fost mutată la un nivel superior. Atinge pentru a oferi feedback." + "Notificarea a fost mutată la un nivel inferior. Atinge pentru a oferi feedback." "Notificări optimizate" "Acțiunile și răspunsurile sugerate sunt acum trimise prin notificări optimizate. Notificările adaptive Android nu mai sunt acceptate." "OK" - "Dezactivați" - "Aflați mai multe" + "Dezactivează" + "Află mai multe" "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și vă organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." "Notificare pentru informații despre modul Rutină" "Bateria se poate descărca înainte de încărcarea obișnuită" - "Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei" + "Economisirea bateriei este activată pentru a mări autonomia" "Economisirea bateriei" "Economisirea bateriei a fost dezactivată" "Telefonul este încărcat suficient. Funcțiile nu mai sunt limitate." @@ -2117,7 +2117,7 @@ "Comandă rapidă de accesibilitate de pe ecran" "Selector de comenzi rapide de accesibilitate de pe ecran" "Comandă rapidă de accesibilitate" - "Închideți fereastra de notificări" + "Închide fereastra de notificări" "Dpad sus" "Dpad jos" "Dpad stânga" @@ -2140,13 +2140,13 @@ "Acest conținut nu poate fi trimis cu aplicații personale" "Acest conținut nu poate fi deschis cu aplicații personale" "Profilul de serviciu este întrerupt" - "Atingeți pentru a activa" + "Atinge pentru a activa" "Nicio aplicație pentru lucru" "Nicio aplicație personală" - "Deschideți %s în profilul personal?" - "Deschideți %s în profilul de serviciu?" - "Folosiți browserul personal" - "Folosiți browserul de serviciu" + "Deschizi %s în profilul personal?" + "Deschizi %s în profilul de serviciu?" + "Folosește browserul personal" + "Folosește browserul de serviciu" "Codul PIN de deblocare SIM privind rețeaua" "Codul PIN de deblocare SIM privind subsetul de rețea" "Codul PIN de deblocare SIM corporativă" @@ -2261,12 +2261,12 @@ "Noi setări de mărire" "Acum puteți mări o parte a ecranului" - "Activați din Setări" + "Activează din Setări" "Respingeți" - "Deblocați microfonul dispozitivului" - "Deblocați camera dispozitivului" + "Deblochează microfonul dispozitivului" + "Deblochează camera dispozitivului" "Pentru <b>%s</b> și toate aplicațiile și serviciile" - "Deblocați" + "Deblochează" "Confidențialitatea privind senzorii" "Pictograma aplicației" "Imaginea de branding a aplicației" @@ -2277,8 +2277,8 @@ "Activitate de fundal" "O aplicație consumă bateria" "O aplicație este încă activă" - "%1$s rulează în fundal. Atingeți pentru a gestiona utilizarea bateriei." - "%1$s poate afecta autonomia bateriei. Atingeți pentru a examina aplicațiile active." + "%1$s rulează în fundal. Atinge pentru a gestiona utilizarea bateriei." + "%1$s poate afecta autonomia bateriei. Atinge pentru a examina aplicațiile active." "Verificați aplicațiile active" "Nu se poate accesa camera foto a telefonului de pe %1$s" "Nu se poate accesa camera foto a tabletei de pe %1$s" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d6d5816d61dc..f7b1da4bc900 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -268,7 +268,7 @@ "Настройки" "Помощник" "Аудиоподсказки" - "Блокировка" + "Блокировка входа" ">999" "Новое уведомление" "Виртуальная клавиатура" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index c86d11cb5317..d393d2d6b161 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1074,7 +1074,7 @@ "Пошук" "Пошуковий запит" "Очистити запит" - "Наіслати запит" + "Надіслати запит" "Голосовий пошук" "Увімкнути дослідження дотиком?" "%1$s хоче ввімкнути функцію дослідження дотиком. Увімкнувши функцію дослідження дотиком, можна чути або бачити опис елемента, розташованого під вашим пальцем, або виконувати жести для взаємодії з планшетним ПК." -- cgit v1.2.3 From 0f1ffe64faeae6e7bbdeab0b4cac885c83f3bd44 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 02:52:58 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I361a078b4861224d7fb8dd3fd06ce9c310a5e64c --- packages/overlays/AvoidAppsInCutoutOverlay/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-ro/strings.xml b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-ro/strings.xml index 6e5947c0d753..b9cc0b066dcf 100644 --- a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-ro/strings.xml +++ b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-ro/strings.xml @@ -17,5 +17,5 @@ - "Redați aplicațiile sub zona de decupaj" + "Redă aplicațiile sub zona de decupaj" -- cgit v1.2.3 From ded6f61b67bca22a7a345ec100c75f302553953d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 02:56:11 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ibfc4d71531db1409338bfd92897f9cefffd2f1f8 --- packages/overlays/NoCutoutOverlay/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/overlays/NoCutoutOverlay/res/values-ro/strings.xml b/packages/overlays/NoCutoutOverlay/res/values-ro/strings.xml index e6281fd09b1a..2d7aaf6a46d2 100644 --- a/packages/overlays/NoCutoutOverlay/res/values-ro/strings.xml +++ b/packages/overlays/NoCutoutOverlay/res/values-ro/strings.xml @@ -17,5 +17,5 @@ - "Ascundeți" + "Ascunde" -- cgit v1.2.3 From 9cd8845e05740ab9087e4d648b97dc4ff7cdb8bc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 02:59:30 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I54056c4281d4edb7f599b05a10dc967ac1f90a1e --- packages/VpnDialogs/res/values-ro/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml index 191736e0088f..94a79090bb51 100644 --- a/packages/VpnDialogs/res/values-ro/strings.xml +++ b/packages/VpnDialogs/res/values-ro/strings.xml @@ -17,7 +17,7 @@ "Solicitare de conexiune" - "%s dorește să configureze o conexiune VPN care să îi permită să monitorizeze traficul în rețea. Acceptați numai dacă aveți încredere în sursă. Atunci când conexiunea VPN este activă, <br /> <br /> <img src=vpn_icon /> se afișează în partea de sus a ecranului." + "%s dorește să configureze o conexiune VPN care să îi permită să monitorizeze traficul în rețea. Acceptă numai dacă ai încredere în sursă. Când conexiunea VPN e activă, <br /> <br /> <img src=vpn_icon /> se afișează în partea de sus a ecranului." "%s solicită permisiunea de a configura o conexiune VPN care să îi permită să monitorizeze traficul de rețea. Acceptați numai dacă aveți încredere în sursă. <br /> <br /> <img src=vpn_icon /> va apărea pe ecran atunci când conexiunea VPN este activă." "VPN este conectat" "Sesiune:" @@ -26,12 +26,12 @@ "Primite:" "%1$s byți/%2$s pachete" "Nu se poate conecta la rețeaua VPN activată permanent" - "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Telefonul dvs. va folosi o rețea publică până când se va putea reconecta la %1$s." - "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Nu veți avea conexiune până când se va putea reconecta rețeaua VPN." + "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Telefonul va folosi o rețea publică până când se va putea reconecta la %1$s." + "%1$s este setată să rămână conectată permanent, dar momentan nu se poate conecta. Nu vei avea conexiune până când se va putea reconecta rețeaua VPN." " " - "Modificați setările VPN" + "Modifică setările VPN" "Configurează" "Deconectează" - "Deschideți aplicația" - "Închideți" + "Deschide aplicația" + "Închide" -- cgit v1.2.3 From 750a74440103bac9d000ff07a6845bb39f894eb8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 03:46:42 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6cc4888a76f0efde4322d3af8590152a51a13f26 --- libs/WindowManager/Shell/res/values-ro/strings_tv.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml index ad872f8be9ba..36df2864a752 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml @@ -21,14 +21,14 @@ "(Program fără titlu)" "Închide" "Ecran complet" - "Mutați" - "Extindeți" - "Restrângeți" + "Mută" + "Extinde" + "Restrânge" " Apasă de două ori ""butonul ecran de pornire"" pentru comenzi" "Meniu picture-in-picture." - "Mutați spre stânga" - "Mutați spre dreapta" - "Mutați în sus" - "Mutați în jos" + "Mută spre stânga" + "Mută spre dreapta" + "Mută în sus" + "Mută în jos" "Gata" -- cgit v1.2.3 From 2c9036238d8f048221f350b4df87a0f15d155a4d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 03:49:55 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5aed2df6d24da6763bdf1e5c516bb3d771fd4ce7 --- libs/WindowManager/Shell/res/values-ro/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index d71e0126001b..ba3701dc734c 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -18,14 +18,14 @@ "Închide" - "Extindeți" + "Extinde" "Setări" - "Accesați ecranul împărțit" + "Accesează ecranul împărțit" "Meniu" "%s este în modul picture-in-picture" "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." - "Redați" - "Întrerupeți" + "Redă" + "Întrerupe" "Treceți la următorul" "Treceți la cel anterior" "Redimensionați" @@ -48,17 +48,17 @@ "Partea de jos pe ecran complet" "Folosirea modului cu o mână" "Pentru a ieși, glisați în sus din partea de jos a ecranului sau atingeți oriunde deasupra ferestrei aplicației" - "Activați modul cu o mână" + "Activează modul cu o mână" "Părăsiți modul cu o mână" "Setări pentru baloanele %1$s" "Suplimentar" "Adaugă înapoi în stivă" "%1$s de la %2$s" "%1$s de la %2$s și încă %3$d" - "Mutați în stânga sus" - "Mutați în dreapta sus" - "Mutați în stânga jos" - "Mutați în dreapta jos" + "Mută în stânga sus" + "Mută în dreapta sus" + "Mută în stânga jos" + "Mută în dreapta jos" "Setări %1$s" "Închide balonul" "Nu afișați conversația în balon" @@ -70,7 +70,7 @@ "Nu există baloane recente" "Baloanele recente și baloanele respinse vor apărea aici" "Balon" - "Gestionați" + "Gestionează" "Balonul a fost respins." "Atingeți ca să reporniți aplicația și să treceți în modul ecran complet." "Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra" @@ -78,7 +78,7 @@ "Nu aveți probleme cu camera foto? Atingeți pentru a închide." "Unele aplicații funcționează cel mai bine în orientarea portret" "Încearcă una dintre aceste opțiuni pentru a profita din plin de spațiu" - "Rotiți dispozitivul pentru a trece în modul ecran complet" + "Rotește dispozitivul pentru a trece în modul ecran complet" "Atinge de două ori lângă o aplicație pentru a o repoziționa" "OK" -- cgit v1.2.3 From a683d0a897060baa92ccfd5e8c7f82750e632467 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 04:59:35 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2f74bd05437c27fe7a82ec1bbce49b394c7f3d82 --- .../PackageInstaller/res/values-ro/strings.xml | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 1f156190b5fd..6b793fcd810c 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -29,36 +29,36 @@ "Aplicația nu a fost instalată." "Instalarea pachetului a fost blocată." "Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent." - "Aplicația nu a fost instalată deoarece nu este compatibilă cu tableta dvs." - "Aplicația nu este compatibilă cu televizorul dvs." - "Aplicația nu a fost instalată deoarece nu este compatibilă cu telefonul dvs." + "Aplicația nu a fost instalată deoarece nu este compatibilă cu tableta." + "Aplicația nu este compatibilă cu televizorul." + "Aplicația nu a fost instalată deoarece nu este compatibilă cu telefonul." "Aplicația nu a fost instalată deoarece pachetul este nevalid." - "Aplicația %1$s nu a putut fi instalată pe tableta dvs." - "Aplicația %1$s nu a putut fi instalată pe televizorul dvs." - "Aplicația %1$s nu a putut fi instalată pe telefonul dvs." + "Aplicația %1$s nu a putut fi instalată pe tabletă." + "Aplicația %1$s nu a putut fi instalată pe televizor." + "Aplicația %1$s nu a putut fi instalată pe telefon." "Deschide" "Administratorul nu permite instalarea aplicațiilor obținute din surse necunoscute" "Aplicațiile necunoscute nu pot fi instalate de acest utilizator" "Acest utilizator nu are permisiunea să instaleze aplicații" "OK" - "Gestionați aplicații" + "Gestionează" "Spațiu de stocare insuficient" - "Aplicația %1$s nu a putut fi instalată. Eliberați spațiu și încercați din nou." + "Aplicația %1$s nu a putut fi instalată. Eliberează spațiu și încearcă din nou." "Aplicația nu a fost găsită" "Aplicația nu a fost găsită în lista de aplicații instalate." "Nepermis" "Utilizatorul actual nu are permisiune pentru a face această dezinstalare." "Eroare" "Aplicația nu a putut fi dezinstalată." - "Dezinstalați aplicația" - "Dezinstalați actualizarea" + "Dezinstalează aplicația" + "Dezinstalează actualizarea" "%1$s face parte din următoarea aplicație:" - "Doriți să dezinstalați această aplicație?" - "Doriți să dezinstalați această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." - "Dezinstalați această aplicație pentru utilizatorul %1$s?" + "Dezinstalezi această aplicație?" + "Dezinstalezi această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." + "Dezinstalezi această aplicație pentru utilizatorul %1$s?" "Doriți să dezinstalați această aplicație din profilul de serviciu?" - "Înlocuiți această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." - "Înlocuiți această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." + "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." + "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." "Păstrează %1$s din datele aplicației." "Dezinstalări în curs" "Dezinstalări nereușite" @@ -71,10 +71,10 @@ "Nu se poate dezinstala aplicația activă de administrare a dispozitivului" "Nu se poate dezinstala aplicația activă de administrare a dispozitivului pentru %1$s" "Aplicația este necesară unor utilizatori sau profiluri și a fost dezinstalată pentru alții" - "Aplicația este necesară pentru profilul dvs. și nu poate fi dezinstalată." + "Aplicația este necesară pentru profilul tău și nu poate fi dezinstalată." "Aplicația este necesară administratorului dispozitivului și nu poate fi dezinstalată." - "Gestionați aplicațiile de administrare dispozitiv" - "Gestionați utilizatorii" + "Gestionează aplicațiile de administrare dispozitiv" + "Gestionează utilizatorii" "Aplicația %1$s nu a putut fi dezinstalată." "A apărut o problemă la analizarea pachetului." "Android Wear" @@ -84,10 +84,10 @@ "Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." "Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." "Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Telefonul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Tableta și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați aplicația, acceptați că sunteți singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Televizorul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Continuați" + "Telefonul și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Tableta și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi aplicația, accepți că ești singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Televizorul și datele tale cu caracter personal sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Continuă" "Setări" "Se (dez)instalează aplicațiile Wear" "Notificare de aplicație instalată" -- cgit v1.2.3 From 47656d82b67f3f8aa75006b07ab7fb360b6c14e2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:00:50 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I882d741ff0ff343037985cd9ae2f23263b4d8083 --- .../PackageInstaller/res/values-ro/strings.xml | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 1f156190b5fd..6b793fcd810c 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -29,36 +29,36 @@ "Aplicația nu a fost instalată." "Instalarea pachetului a fost blocată." "Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent." - "Aplicația nu a fost instalată deoarece nu este compatibilă cu tableta dvs." - "Aplicația nu este compatibilă cu televizorul dvs." - "Aplicația nu a fost instalată deoarece nu este compatibilă cu telefonul dvs." + "Aplicația nu a fost instalată deoarece nu este compatibilă cu tableta." + "Aplicația nu este compatibilă cu televizorul." + "Aplicația nu a fost instalată deoarece nu este compatibilă cu telefonul." "Aplicația nu a fost instalată deoarece pachetul este nevalid." - "Aplicația %1$s nu a putut fi instalată pe tableta dvs." - "Aplicația %1$s nu a putut fi instalată pe televizorul dvs." - "Aplicația %1$s nu a putut fi instalată pe telefonul dvs." + "Aplicația %1$s nu a putut fi instalată pe tabletă." + "Aplicația %1$s nu a putut fi instalată pe televizor." + "Aplicația %1$s nu a putut fi instalată pe telefon." "Deschide" "Administratorul nu permite instalarea aplicațiilor obținute din surse necunoscute" "Aplicațiile necunoscute nu pot fi instalate de acest utilizator" "Acest utilizator nu are permisiunea să instaleze aplicații" "OK" - "Gestionați aplicații" + "Gestionează" "Spațiu de stocare insuficient" - "Aplicația %1$s nu a putut fi instalată. Eliberați spațiu și încercați din nou." + "Aplicația %1$s nu a putut fi instalată. Eliberează spațiu și încearcă din nou." "Aplicația nu a fost găsită" "Aplicația nu a fost găsită în lista de aplicații instalate." "Nepermis" "Utilizatorul actual nu are permisiune pentru a face această dezinstalare." "Eroare" "Aplicația nu a putut fi dezinstalată." - "Dezinstalați aplicația" - "Dezinstalați actualizarea" + "Dezinstalează aplicația" + "Dezinstalează actualizarea" "%1$s face parte din următoarea aplicație:" - "Doriți să dezinstalați această aplicație?" - "Doriți să dezinstalați această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." - "Dezinstalați această aplicație pentru utilizatorul %1$s?" + "Dezinstalezi această aplicație?" + "Dezinstalezi această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." + "Dezinstalezi această aplicație pentru utilizatorul %1$s?" "Doriți să dezinstalați această aplicație din profilul de serviciu?" - "Înlocuiți această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." - "Înlocuiți această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." + "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." + "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." "Păstrează %1$s din datele aplicației." "Dezinstalări în curs" "Dezinstalări nereușite" @@ -71,10 +71,10 @@ "Nu se poate dezinstala aplicația activă de administrare a dispozitivului" "Nu se poate dezinstala aplicația activă de administrare a dispozitivului pentru %1$s" "Aplicația este necesară unor utilizatori sau profiluri și a fost dezinstalată pentru alții" - "Aplicația este necesară pentru profilul dvs. și nu poate fi dezinstalată." + "Aplicația este necesară pentru profilul tău și nu poate fi dezinstalată." "Aplicația este necesară administratorului dispozitivului și nu poate fi dezinstalată." - "Gestionați aplicațiile de administrare dispozitiv" - "Gestionați utilizatorii" + "Gestionează aplicațiile de administrare dispozitiv" + "Gestionează utilizatorii" "Aplicația %1$s nu a putut fi dezinstalată." "A apărut o problemă la analizarea pachetului." "Android Wear" @@ -84,10 +84,10 @@ "Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." "Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." "Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Telefonul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Tableta și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați aplicația, acceptați că sunteți singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Televizorul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." - "Continuați" + "Telefonul și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Tableta și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi aplicația, accepți că ești singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Televizorul și datele tale cu caracter personal sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." + "Continuă" "Setări" "Se (dez)instalează aplicațiile Wear" "Notificare de aplicație instalată" -- cgit v1.2.3 From 5ef61db976845467e160f095d250fbefce7488a3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:08:13 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8cd05a70d850c8931821f32f31f9cef27fcf039a --- packages/SimAppDialog/res/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SimAppDialog/res/values-ro/strings.xml b/packages/SimAppDialog/res/values-ro/strings.xml index 21663d125f7f..5d876eac82d8 100644 --- a/packages/SimAppDialog/res/values-ro/strings.xml +++ b/packages/SimAppDialog/res/values-ro/strings.xml @@ -18,9 +18,9 @@ "Sim App Dialog" - "Activați serviciul mobil" + "Activează serviciul mobil" "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația %1$s" "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația operatorului" "Nu acum" - "Descărcați aplicația" + "Descarcă aplicația" -- cgit v1.2.3 From 7710db36e3899335202552c035685fe931920031 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:09:22 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia66df69103c8904c7b26a84230735ef999530880 --- packages/SimAppDialog/res/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SimAppDialog/res/values-ro/strings.xml b/packages/SimAppDialog/res/values-ro/strings.xml index 21663d125f7f..5d876eac82d8 100644 --- a/packages/SimAppDialog/res/values-ro/strings.xml +++ b/packages/SimAppDialog/res/values-ro/strings.xml @@ -18,9 +18,9 @@ "Sim App Dialog" - "Activați serviciul mobil" + "Activează serviciul mobil" "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația %1$s" "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația operatorului" "Nu acum" - "Descărcați aplicația" + "Descarcă aplicația" -- cgit v1.2.3 From ecd5a0e85b4be1cb4261707285e9a7bcb8cf6dd7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:16:21 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4d77a8bd1ea30c2ac1951d28a7340657d7db53a1 --- packages/Shell/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index 73322d6bd721..56e9ee0d1350 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -25,7 +25,7 @@ "Raportul de eroare va apărea curând pe telefon" "Selectează pentru a trimite raportul de eroare" "Atinge pentru a trimite raportul de eroare" - "Selectează pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" + "Selectează pentru a trimite raportul fără captură de ecran sau așteaptă finalizarea acesteia" "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le poți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permite accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care ai încredere." -- cgit v1.2.3 From fe56395a79c5413e5721e67450a89af87910c222 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:17:22 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ibbe9931bbba2a93a0dd6bd67748c017a0b32c100 --- packages/Shell/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index 73322d6bd721..56e9ee0d1350 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -25,7 +25,7 @@ "Raportul de eroare va apărea curând pe telefon" "Selectează pentru a trimite raportul de eroare" "Atinge pentru a trimite raportul de eroare" - "Selectează pentru a trimite raportul de eroare fără captură de ecran sau așteptați finalizarea acesteia" + "Selectează pentru a trimite raportul fără captură de ecran sau așteaptă finalizarea acesteia" "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" "Atinge ca să trimiți raportul de eroare fără captură de ecran sau așteaptă finalizarea acesteia" "Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului. Acestea pot include date pe care le poți considera sensibile (cum ar fi utilizarea aplicației și date despre locație). Permite accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care ai încredere." -- cgit v1.2.3 From edbf635caeafcaeece2ce6a74441402471bfd532 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:21:01 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib0757c5724285295eb4189eccafbe971f38253d0 --- packages/SystemUI/res/values-ca/strings.xml | 8 +- packages/SystemUI/res/values-kk/strings.xml | 8 +- packages/SystemUI/res/values-mr/strings.xml | 6 +- packages/SystemUI/res/values-ro/strings.xml | 250 ++++++++++++++-------------- 4 files changed, 136 insertions(+), 136 deletions(-) diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index ff702d641c64..e777795de587 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -251,7 +251,7 @@ "S\'està connectant..." "Punt d\'accés Wi-Fi" "S\'està activant…" - "Economitzador activat" + "Estalvi dades activat" %d dispositius %d dispositiu @@ -593,8 +593,8 @@ "Obre la configuració" "Auriculars connectats" "Auriculars connectats" - "Economitzador de dades" - "L\'Economitzador de dades està activat" + "Estalvi de dades" + "L\'Estalvi de dades està activat" "Activat" "Desactivat" "No disponible" @@ -623,7 +623,7 @@ "Codi de tecla de la dreta" "Icona de l\'esquerra" "Icona de la dreta" - "Mantén premut i arrossega per afegir mosaics" + "Mantén premut i arrossega per afegir icones" "Mantén premut i arrossega per reorganitzar els mosaics" "Arrossega aquí per suprimir" "Necessites com a mínim %1$d mosaics" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index a234570783c8..71f5e76c2d80 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -194,9 +194,9 @@ "Азырақ уақыт." "Экранды трансляциялау тоқтатылды." "Дисплей жарықтығы" - "Мобильдік деректер кідіртілді" + "Мобильдік интернет кідіртілді" "Деректер кідіртілді" - "Белгіленген деректер шегіне жеттіңіз. Мобильдік деректер енді пайдаланылмайды.\n\nЕгер жалғастырсаңыз, деректер трафигі үшін ақы алынуы мүмкін." + "Белгіленген деректер шегіне жеттіңіз. Мобильдік интернет енді пайдаланылмайды.\n\nЕгер жалғастырсаңыз, деректер трафигі үшін ақы алынуы мүмкін." "Жалғастыру" "Орын өтініштері қосылған" "Датчиктер өшірулі." @@ -258,7 +258,7 @@ "Қалта шам" "Камера қолданылып жатыр" - "Мобильдік деректер" + "Мобильдік интернет" "Дерек шығыны" "Қалған деректер" "Шектен асу" @@ -711,7 +711,7 @@ "Мазаламау режимі автоматты ереже немесе қолданба арқылы қосылды." "Фонда жұмыс істеп тұрған қолданбалар" "Батарея мен деректер трафигі туралы білу үшін түртіңіз" - "Мобильдік деректер өшірілсін бе?" + "Мобильдік интернет өшірілсін бе?" "%s операторы арқылы деректерге немесе интернетке кіре алмайсыз. Интернетке тек Wi-Fi арқылы кіресіз." "операторыңыз" "Басқа қолданба рұқсат сұрауын жасырып тұрғандықтан, параметрлер жауабыңызды растай алмайды." diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 188f0b7abaa1..331bb318c70c 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -324,9 +324,9 @@ "हे डिव्हाइस तुमच्या संस्थेचे आहे" "हे डिव्हाइस %s चे आहे" "हे डिव्हाइस %s द्वारे पुरवले गेले आहे" - "फोनसाठी चिन्हावरून स्वाइप करा" - "व्हॉइस सहाय्यासाठी चिन्हावरून स्वाइप करा" - "कॅमेर्‍यासाठी चिन्हावरून स्वाइप करा" + "फोनसाठी आयकनवरून स्वाइप करा" + "व्हॉइस सहाय्यासाठी आयकनवरून स्वाइप करा" + "कॅमेर्‍यासाठी आयकनवरून स्वाइप करा" "संपूर्ण शांतता. हे स्क्रीन रीडर ना देखील शांत करेल." "संपूर्ण शांतता" "केवळ प्राधान्य" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index e6dabc62bebc..a91245d99b49 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -20,28 +20,28 @@ "UI sistem" - "Activați Economisirea bateriei?" + "Activezi Economisirea bateriei?" "Mai aveți %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Procent rămas din baterie: %s" "Nu se poate realiza încărcarea prin USB" - "Folosiți încărcătorul livrat împreună cu dispozitivul" - "Activați economisirea bateriei?" + "Folosește încărcătorul livrat împreună cu dispozitivul" + "Activezi economisirea bateriei?" "Despre Economisirea bateriei" - "Activați" - "Activați" + "Activează" + "Activează" "Nu, mulțumesc" "Rotire automată a ecranului" - "Permiți %1$s să acceseze %2$s?" + "Permiți ca %1$s să acceseze %2$s?" "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Permiți ca %1$s să acceseze %2$s?" - "Deschideți %1$s ca să gestioneze %2$s?" + "Deschizi %1$s ca să gestioneze %2$s?" "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Permiți %1$s să acceseze %2$s?" - "Deschideți %1$s ca să gestioneze %2$s?" - "Deschide %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." - "Deschideți %1$s ca să gestioneze %2$s?" + "Permiți ca %1$s să acceseze %2$s?" + "Deschizi %1$s ca să gestioneze %2$s?" + "Deschizi %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Deschizi %1$s ca să gestioneze %2$s?" "Aplic. instal. nu funcț. cu acest acces. USB. Află despre acest accesoriu la %1$s" "Accesoriu USB" "Afișează" @@ -52,11 +52,11 @@ "Permite întotdeauna de pe acest computer" "Permite" "Remedierea erorilor prin USB nu este permisă" - "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." + "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comută la utilizatorul principal." "Schimbați limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" - "Schimbați limba" - "Păstrați limba actuală" + "Schimbă limba" + "Păstrează limba actuală" "Permiți remedierea erorilor wireless în această rețea?" "Numele rețelei (SSID)\n%1$s\n\nAdresa Wi‑Fi (BSSID)\n%2$s" "Permite întotdeauna în această rețea" @@ -64,9 +64,9 @@ "Remedierea erorilor wireless nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" - "Pentru a vă proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVeți primi o notificare când puteți folosi din nou portul USB." + "Pentru a proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVei primi o notificare când poți folosi din nou portul USB." "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" - "Activați USB" + "Activează USB" "Mai multe" "Captură de ecran" "Smart Lock dezactivat" @@ -75,12 +75,12 @@ "Captură de ecran salvată" "Nu s-a putut salva captura de ecran" "Pentru a salva captura de ecran, trebuie să deblocați dispozitivul" - "Încercați să faceți din nou o captură de ecran" + "Încearcă să faci din nou o captură de ecran" "Nu se poate salva captura de ecran" - "Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs." + "Crearea capturilor de ecran nu e permisă de aplicație sau de organizația ta" "Administratorul IT a blocat crearea capturilor de ecran" - "Editați" - "Editați captura de ecran" + "Editează" + "Editează captura de ecran" "Trimite captura de ecran" "Surprindeți mai mult" "Închide captura de ecran" @@ -113,34 +113,34 @@ "Ecranul de pornire" "Meniu" "Accesibilitate" - "Rotiți ecranul" + "Rotește ecranul" "Recente" "Cameră foto" "Telefon" "Asistent vocal" "Portofel" "Scanner de coduri QR" - "Deblocați" + "Deblochează" "Dispozitiv blocat" "Scanarea chipului" "Trimite" - "deschideți telefonul" - "deschideți asistentul vocal" - "deschideți camera foto" + "deschide telefonul" + "deschide asistentul vocal" + "deschide camera foto" "Anulează" - "Confirmați" + "Confirmă" "Încearcă din nou" "Atinge pentru a anula autentificarea" "Încearcă din nou" "Se caută chipul" "Chip autentificat" "Confirmat" - "Atingeți Confirmați pentru a finaliza" + "Atinge Confirm pentru a finaliza" "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" "Autentificat" - "Folosiți PIN-ul" - "Folosiți modelul" - "Folosiți parola" + "Folosește PIN-ul" + "Folosește modelul" + "Folosește parola" "PIN greșit" "Model greșit" "Parolă greșită" @@ -158,7 +158,7 @@ "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." "Atinge senzorul de amprente" "Pictograma amprentă" - "Chipul nu a fost recunoscut. Folosiți amprenta." + "Chipul nu a fost recunoscut. Folosește amprenta." "Conectat prin Bluetooth." @@ -196,8 +196,8 @@ "Luminozitatea ecranului" "Datele mobile sunt întrerupte" "Conexiunea de date este întreruptă" - "A fost atinsă limita de date setată. Datele mobile nu mai sunt folosite.\n\nDacă reluați, este posibil să se aplice taxe pentru utilizarea datelor." - "Reluați" + "A fost atinsă limita de date setată. Datele mobile nu mai sunt folosite.\n\nDacă reiei, se pot aplica taxe pentru utilizarea datelor." + "Reia" "Solicitări locație active" "Dezactivarea senzorilor este activă" "Șterge toate notificările." @@ -304,15 +304,15 @@ "Cameră foto disponibilă" "Microfon și cameră disponibile" "Alt dispozitiv" - "Comutați secțiunea Recente" - "Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de dvs. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri." - "Se vor anunța prin sunete și vibrații numai alarmele. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri." - "Personalizați" - "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri." + "Comută secțiunea Recente" + "Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de tine. Totuși, vei auzi tot ce alegi să redai, inclusiv muzică, videoclipuri și jocuri." + "Se vor anunța prin sunete și vibrații numai alarmele. Totuși, vei auzi tot ce alegi să redai, inclusiv muzică, videoclipuri și jocuri." + "Personalizează" + "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, vei putea iniția apeluri." "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor." "Atinge din nou pentru a deschide" "Atinge din nou" - "Glisați în sus pentru a deschide" + "Glisează în sus pentru a deschide" "Apasă pictograma de deblocare pentru a deschide" "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" @@ -321,14 +321,14 @@ "Deplasați spre dreapta" "Deplasați în sus" - "Glisați pentru a încerca din nou" - "Deblocați pentru a folosi NFC" + "Glisează pentru a încerca din nou" + "Deblochează pentru a folosi NFC" "Dispozitivul aparține organizației dvs." "Acest dispozitiv aparține organizației %s" "Acest dispozitiv este oferit de %s" - "Glisați dinspre telefon" - "Glisați dinspre pictogramă pentru asistentul vocal" - "Glisați pentru a fotografia" + "Glisează dinspre telefon" + "Glisează dinspre pictogramă pentru asistentul vocal" + "Glisează pentru a fotografia" "Liniște absolută. Se va opri sunetul și pentru cititoarele de ecran." "Niciun sunet" "Numai cu prioritate" @@ -341,27 +341,27 @@ "%2$s • Se încarcă rapid • %1$s până la încărcarea completă" "%2$s • Se încarcă lent • %1$s până la încărcarea completă" "%2$s • Suport de încărcare • %1$s până la încărcarea completă" - "Comutați între utilizatori" + "Schimbă utilizatorul" "Toate aplicațiile și datele din această sesiune vor fi șterse." - "Bine ați revenit în sesiunea pentru invitați!" - "Vreți să continuați sesiunea?" - "Începeți din nou" - "Da, continuați" - "Ați atins limita de utilizatori" + "Bine ai revenit în sesiunea pentru invitați!" + "Continui sesiunea?" + "Începe din nou" + "Da, continuă" + "Ai atins limita de utilizatori" - Puteți adăuga maximum %d utilizatori. - Puteți adăuga maximum %d de utilizatori. + Poți adăuga maximum %d utilizatori. + Poți adăuga maximum %d de utilizatori. Poate fi creat doar un utilizator. - "Eliminați utilizatorul?" + "Elimini utilizatorul?" "Toate aplicațiile și datele acestui utilizator vor fi șterse." - "Eliminați" + "Elimină" "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Începeți să înregistrați sau să proiectați?" "Începeți să înregistrați sau să proiectați cu %s?" "Șterge toate notificările" - "Gestionați" + "Gestionează" "Istoric" "Noi" "Silențioase" @@ -369,7 +369,7 @@ "Conversații" "Șterge toate notificările silențioase" "Notificări întrerupte prin „Nu deranja”" - "Începeți acum" + "Începe acum" "Nicio notificare" "Dispozitivul este gestionat de unul dintre părinți" "Organizația dvs. deține acest dispozitiv și poate monitoriza traficul de rețea" @@ -381,8 +381,8 @@ "Acest dispozitiv aparține organizației %1$s" "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin rețele VPN." "Acest dispozitiv aparține organizației %1$s și este conectat la internet prin rețele VPN." - "Este posibil ca organizația dvs. să monitorizeze traficul de rețea în profilul dvs. de serviciu" - "Este posibil ca %1$s să monitorizeze traficul de rețea din profilul dvs. de serviciu" + "E posibil ca organizația ta să monitorizeze traficul de rețea în profilul de serviciu" + "E posibil ca %1$s să monitorizeze traficul de rețea din profilul tău de serviciu" "Adminul IT poate vedea profilul de serviciu" "Este posibil ca rețeaua să fie monitorizată" "Acest dispozitiv este conectat la internet prin rețele VPN." @@ -399,10 +399,10 @@ "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." - "Organizația dvs. a instalat un certificat CA pe acest dispozitiv. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Organizația dvs. a instalat un certificat CA în profilul dvs. de serviciu. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Pe acest dispozitiv este instalat un certificat CA. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs." + "Organizația ta a instalat un certificat CA pe acest dispozitiv. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Organizația ta a instalat un certificat CA în profilul tău de serviciu. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Pe acest dispozitiv este instalat un certificat CA. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Administratorul tău a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul de pe dispozitivul tău." "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul în profilul dvs. de serviciu, dar nu și în profilul personal." "Acest dispozitiv este conectat la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." "Acest dispozitiv este conectat la internet prin aplicațiile %1$s și %2$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." @@ -418,14 +418,14 @@ "Adaugă subtitrări automate la fișierele media" "Sfat pentru subtitrări" "Suprapunere pe subtitrări" - "activați" - "dezactivați" + "activează" + "dezactivează" "Aplicația este fixată" - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea." - "Astfel rămâne afișată până anulați fixarea. Glisați în sus și țineți apăsat pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Acasă pentru a anula fixarea." + "Astfel rămâne afișată până anulați fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Recente" @@ -446,22 +446,22 @@ "Accesibilitate" "Sonerie" "Vibrații" - "Blocați" + "Blochează" "%1$s. Atinge pentru a activa sunetul." "%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." "%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." "%1$s. Atinge pentru a seta pe vibrații." "%1$s. Atinge pentru a dezactiva sunetul." "Atinge pentru a schimba modul soneriei" - "dezactivați sunetul" - "activați sunetul" + "dezactivează sunetul" + "activează sunetul" "vibrații" "Comenzi de volum pentru %s" "Apelurile și notificările vor suna (%1$s)" "System UI Tuner" "Bară de stare" "Mod demonstrativ pentru IU sistem" - "Activați modul demonstrativ" + "Activează modul demonstrativ" "Afișează modul demonstrativ" "Ethernet" "Alarmă" @@ -470,33 +470,33 @@ "Afișează-le pe toate" "Atinge pentru a deschide" "Se actualizează" - "Deblocați pentru a folosi" + "Deblochează pentru a folosi" "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" "Scanați codul QR" "Profil de serviciu" "Mod Avion" - "Nu veți auzi următoarea alarmă %1$s" + "Nu vei auzi următoarea alarmă %1$s" "la %1$s" "%1$s" "Hotspot" "Profil de serviciu" "Distractiv pentru unii, dar nu pentru toată lumea" - "System UI Tuner vă oferă modalități suplimentare de a ajusta și a personaliza interfața de utilizare Android. Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență." - "Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență." + "System UI Tuner oferă modalități suplimentare de a ajusta și a personaliza interfața de utilizare Android. Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuă cu prudență." + "Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuă cu prudență." "Am înțeles" "Felicitări! System UI Tuner a fost adăugat în Setări" - "Eliminați din Setări" - "Eliminați System UI Tuner din Setări și încetați utilizarea tuturor funcțiilor sale?" - "Activați Bluetooth?" - "Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth." - "Activați" + "Elimină din Setări" + "Elimini System UI Tuner din Setări și încetezi utilizarea tuturor funcțiilor sale?" + "Activezi Bluetooth?" + "Pentru a conecta tastatura la tabletă, mai întâi trebuie să activezi Bluetooth." + "Activează" "Comenzi de gestionare a notificărilor" "Activată – În funcție de chip" - "Folosind comenzile de gestionare a notificărilor, puteți să setați un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n""Nivelul 5"" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 4"" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 3"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n""Nivelul 2"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n""Nivelul 1"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n""Nivelul 0"" \n– Se blochează toate notificările din aplicație" + "Folosind comenzile de gestionare a notificărilor, poți seta un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n""Nivelul 5"" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 4"" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 3"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n""Nivelul 2"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n""Nivelul 1"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n""Nivelul 0"" \n– Se blochează toate notificările din aplicație" "Gata" - "Aplicați" - "Dezactivați notificările" + "Aplică" + "Dezactivează notificările" "Silențios" "Prestabilite" "Automat" @@ -529,9 +529,9 @@ "Opțiunile privind notificările pentru %1$s sunt afișate" "Opțiunile privind notificările pentru %1$s nu sunt afișate" "Mai multe setări" - "Personalizați" + "Personalizează" "Afișează balonul" - "Eliminați baloanele" + "Elimină baloanele" "%1$s %2$s" "comenzile notificării" "opțiuni de amânare a notificării" @@ -561,12 +561,12 @@ "Spațiu" "Enter" "Backspace" - "Redați/Întrerupeți" + "Redă/Întrerupe" "Oprește" "Înainte" "Înapoi" - "Derulați înapoi" - "Derulați rapid înainte" + "Derulează înapoi" + "Derulează rapid înainte" "O pagină mai sus" "O pagină mai jos" "Șterge" @@ -575,14 +575,14 @@ "Inserează" "Num Lock" "Tasta numerică %1$s" - "Eliminați atașamentul" + "Elimină atașamentul" "Sistem" "Ecran de pornire" "Recente" "Înapoi" "Notificări" "Comenzi rapide de la tastatură" - "Schimbați aspectul tastaturii" + "Schimbă aspectul tastaturii" "Aplicații" "Asistent" "Browser" @@ -601,7 +601,7 @@ "Economizor de date" "Economizorul de date este activat" "Activat" - "Dezactivați" + "Dezactivează" "Indisponibil" "Dezactivat" "Bară de navigare" @@ -611,7 +611,7 @@ "Clipboard" "Cod de tastă" - "Confirmați rotirea, comutator de la tastatură" + "Confirmă rotirea, comutator de la tastatură" "Niciunul" @@ -628,11 +628,11 @@ "Codul de taste din dreapta" "Pictograma din stânga" "Pictograma din dreapta" - "Țineți apăsat și trageți pentru a adăuga piese" - "Țineți apăsat și trageți pentru a rearanja piesele" - "Trageți aici pentru a elimina" - "Aveți nevoie de cel puțin %1$d carduri" - "Editați" + "Ține apăsat și trage pentru a adăuga carduri" + "Ține apăsat și trage pentru a rearanja cardurile" + "Trage aici pentru a elimina" + "Ai nevoie de cel puțin %1$d carduri" + "Editează" "Oră" "Afișează orele, minutele și secundele" @@ -664,27 +664,27 @@ "alege utilizatorul" "Fără conexiune la internet" "Deschide setările %s." - "Editați ordinea setărilor." + "Editează ordinea setărilor." "Meniul de pornire" "Pagina %1$d din %2$d" "Ecran de blocare" "Telefonul s-a oprit din cauza încălzirii" "Acum telefonul funcționează normal.\nAtinge pentru mai multe informații" - "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosiți aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descărcați/încărcați fișiere mari;\n • folosiți telefonul la temperaturi ridicate." + "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descarci/încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate." "Vezi pașii pentru îngrijire" "Telefonul se încălzește" "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" - "Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." + "Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." "Vezi pașii pentru îngrijire" "Deconectează încărcătorul" - "Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald." + "Există o problemă la încărcarea acestui dispozitiv. Deconectează adaptorul de curent și ai grijă, deoarece cablul poate fi cald." "Vezi pașii pentru îngrijire" "Comanda rapidă din stânga" "Comanda rapidă din dreapta" "Comanda rapidă din stânga și deblochează" "Comanda rapidă din dreapta și deblochează" "Niciuna" - "Lansați %1$s" + "Lansează %1$s" "Alte aplicații" "Cerc" "Plus" @@ -704,7 +704,7 @@ "Aplicația a fost deschisă fără a fi instalată." "Aplicația a fost deschisă fără a fi instalată. Atinge pentru a afla mai multe." "Informații aplicație" - "Accesați browserul" + "Accesează browserul" "Date mobile" "%1$s%2$s" "%1$s, %2$s" @@ -716,18 +716,18 @@ "Funcția Nu deranja a fost activată de o regulă automată sau de o aplicație." "Aplicațiile rulează în fundal" "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" - "Dezactivați datele mobile?" - "Nu veți avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." - "operatorul dvs." - "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu vă pot verifica răspunsul." - "Permiți %1$s să afișeze porțiuni din %2$s?" + "Dezactivezi datele mobile?" + "Nu vei avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." + "operatorul tău" + "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu îți pot verifica răspunsul." + "Permiți ca %1$s să afișeze porțiuni din %2$s?" "- Poate citi informații din %1$s" "- Poate efectua acțiuni în %1$s" "Permite %1$s să afișeze porțiuni din orice aplicație" "Permite" "Refuz" "Atinge pentru a programa Economisirea energiei" - "Porniți dacă este probabil ca bateria să se descarce" + "Pornește dacă e probabil ca bateria să se descarce" "Nu, mulțumesc" "Extrage memoria SysUI" "În uz" @@ -806,8 +806,8 @@ "Cod PIN greșit" "Introdu codul PIN" "Încearcă alt cod PIN" - "Confirmați schimbarea pentru %s" - "Glisați pentru a vedea mai multe" + "Confirmă schimbarea pentru %s" + "Glisează pentru a vedea mai multe" "Se încarcă recomandările" "Media" "Ascundeți comanda media pentru %1$s?" @@ -817,15 +817,15 @@ "Setări" "%1$s de la %2$s se redă în %3$s" "%1$s din %2$s" - "Redați" - "Întrerupeți" + "Redă" + "Întrerupe" "Melodia anterioară" "Melodia următoare" "Se conectează" - "Redați" + "Redă" "Deschide %1$s" - "Redați %1$s de la %2$s în %3$s" - "Redați %1$s în %2$s" + "Redă %1$s de la %2$s în %3$s" + "Redă %1$s în %2$s" "Anulează" "Apropiați-vă pentru a reda pe %1$s" "Mergeți mai aproape de %1$s ca să redați acolo" @@ -839,7 +839,7 @@ "Starea nu se poate încărca" "Eroare, încercați din nou" "Adaugă comenzi" - "Editați comenzile" + "Editează comenzile" "Adaugă ieșiri" "Grup" "S-a selectat un dispozitiv" @@ -906,7 +906,7 @@ "Nicio alarmă setată" "Senzor de amprentă" "Autentificați-vă" - "Accesați dispozitivul" + "Accesează dispozitivul" "Folosiți amprenta ca să deschideți" "Autentificare obligatorie. Atingeți senzorul de amprentă pentru a vă autentifica." "Apel telefonic în desfășurare" @@ -919,14 +919,14 @@ "Nicio rețea disponibilă" "Wi-Fi" "Atingeți o rețea pentru a vă conecta" - "Deblocați pentru a vedea rețelele" + "Deblochează pentru a vedea rețelele" "Se caută rețele…" "Nu s-a realizat conexiunea la rețea" "Deocamdată, Wi-Fi nu se poate conecta automat" "Afișează-le pe toate" "Pentru a schimba rețeaua, deconectați ethernet" "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" - "Dezactivați modul Avion" + "Dezactivează modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" "Adaugă un card" "Nu adăugați un card" @@ -945,8 +945,8 @@ "S-a copiat" "Din %1$s" "Închide textul copiat" - "Editați textul copiat" - "Editați imaginea copiată" + "Editează textul copiat" + "Editează imaginea copiată" "Trimite către un dispozitiv din apropiere" "Atinge pentru a afișa" "Textul a fost copiat" @@ -957,7 +957,7 @@ "Previzualizarea imaginii" "editați" "Adaugă" - "Gestionați utilizatorii" + "Gestionează utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." "Wi‑Fi indisponibil" "Modul Prioritate" -- cgit v1.2.3 From 7c03edc18a0fde7ef351e74719fa6760db4e423e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:23:54 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1e1540f9bff3ef642e6e9234c79c034c1491c5ac --- packages/SystemUI/res/values-ro-ldrtl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-ro-ldrtl/strings.xml b/packages/SystemUI/res/values-ro-ldrtl/strings.xml index e167b41c680c..a7cd33cd21da 100644 --- a/packages/SystemUI/res/values-ro-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-ro-ldrtl/strings.xml @@ -19,5 +19,5 @@ - "Trageți spre stânga pentru a comuta rapid între aplicații" + "Trage spre stânga pentru a comuta rapid între aplicații" -- cgit v1.2.3 From b20963c62933f7a3cc97fe2d7b05d3c8fe491f6c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:25:55 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1a7a0d541ee0af4b2659b23079e4c9e464ec6263 --- .../SystemUI/res-keyguard/values-ro/strings.xml | 48 +++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 6e2f92fa54a5..e52c7b16c90e 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -37,7 +37,7 @@ "Introdu un card SIM." "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." - "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." + "Cardul SIM e dezactivat definitiv.\n Contactează furnizorul de servicii wireless pentru a obține un alt card SIM." "Cardul SIM este blocat." "Cardul SIM este blocat cu codul PUK." "Se deblochează cardul SIM…" @@ -46,7 +46,7 @@ "Zona codului PIN pentru cardul SIM" "Zona codului PUK pentru cardul SIM" "Șterge" - "Dezactivați cardul eSIM" + "Dezactivează cardul eSIM" "Nu se poate dezactiva cardul eSIM" "Cardul eSIM nu poate fi dezactivat din cauza unei erori." "Introdu" @@ -56,32 +56,32 @@ "{count,plural, =1{Reîncearcă peste o secundă.}few{Reîncearcă peste # secunde.}other{Reîncearcă peste # de secunde.}}" "Introdu codul PIN al cardului SIM." "Introdu codul PIN al cardului SIM pentru „%1$s”." - "%1$s Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." - "Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." - "Cardul SIM „%1$s\" este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." + "%1$s Dezactivează cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." + "Cardul SIM e acum dezactivat. Pentru a continua, introdu codul PUK. Pentru detalii, contactează operatorul." + "Cardul SIM „%1$s\" e acum dezactivat. Pentru a continua, introdu codul PUK. Pentru detalii, contactează operatorul." "Introdu codul PIN dorit" - "Confirmați codul PIN dorit" + "Confirmă codul PIN dorit" "Se deblochează cardul SIM…" "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Codul PUK trebuie să aibă minimum 8 cifre." - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Codul PIN pentru cardul SIM este incorect. Contactează operatorul pentru a debloca dispozitivul." - Codul PIN pentru cardul SIM este incorect. V-au mai rămas %d încercări. - Codul PIN pentru cardul SIM este incorect. V-au mai rămas %d de încercări. - Codul PIN pentru cardul SIM este incorect. V-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Codul PIN pentru cardul SIM e incorect. Ți-au mai rămas %d încercări. + Codul PIN pentru cardul SIM e incorect. Ți-au mai rămas %d de încercări. + Codul PIN pentru cardul SIM e incorect. Ți-a mai rămas %d încercare, după care va trebui să contactezi operatorul pentru a debloca dispozitivul. - "Cardul SIM nu poate fi utilizat. Contactați operatorul." + "Cardul SIM nu poate fi utilizat. Contactează operatorul." - Codul PUK pentru cardul SIM este incorect. V-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. - Codul PUK pentru cardul SIM este incorect. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. - Codul PUK pentru cardul SIM este incorect. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. "Deblocarea cu ajutorul codului PIN pentru cardul SIM nu a reușit!" "Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!" - "Comutați metoda de introducere" + "Schimbă metoda de introducere" "Mod Avion" "Modelul este necesar după repornirea dispozitivului" "Codul PIN este necesar după repornirea dispozitivului" @@ -94,14 +94,14 @@ "Nu este recunoscut" "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" - Introduceți codul PIN pentru cardul SIM. V-au mai rămas %d încercări. - Introduceți codul PIN pentru cardul SIM. V-au mai rămas %d de încercări. - Introduceți codul PIN pentru cardul SIM. V-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d încercări. + Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d de încercări. + Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. "Prestabilit" "Balon" -- cgit v1.2.3 From 66f50a153c88166cb8c776ba808f63d965dd1242 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:26:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6995a32a86f5856959fbfad414552d2ee283662f --- .../SystemUI/res-product/values-ro/strings.xml | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index b260f28d8f03..807ebfe03bef 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -27,22 +27,22 @@ "Nu există card SIM în telefon." "Codurile PIN nu coincid" "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." "Ați efectuat %d încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Deblocați telefonul pentru mai multe opțiuni" - "Deblocați tableta pentru mai multe opțiuni" - "Deblocați dispozitivul pentru mai multe opțiuni" + "Deblochează telefonul pentru mai multe opțiuni" + "Deblochează tableta pentru mai multe opțiuni" + "Deblochează dispozitivul pentru mai multe opțiuni" "Se redă pe acest telefon" "Se redă pe această tabletă" -- cgit v1.2.3 From 19bfe2796e22e16dbd2f36b128c477cc9d71d357 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:28:32 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6f6f9b7f1b24d35fb586c46a5e5536bf688cb706 --- packages/SystemUI/res/values-ca/strings.xml | 8 +- packages/SystemUI/res/values-kk/strings.xml | 8 +- packages/SystemUI/res/values-mr/strings.xml | 6 +- packages/SystemUI/res/values-ro/strings.xml | 250 ++++++++++++++-------------- 4 files changed, 136 insertions(+), 136 deletions(-) diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index ff702d641c64..e777795de587 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -251,7 +251,7 @@ "S\'està connectant..." "Punt d\'accés Wi-Fi" "S\'està activant…" - "Economitzador activat" + "Estalvi dades activat" %d dispositius %d dispositiu @@ -593,8 +593,8 @@ "Obre la configuració" "Auriculars connectats" "Auriculars connectats" - "Economitzador de dades" - "L\'Economitzador de dades està activat" + "Estalvi de dades" + "L\'Estalvi de dades està activat" "Activat" "Desactivat" "No disponible" @@ -623,7 +623,7 @@ "Codi de tecla de la dreta" "Icona de l\'esquerra" "Icona de la dreta" - "Mantén premut i arrossega per afegir mosaics" + "Mantén premut i arrossega per afegir icones" "Mantén premut i arrossega per reorganitzar els mosaics" "Arrossega aquí per suprimir" "Necessites com a mínim %1$d mosaics" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index a234570783c8..71f5e76c2d80 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -194,9 +194,9 @@ "Азырақ уақыт." "Экранды трансляциялау тоқтатылды." "Дисплей жарықтығы" - "Мобильдік деректер кідіртілді" + "Мобильдік интернет кідіртілді" "Деректер кідіртілді" - "Белгіленген деректер шегіне жеттіңіз. Мобильдік деректер енді пайдаланылмайды.\n\nЕгер жалғастырсаңыз, деректер трафигі үшін ақы алынуы мүмкін." + "Белгіленген деректер шегіне жеттіңіз. Мобильдік интернет енді пайдаланылмайды.\n\nЕгер жалғастырсаңыз, деректер трафигі үшін ақы алынуы мүмкін." "Жалғастыру" "Орын өтініштері қосылған" "Датчиктер өшірулі." @@ -258,7 +258,7 @@ "Қалта шам" "Камера қолданылып жатыр" - "Мобильдік деректер" + "Мобильдік интернет" "Дерек шығыны" "Қалған деректер" "Шектен асу" @@ -711,7 +711,7 @@ "Мазаламау режимі автоматты ереже немесе қолданба арқылы қосылды." "Фонда жұмыс істеп тұрған қолданбалар" "Батарея мен деректер трафигі туралы білу үшін түртіңіз" - "Мобильдік деректер өшірілсін бе?" + "Мобильдік интернет өшірілсін бе?" "%s операторы арқылы деректерге немесе интернетке кіре алмайсыз. Интернетке тек Wi-Fi арқылы кіресіз." "операторыңыз" "Басқа қолданба рұқсат сұрауын жасырып тұрғандықтан, параметрлер жауабыңызды растай алмайды." diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 188f0b7abaa1..331bb318c70c 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -324,9 +324,9 @@ "हे डिव्हाइस तुमच्या संस्थेचे आहे" "हे डिव्हाइस %s चे आहे" "हे डिव्हाइस %s द्वारे पुरवले गेले आहे" - "फोनसाठी चिन्हावरून स्वाइप करा" - "व्हॉइस सहाय्यासाठी चिन्हावरून स्वाइप करा" - "कॅमेर्‍यासाठी चिन्हावरून स्वाइप करा" + "फोनसाठी आयकनवरून स्वाइप करा" + "व्हॉइस सहाय्यासाठी आयकनवरून स्वाइप करा" + "कॅमेर्‍यासाठी आयकनवरून स्वाइप करा" "संपूर्ण शांतता. हे स्क्रीन रीडर ना देखील शांत करेल." "संपूर्ण शांतता" "केवळ प्राधान्य" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index e6dabc62bebc..a91245d99b49 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -20,28 +20,28 @@ "UI sistem" - "Activați Economisirea bateriei?" + "Activezi Economisirea bateriei?" "Mai aveți %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Procent rămas din baterie: %s" "Nu se poate realiza încărcarea prin USB" - "Folosiți încărcătorul livrat împreună cu dispozitivul" - "Activați economisirea bateriei?" + "Folosește încărcătorul livrat împreună cu dispozitivul" + "Activezi economisirea bateriei?" "Despre Economisirea bateriei" - "Activați" - "Activați" + "Activează" + "Activează" "Nu, mulțumesc" "Rotire automată a ecranului" - "Permiți %1$s să acceseze %2$s?" + "Permiți ca %1$s să acceseze %2$s?" "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Permiți ca %1$s să acceseze %2$s?" - "Deschideți %1$s ca să gestioneze %2$s?" + "Deschizi %1$s ca să gestioneze %2$s?" "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Permiți %1$s să acceseze %2$s?" - "Deschideți %1$s ca să gestioneze %2$s?" - "Deschide %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." - "Deschideți %1$s ca să gestioneze %2$s?" + "Permiți ca %1$s să acceseze %2$s?" + "Deschizi %1$s ca să gestioneze %2$s?" + "Deschizi %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." + "Deschizi %1$s ca să gestioneze %2$s?" "Aplic. instal. nu funcț. cu acest acces. USB. Află despre acest accesoriu la %1$s" "Accesoriu USB" "Afișează" @@ -52,11 +52,11 @@ "Permite întotdeauna de pe acest computer" "Permite" "Remedierea erorilor prin USB nu este permisă" - "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." + "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comută la utilizatorul principal." "Schimbați limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" - "Schimbați limba" - "Păstrați limba actuală" + "Schimbă limba" + "Păstrează limba actuală" "Permiți remedierea erorilor wireless în această rețea?" "Numele rețelei (SSID)\n%1$s\n\nAdresa Wi‑Fi (BSSID)\n%2$s" "Permite întotdeauna în această rețea" @@ -64,9 +64,9 @@ "Remedierea erorilor wireless nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" - "Pentru a vă proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVeți primi o notificare când puteți folosi din nou portul USB." + "Pentru a proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVei primi o notificare când poți folosi din nou portul USB." "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" - "Activați USB" + "Activează USB" "Mai multe" "Captură de ecran" "Smart Lock dezactivat" @@ -75,12 +75,12 @@ "Captură de ecran salvată" "Nu s-a putut salva captura de ecran" "Pentru a salva captura de ecran, trebuie să deblocați dispozitivul" - "Încercați să faceți din nou o captură de ecran" + "Încearcă să faci din nou o captură de ecran" "Nu se poate salva captura de ecran" - "Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs." + "Crearea capturilor de ecran nu e permisă de aplicație sau de organizația ta" "Administratorul IT a blocat crearea capturilor de ecran" - "Editați" - "Editați captura de ecran" + "Editează" + "Editează captura de ecran" "Trimite captura de ecran" "Surprindeți mai mult" "Închide captura de ecran" @@ -113,34 +113,34 @@ "Ecranul de pornire" "Meniu" "Accesibilitate" - "Rotiți ecranul" + "Rotește ecranul" "Recente" "Cameră foto" "Telefon" "Asistent vocal" "Portofel" "Scanner de coduri QR" - "Deblocați" + "Deblochează" "Dispozitiv blocat" "Scanarea chipului" "Trimite" - "deschideți telefonul" - "deschideți asistentul vocal" - "deschideți camera foto" + "deschide telefonul" + "deschide asistentul vocal" + "deschide camera foto" "Anulează" - "Confirmați" + "Confirmă" "Încearcă din nou" "Atinge pentru a anula autentificarea" "Încearcă din nou" "Se caută chipul" "Chip autentificat" "Confirmat" - "Atingeți Confirmați pentru a finaliza" + "Atinge Confirm pentru a finaliza" "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" "Autentificat" - "Folosiți PIN-ul" - "Folosiți modelul" - "Folosiți parola" + "Folosește PIN-ul" + "Folosește modelul" + "Folosește parola" "PIN greșit" "Model greșit" "Parolă greșită" @@ -158,7 +158,7 @@ "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." "Atinge senzorul de amprente" "Pictograma amprentă" - "Chipul nu a fost recunoscut. Folosiți amprenta." + "Chipul nu a fost recunoscut. Folosește amprenta." "Conectat prin Bluetooth." @@ -196,8 +196,8 @@ "Luminozitatea ecranului" "Datele mobile sunt întrerupte" "Conexiunea de date este întreruptă" - "A fost atinsă limita de date setată. Datele mobile nu mai sunt folosite.\n\nDacă reluați, este posibil să se aplice taxe pentru utilizarea datelor." - "Reluați" + "A fost atinsă limita de date setată. Datele mobile nu mai sunt folosite.\n\nDacă reiei, se pot aplica taxe pentru utilizarea datelor." + "Reia" "Solicitări locație active" "Dezactivarea senzorilor este activă" "Șterge toate notificările." @@ -304,15 +304,15 @@ "Cameră foto disponibilă" "Microfon și cameră disponibile" "Alt dispozitiv" - "Comutați secțiunea Recente" - "Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de dvs. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri." - "Se vor anunța prin sunete și vibrații numai alarmele. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri." - "Personalizați" - "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri." + "Comută secțiunea Recente" + "Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de tine. Totuși, vei auzi tot ce alegi să redai, inclusiv muzică, videoclipuri și jocuri." + "Se vor anunța prin sunete și vibrații numai alarmele. Totuși, vei auzi tot ce alegi să redai, inclusiv muzică, videoclipuri și jocuri." + "Personalizează" + "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, vei putea iniția apeluri." "Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor." "Atinge din nou pentru a deschide" "Atinge din nou" - "Glisați în sus pentru a deschide" + "Glisează în sus pentru a deschide" "Apasă pictograma de deblocare pentru a deschide" "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" @@ -321,14 +321,14 @@ "Deplasați spre dreapta" "Deplasați în sus" - "Glisați pentru a încerca din nou" - "Deblocați pentru a folosi NFC" + "Glisează pentru a încerca din nou" + "Deblochează pentru a folosi NFC" "Dispozitivul aparține organizației dvs." "Acest dispozitiv aparține organizației %s" "Acest dispozitiv este oferit de %s" - "Glisați dinspre telefon" - "Glisați dinspre pictogramă pentru asistentul vocal" - "Glisați pentru a fotografia" + "Glisează dinspre telefon" + "Glisează dinspre pictogramă pentru asistentul vocal" + "Glisează pentru a fotografia" "Liniște absolută. Se va opri sunetul și pentru cititoarele de ecran." "Niciun sunet" "Numai cu prioritate" @@ -341,27 +341,27 @@ "%2$s • Se încarcă rapid • %1$s până la încărcarea completă" "%2$s • Se încarcă lent • %1$s până la încărcarea completă" "%2$s • Suport de încărcare • %1$s până la încărcarea completă" - "Comutați între utilizatori" + "Schimbă utilizatorul" "Toate aplicațiile și datele din această sesiune vor fi șterse." - "Bine ați revenit în sesiunea pentru invitați!" - "Vreți să continuați sesiunea?" - "Începeți din nou" - "Da, continuați" - "Ați atins limita de utilizatori" + "Bine ai revenit în sesiunea pentru invitați!" + "Continui sesiunea?" + "Începe din nou" + "Da, continuă" + "Ai atins limita de utilizatori" - Puteți adăuga maximum %d utilizatori. - Puteți adăuga maximum %d de utilizatori. + Poți adăuga maximum %d utilizatori. + Poți adăuga maximum %d de utilizatori. Poate fi creat doar un utilizator. - "Eliminați utilizatorul?" + "Elimini utilizatorul?" "Toate aplicațiile și datele acestui utilizator vor fi șterse." - "Eliminați" + "Elimină" "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." "Începeți să înregistrați sau să proiectați?" "Începeți să înregistrați sau să proiectați cu %s?" "Șterge toate notificările" - "Gestionați" + "Gestionează" "Istoric" "Noi" "Silențioase" @@ -369,7 +369,7 @@ "Conversații" "Șterge toate notificările silențioase" "Notificări întrerupte prin „Nu deranja”" - "Începeți acum" + "Începe acum" "Nicio notificare" "Dispozitivul este gestionat de unul dintre părinți" "Organizația dvs. deține acest dispozitiv și poate monitoriza traficul de rețea" @@ -381,8 +381,8 @@ "Acest dispozitiv aparține organizației %1$s" "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin rețele VPN." "Acest dispozitiv aparține organizației %1$s și este conectat la internet prin rețele VPN." - "Este posibil ca organizația dvs. să monitorizeze traficul de rețea în profilul dvs. de serviciu" - "Este posibil ca %1$s să monitorizeze traficul de rețea din profilul dvs. de serviciu" + "E posibil ca organizația ta să monitorizeze traficul de rețea în profilul de serviciu" + "E posibil ca %1$s să monitorizeze traficul de rețea din profilul tău de serviciu" "Adminul IT poate vedea profilul de serviciu" "Este posibil ca rețeaua să fie monitorizată" "Acest dispozitiv este conectat la internet prin rețele VPN." @@ -399,10 +399,10 @@ "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." - "Organizația dvs. a instalat un certificat CA pe acest dispozitiv. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Organizația dvs. a instalat un certificat CA în profilul dvs. de serviciu. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Pe acest dispozitiv este instalat un certificat CA. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." - "Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs." + "Organizația ta a instalat un certificat CA pe acest dispozitiv. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Organizația ta a instalat un certificat CA în profilul tău de serviciu. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Pe acest dispozitiv este instalat un certificat CA. Traficul de rețea securizat poate fi monitorizat sau modificat." + "Administratorul tău a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul de pe dispozitivul tău." "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul în profilul dvs. de serviciu, dar nu și în profilul personal." "Acest dispozitiv este conectat la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." "Acest dispozitiv este conectat la internet prin aplicațiile %1$s și %2$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." @@ -418,14 +418,14 @@ "Adaugă subtitrări automate la fișierele media" "Sfat pentru subtitrări" "Suprapunere pe subtitrări" - "activați" - "dezactivați" + "activează" + "dezactivează" "Aplicația este fixată" - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea." - "Astfel rămâne afișată până anulați fixarea. Glisați în sus și țineți apăsat pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." - "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Acasă pentru a anula fixarea." + "Astfel rămâne afișată până anulați fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Recente" @@ -446,22 +446,22 @@ "Accesibilitate" "Sonerie" "Vibrații" - "Blocați" + "Blochează" "%1$s. Atinge pentru a activa sunetul." "%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate." "%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate." "%1$s. Atinge pentru a seta pe vibrații." "%1$s. Atinge pentru a dezactiva sunetul." "Atinge pentru a schimba modul soneriei" - "dezactivați sunetul" - "activați sunetul" + "dezactivează sunetul" + "activează sunetul" "vibrații" "Comenzi de volum pentru %s" "Apelurile și notificările vor suna (%1$s)" "System UI Tuner" "Bară de stare" "Mod demonstrativ pentru IU sistem" - "Activați modul demonstrativ" + "Activează modul demonstrativ" "Afișează modul demonstrativ" "Ethernet" "Alarmă" @@ -470,33 +470,33 @@ "Afișează-le pe toate" "Atinge pentru a deschide" "Se actualizează" - "Deblocați pentru a folosi" + "Deblochează pentru a folosi" "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" "Scanați codul QR" "Profil de serviciu" "Mod Avion" - "Nu veți auzi următoarea alarmă %1$s" + "Nu vei auzi următoarea alarmă %1$s" "la %1$s" "%1$s" "Hotspot" "Profil de serviciu" "Distractiv pentru unii, dar nu pentru toată lumea" - "System UI Tuner vă oferă modalități suplimentare de a ajusta și a personaliza interfața de utilizare Android. Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență." - "Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență." + "System UI Tuner oferă modalități suplimentare de a ajusta și a personaliza interfața de utilizare Android. Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuă cu prudență." + "Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuă cu prudență." "Am înțeles" "Felicitări! System UI Tuner a fost adăugat în Setări" - "Eliminați din Setări" - "Eliminați System UI Tuner din Setări și încetați utilizarea tuturor funcțiilor sale?" - "Activați Bluetooth?" - "Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth." - "Activați" + "Elimină din Setări" + "Elimini System UI Tuner din Setări și încetezi utilizarea tuturor funcțiilor sale?" + "Activezi Bluetooth?" + "Pentru a conecta tastatura la tabletă, mai întâi trebuie să activezi Bluetooth." + "Activează" "Comenzi de gestionare a notificărilor" "Activată – În funcție de chip" - "Folosind comenzile de gestionare a notificărilor, puteți să setați un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n""Nivelul 5"" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 4"" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 3"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n""Nivelul 2"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n""Nivelul 1"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n""Nivelul 0"" \n– Se blochează toate notificările din aplicație" + "Folosind comenzile de gestionare a notificărilor, poți seta un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n""Nivelul 5"" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 4"" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n""Nivelul 3"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n""Nivelul 2"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n""Nivelul 1"" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n""Nivelul 0"" \n– Se blochează toate notificările din aplicație" "Gata" - "Aplicați" - "Dezactivați notificările" + "Aplică" + "Dezactivează notificările" "Silențios" "Prestabilite" "Automat" @@ -529,9 +529,9 @@ "Opțiunile privind notificările pentru %1$s sunt afișate" "Opțiunile privind notificările pentru %1$s nu sunt afișate" "Mai multe setări" - "Personalizați" + "Personalizează" "Afișează balonul" - "Eliminați baloanele" + "Elimină baloanele" "%1$s %2$s" "comenzile notificării" "opțiuni de amânare a notificării" @@ -561,12 +561,12 @@ "Spațiu" "Enter" "Backspace" - "Redați/Întrerupeți" + "Redă/Întrerupe" "Oprește" "Înainte" "Înapoi" - "Derulați înapoi" - "Derulați rapid înainte" + "Derulează înapoi" + "Derulează rapid înainte" "O pagină mai sus" "O pagină mai jos" "Șterge" @@ -575,14 +575,14 @@ "Inserează" "Num Lock" "Tasta numerică %1$s" - "Eliminați atașamentul" + "Elimină atașamentul" "Sistem" "Ecran de pornire" "Recente" "Înapoi" "Notificări" "Comenzi rapide de la tastatură" - "Schimbați aspectul tastaturii" + "Schimbă aspectul tastaturii" "Aplicații" "Asistent" "Browser" @@ -601,7 +601,7 @@ "Economizor de date" "Economizorul de date este activat" "Activat" - "Dezactivați" + "Dezactivează" "Indisponibil" "Dezactivat" "Bară de navigare" @@ -611,7 +611,7 @@ "Clipboard" "Cod de tastă" - "Confirmați rotirea, comutator de la tastatură" + "Confirmă rotirea, comutator de la tastatură" "Niciunul" @@ -628,11 +628,11 @@ "Codul de taste din dreapta" "Pictograma din stânga" "Pictograma din dreapta" - "Țineți apăsat și trageți pentru a adăuga piese" - "Țineți apăsat și trageți pentru a rearanja piesele" - "Trageți aici pentru a elimina" - "Aveți nevoie de cel puțin %1$d carduri" - "Editați" + "Ține apăsat și trage pentru a adăuga carduri" + "Ține apăsat și trage pentru a rearanja cardurile" + "Trage aici pentru a elimina" + "Ai nevoie de cel puțin %1$d carduri" + "Editează" "Oră" "Afișează orele, minutele și secundele" @@ -664,27 +664,27 @@ "alege utilizatorul" "Fără conexiune la internet" "Deschide setările %s." - "Editați ordinea setărilor." + "Editează ordinea setărilor." "Meniul de pornire" "Pagina %1$d din %2$d" "Ecran de blocare" "Telefonul s-a oprit din cauza încălzirii" "Acum telefonul funcționează normal.\nAtinge pentru mai multe informații" - "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosiți aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descărcați/încărcați fișiere mari;\n • folosiți telefonul la temperaturi ridicate." + "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descarci/încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate." "Vezi pașii pentru îngrijire" "Telefonul se încălzește" "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" - "Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." + "Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." "Vezi pașii pentru îngrijire" "Deconectează încărcătorul" - "Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald." + "Există o problemă la încărcarea acestui dispozitiv. Deconectează adaptorul de curent și ai grijă, deoarece cablul poate fi cald." "Vezi pașii pentru îngrijire" "Comanda rapidă din stânga" "Comanda rapidă din dreapta" "Comanda rapidă din stânga și deblochează" "Comanda rapidă din dreapta și deblochează" "Niciuna" - "Lansați %1$s" + "Lansează %1$s" "Alte aplicații" "Cerc" "Plus" @@ -704,7 +704,7 @@ "Aplicația a fost deschisă fără a fi instalată." "Aplicația a fost deschisă fără a fi instalată. Atinge pentru a afla mai multe." "Informații aplicație" - "Accesați browserul" + "Accesează browserul" "Date mobile" "%1$s%2$s" "%1$s, %2$s" @@ -716,18 +716,18 @@ "Funcția Nu deranja a fost activată de o regulă automată sau de o aplicație." "Aplicațiile rulează în fundal" "Atinge pentru mai multe detalii privind bateria și utilizarea datelor" - "Dezactivați datele mobile?" - "Nu veți avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." - "operatorul dvs." - "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu vă pot verifica răspunsul." - "Permiți %1$s să afișeze porțiuni din %2$s?" + "Dezactivezi datele mobile?" + "Nu vei avea acces la date sau la internet prin intermediul %s. Internetul va fi disponibil numai prin Wi-Fi." + "operatorul tău" + "Deoarece o aplicație acoperă o solicitare de permisiune, Setările nu îți pot verifica răspunsul." + "Permiți ca %1$s să afișeze porțiuni din %2$s?" "- Poate citi informații din %1$s" "- Poate efectua acțiuni în %1$s" "Permite %1$s să afișeze porțiuni din orice aplicație" "Permite" "Refuz" "Atinge pentru a programa Economisirea energiei" - "Porniți dacă este probabil ca bateria să se descarce" + "Pornește dacă e probabil ca bateria să se descarce" "Nu, mulțumesc" "Extrage memoria SysUI" "În uz" @@ -806,8 +806,8 @@ "Cod PIN greșit" "Introdu codul PIN" "Încearcă alt cod PIN" - "Confirmați schimbarea pentru %s" - "Glisați pentru a vedea mai multe" + "Confirmă schimbarea pentru %s" + "Glisează pentru a vedea mai multe" "Se încarcă recomandările" "Media" "Ascundeți comanda media pentru %1$s?" @@ -817,15 +817,15 @@ "Setări" "%1$s de la %2$s se redă în %3$s" "%1$s din %2$s" - "Redați" - "Întrerupeți" + "Redă" + "Întrerupe" "Melodia anterioară" "Melodia următoare" "Se conectează" - "Redați" + "Redă" "Deschide %1$s" - "Redați %1$s de la %2$s în %3$s" - "Redați %1$s în %2$s" + "Redă %1$s de la %2$s în %3$s" + "Redă %1$s în %2$s" "Anulează" "Apropiați-vă pentru a reda pe %1$s" "Mergeți mai aproape de %1$s ca să redați acolo" @@ -839,7 +839,7 @@ "Starea nu se poate încărca" "Eroare, încercați din nou" "Adaugă comenzi" - "Editați comenzile" + "Editează comenzile" "Adaugă ieșiri" "Grup" "S-a selectat un dispozitiv" @@ -906,7 +906,7 @@ "Nicio alarmă setată" "Senzor de amprentă" "Autentificați-vă" - "Accesați dispozitivul" + "Accesează dispozitivul" "Folosiți amprenta ca să deschideți" "Autentificare obligatorie. Atingeți senzorul de amprentă pentru a vă autentifica." "Apel telefonic în desfășurare" @@ -919,14 +919,14 @@ "Nicio rețea disponibilă" "Wi-Fi" "Atingeți o rețea pentru a vă conecta" - "Deblocați pentru a vedea rețelele" + "Deblochează pentru a vedea rețelele" "Se caută rețele…" "Nu s-a realizat conexiunea la rețea" "Deocamdată, Wi-Fi nu se poate conecta automat" "Afișează-le pe toate" "Pentru a schimba rețeaua, deconectați ethernet" "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" - "Dezactivați modul Avion" + "Dezactivează modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" "Adaugă un card" "Nu adăugați un card" @@ -945,8 +945,8 @@ "S-a copiat" "Din %1$s" "Închide textul copiat" - "Editați textul copiat" - "Editați imaginea copiată" + "Editează textul copiat" + "Editează imaginea copiată" "Trimite către un dispozitiv din apropiere" "Atinge pentru a afișa" "Textul a fost copiat" @@ -957,7 +957,7 @@ "Previzualizarea imaginii" "editați" "Adaugă" - "Gestionați utilizatorii" + "Gestionează utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." "Wi‑Fi indisponibil" "Modul Prioritate" -- cgit v1.2.3 From 0265f400e659a4555b457ead6527e8c135d4476f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:38:14 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I472e2dcabfb0ffff37be108007eec96bbf583713 --- packages/SystemUI/res/values-ro-ldrtl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-ro-ldrtl/strings.xml b/packages/SystemUI/res/values-ro-ldrtl/strings.xml index e167b41c680c..a7cd33cd21da 100644 --- a/packages/SystemUI/res/values-ro-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-ro-ldrtl/strings.xml @@ -19,5 +19,5 @@ - "Trageți spre stânga pentru a comuta rapid între aplicații" + "Trage spre stânga pentru a comuta rapid între aplicații" -- cgit v1.2.3 From b5088189b0fc69878d0627a2b57b4c53962d2115 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:43:59 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I925bb154caa78bf0d84826a71d30db2e4b425f0b --- .../SystemUI/res-keyguard/values-ro/strings.xml | 48 +++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 6e2f92fa54a5..e52c7b16c90e 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -37,7 +37,7 @@ "Introdu un card SIM." "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." - "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." + "Cardul SIM e dezactivat definitiv.\n Contactează furnizorul de servicii wireless pentru a obține un alt card SIM." "Cardul SIM este blocat." "Cardul SIM este blocat cu codul PUK." "Se deblochează cardul SIM…" @@ -46,7 +46,7 @@ "Zona codului PIN pentru cardul SIM" "Zona codului PUK pentru cardul SIM" "Șterge" - "Dezactivați cardul eSIM" + "Dezactivează cardul eSIM" "Nu se poate dezactiva cardul eSIM" "Cardul eSIM nu poate fi dezactivat din cauza unei erori." "Introdu" @@ -56,32 +56,32 @@ "{count,plural, =1{Reîncearcă peste o secundă.}few{Reîncearcă peste # secunde.}other{Reîncearcă peste # de secunde.}}" "Introdu codul PIN al cardului SIM." "Introdu codul PIN al cardului SIM pentru „%1$s”." - "%1$s Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." - "Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." - "Cardul SIM „%1$s\" este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul." + "%1$s Dezactivează cardul eSIM pentru a folosi dispozitivul fără serviciu mobil." + "Cardul SIM e acum dezactivat. Pentru a continua, introdu codul PUK. Pentru detalii, contactează operatorul." + "Cardul SIM „%1$s\" e acum dezactivat. Pentru a continua, introdu codul PUK. Pentru detalii, contactează operatorul." "Introdu codul PIN dorit" - "Confirmați codul PIN dorit" + "Confirmă codul PIN dorit" "Se deblochează cardul SIM…" "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Codul PUK trebuie să aibă minimum 8 cifre." - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Codul PIN pentru cardul SIM este incorect. Contactează operatorul pentru a debloca dispozitivul." - Codul PIN pentru cardul SIM este incorect. V-au mai rămas %d încercări. - Codul PIN pentru cardul SIM este incorect. V-au mai rămas %d de încercări. - Codul PIN pentru cardul SIM este incorect. V-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Codul PIN pentru cardul SIM e incorect. Ți-au mai rămas %d încercări. + Codul PIN pentru cardul SIM e incorect. Ți-au mai rămas %d de încercări. + Codul PIN pentru cardul SIM e incorect. Ți-a mai rămas %d încercare, după care va trebui să contactezi operatorul pentru a debloca dispozitivul. - "Cardul SIM nu poate fi utilizat. Contactați operatorul." + "Cardul SIM nu poate fi utilizat. Contactează operatorul." - Codul PUK pentru cardul SIM este incorect. V-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. - Codul PUK pentru cardul SIM este incorect. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. - Codul PUK pentru cardul SIM este incorect. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. + Codul PUK pentru cardul SIM e incorect. Ți-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. "Deblocarea cu ajutorul codului PIN pentru cardul SIM nu a reușit!" "Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!" - "Comutați metoda de introducere" + "Schimbă metoda de introducere" "Mod Avion" "Modelul este necesar după repornirea dispozitivului" "Codul PIN este necesar după repornirea dispozitivului" @@ -94,14 +94,14 @@ "Nu este recunoscut" "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" - Introduceți codul PIN pentru cardul SIM. V-au mai rămas %d încercări. - Introduceți codul PIN pentru cardul SIM. V-au mai rămas %d de încercări. - Introduceți codul PIN pentru cardul SIM. V-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d încercări. + Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d de încercări. + Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. - Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. + Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. "Prestabilit" "Balon" -- cgit v1.2.3 From f559752b91f440f210aa407a0e2432a93d38b3c2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 23 Sep 2022 05:47:15 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic4f1944460b81546835172b6c92416bbadf402ea --- .../SystemUI/res-product/values-ro/strings.xml | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index b260f28d8f03..807ebfe03bef 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -27,22 +27,22 @@ "Nu există card SIM în telefon." "Codurile PIN nu coincid" "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." "Ați efectuat %d încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Deblocați telefonul pentru mai multe opțiuni" - "Deblocați tableta pentru mai multe opțiuni" - "Deblocați dispozitivul pentru mai multe opțiuni" + "Deblochează telefonul pentru mai multe opțiuni" + "Deblochează tableta pentru mai multe opțiuni" + "Deblochează dispozitivul pentru mai multe opțiuni" "Se redă pe acest telefon" "Se redă pe această tabletă" -- cgit v1.2.3 From 24473590373902db492de502c7c557ef5ead485f Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Mon, 26 Sep 2022 21:35:26 +0800 Subject: [DO NOT MERGE] Fix permanent denial of service via setComponentEnabledSetting Do not update invalid component enabled settings to prevent the malicious apps from exhausting system server memory. Bug: 240936919 Test: atest android.security.cts.PackageManagerTest Change-Id: I08165337895e89f13a2b9fcce1201cba9ad13d7d --- services/core/java/com/android/server/pm/PackageManagerService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9836679c1dee..139d44928d91 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24036,6 +24036,9 @@ public class PackageManagerService extends IPackageManager.Stub } else { Slog.w(TAG, "Failed setComponentEnabledSetting: component class " + className + " does not exist in " + packageName); + // Safetynet logging for b/240936919 + EventLog.writeEvent(0x534e4554, "240936919", callingUid); + return; } } switch (newState) { -- cgit v1.2.3 From 006bb7107e7a88df7dfb6049f97bae57ac78b364 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Mon, 26 Sep 2022 21:35:26 +0800 Subject: [DO NOT MERGE] Fix permanent denial of service via setComponentEnabledSetting Do not update invalid component enabled settings to prevent the malicious apps from exhausting system server memory. Bug: 240936919 Test: atest android.security.cts.PackageManagerTest Change-Id: I08165337895e89f13a2b9fcce1201cba9ad13d7d --- services/core/java/com/android/server/pm/PackageManagerService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0397d3edd2b1..12e594716410 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24162,6 +24162,9 @@ public class PackageManagerService extends IPackageManager.Stub } else { Slog.w(TAG, "Failed setComponentEnabledSetting: component class " + className + " does not exist in " + packageName); + // Safetynet logging for b/240936919 + EventLog.writeEvent(0x534e4554, "240936919", callingUid); + return; } } switch (newState) { -- cgit v1.2.3 From 5e98f267592775a2b886ccaa752377d6967f9741 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Mon, 26 Sep 2022 21:35:26 +0800 Subject: [DO NOT MERGE] Fix permanent denial of service via setComponentEnabledSetting Do not update invalid component enabled settings to prevent the malicious apps from exhausting system server memory. Bug: 240936919 Test: atest android.security.cts.PackageManagerTest Change-Id: I08165337895e89f13a2b9fcce1201cba9ad13d7d --- services/core/java/com/android/server/pm/PackageManagerService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 93c83f7ad7cd..12961584b740 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21116,6 +21116,9 @@ public class PackageManagerService extends IPackageManager.Stub } else { Slog.w(TAG, "Failed setComponentEnabledSetting: component class " + className + " does not exist in " + packageName); + // Safetynet logging for b/240936919 + EventLog.writeEvent(0x534e4554, "240936919", callingUid); + return; } } switch (newState) { -- cgit v1.2.3 From 4d13148a3fa5f6bc1b7038fae7d1f1adda163a9f Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Mon, 26 Sep 2022 21:35:26 +0800 Subject: [DO NOT MERGE] Fix permanent denial of service via setComponentEnabledSetting Do not update invalid component enabled settings to prevent the malicious apps from exhausting system server memory. Bug: 240936919 Test: atest android.security.cts.PackageManagerTest Change-Id: I08165337895e89f13a2b9fcce1201cba9ad13d7d --- services/core/java/com/android/server/pm/PackageManagerService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 28f1d7900107..6b06de3da929 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21485,6 +21485,9 @@ public class PackageManagerService extends IPackageManager.Stub } else { Slog.w(TAG, "Failed setComponentEnabledSetting: component class " + className + " does not exist in " + packageName); + // Safetynet logging for b/240936919 + EventLog.writeEvent(0x534e4554, "240936919", callingUid); + return; } } switch (newState) { -- cgit v1.2.3 From 47d70626dec4c8c8b50d358bd2bbf913f981bc3d Mon Sep 17 00:00:00 2001 From: Stephanie Bak Date: Wed, 10 Aug 2022 04:30:42 +0000 Subject: Use message ID from proto for BT APM notification Bug: 249590939 Bug: 239983569 Test: atest ServiceBluetoothTests Change-Id: I109ea5b7703dbffd01b22ed1c8867a8c96b7c002 Merged-In: I109ea5b7703dbffd01b22ed1c8867a8c96b7c002 (cherry picked from commit 6a6bfaeb0479b30c0dc33e10dda5ae672c49c915) --- proto/src/system_messages.proto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto index dfa34bb50805..b87773bbe0b2 100644 --- a/proto/src/system_messages.proto +++ b/proto/src/system_messages.proto @@ -290,6 +290,10 @@ message SystemMessage { // Package: android NOTE_REVIEW_NOTIFICATION_PERMISSIONS = 71; + // Inform the user of bluetooth apm state changes. + // Package: android + NOTE_BT_APM_NOTIFICATION = 74; + // ADD_NEW_IDS_ABOVE_THIS_LINE // Legacy IDs with arbitrary values appear below // Legacy IDs existed as stable non-conflicting constants prior to the O release -- cgit v1.2.3 From 14a5cf1a2ccc187e6fc3dff2b1a98e8525ab7bd4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 10:37:03 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I818bded8659afcc502d886213bd7e40541587df5 --- core/res/res/values-be/strings.xml | 2 +- core/res/res/values-da/strings.xml | 8 +- core/res/res/values-et/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 12 +- core/res/res/values-gl/strings.xml | 4 +- core/res/res/values-iw/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 4 +- core/res/res/values-pt-rPT/strings.xml | 2 +- core/res/res/values-ro/strings.xml | 450 ++++++++++++++++----------------- core/res/res/values-sw/strings.xml | 8 +- core/res/res/values-vi/strings.xml | 4 +- 11 files changed, 249 insertions(+), 249 deletions(-) diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 3daea4b6896d..9b33e31c058e 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -195,7 +195,7 @@ "Ваша арганізацыя кіруе гэтай прыладай і можа сачыць за сеткавым трафікам. Дакраніцеся для атрымання дадатковай інфармацыі." "Праграмы могуць атрымліваць даныя пра ваша месцазнаходжанне" "Каб даведацца больш, звярніцеся да ІТ-адміністратара" - "Служба вызначэння геаперыметра" + "Сэрвіс геазаніравання" "Дэтэктар краіны" "Служба геалакацыі" "Служба GNSS" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index bea4410f0dcf..a4f910172f09 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1940,11 +1940,11 @@ "Tabletindstillingerne er ikke tilgængelige" "Telefonindstillingerne er ikke tilgængelige" "Du har ikke adgang til denne app på din %1$s. Prøv på din Android TV-enhed i stedet." - "Du har ikke adgang til denne app på din %1$s. Prøv på din tablet i stedet." - "Du har ikke adgang til denne app på din %1$s. Prøv på din telefon i stedet." - "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din Android TV-enhed i stedet." + "Dette er ikke tilgængeligt på din %1$s. Prøv på din tablet i stedet." + "Dette er ikke tilgængeligt på din %1$s. Prøv på din telefon i stedet." + "Dette er ikke tilgængeligt på din %1$s på nuværende tidspunkt. Prøv på din Android TV-enhed i stedet." "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din tablet i stedet." - "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din telefon i stedet." + "Dette er ikke tilgængeligt på din %1$s på nuværende tidspunkt. Prøv på din telefon i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din Android TV-enhed i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din tablet i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din telefon i stedet." diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 8a8708c79afc..4044249ba1d6 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2279,7 +2279,7 @@ "Rakendus %1$s töötab taustal. Puudutage akukasutuse haldamiseks." "%1$s võib aku tööiga mõjutada. Puudutage aktiivsete rakenduste ülevaatamiseks." "Vaadake aktiivseid rakendusi" - "Teie seadmest %1$s ei pääse telefoni kaamerale juurde" + "Teie seadmest %1$s ei pääse telefoni kaamerale juurde." "Teie seadmest %1$s ei pääse tahvelarvuti kaamerale juurde" "Süsteemi vaikeseade" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 56ec3bca1df6..d6ced6927ed3 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -56,7 +56,7 @@ "IMEIa" "MEID" - "Sarrerako deien identifikazio-zerbitzua" + "Deitzailearen identitatea (jasotako deiak)" "Ezkutatu irteerako deitzailearen identitatea" "Konektatutako linearen IDa" "Konektatutako linearen ID murriztapena" @@ -71,12 +71,12 @@ "Nahigabeko dei gogaikarriak ukatzea" "Deitzailearen zenbakia ematea" "Ez molestatzeko modua" - "Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenekin" - "Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenik gabe" - "Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenekin" - "Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenik gabe" + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenekin" + "Deitzailearen identitatea adierazteko zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenik gabe." + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenekin." + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenik gabe." "Zerbitzua ez da hornitu." - "Ezin duzu deien identifikazio-zerbitzuaren ezarpena aldatu." + "Ezin duzu aldatu deitzailearen identitatearen ezarpena." "Ez dago mugikorreko datu-zerbitzurik" "Ezin da egin larrialdi-deirik" "Ez dago ahots-deien zerbitzurik" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index c248c760dcf2..1963dd55c655 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -213,7 +213,7 @@ "Opcións da tableta" "Opcións de Android TV" "Opcións do teléfono" - "Modo de silencio" + "Modo silencioso" "Activar a conexión sen fíos" "Desactivar a conexión sen fíos" "Bloqueo de pantalla" @@ -257,7 +257,7 @@ "{count,plural, =1{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundo.}other{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundos.}}" "Realizouse a captura de pantalla co informe de erros" "Produciuse un erro ao realizar a captura de pantalla co informe de erros" - "Modo de silencio" + "Modo silencioso" "O son está desactivado" "O son está activado" "Modo avión" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 5b43fe921666..757fb9e1a424 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1946,7 +1946,7 @@ "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s. במקום זאת, יש לנסות בטלפון." "‏אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות במכשיר Android TV." "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות בטאבלט." - "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות בטלפון." + "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, אפשר לנסות בטלפון." "‏האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות במכשיר Android TV." "האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות בטאבלט." "האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות בטלפון." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 9e1b3f0612fb..8a3ef03361a8 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1156,8 +1156,8 @@ "취소" "주의" "로드 중.." - "ON" - "OFF" + "사용 설정" + "사용 안함" "선택함" "선택 안함" "선택됨" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c170d1c8fe15..25010a3df4e8 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -186,7 +186,7 @@ "Pelo gestor do seu perfil de trabalho" "Por %s" "Perfil de trabalho eliminado" - "A app de administração do perfil de trabalho está em falta ou danificada. Consequentemente, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o gestor para obter assistência." + "A app de administração do perfil de trabalho está em falta ou danificada. Por isso, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o gestor para obter assistência." "O seu perfil de trabalho já não está disponível neste dispositivo" "Demasiadas tentativas de introdução da palavra-passe" "O administrador anulou o dispositivo para utilização pessoal." diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 7a0c6cb3b80f..b8d8f648dff0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -44,16 +44,16 @@ "MMI finalizat." "Codul PIN vechi introdus nu este corect." "Codul PUK introdus nu este corect." - "Codurile PIN introduse nu se potrivesc." + "PIN-urile introduse nu sunt identice." "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Introdu un cod PUK care să aibă 8 cifre sau mai mult." "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." "Introdu codul PUK2 pentru a debloca cardul SIM." "Operațiunea nu a reușit. Activează blocarea cardului SIM/RUIM." - V-au mai rămas %d încercări până la blocarea cardului SIM. - V-au mai rămas %d de încercări până la blocarea cardului SIM. - V-a mai rămas %d încercare până la blocarea cardului SIM. + Ți-au mai rămas %d încercări până la blocarea cardului SIM. + Ți-au mai rămas %d de încercări până la blocarea cardului SIM. + Ți-a mai rămas %d încercare până la blocarea cardului SIM. "IMEI" "MEID" @@ -85,9 +85,9 @@ "Dezactivat temporar de operator" "Dezactivat temporar de operator pentru numărul de card SIM %d" "Nu se poate stabili conexiunea la rețeaua mobilă" - "Încercați să schimbați rețeaua preferată. Atingeți pentru a schimba." + "Încearcă să schimbi rețeaua preferată. Atinge pentru a schimba." "Apelurile de urgență nu sunt disponibile" - "Nu puteți efectua apeluri de urgență prin Wi-Fi" + "Nu poți face apeluri de urgență prin Wi-Fi" "Alerte" "Redirecționarea apelurilor" "Mod de apelare inversă de urgență" @@ -128,7 +128,7 @@ "Pentru a face apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicită configurarea acestui serviciu la operator. Apoi, activează din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" - "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: %1$s" + "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul tău: %1$s" @@ -145,7 +145,7 @@ "VoWifi" "Dezactivată" "Apelează prin Wi-Fi" - "Apelați prin rețeaua mobilă" + "Sună prin rețeaua mobilă" "Numai Wi-Fi" @@ -176,7 +176,7 @@ "Eroare de conectare pentru %1$s" "Sincronizare" "Nu se poate sincroniza" - "Ați încercat să ștergeți prea multe %s." + "Ai încercat să ștergi prea multe %s." "Stocarea pe tabletă este plină. Șterge câteva fișiere pentru a elibera spațiu." "Spațiul de stocare de pe ceas este plin! Șterge câteva fișiere pentru a elibera spațiu." "Spațiul de stocare de pe dispozitivul Android TV este plin. Șterge câteva fișiere pentru a elibera spațiu." @@ -186,13 +186,13 @@ "De administratorul profilului de serviciu" "De %s" "Profilul de serviciu a fost șters" - "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul." + "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactează administratorul." "Profilul de serviciu nu mai este disponibil pe acest dispozitiv" "Prea multe încercări de introducere a parolei" "Administratorul a retras dispozitivul pentru uz personal" "Dispozitivul este gestionat" - "Organizația dvs. gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atingeți pentru mai multe detalii." - "Aplicațiile vă pot accesa locația" + "Organizația ta gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atinge pentru mai multe detalii." + "Aplicațiile îți pot accesa locația" "Contactează administratorul IT pentru a afla mai multe" "Serviciul de delimitare geografică" "Detector de țară" @@ -204,10 +204,10 @@ "Serviciul Manager de politici pentru dispozitive" "Serviciu de gestionare a recunoașterii de melodii" "Datele de pe dispozitiv vor fi șterse" - "Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs." + "Aplicația de administrare nu poate fi folosită. Dispozitivul va fi șters.\n\nDacă ai întrebări, contactează administratorul organizației." "Printare dezactivată de %s." "Activează profilul de serviciu" - "Aplicațiile personale sunt blocate până când activați profilul de serviciu" + "Aplicațiile personale sunt blocate până când activezi profilul de serviciu" "Aplicațiile personale vor fi blocate pe %1$s, la %2$s. Administratorul IT nu permite ca profilul de serviciu să fie dezactivat mai mult de %3$d zile." "Activează" "Eu" @@ -229,11 +229,11 @@ "Revenire la setările din fabrică" "Se repornește…" "Se închide..." - "Computerul dvs. tablet PC se va închide." + "Tableta se va închide." "Dispozitivul Android TV se va închide." - "Ceasul dvs. se va închide." - "Telefonul dvs. se va închide." - "Doriți să închideți?" + "Ceasul se va închide." + "Telefonul se va închide." + "Vrei să închizi?" "Repornește în modul sigur" "Repornești în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte instalate. Acestea vor fi restabilite când repornești dispozitivul." "Recente" @@ -250,7 +250,7 @@ "Încheie sesiunea" "Instantaneu" "Raport de eroare" - "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis." + "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Ai răbdare după pornirea raportului despre erori până când va fi gata de trimis." "Raport interactiv" "Folosește această opțiune în majoritatea situațiilor. Astfel, poți să urmărești progresul raportului, să introduci mai multe detalii în privința problemei și să creezi capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." "Raport complet" @@ -296,16 +296,16 @@ "%1$s, %2$s" "Mod sigur" "Sistemul Android" - "Comutați la profilul personal" - "Comutați la profilul de serviciu" + "Comută la profilul personal" + "Comută la profilul de serviciu" "Agendă" "să acceseze agenda" "Locație" "să acceseze locația acestui dispozitiv" "Calendar" - "acceseze calendarul" + "să acceseze calendarul" "SMS" - "trimită și să vadă mesajele SMS" + "să trimită și să vadă mesajele SMS" "Fișiere" "să acceseze fișiere de pe dispozitiv" "Muzică și conținut audio" @@ -319,7 +319,7 @@ "Camera foto" "fotografieze și să înregistreze videoclipuri" "Dispozitive din apropiere" - "descoperiți dispozitive din apropiere și conectați-vă la acestea" + "descoperă dispozitive din apropiere și conectează-te la acestea" "Jurnale de apeluri" "să citească și să scrie jurnalul de apeluri telefonice" "Telefon" @@ -328,19 +328,19 @@ "să acceseze datele de la senzori despre semnele vitale" "Notificări" "să afișeze notificări" - "Analizeze conținutul ferestrei" - "Inspectează conținutul unei ferestre cu care interacționați." + "să preia conținutul ferestrei" + "Inspectează conținutul unei ferestre cu care interacționezi." "să activeze funcția Explorează prin atingere" "Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi." - "Remarce textul pe care îl introduceți" - "Include date personale, cum ar fi numere ale cardurilor de credit sau parole." + "să vadă textul pe care îl introduci" + "Include date cu caracter personal, cum ar fi numere ale cardurilor de credit sau parole." "Controlează mărirea pe afișaj" "Controlează nivelul de zoom și poziționarea afișajului." "Folosește gesturi" "Poate atinge, glisa, ciupi sau folosi alte gesturi." - "Redea gesturi ce implică amprente" + "să redea gesturi ce implică amprente" "Poate reda gesturile făcute pe senzorul de amprentă al dispozitivului." - "Faceți o captură de ecran" + "Fă o captură de ecran" "Poate face o captură de ecran." "dezactivare sau modificare bare de stare" "Permite aplicației să dezactiveze bara de stare sau să adauge și să elimine pictograme de sistem." @@ -359,11 +359,11 @@ "să răspundă la apeluri telefonice" "Permite aplicației să răspundă la un apel telefonic." "primește mesaje text (SMS)" - "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "primește mesaje text (MMS)" "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "Redirecționează mesajele cu transmisie celulară" - "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." + "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a te avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului când e primită o transmisie celulară de urgență." "Să gestioneze apelurile în desfășurare" "Permite unei aplicații să vadă detalii despre apelurile în desfășurare de pe dispozitiv și să gestioneze apelurile respective." "citește mesajele cu transmisie celulară" @@ -377,7 +377,7 @@ "Această aplicație poate să citească toate mesajele SMS (texT) stocate pe dispozitivul Android TV." "Această aplicație poate citi toate mesajele SMS stocate pe telefon." "primește mesaje text (WAP)" - "Permite aplicației să primească și să proceseze mesaje WAP. Această permisiune include capacitatea de a monitoriza sau șterge mesajele care v-au fost trimise fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje WAP. Această permisiune include capacitatea de a monitoriza sau șterge mesajele care ți-au fost trimise fără a ți le arăta." "preluare aplicații care rulează" "Permite aplicației să preia informațiile despre activitățile care rulează în prezent și care au rulat recent. În acest fel, aplicația poate descoperi informații despre aplicațiile care sunt utilizate pe dispozitiv." "să gestioneze profilul și proprietarii dispozitivului" @@ -403,7 +403,7 @@ "măsurare spațiu de stocare al aplicației" "Permite aplicației să preia dimensiunile codului, ale datelor și ale memoriei cache" "modifică setări de sistem" - "Permite aplicației să modifice datele din setările sistemului. Aplicațiile rău intenționate pot corupe configurația sistemului dvs." + "Permite aplicației să modifice datele din setările sistemului. Aplicațiile rău intenționate pot corupe configurația sistemului." "rulează la pornire" "Permite aplicației să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea tabletei poate dura mai mult timp, iar rularea continuă a aplicației poate încetini dispozitivul." "Permite aplicației să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea dispozitivului Android TV poate dura mai mult timp, iar rularea continuă a aplicației poate încetini dispozitivul." @@ -413,9 +413,9 @@ "Permite aplicației să trimită mesaje difuzate persistente, care se păstrează după terminarea difuzării mesajului. Utilizarea excesivă a acestei funcții poate să încetinească sau să destabilizeze dispozitivul Android TV, determinându-l să utilizeze prea multă memorie." "Permite aplicației să trimită mesaje difuzate persistente, care se păstrează după terminarea difuzării mesajului. Utilizarea excesivă a acestei funcții poate să încetinească sau să destabilizeze telefonul, determinându-l să utilizeze prea multă memorie." "citește agenda" - "Permite aplicației să citească datele despre persoanele din agenda stocată pe tabletă. Aplicațiile vor avea și acces la conturile de pe tabletă care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." - "Permite aplicației să citească datele despre persoanele de contact din agenda stocată pe dispozitivul Android TV. Aplicațiile vor avea și acces la conturile de pe dispozitivul Android TV care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." - "Permite aplicației să citească datele despre persoanele de contact salvate pe telefon. Aplicațiile vor avea și acces la conturile de pe telefon care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." + "Permite aplicației să citească datele despre persoanele din agenda stocată pe tabletă. Aplicațiile vor avea și acces la conturile de pe tabletă care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." + "Permite aplicației să citească datele despre persoanele de contact din agenda stocată pe dispozitivul Android TV. Aplicațiile vor avea și acces la conturile de pe dispozitivul Android TV care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." + "Permite aplicației să citească datele despre persoanele de contact salvate pe telefon. Aplicațiile vor avea și acces la conturile de pe telefon care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." "modifică agenda" "Permite aplicației să modifice datele despre persoanele din agenda stocată pe tabletă. Cu această permisiune, aplicația poate șterge datele de contact." "Permite aplicației să modifice datele despre persoanele din agenda stocată pe dispozitivul Android TV. Cu această permisiune, aplicația poate șterge datele de contact." @@ -425,7 +425,7 @@ "scrie jurnalul de apeluri" "Permite aplicației să modifice jurnalul de apeluri al tabletei, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al dispozitivului Android TV, inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul de apeluri." - "Permite aplicației să modifice jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." + "Permite aplicației să modifice jurnalul de apeluri al telefonului, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Să acceseze date de la senzorii corporali, cum ar fi pulsul, în timpul folosirii" "Permite aplicației să acceseze date de la senzorii corporali, cum ar fi pulsul, temperatura și procentul de oxigen din sânge, în timpul folosirii aplicației." "Să acceseze date de la senzorii corporali, precum pulsul, când rulează în fundal" @@ -441,10 +441,10 @@ "accesare comenzi suplimentare ale furnizorului locației" "Permite aplicației să acceseze comenzi suplimentare pentru furnizorul locației. Aplicația ar putea să utilizeze această permisiune pentru a influența operațiile GPS sau ale altor surse de locații." "să acceseze locația exactă în prim-plan" - "Aplicația vă poate determina locația exactă cu ajutorul serviciilor de localizare atunci când este folosită. Pentru ca aplicația să poată determina locația, trebuie să activați serviciile de localizare pentru dispozitiv. Aceasta poate mări utilizarea bateriei." + "Aplicația îți poate stabili locația exactă cu ajutorul serviciilor de localizare când este folosită. Pentru ca aplicația să poată stabili locația, trebuie să activezi serviciile de localizare pentru dispozitiv. Aceasta poate mări utilizarea bateriei." "să acceseze locația aproximativă numai în prim-plan." - "Aplicația vă poate determina locația aproximativă cu ajutorul serviciilor de localizare atunci când este folosită. Pentru ca aplicația să poată determina locația, trebuie să activați serviciile de localizare pentru dispozitiv." - "accesați locația în fundal" + "Aplicația îți poate stabili locația aproximativă cu ajutorul serviciilor de localizare când este folosită. Pentru ca aplicația să poată stabili locația, trebuie să activezi serviciile de localizare pentru dispozitiv." + "să acceseze locația în fundal" "Aplicația poate accesa locația oricând, chiar dacă nu este folosită." "modificare setări audio" "Permite aplicației să modifice setările audio globale, cum ar fi volumul și difuzorul care este utilizat pentru ieșire." @@ -455,7 +455,7 @@ "să trimită comenzi către SIM" "Permite aplicației să trimită comenzi pe cardul SIM. Această permisiune este foarte periculoasă." "recunoașterea activității fizice" - "Această aplicație vă poate recunoaște activitatea fizică." + "Această aplicație îți poate recunoaște activitatea fizică." "realizarea de fotografii și videoclipuri" "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto când este în uz." "să fotografieze și să înregistreze videoclipuri în fundal" @@ -468,9 +468,9 @@ "Permite aplicației să controleze mecanismul de vibrare." "Permite aplicației să acceseze modul de vibrații." "să sune direct la numere de telefon" - "Permite aplicației să apeleze numere de telefon fără intervenția dvs. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." + "Permite aplicației să apeleze numere de telefon fără intervenția ta. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." "accesează serviciul de apelare IMS" - "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția dvs." + "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția ta." "citește starea și identitatea telefonului" "Permite aplicației să acceseze funcțiile de telefon ale dispozitivului. Cu această permisiune aplicația stabilește numărul de telefon și ID-urile de dispozitiv, dacă un apel este activ, precum și numărul de la distanță conectat printr-un apel." "să citească informații de bază, precum activitatea și starea telefonului" @@ -507,8 +507,8 @@ "Permite aplicației să schimbe fusul orar al telefonului." "găsește conturi pe dispozitiv" "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." - "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." - "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." + "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." + "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." "să vadă conexiunile la rețea" "Permite aplicației să vadă informațiile despre conexiunile la rețea, cum ar fi rețelele existente și cele care sunt conectate." "să aibă acces deplin la rețea" @@ -522,13 +522,13 @@ "se conectează și se deconectează de la Wi-Fi" "Permite aplicației să se conecteze și să se deconecteze de la punctele de acces Wi-Fi, precum și să efectueze modificări în configurația dispozitivului pentru rețelele Wi-Fi." "permitere recepționare difuzare multiplă Wi-Fi" - "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar tableta dvs. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." + "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, folosind adrese cu difuzare multiplă, nu doar tableta ta. Această funcție folosește mai multă energie decât modul fără difuzare multiplă." "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar dispozitivul Android TV. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." - "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar telefonul dvs. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." + "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, folosind adrese cu difuzare multiplă, nu doar telefonul tău. Această funcție folosește mai multă energie decât modul fără difuzare multiplă." "accesează setările Bluetooth" - "Permite aplicației să configureze tableta Bluetooth locală, să descopere și să se împerecheze cu dispozitive la distanță." - "Permite aplicației să configureze conexiunea Bluetooth pe dispozitivul Android TV, să descopere și să se împerecheze cu dispozitive la distanță." - "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se împerecheze cu dispozitive la distanță." + "Permite aplicației să configureze tableta Bluetooth locală, să descopere și să se asocieze cu dispozitive la distanță." + "Permite aplicației să configureze conexiunea Bluetooth pe dispozitivul Android TV, să descopere și să se asocieze cu dispozitive la distanță." + "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se asocieze cu dispozitive la distanță." "se conectează și se deconectează de la WiMAX" "Permite aplicației să stabilească dacă o rețea WiMAX este activată și să vadă informațiile cu privire la toate rețelele WiMAX conectate." "schimbă starea WiMAX" @@ -537,8 +537,8 @@ "Permite aplicației să conecteze și să deconecteze telefonul la și de la rețelele WiMAX." "conectează dispozitive Bluetooth" "Permite aplicației să vadă configurația tabletei Bluetooth, să facă și să accepte conexiuni cu dispozitive asociate." - "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive împerecheate." - "Permite aplicației să vadă configurația telefonului Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." + "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive asociate." + "Permite aplicației să vadă configurația telefonului Bluetooth, să stabilească și să accepte conexiuni cu dispozitive asociate." "să descopere și să asocieze dispozitive Bluetooth din apropiere" "Permite aplicației să descopere și să asocieze dispozitive Bluetooth din apropiere" "să se conecteze la dispozitive Bluetooth asociate" @@ -555,46 +555,46 @@ "Permite aplicației să comunice cu etichetele, cardurile și cititoarele NFC (Near Field Communication)." "dezactivează blocarea ecranului" "Permite aplicației să dezactiveze blocarea tastelor și orice modalitate asociată de securizare prin parolă. De exemplu, telefonul dezactivează blocarea tastelor când se primește un apel telefonic și reactivează blocarea tastelor la terminarea apelului." - "solicitați complexitatea blocării ecranului" - "Permite aplicației să învețe nivelul de complexitate al blocării ecranului (ridicat, mediu, scăzut sau fără), fapt ce indică intervalul posibil de lungime a parolei și tipul de blocare a ecranului. Aplicația le poate sugera utilizatorilor să își actualizeze blocarea ecranului la un anumit nivel, dar utilizatorii pot ignora sugestia și pot naviga în continuare. Rețineți că blocarea ecranului nu este stocată ca text simplu, astfel încât aplicația să nu cunoască parola exactă." + "să solicite complexitatea blocării ecranului" + "Permite aplicației să învețe nivelul de complexitate al blocării ecranului (ridicat, mediu, scăzut sau fără), fapt ce indică intervalul posibil de lungime a parolei și tipul de blocare a ecranului. Aplicația le poate sugera utilizatorilor să își actualizeze blocarea ecranului la un anumit nivel, dar utilizatorii pot ignora sugestia și pot naviga în continuare. Reține că blocarea ecranului nu e stocată ca text simplu, astfel încât aplicația să nu cunoască parola exactă." "să afișeze notificări" "Permite aplicației să afișeze notificări" - "utilizați hardware biometric" + "să folosească hardware biometric" "Permite aplicației să folosească hardware biometric pentru autentificare" "gestionează hardware-ul pentru amprentă" "Permite aplicației să invoce metode pentru a adăuga și pentru a șterge șabloane de amprentă pentru utilizare." "folosește hardware-ul pentru amprentă" "Permite aplicației să folosească hardware pentru amprentă pentru autentificare" - "modificați colecția de muzică" + "să modifice colecția de muzică" "Permite aplicației să modifice colecția de muzică." - "modificați colecția de videoclipuri" - "Permite aplicației să vă modifice colecția de videoclipuri." - "modificați colecția de fotografii" - "Permite aplicației să vă modifice colecția de fotografii." - "citiți locațiile din colecția media" - "Permite aplicației să citească locațiile din colecția dvs. media." + "să modifice colecția de videoclipuri" + "Permite aplicației să-ți modifice colecția de videoclipuri." + "să modifice colecția de fotografii" + "Permite aplicației să-ți modifice colecția de fotografii." + "să citească locațiile din colecția media" + "Permite aplicației să citească locațiile din colecția ta media." "Folosește sistemele biometrice" "Folosește sistemele biometrice sau blocarea ecranului" - "Confirmați-vă identitatea" + "Confirmă-ți identitatea" "Folosește sistemele biometrice pentru a continua" "Folosește sistemele biometrice sau blocarea ecranului pentru a continua" "Hardware biometric indisponibil" "Autentificarea a fost anulată" "Nu este recunoscut" "Autentificarea a fost anulată" - "Nu este setat niciun cod PIN, model sau parolă" + "Nu este setat un cod PIN, un model sau o parolă" "Eroare la autentificare" "Folosește blocarea ecranului" - "Introduceți blocarea ecranului ca să continuați" + "Introdu blocarea ecranului pentru a continua" "Apasă ferm pe senzor" "Amprenta nu a putut fi procesată. Încearcă din nou." - "Curățați senzorul de amprentă și încercați din nou" - "Curățați senzorul și încercați din nou" + "Curăță senzorul de amprentă și încearcă din nou" + "Curăță senzorul și încearcă din nou" "Apasă ferm pe senzor" "Ai mișcat degetul prea lent. Încearcă din nou." "Încearcă altă amprentă" "Prea luminos" - "Încercați să ajustați" + "Încearcă să ajustezi" "Schimbă ușor poziția degetului de fiecare dată" @@ -614,7 +614,7 @@ "Nu au fost înregistrate amprente." "Dispozitivul nu are senzor de amprentă." "Senzorul este dezactivat temporar." - "Nu se poate folosi senzorul de amprentă. Vizitați un furnizor de servicii de reparații." + "Nu se poate folosi senzorul de amprentă. Vizitează un furnizor de servicii de reparații." "Degetul %d" "Folosește amprenta" "Folosește amprenta sau blocarea ecranului" @@ -626,15 +626,15 @@ "Pictograma amprentă" "Deblocare facială" "Problemă cu Deblocarea facială" - "Atingeți pentru a șterge modelul facial, apoi adăugați din nou fața" + "Atinge pentru a șterge modelul facial, apoi adaugă din nou chipul" "Configurează Deblocarea facială" - "Deblocați-vă telefonul uitându-vă la acesta" - "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" + "Deblochează-ți telefonul uitându-te la el" + "Pentru a folosi Deblocarea facială, activează ""Accesul la cameră"" în Setări și confidențialitate" "Configurează mai multe moduri de deblocare" - "Atingeți ca să adăugați o amprentă" + "Atinge ca să adaugi o amprentă" "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" - "Vizitați un furnizor de servicii de reparații." + "Vizitează un furnizor de servicii de reparații." "Nu s-a putut fotografia fața cu precizie. Încearcă din nou." "Prea luminos. Încearcă o lumină mai slabă." "Prea întunecat. Încearcă o lumină mai puternică." @@ -644,17 +644,17 @@ "Mută telefonul mai jos." "Mută telefonul spre stânga." "Mută telefonul spre dreapta." - "Priviți mai direct spre dispozitiv." - "Stați cu capul direct în fața telefonului." - "Prea multă mișcare. Țineți telefonul nemișcat." + "Privește mai direct spre dispozitiv." + "Stai cu capul direct în fața telefonului." + "Prea multă mișcare. Ține telefonul nemișcat." "Reînregistrează-ți chipul." "Nu se mai poate recunoaște fața. Încearcă din nou." "Prea asemănător, schimbă poziția." "Întoarce capul mai puțin." - "Înclinați capul mai puțin." - "Întoarceți capul mai puțin." - "Eliminați orice vă ascunde chipul." - "Curățați partea de sus a ecranului, inclusiv bara neagră" + "Înclină capul mai puțin." + "Întoarce capul mai puțin." + "Îndepărtează orice îți ascunde chipul." + "Curăță partea de sus a ecranului, inclusiv bara neagră" "Nu se poate confirma fața. Hardware-ul nu este disponibil." @@ -666,14 +666,14 @@ "Prea multe încercări. Deblocarea facială este dezactivată." "Prea multe încercări. Folosește blocarea ecranului." "Nu se poate confirma fața. Încearcă din nou." - "Nu ați configurat Deblocarea facială" + "Nu ai configurat Deblocarea facială" "Deblocarea facială nu este acceptată pe acest dispozitiv" "Senzorul este dezactivat temporar." "Chip %d" "Folosește Deblocarea facială" "Folosește deblocarea facială sau ecranul de blocare" - "Folosiți-vă chipul ca să continuați" - "Folosiți-vă chipul sau blocarea ecranului pentru a continua" + "Folosește-ți chipul pentru a continua" + "Folosește-ți chipul sau blocarea ecranului pentru a continua" "A apărut o eroare. Încearcă din nou." @@ -712,7 +712,7 @@ "Permite aplicației să citească utilizarea statistică a rețelei pentru anumite rețele și aplicații." "gestionează politica de rețea" "Permite aplicației să gestioneze politicile de rețea și să definească regulile specifice aplicațiilor." - "modificați modul de calcul al utilizării rețelei" + "să modifice modul de calcul al utilizării rețelei" "Permite aplicației să modifice modul în care este calculată utilizarea rețelei pentru aplicații. Nu se utilizează de aplicațiile obișnuite." "accesare notificări" "Permite aplicației să recupereze, să examineze și să șteargă notificări, inclusiv pe cele postate de alte aplicații." @@ -726,7 +726,7 @@ "Permite proprietarului să apeleze aplicația de configurare furnizată de operator. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "ascultă observații despre starea rețelei" "Permite unei aplicații să asculte observații despre starea rețelei. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." - "schimbați calibrarea dispozitivului de intrare" + "schimbă calibrarea dispozitivului de intrare" "Permite aplicației să modifice parametrii de calibrare a ecranului tactil. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "accesează certificatele DRM" "Permite unei aplicații să furnizeze și să utilizeze certificate DRM. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." @@ -744,21 +744,21 @@ "Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "să înceapă să examineze deciziile privind permisiunile" "Permite proprietarului să deschidă ecranul pentru a examina deciziile privind permisiunile. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." - "începeți să vedeți funcțiile aplicației" + "să vadă funcțiile aplicației" "Permite proprietarului să înceapă să vadă informațiile despre funcții pentru o aplicație." "să acceseze date de la senzori la o rată de eșantionare mare" "Permite aplicației să colecteze date de la senzori la o rată de eșantionare de peste 200 Hz" "Să seteze reguli pentru parolă" - "Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului." + "Stabilește lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului." "Să monitorizeze încercările de deblocare a ecranului" - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți datele acesteia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele de pe acesta dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge datele acesteia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele de pe acesta dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestui profil dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestui profil dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Să schimbe blocarea ecranului" "Modifică blocarea ecranului." "Să blocheze ecranul" @@ -914,7 +914,7 @@ "Apasă Meniu pentru deblocare." "Desenează modelul pentru a debloca" "Urgență" - "Reveniți la apel" + "Revino la apel" "Corect!" "Încearcă din nou" "Încearcă din nou" @@ -927,7 +927,7 @@ "Introdu un card SIM." "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." - "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." + "Cardul SIM este dezactivat definitiv.\n Contactează furnizorul de servicii wireless pentru a obține un alt card SIM." "Melodia anterioară" "Melodia următoare" "Pauză" @@ -938,31 +938,31 @@ "Numai apeluri de urgență" "Rețea blocată" "Cardul SIM este blocat cu codul PUK." - "Consultați Ghidul de utilizare sau contactați Serviciul de relații cu clienții." + "Consultă Ghidul de utilizare sau contactează asistența pentru clienți." "Cardul SIM este blocat." "Se deblochează cardul SIM..." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV prin conectarea la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acesta va fi acum resetat la setările prestabilite din fabrică." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acesta va reveni acum la setările din fabrică." "Încearcă din nou peste %d secunde." "Ai uitat modelul?" "Deblocare cont" "Prea multe încercări de desenare a modelului" - "Pentru a debloca, conectați-vă folosind Contul Google." + "Pentru a debloca, conectează-te folosind Contul Google." "Nume de utilizator (e-mail)" "Parolă" "Conectează-te" "Nume de utilizator sau parolă nevalide." - "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." + "Ai uitat numele de utilizator sau parola?\nAccesează ""google.com/accounts/recovery""." "Se verifică..." "Deblochează" "Sunet activat" @@ -1011,7 +1011,7 @@ "JavaScript" "Confirmă părăsirea paginii" "Părăsește această pagină" - "Rămâneți în această pagină" + "Rămâi în această pagină" "%s\n\nSigur părăsești această pagină?" "Confirmă" "Sfat: mărește și micșorează prin dublă atingere." @@ -1046,7 +1046,7 @@ "Permite aplicației să adauge mesaje în Mesaje primite în mesageria vocală." "modificare permisiuni pentru locația geografică a browserului" "Permite aplicației să modifice permisiunile privind locația geografică a browserului. Aplicațiile rău intenționate pot utiliza această permisiune pentru a permite trimiterea informațiilor privind locația către site-uri web arbitrare." - "Doriți ca browserul să rețină această parolă?" + "Vrei ca browserul să rețină această parolă?" "Nu acum" "Reține" "Niciodată" @@ -1075,7 +1075,7 @@ "Șterge interogarea" "Trimite interogarea" "Căutare vocală" - "Activați Explorați prin atingere?" + "Activezi Explorează prin atingere?" "%1$s vrea să activeze funcția Explorează prin atingere. Când e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu tableta." "%1$s dorește să activeze funcția Explorează prin atingere. Când aceasta e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu telefonul." "cu 1 lună în urmă" @@ -1090,9 +1090,9 @@ " zile" "oră" "ore" - "min" + "min." "min." - "sec" + "sec." "sec." "săptămână" "săptămâni" @@ -1117,7 +1117,7 @@ "{count,plural, =1{# an}few{# ani}other{# de ani}}" "Problemă video" "Acest fișier video nu este valid pentru a fi transmis în flux către acest dispozitiv." - "Nu puteți reda acest videoclip" + "Nu poți reda acest videoclip" "OK" "%1$s, %2$s" "prânz" @@ -1132,7 +1132,7 @@ "Eroare la copierea în clipboard" "Inserează" "Inserează ca text simplu" - "Înlocuiți..." + "Înlocuiește..." "Șterge" "Copiază adresa URL" "Selectează text" @@ -1145,10 +1145,10 @@ "Metodă de intrare" "Acțiuni pentru text" "Înapoi" - "Comutați metoda de introducere a textului" + "Schimbă metoda de introducere" "Spațiul de stocare aproape ocupat" "Este posibil ca unele funcții de sistem să nu funcționeze" - "Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți." + "Spațiu de stocare insuficient pentru sistem. Asigură-te că ai 250 MB de spațiu liber și repornește." "%1$s rulează acum" "Atinge pentru mai multe informații sau pentru a opri aplicația." "OK" @@ -1165,8 +1165,8 @@ "neselectat" "în curs" "Finalizare acțiune utilizând" - "Finalizați acțiunea utilizând %1$s" - "Finalizați acțiunea" + "Finalizează acțiunea folosind %1$s" + "Finalizează acțiunea" "Deschide cu" "Deschide cu %1$s" "Deschide" @@ -1185,13 +1185,13 @@ "Trimite folosind %1$s" "Trimite" "Selectează o aplicație de pe ecranul de pornire" - "Utilizați %1$s ca ecran de pornire" + "Folosește %1$s ca ecran de pornire" "Fotografiază" "Fotografiază cu" "Fotografiază cu %1$s" "Fotografiază" "Se utilizează în mod prestabilit pentru această acțiune." - "Utilizați altă aplicație" + "Folosește altă aplicație" "Șterge setările prestabilite din Setări de sistem > Aplicații > Descărcate." "Alege o acțiune" "Alege o aplicație pentru dispozitivul USB" @@ -1212,7 +1212,7 @@ "%1$s nu răspunde" "Procesul %1$s nu răspunde" "OK" - "Raportați" + "Raportează" "Așteaptă" "Pagina a devenit inactivă.\n\nO închizi?" "Aplicație redirecționată" @@ -1242,12 +1242,12 @@ "Se pregătește %1$s." "Se pornesc aplicațiile." "Se finalizează pornirea." - "Continuați configurarea?" - "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor când vă configurați amprenta." + "Continui configurarea?" + "Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor când îți configurezi amprenta." "Dezactivează ecranul" "Continuă configurarea" - "Continuați cu verificarea amprentei?" - "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor pentru verificarea amprentei." + "Continui cu verificarea amprentei?" + "Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor pentru verificarea amprentei." "Dezactivează ecranul" "Continuă" "Rulează %1$s" @@ -1262,8 +1262,8 @@ "Datele privind memoria au fost culese. Atinge pentru a trimite." "Trimiți datele privind memoria?" "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." - "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." - "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." + "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastezi." + "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le poți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastezi." "Alege o acțiune pentru text" "Volum sonerie" "Volum media" @@ -1296,7 +1296,7 @@ "Rețeaua nu are acces la internet" "Serverul DNS privat nu poate fi accesat" "%1$s are conectivitate limitată" - "Atingeți pentru a vă conecta oricum" + "Atinge pentru a te conecta oricum" "S-a comutat la %1$s" "Dispozitivul folosește %1$s când %2$s nu are acces la internet. Se pot aplica taxe." "S-a comutat de la %1$s la %2$s" @@ -1308,7 +1308,7 @@ "VPN" "un tip de rețea necunoscut" - "Acceptați" + "Accept" "Refuz" "Introdu caracterul" "Se trimit mesaje SMS" @@ -1320,18 +1320,18 @@ "Acest lucru va genera costuri în contul tău mobil." "Trimite" "Anulează" - "Doresc să se rețină opțiunea" + "Reține opțiunea" "Poți modifica ulterior în Setări > Aplicații" "Permite întotdeauna" "Nu permite niciodată" "Card SIM eliminat" - "Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus." + "Rețeaua mobilă va fi indisponibilă până când repornești cu un card SIM valid introdus." "Terminat" "Card SIM adăugat" "Repornește dispozitivul pentru a accesa rețeaua mobilă." "Repornește" "Activează serviciul mobil" - "Descărcați aplicația operatorului pentru a vă activa noul card SIM" + "Descarcă aplicația operatorului pentru a activa noul card SIM" "Descarcă aplicația %1$s pentru a-ți activa noul card SIM" "Descarcă aplicația" "S-a introdus un card SIM nou" @@ -1365,19 +1365,19 @@ "Modul Set de testare este activat" "Revino la setările din fabrică pentru a dezactiva modul Set de testare." "Consola din serie este activată" - "Performanța este afectată. Pentru a dezactiva, verificați programul bootloader." + "Performanța este afectată. Pentru a dezactiva, verifică programul bootloader." "MTE experimentală activată" - "Performanța și stabilitatea pot fi afectate. Reporniți pentru a dezactiva. Dacă s-a activat cu arm64.memtag.bootctl, setați înainte la niciuna." + "Performanța și stabilitatea pot fi afectate. Repornește pentru a dezactiva. Dacă s-a activat cu arm64.memtag.bootctl, setează dinainte la niciuna." "Lichide sau reziduuri în portul USB" - "Portul USB este dezactivat automat. Atingeți ca să aflați mai multe." + "Portul USB este dezactivat automat. Atinge ca să afli mai multe." "Portul USB poate fi folosit" "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" "Trimiți raportul de eroare?" "Se trimite raportul de eroare…" - "Administratorul dvs. a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la date și aplicații." - "TRIMITEȚI" - "REFUZAȚI" + "Administratorul a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. E posibil să se permită accesul la date și aplicații." + "TRIMITE" + "REFUZ" "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" "Afișează tastatura virtuală" @@ -1388,7 +1388,7 @@ "Afișare peste alte aplicații" "%s se afișează peste alte aplicații" "%s se afișează peste aplicații" - "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." + "Dacă nu vrei ca %s să folosească această funcție, atinge pentru a deschide setările și dezactiveaz-o." "Dezactivează" "Se verifică %s…" "Se examinează conținutul curent" @@ -1397,28 +1397,28 @@ "%s nu funcționează" "Atinge pentru a configura" "Selectează pentru a configura" - "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." + "Poate fi nevoie să reformatezi dispozitivul. Atinge pentru a-l scoate." "Pentru a transfera fotografii și fișiere media" - "Răsfoiți fișierele media" + "Răsfoiește fișierele media" "Problemă cu %s" "%s nu funcționează" "Atinge pentru a remedia" "%s este corupt. Selectează pentru a remedia." - "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." + "Poate fi nevoie să reformatezi dispozitivul. Atinge pentru a-l scoate." "%s necompatibil" "%s nu funcționează" "Dispozitivul nu este compatibil cu acest %s. Atinge pentru configurare într-un format compatibil." "Selectează pentru a configura %s într-un format acceptat." - "Poate fi nevoie să reformatați dispozitivul" + "Poate fi nevoie să reformatezi dispozitivul" "%s scos pe neașteptate" "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" "S-a eliminat %s" "Funcționarea ar putea fi necorespunzătoare. Introdu un dispozitiv de stocare nou." "Se deconectează %s" - "Nu scoateți" + "Nu scoate" "Configurează" "Scoate" - "Explorați" + "Explorează" "Schimbă ieșirea" "%s lipsește" "Reintrodu dispozitivul" @@ -1460,10 +1460,10 @@ "Înainte" "Terminat" "Înapoi" - "Executați" - "Formați numărul\nutilizând %s" - "Creați contactul\nutilizând %s" - "Următoarele aplicații solicită permisiunea de a accesa contul dvs. acum și în viitor." + "Execută" + "Formează numărul\nfolosind %s" + "Creează contactul\nutilizând %s" + "Următoarele aplicații solicită permisiunea de a-ți accesa contul acum și în viitor." "Permiți această solicitare?" "Solicitare de acces" "Permite" @@ -1501,12 +1501,12 @@ "Înainte" "Omite" "Nicio potrivire" - "Găsiți pe pagină" + "Caută în pagină" "{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}}" "Terminat" "Se șterge spațiul de stocare distribuit..." "Distribuie" - "Găsiți" + "Caută" "Căutare pe web" "Următorul rezultat" "Rezultatul anterior" @@ -1516,29 +1516,29 @@ "Da" "Nu" "Limita pentru ștergere a fost depășită" - "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" + "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce vrei să faci?" "Șterge elementele" "Anulează aceste ștergeri" - "Nu trebuie să luați nicio măsură deocamdată" + "Nu trebuie să iei nicio măsură deocamdată" "Alege un cont" "Adaugă un cont" "Adaugă un cont" - "Creșteți" - "Reduceți" - "%s atingeți lung." + "Mărește" + "Redu" + "%s atinge lung." "Glisează în sus pentru a crește și în jos pentru a reduce." - "Creșteți valoarea pentru minute" + "Mărește valoarea pentru minute" "Redu valoarea pentru minute" - "Creșteți valoarea pentru oră" + "Mărește valoarea pentru oră" "Redu valoarea pentru oră" "Setează valoarea PM" "Setează valoarea AM" "Mărește valoarea pentru lună" - "Reduceți valoarea pentru lună" + "Redu valoarea pentru lună" "Mărește valoarea pentru zi" - "Reduceți valoarea pentru zi" - "Creșteți valoarea pentru an" - "Reduceți valoarea pentru an" + "Redu valoarea pentru zi" + "Mărește valoarea pentru an" + "Redu valoarea pentru an" "Luna trecută" "Luna viitoare" "Alt" @@ -1552,7 +1552,7 @@ "Nu s-a putut lansa %s" "Permite accesul pentru" "Permite accesul pentru %s" - "Mâner glisant. Atingeți și țineți apăsat." + "Ghidaj glisant. Atinge și ține apăsat." "Glisează pentru a debloca." "Navighează la ecranul de pornire" "Navighează în sus" @@ -1636,59 +1636,59 @@ "Introdu codul PIN al cardului SIM" "Introdu codul PIN" "Introdu parola" - "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." + "Cardul SIM este acum dezactivat. Introdu codul PUK pentru a continua. Contactează operatorul pentru mai multe detalii." "Introdu codul PIN dorit" "Confirmă codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." "Introdu un cod PIN format din 4 până la 8 cifre." "Codul PUK trebuie să conțină 8 numere." - "Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." + "Reintrodu codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." "Codurile PIN nu coincid" "Prea multe încercări de desenare a modelului" - "Pentru a debloca, conectați-vă cu Contul dvs. Google." + "Pentru a debloca, conectează-te folosind Contul Google." "Nume de utilizator (e-mail)" "Parolă" "Conectează-te" "Nume de utilizator sau parolă nevalide." - "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." + "Ai uitat numele de utilizator sau parola?\nAccesează ""google.com/accounts/recovery""." "Se verifică contul…" - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Telefonul va fi acum resetat la setările prestabilite din fabrică." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Telefonul va reveni acum la setările din fabrică." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." " — " "Elimină" - "Ridicați volumul mai sus de nivelul recomandat?\n\nAscultarea la volum ridicat pe perioade lungi de timp vă poate afecta auzul." - "Utilizați comanda rapidă pentru accesibilitate?" - "Atunci când comanda rapidă este activată, dacă apăsați ambele butoane de volum timp de trei secunde, veți lansa o funcție de accesibilitate." + "Mărești volumul peste nivelul recomandat?\n\nDacă asculți perioade lungi la volum ridicat, auzul poate fi afectat." + "Folosești comanda rapidă pentru accesibilitate?" + "Când comanda rapidă e activată, dacă apeși ambele butoane de volum timp de trei secunde, vei lansa o funcție de accesibilitate." "Activezi comanda rapidă pentru funcțiile de accesibilitate?" - "Dacă apăsați ambele taste de volum câteva secunde, activați funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPuteți schimba funcțiile selectate din Setări > Accesibilitate." + "Dacă apeși ambele taste de volum câteva secunde, activezi funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPoți schimba funcțiile selectate din Setări > Accesibilitate." " • %1$s\n" "Activezi comanda rapidă %1$s?" - "Dacă apăsați ambele taste de volum câteva secunde, activați funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPuteți alege altă funcție pentru această comandă în Setări > Accesibilitate." + "Dacă apeși ambele taste de volum câteva secunde, activezi funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPoți alege altă funcție pentru această comandă în Setări > Accesibilitate." "Activează" - "Nu activați" + "Nu activa" "ACTIVAT" "DEZACTIVAT" - "Permiteți serviciului %1$s să aibă control total asupra dispozitivului dvs.?" - "Controlul total este adecvat pentru aplicații care vă ajută cu accesibilitatea, însă nu pentru majoritatea aplicaților." - "Vă vede și vă controlează ecranul" + "Permiți serviciului %1$s să aibă control total asupra dispozitivului?" + "Controlul total este adecvat pentru aplicații care te ajută cu accesibilitatea, însă nu pentru majoritatea aplicaților." + "să vadă și să controleze ecranul" "Poate citi tot conținutul de pe ecran și poate afișa conținut peste alte aplicații." - "Vă vede interacțiunile și le realizează" - "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." + "să vadă și să facă acțiuni" + "Poate să urmărească interacțiunile tale cu o aplicație sau cu un senzor hardware și să interacționeze cu aplicații în numele tău." "Permite" "Refuz" - "Atingeți o funcție ca să începeți să o folosiți:" - "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" + "Atinge o funcție ca să începi să o folosești:" + "Alege funcțiile pe care să le folosești cu butonul de accesibilitate" "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" "Editează comenzile rapide" @@ -1702,12 +1702,12 @@ "S-au apăsat lung tastele de volum. S-a activat %1$s." "S-au apăsat lung tastele de volum. S-a dezactivat %1$s." "Apasă ambele butoane de volum timp de trei secunde pentru a folosi %1$s" - "Alegeți o funcție pe care să o folosiți când atingeți butonul de accesibilitate:" - "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):" - "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):" - "Pentru a comuta între funcții, atingeți lung butonul de accesibilitate." - "Pentru a comuta între funcții, glisați în sus cu două degete și mențineți apăsat." - "Pentru a comuta între funcții, glisați în sus cu trei degete și mențineți apăsat." + "Alege o funcție pe care să o folosești când atingi butonul de accesibilitate:" + "Alege o funcție pe care să o folosești cu gestul de accesibilitate (glisează în sus cu două degete din partea de jos a ecranului):" + "Alege o funcție pe care să o folosești cu gestul de accesibilitate (glisează în sus cu trei degete din partea de jos a ecranului):" + "Pentru a comuta între funcții, atinge lung butonul de accesibilitate." + "Pentru a comuta între funcții, glisează în sus cu două degete și ține apăsat." + "Pentru a comuta între funcții, glisează în sus cu trei degete și ține apăsat." "Mărire" "Utilizator curent: %1$s." "Se comută la %1$s…" @@ -1717,7 +1717,7 @@ "Eroare" "Această modificare nu este permisă de administrator" "Nicio aplicație pentru gestionarea acestei acțiuni" - "Revocați" + "Revocă" "ISO A0" "ISO A1" "ISO A2" @@ -1825,12 +1825,12 @@ "Codul PIN actual" "Codul PIN nou" "Confirmă noul cod PIN" - "Creați un cod PIN pentru modificarea restricțiilor" - "Codurile PIN nu se potrivesc. Încercați din nou." + "Creează un cod PIN pentru modificarea restricțiilor" + "PIN-urile nu sunt identice. Încearcă din nou." "Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre." "Reîncearcă mai târziu" "Vizualizare pe ecran complet" - "Pentru a ieși, glisați de sus în jos." + "Pentru a ieși, glisează de sus în jos." "Am înțeles" "Terminat" "Selector circular pentru ore" @@ -1848,7 +1848,7 @@ "Solicită parola înainte de a anula fixarea" "Instalat de administrator" "Actualizat de administrator" - "Șters de administratorul dvs." + "Șters de administrator" "OK" "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." @@ -1866,8 +1866,8 @@ "Până %1$s" "Până la %1$s" "Până la %1$s (următoarea alarmă)" - "Până când dezactivați" - "Până când dezactivați „Nu deranja”" + "Până dezactivezi" + "Până când dezactivezi „Nu deranja”" "%1$s/%2$s" "Restrânge" "Nu deranja" @@ -1899,13 +1899,13 @@ "Port USB periferic" "Mai multe opțiuni" "Închide meniul suplimentar" - "Maximizați" + "Maximizează" "Închide" "%1$s: %2$s" "Răspunde" "Video" - "Respingeți" - "Încheiați" + "Respinge" + "Închide" "Apel primit" "Apel în desfășurare" "Se filtrează un apel primit" @@ -1928,7 +1928,7 @@ "Află mai multe" "Anulează întreruperea aplicației" "Activezi aplicațiile pentru lucru?" - "Obțineți acces la aplicațiile pentru lucru și notificări" + "Obține acces la aplicațiile și notificările pentru lucru" "Activează" "Aplicația nu este disponibilă" "%1$s nu este disponibilă momentan." @@ -1949,17 +1949,17 @@ "Aplicația necesită securitate suplimentară. Încearcă pe dispozitivul Android TV." "Aplicația necesită securitate suplimentară. Încearcă pe tabletă." "Aplicația necesită securitate suplimentară. Încearcă pe telefon." - "Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul." + "Această aplicație a fost creată pentru o versiune Android mai veche și e posibil să nu funcționeze corect. Încearcă să cauți actualizări sau contactează dezvoltatorul." "Caută actualizări" - "Aveți mesaje noi" + "Ai mesaje noi" "Deschide aplicația pentru SMS-uri ca să vezi" "Unele funcții ar putea fi limitate" "Profil de serviciu blocat" "Atinge ca să deblochezi" "Conectat la %1$s" "Atinge pentru a vedea fișierele" - "Fixați" - "Fixați %1$s" + "Fixează" + "Fixează %1$s" "Anulează fixarea" "Anulează fixarea pentru %1$s" "Informații despre aplicație" @@ -1985,7 +1985,7 @@ "Setează ora" "Introdu o oră validă" "Introdu ora" - "Pentru a introduce ora, comutați la modul de introducere a textului." + "Pentru a introduce ora, comută la modul de introducere a textului." "Pentru a introduce ora, comută la modul ceas." "Opțiuni de completare automată" "Salvează pentru completare automată" @@ -2014,9 +2014,9 @@ "card" "nume de utilizator" "adresă de e-mail" - "Păstrați-vă calmul și căutați un adăpost în apropiere." - "Părăsiți imediat zonele de coastă și din apropierea râurilor și îndreptați-vă spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." - "Păstrați-vă calmul și căutați un adăpost în apropiere." + "Păstrează-ți calmul și caută un adăpost în apropiere." + "Părăsește imediat zonele de coastă și din apropierea râurilor și îndreaptă-te spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." + "Păstrează-ți calmul și caută un adăpost în apropiere." "Testarea mesajelor de urgență" "Răspunde" @@ -2035,13 +2035,13 @@ "Nu s-a putut restabili comanda rapidă din cauza nepotrivirii semnăturii aplicației" "Nu s-a putut restabili comanda rapidă" "Comanda rapidă este dezactivată" - "DEZINSTALAȚI" + "DEZINSTALEAZĂ" "Deschide oricum" "Aplicație dăunătoare detectată" "Permiți ca %s să acceseze toate jurnalele dispozitivului?" "Permite accesul o dată" "Nu permite" - "Jurnalele dispozitivului înregistrează activitatea de pe dispozitivul dvs. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permiteți accesul la toate jurnalele dispozitivului doar aplicațiilor în care aveți încredere. \n\nDacă nu permiteți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. Este posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Aflați mai multe" + "Jurnalele dispozitivului înregistrează activitatea de pe acesta. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permite accesul la toate jurnalele dispozitivului doar aplicațiilor în care ai încredere. \n\nDacă nu permiți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. E posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Află mai multe." "Nu mai afișa" "%1$s vrea să afișeze porțiuni din %2$s" "Editează" @@ -2050,11 +2050,11 @@ "Modificări de sistem" "Nu deranja" "Funcția nouă Nu deranja ascunde notificările" - "Atingeți ca să aflați mai multe și să modificați" + "Atinge ca să afli mai multe și să modifici" "Funcția Nu deranja s-a schimbat" "Atinge pentru a verifica ce este blocat." - "Examinați setările pentru notificări" - "Începând cu Android 13, aplicațiile pe care le instalați necesită permisiunea de a trimite notificări. Atingeți ca să modificați permisiunea pentru aplicațiile existente." + "Verifică setările pentru notificări" + "Începând cu Android 13, aplicațiile pe care le instalezi necesită permisiunea de a trimite notificări. Atinge ca să modifici permisiunea pentru aplicațiile existente." "Mai târziu" "Închide" "Sistem" @@ -2062,7 +2062,7 @@ "Cameră foto" "Microfon" "se afișează peste alte aplicații de pe ecran" - "Oferiți feedback" + "Oferă feedback" "Notificarea a fost promovată la Prestabilită. Atinge pentru a oferi feedback." "Notificarea a fost mutată în jos la Silențioasă. Atinge pentru a oferi feedback." "Notificarea a fost mutată la un nivel superior. Atinge pentru a oferi feedback." @@ -2072,7 +2072,7 @@ "OK" "Dezactivează" "Află mai multe" - "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și vă organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." + "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." "Notificare pentru informații despre modul Rutină" "Bateria se poate descărca înainte de încărcarea obișnuită" "Economisirea bateriei este activată pentru a mări autonomia" @@ -2260,9 +2260,9 @@ "Noi setări de mărire" - "Acum puteți mări o parte a ecranului" + "Acum poți mări o parte a ecranului" "Activează din Setări" - "Respingeți" + "Închide" "Deblochează microfonul dispozitivului" "Deblochează camera dispozitivului" "Pentru <b>%s</b> și toate aplicațiile și serviciile" @@ -2270,8 +2270,8 @@ "Confidențialitatea privind senzorii" "Pictograma aplicației" "Imaginea de branding a aplicației" - "Verificați setările pentru acces" - "%s poate să vadă și să vă controleze ecranul. Atingeți pentru a examina." + "Verifică setările pentru acces" + "%s poate să vadă și să controleze ecranul. Atinge pentru a verifica." "%1$s a fost tradus." "Mesaj tradus din %1$s în %2$s." "Activitate de fundal" @@ -2279,7 +2279,7 @@ "O aplicație este încă activă" "%1$s rulează în fundal. Atinge pentru a gestiona utilizarea bateriei." "%1$s poate afecta autonomia bateriei. Atinge pentru a examina aplicațiile active." - "Verificați aplicațiile active" + "Verifică aplicațiile active" "Nu se poate accesa camera foto a telefonului de pe %1$s" "Nu se poate accesa camera foto a tabletei de pe %1$s" "Prestabilit de sistem" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index d64b7e6d9c54..39f317adfa7f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1942,9 +1942,9 @@ "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kifaa chako cha Android TV." "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kompyuta yako kibao." "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye simu yako." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye kifaa chako cha Android TV." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye kompyuta yako kibao." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye simu yako." + "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kifaa chako cha Android TV." + "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kompyuta yako kibao." + "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye simu yako." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kifaa chako cha Android TV." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kompyuta yako kibao." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye simu yako." @@ -2279,7 +2279,7 @@ "%1$s inatumika chinichini. Gusa ili udhibiti matumizi ya betri." "%1$s inaweza kuathiri muda wa matumizi ya betri. Gusa ili ukague programu zinazotumika." "Angalia programu zinazotumika" - "Haiwezi kufikia kamera ya simu kutoka kwenye %1$s yako" + "Huwezi kufikia kamera ya simu kutoka kwenye %1$s yako" "Haiwezi kufikia kamera ya kompyuta kibao kutoka kwenye %1$s yako" "Chaguomsingi la mfumo" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index bbbedfab23de..4a2f0f918b59 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1224,7 +1224,7 @@ "Luôn hiển thị" "%1$s được xây dựng cho phiên bản không tương thích của hệ điều hành Android và có thể hoạt động không như mong đợi. Bạn có thể sử dụng phiên bản cập nhật của ứng dụng." "Luôn hiển thị" - "Kiểm tra bản cập nhật" + "Kiểm tra để tìm bản cập nhật" "Ứng dụng %1$s (quá trình %2$s) đã vi phạm chính sách StrictMode tự thi hành của mình." "Quá trình %1$s đã vi phạm chính sách StrictMode tự thi hành của mình." "Điện thoại đang cập nhật…" @@ -1949,7 +1949,7 @@ "Ứng dụng này đang yêu cầu tính năng bảo mật bổ sung. Hãy thử trên máy tính bảng." "Ứng dụng này đang yêu cầu tính năng bảo mật bổ sung. Hãy thử trên điện thoại." "Ứng dụng này được xây dựng cho một phiên bản Android cũ hơn và có thể hoạt động không bình thường. Hãy thử kiểm tra các bản cập nhật hoặc liên hệ với nhà phát triển." - "Kiểm tra bản cập nhật" + "Kiểm tra để tìm bản cập nhật" "Bạn có tin nhắn mới" "Mở ứng dụng SMS để xem" "Một số chức năng có thể bị hạn chế" -- cgit v1.2.3 From 39b4b1e9aad79c98413a866de53ccacccf64ca7f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 31 Aug 2022 12:58:41 -0400 Subject: Lower per-app notificationchannel limit Test: PreferencesHelperTest Bug: 240422263 Change-Id: I8c12e3fc73e4a88842af275feaf2acffcced0402 (cherry picked from commit f528b337dd48b7e8071269e07e610bd4a3668c75) --- .../core/java/com/android/server/notification/PreferencesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 477b8da61e0f..d8aa469bcd81 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -106,7 +106,7 @@ public class PreferencesHelper implements RankingConfig { private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":"; @VisibleForTesting - static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000; + static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; @VisibleForTesting static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 50000; -- cgit v1.2.3 From c23434dcb81ab8024c77a74c88b251a99e966c92 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 13:45:04 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I53d1850038175ec9f813cbed0d2c0e851c2799ed --- packages/PackageInstaller/res/values-ro/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 6b793fcd810c..9ca454377cd0 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -24,8 +24,8 @@ "Se instalează…" "Se instalează %1$s…" "Aplicație instalată." - "Doriți să instalați această aplicație?" - "Doriți să actualizați această aplicație?" + "Vrei să instalezi această aplicație?" + "Vrei să actualizezi această aplicație?" "Aplicația nu a fost instalată." "Instalarea pachetului a fost blocată." "Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent." @@ -56,7 +56,7 @@ "Dezinstalezi această aplicație?" "Dezinstalezi această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." "Dezinstalezi această aplicație pentru utilizatorul %1$s?" - "Doriți să dezinstalați această aplicație din profilul de serviciu?" + "Dezinstalezi această aplicație din profilul de serviciu?" "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." "Păstrează %1$s din datele aplicației." @@ -81,9 +81,9 @@ "Acțiunile de instalare și dezinstalare nu sunt acceptate pe Wear." "Se pregătește aplicația…" "Necunoscut" - "Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." + "Din motive de securitate, tableta nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." + "Din motive de securitate, televizorul nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." + "Din motive de securitate, telefonul nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." "Telefonul și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." "Tableta și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi aplicația, accepți că ești singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." "Televizorul și datele tale cu caracter personal sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." -- cgit v1.2.3 From ac62154a873f0e93c8aeb1d096c0b9014328beb5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 14:08:43 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I393d9ca64e7b979ac325506a6c487b1550a323b8 --- packages/SystemUI/res/values-ro/strings.xml | 218 ++++++++++++++-------------- packages/SystemUI/res/values-sk/strings.xml | 2 +- 2 files changed, 110 insertions(+), 110 deletions(-) diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a91245d99b49..78e7beb25359 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "UI sistem" "Activezi Economisirea bateriei?" - "Mai aveți %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." + "Mai ai %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Procent rămas din baterie: %s" "Nu se poate realiza încărcarea prin USB" @@ -36,8 +36,8 @@ "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Permiți ca %1$s să acceseze %2$s?" "Deschizi %1$s ca să gestioneze %2$s?" - "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." + "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosești %1$s cu acest dispozitiv, acest lucru te poate împiedica să auzi apeluri, notificări și alarme." + "Dacă folosești %1$s cu acest dispozitiv, acest lucru te poate împiedica să auzi apeluri, notificări și alarme." "Permiți ca %1$s să acceseze %2$s?" "Deschizi %1$s ca să gestioneze %2$s?" "Deschizi %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." @@ -53,7 +53,7 @@ "Permite" "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comută la utilizatorul principal." - "Schimbați limba de sistem la %1$s?" + "Schimbi limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" "Schimbă limba" "Păstrează limba actuală" @@ -62,7 +62,7 @@ "Permite întotdeauna în această rețea" "Permite" "Remedierea erorilor wireless nu este permisă" - "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." + "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comută la utilizatorul principal." "Portul USB a fost dezactivat" "Pentru a proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVei primi o notificare când poți folosi din nou portul USB." "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" @@ -74,7 +74,7 @@ "Se salvează captura de ecran..." "Captură de ecran salvată" "Nu s-a putut salva captura de ecran" - "Pentru a salva captura de ecran, trebuie să deblocați dispozitivul" + "Pentru a salva captura de ecran, trebuie să deblochezi dispozitivul" "Încearcă să faci din nou o captură de ecran" "Nu se poate salva captura de ecran" "Crearea capturilor de ecran nu e permisă de aplicație sau de organizația ta" @@ -82,7 +82,7 @@ "Editează" "Editează captura de ecran" "Trimite captura de ecran" - "Surprindeți mai mult" + "Surprinde mai mult" "Închide captura de ecran" "Previzualizare a capturii de ecran" "Marginea de sus la %1$d %%" @@ -92,14 +92,14 @@ "Recorder pentru ecran" "Se procesează înregistrarea" "Notificare în curs pentru o sesiune de înregistrare a ecranului" - "Începeți înregistrarea?" + "Începi înregistrarea?" "În timpul înregistrării, sistemul Android poate captura informațiile sensibile vizibile pe ecran sau redate pe dispozitiv. Aici sunt incluse parole, informații de plată, fotografii, mesaje și conținut audio." - "Înregistrați conținut audio" + "Înregistrează audio" "Conținutul audio de la dispozitiv" "Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de sonerie" "Microfon" "Conținutul audio de la dispozitiv și microfon" - "Începeți" + "Începe" "Se înregistrează ecranul" "Se înregistrează ecranul și conținutul audio" "Afișează atingerile de pe ecran" @@ -136,7 +136,7 @@ "Chip autentificat" "Confirmat" "Atinge Confirm pentru a finaliza" - "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" + "Deblocat facial. Apasă pictograma Deblocare ca să continui." "Autentificat" "Folosește PIN-ul" "Folosește modelul" @@ -146,16 +146,16 @@ "Parolă greșită" "Prea multe încercări incorecte.\nÎncearcă din nou peste %d secunde." "Încearcă din nou. Încercarea %1$d din %2$d." - "Datele dvs. vor fi șterse" - "Dacă la următoarea încercare introduceți un model incorect, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți o parolă incorectă, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți un model incorect, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți un cod PIN incorect, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți o parolă incorectă, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți un model incorect, profilul de serviciu și datele sale vor fi șterse." - "Dacă la următoarea încercare introduceți un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." - "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." + "Datele tale vor fi șterse" + "Dacă la următoarea încercare introduci un model incorect, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci o parolă incorectă, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci un model incorect, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci un cod PIN incorect, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci o parolă incorectă, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci un model incorect, profilul de serviciu și datele sale vor fi șterse." + "Dacă la următoarea încercare introduci un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." + "Dacă la următoarea încercare introduci o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." "Atinge senzorul de amprente" "Pictograma amprentă" "Chipul nu a fost recunoscut. Folosește amprenta." @@ -285,21 +285,21 @@ "Serviciul NFC este dezactivat" "Serviciul NFC este activat" "Înregistrarea ecranului" - "Începeți" + "Începe" "Oprește" "Modul cu o mână" - "Deblocați microfonul dispozitivului?" - "Deblocați camera dispozitivului?" - "Deblocați camera și microfonul dispozitivului?" - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi microfonul." - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera." - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera sau microfonul." + "Deblochezi microfonul dispozitivului?" + "Deblochezi camera dispozitivului?" + "Deblochezi camera și microfonul dispozitivului?" + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi microfonul." + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera." + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera sau microfonul." "Microfonul este blocat" "Camera este blocată" "Microfonul și camera sunt blocate" - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Microfon activat pentru a permite accesul la microfon. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Cameră foto activată pentru a permite accesul la cameră. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Deblocat(ă) pentru a permite accesul. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Microfon activat pentru a permite accesul la microfon. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Cameră foto activată pentru a permite accesul la cameră. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Deblocat(ă) pentru a permite accesul. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." "Microfon disponibil" "Cameră foto disponibilă" "Microfon și cameră disponibile" @@ -314,16 +314,16 @@ "Atinge din nou" "Glisează în sus pentru a deschide" "Apasă pictograma de deblocare pentru a deschide" - "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" + "Deblocat facial. Apasă pictograma Deblocare ca să deschizi." - "Deplasați spre stânga" - "Deplasați în jos" - "Deplasați spre dreapta" - "Deplasați în sus" + "Mută la stânga" + "Mută în jos" + "Mută la dreapta" + "Mută în sus" "Glisează pentru a încerca din nou" "Deblochează pentru a folosi NFC" - "Dispozitivul aparține organizației dvs." + "Dispozitivul aparține organizației tale" "Acest dispozitiv aparține organizației %s" "Acest dispozitiv este oferit de %s" "Glisează dinspre telefon" @@ -353,13 +353,13 @@ Poți adăuga maximum %d de utilizatori. Poate fi creat doar un utilizator. - "Elimini utilizatorul?" + "Excluzi utilizatorul?" "Toate aplicațiile și datele acestui utilizator vor fi șterse." "Elimină" - "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." - "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." - "Începeți să înregistrați sau să proiectați?" - "Începeți să înregistrați sau să proiectați cu %s?" + "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai." + "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai." + "Începi să înregistrezi sau să proiectezi?" + "Începi să înregistrezi sau să proiectezi cu %s?" "Șterge toate notificările" "Gestionează" "Istoric" @@ -372,22 +372,22 @@ "Începe acum" "Nicio notificare" "Dispozitivul este gestionat de unul dintre părinți" - "Organizația dvs. deține acest dispozitiv și poate monitoriza traficul de rețea" + "Organizația ta deține acest dispozitiv și poate monitoriza traficul de rețea" "%1$s deține acest dispozitiv și poate monitoriza traficul din rețea" "Acest dispozitiv este oferit de %s" - "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin aplicația %1$s." + "Acest dispozitiv aparține organizației tale și e conectat la internet prin %1$s." "Acest dispozitiv aparține organizației %1$s și e conectat la internet prin %2$s." - "Dispozitivul aparține organizației dvs." + "Dispozitivul aparține organizației tale" "Acest dispozitiv aparține organizației %1$s" - "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin rețele VPN." + "Acest dispozitiv aparține organizației tale și e conectat la internet prin VPN-uri." "Acest dispozitiv aparține organizației %1$s și este conectat la internet prin rețele VPN." "E posibil ca organizația ta să monitorizeze traficul de rețea în profilul de serviciu" "E posibil ca %1$s să monitorizeze traficul de rețea din profilul tău de serviciu" "Adminul IT poate vedea profilul de serviciu" "Este posibil ca rețeaua să fie monitorizată" "Acest dispozitiv este conectat la internet prin rețele VPN." - "Aplicațiile dvs. pentru lucru sunt conectate la internet prin %1$s" - "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s." + "Aplicațiile pentru lucru sunt conectate la internet prin %1$s" + "Aplicațiile personale sunt conectate la internet prin %1$s." "Acest dispozitiv este conectat la internet prin aplicația %1$s." "Acest dispozitiv este oferit de %s" "Gestionarea dispozitivului" @@ -396,18 +396,18 @@ "Certificate CA" "Afișează politicile" "Vezi opțiunile" - "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." - "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." - "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." + "Dispozitivul aparține organizației %1$s.\n\nAdministratorul IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactează administratorul IT." + "E posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă ai întrebări, ia legătura cu %2$s." + "Dispozitivul aparține organizației tale.\n\nAdministratorul IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactează administratorul IT." "Organizația ta a instalat un certificat CA pe acest dispozitiv. Traficul de rețea securizat poate fi monitorizat sau modificat." "Organizația ta a instalat un certificat CA în profilul tău de serviciu. Traficul de rețea securizat poate fi monitorizat sau modificat." "Pe acest dispozitiv este instalat un certificat CA. Traficul de rețea securizat poate fi monitorizat sau modificat." "Administratorul tău a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul de pe dispozitivul tău." - "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul în profilul dvs. de serviciu, dar nu și în profilul personal." + "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul în profilul de serviciu, dar nu și în profilul personal." "Acest dispozitiv este conectat la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." "Acest dispozitiv este conectat la internet prin aplicațiile %1$s și %2$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." - "Aplicațiile dvs. pentru lucru sunt conectate la internet prin aplicația %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." - "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." + "Aplicațiile pentru lucru sunt conectate la internet prin %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." + "Aplicațiile personale sunt conectate la internet prin %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." " " "Deschide Setări VPN" "Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului." @@ -423,14 +423,14 @@ "Aplicația este fixată" "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Recente pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Acasă pentru a anula fixarea." - "Astfel rămâne afișată până anulați fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." + "Astfel rămâne afișată până anulezi fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." - "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Recente" - "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Acasă" - "Pentru a anula fixarea acestei aplicații, glisați în sus și mențineți" + "Pentru a anula fixarea acestei aplicații, atinge lung butoanele Înapoi și Recente" + "Pentru a anula fixarea acestei aplicații, atinge lung butoanele Înapoi și Acasă" + "Pentru a anula fixarea acestei aplicații, glisează în sus și menține" "Am înțeles" "Nu, mulțumesc" "Aplicație fixată" @@ -466,14 +466,14 @@ "Ethernet" "Alarmă" "Portofel" - "Configurați pentru a face achiziții mai rapide și mai sigure cu telefonul dvs." + "Configurează pentru a face achiziții mai rapide și mai sigure cu telefonul" "Afișează-le pe toate" "Atinge pentru a deschide" "Se actualizează" "Deblochează pentru a folosi" "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" - "Scanați codul QR" + "Scanează codul QR" "Profil de serviciu" "Mod Avion" "Nu vei auzi următoarea alarmă %1$s" @@ -504,7 +504,7 @@ "Fără sunet sau vibrații și apare în partea de jos a secțiunii de conversație" "Poate să sune sau să vibreze, în funcție de setările telefonului" "Poate să sune sau să vibreze, în funcție de setările telefonului. Conversațiile din balonul %1$s în mod prestabilit." - "Solicitați-i sistemului să stabilească dacă această notificare este sonoră sau cu vibrații." + "Solicită-i sistemului să stabilească dacă această notificare e sonoră sau cu vibrații." "<b>Stare:</b> promovată la prestabilită" "<b>Stare:</b> setată ca Silențioasă" "<b>Stare:</b> clasificată mai sus" @@ -646,8 +646,8 @@ "Afișează pictogramele de notificare cu prioritate redusă" "Altele" - "eliminați cardul" - "adăugați cardul la sfârșit" + "elimină cardul" + "adaugă cardul la sfârșit" "Mută cardul" "Adaugă un card" "Mută pe poziția %1$d" @@ -673,7 +673,7 @@ "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descarci/încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate." "Vezi pașii pentru îngrijire" "Telefonul se încălzește" - "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" + "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații." "Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." "Vezi pașii pentru îngrijire" "Deconectează încărcătorul" @@ -749,25 +749,25 @@ "Standby" "Fereastra de mărire" "Comenzi pentru fereastra de mărire" - "Măriți" - "Micșorați" - "Deplasați în sus" - "Deplasați în jos" - "Deplasați spre stânga" - "Deplasați spre dreapta" + "Mărește" + "Micșorează" + "Mută în sus" + "Mută în jos" + "Mută la stânga" + "Mută spre dreapta" "Comutator de mărire" - "Măriți tot ecranul" - "Măriți o parte a ecranului" + "Mărește tot ecranul" + "Mărește o parte a ecranului" "Comutator" - "Atingeți pentru a deschide funcțiile de accesibilitate. Personalizați sau înlocuiți butonul în Setări.\n\n""Afișați setările" + "Atinge ca să deschizi funcțiile de accesibilitate. Personalizează sau înlocuiește butonul în setări.\n\n""Vezi setările" "Mută butonul spre margine pentru a-l ascunde temporar" "Mută în stânga sus" "Mută în dreapta sus" "Mută în stânga jos" "Mută în dreapta jos" - "Mutați în afară și ascundeți" - "Mutați în afară și afișați" - "Activați / dezactivați" + "Mută la margine și ascunde" + "Mută de la margine și afișează" + "Activează / dezactivează" "Comenzile dispozitivelor" "Alege aplicația pentru a adăuga comenzi" @@ -779,30 +779,30 @@ "Marcată ca preferată" "Marcată ca preferată, poziția %d" "S-a anulat marcarea ca preferată" - "marcați ca preferată" - "anulați marcarea ca preferată" + "marchează ca preferată" + "anulează marcarea ca preferată" "Mută pe poziția %d" "Comenzi" "Alege comenzile de accesat din Setările rapide" - "Țineți apăsat și trageți pentru a rearanja comenzile" + "Ține apăsat și trage pentru a rearanja comenzile" "Au fost șterse toate comenzile" "Modificările nu au fost salvate" "Vezi alte aplicații" - "Comenzile nu au putut fi încărcate. Accesați aplicația %s pentru a vă asigura că setările aplicației nu s-au schimbat." + "Comenzile nu au putut fi încărcate. Accesează aplicația %s pentru a te asigura că setările aplicației nu s-au schimbat." "Nu sunt disponibile comenzi compatibile" "Altul" "Adaugă la comenzile dispozitivelor" "Adaugă" "Sugerat de %s" "Dispozitiv blocat" - "Vedeți și controlați dispozitivele de pe ecranul de blocare?" - "Puteți adăuga comenzi pentru dispozitivele externe pe ecranul de blocare.\n\nAplicația de pe dispozitiv vă poate da posibilitatea să controlați unele dispozitive fără să deblocați telefonul.\n\nPuteți face modificări oricând în Setări." - "Controlați dispozitivele de pe ecranul de blocare?" - "Puteți să controlați unele dispozitive fără să deblocați telefonul sau tableta.\n\nAplicația de pe dispozitiv stabilește dispozitivele care pot fi controlate astfel." + "Afișezi și controlezi dispozitivele de pe ecranul de blocare?" + "Poți adăuga comenzi pentru dispozitivele externe pe ecranul de blocare.\n\nAplicația de pe dispozitiv îți poate permite să controlezi unele dispozitive fără să deblochezi telefonul.\n\nPoți face modificări oricând în setări." + "Controlezi dispozitivele de pe ecranul de blocare?" + "Poți controla unele dispozitive fără să deblochezi telefonul sau tableta.\n\nAplicația de pe dispozitiv stabilește dispozitivele care pot fi controlate astfel." "Nu, mulțumesc" "Da" "Codul PIN conține litere sau simboluri" - "Verificați %s" + "Verifică %s" "Cod PIN greșit" "Introdu codul PIN" "Încearcă alt cod PIN" @@ -810,7 +810,7 @@ "Glisează pentru a vedea mai multe" "Se încarcă recomandările" "Media" - "Ascundeți comanda media pentru %1$s?" + "Ascunzi comanda media pentru %1$s?" "Sesiunea media actuală nu se poate ascunde." "Ascunde" "Reia" @@ -827,17 +827,17 @@ "Redă %1$s de la %2$s în %3$s" "Redă %1$s în %2$s" "Anulează" - "Apropiați-vă pentru a reda pe %1$s" - "Mergeți mai aproape de %1$s ca să redați acolo" + "Apropie-te pentru a reda pe %1$s" + "Apropie-te de %1$s ca să redai acolo" "Se redă pe %1$s" "A apărut o eroare. Încearcă din nou." - "Inactiv, verificați aplicația" + "Inactiv, verifică aplicația" "Nu s-a găsit" "Comanda este indisponibilă" - "Nu s-a putut accesa %1$s. Accesați aplicația %2$s pentru a vă asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." + "Nu s-a putut accesa %1$s. Accesează aplicația %2$s pentru a te asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." "Deschide aplicația" "Starea nu se poate încărca" - "Eroare, încercați din nou" + "Eroare, încearcă din nou" "Adaugă comenzi" "Editează comenzile" "Adaugă ieșiri" @@ -846,16 +846,16 @@ "S-au selectat %1$d dispozitive" "(deconectat)" "Nu se poate comuta. Atinge pentru a încerca din nou." - "Asociați un nou dispozitiv" - "Pentru a proiecta această sesiune, deschideți aplicația." + "Asociază un dispozitiv nou" + "Pentru a proiecta această sesiune, deschide aplicația." "Aplicație necunoscută" - "Nu mai proiectați" + "Nu mai proiecta" "Dispozitive disponibile pentru ieșire audio." "Volum" "Cum funcționează transmisia" - "Transmiteți" - "Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiteți" - "Ca să asculte transmisia dvs., persoanele din apropiere cu dispozitive Bluetooth compatibile vă pot scana codul QR sau pot folosi numele și parola transmisiei." + "Transmite" + "Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiți" + "Ca să-ți asculte transmisia, persoanele din apropiere cu dispozitive Bluetooth compatibile pot să îți scaneze codul QR sau să folosească numele și parola transmisiei." "Numele transmisiei" "Parolă" "Salvează" @@ -867,8 +867,8 @@ "Numărul versiunii s-a copiat în clipboard." "Deschide conversația" "Widgeturi pentru conversație" - "Atingeți o conversație ca să o adăugați pe ecranul de pornire" - "Conversațiile dvs. recente se vor afișa aici" + "Atinge o conversație ca să o adaugi pe ecranul de pornire" + "Conversațiile recente se vor afișa aici" "Conversații cu prioritate" "Conversații recente" "Acum %1$s zile" @@ -905,10 +905,10 @@ "Atinge pentru mai multe informații" "Nicio alarmă setată" "Senzor de amprentă" - "Autentificați-vă" + "autentifică-te" "Accesează dispozitivul" - "Folosiți amprenta ca să deschideți" - "Autentificare obligatorie. Atingeți senzorul de amprentă pentru a vă autentifica." + "Folosește amprenta ca să deschizi" + "Autentificare obligatorie. Atinge senzorul de amprentă pentru a te autentifica." "Apel telefonic în desfășurare" "Date mobile" "%1$s/%2$s" @@ -918,18 +918,18 @@ "Nu sunt disponibile alte rețele" "Nicio rețea disponibilă" "Wi-Fi" - "Atingeți o rețea pentru a vă conecta" + "Atinge o rețea pentru a te conecta" "Deblochează pentru a vedea rețelele" "Se caută rețele…" "Nu s-a realizat conexiunea la rețea" "Deocamdată, Wi-Fi nu se poate conecta automat" "Afișează-le pe toate" - "Pentru a schimba rețeaua, deconectați ethernet" - "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" + "Pentru a schimba rețeaua, deconectează ethernet" + "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi e dezactivată. Poți schimba opțiunea din setările pentru căutarea de rețele Wi-Fi. ""Schimbă" "Dezactivează modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" - "Adaugă un card" - "Nu adăugați un card" + "Adaugă cardul" + "Nu adăuga cardul" "Alege utilizatorul" %s aplicații sunt active @@ -938,7 +938,7 @@ "Informații noi" "Aplicații active" - "Aceste aplicații sunt active și rulează, chiar dacă nu le folosiți. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." + "Aceste aplicații sunt active și rulează, chiar dacă nu le folosești. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." "Oprește" "Oprită" "Gata" @@ -955,7 +955,7 @@ "Editor de clipboard" "Clipboard" "Previzualizarea imaginii" - "editați" + "editează" "Adaugă" "Gestionează utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 8a6c3671d5ea..b23b50aaa189 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -633,7 +633,7 @@ "Pravý kód klávesnice" "Ľavá ikona" "Pravá ikona" - "Pridržaním a presunutím pridáte dlaždice" + "Pridržaním a presunutím pridáte karty" "Dlaždice môžete usporiadať pridržaním a presunutím" "Presunutím sem odstránite" "Minimálny počet vyžadovaných dlaždíc: %1$d" -- cgit v1.2.3 From 55ea56c064bec03dc1d95644d3bfd6bfd10a6886 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 14:09:44 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5cae19913751f47ee81d88ed85e5e9d7753ce142 --- packages/SystemUI/res/values-es/tiles_states_strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml index 7d8be488c5c5..66ebf5a3eede 100644 --- a/packages/SystemUI/res/values-es/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml @@ -58,12 +58,12 @@ "No disponible" - "Desactivada" + "Desactivado" "Activado" "No disponible" - "Desactivada" + "Desactivado" "Activado" -- cgit v1.2.3 From 061ecac3c064ab3484d5dcb740734ac36cb2559e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 18:11:38 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I33190356fb8e8b072c2df8524c930eec037a4531 --- packages/SettingsLib/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index b667fc0519b2..a47b5283a89c 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -247,7 +247,7 @@ "Appareils associés" "Actuellement connecté" "Infos sur l\'appareil" - "Retirer" + "Supprimer" "Empreinte de l\'appareil : %1$s" "Échec de la connexion" "Vérifiez que l\'appareil %1$s est connecté au bon réseau" -- cgit v1.2.3 From 34f2c9297723a7f11bdbca55fa2fb452c8d7a29b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 29 Sep 2022 18:16:24 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4e561b7e4b32b0795c14178878762c4222708560 --- packages/SettingsLib/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index b667fc0519b2..a47b5283a89c 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -247,7 +247,7 @@ "Appareils associés" "Actuellement connecté" "Infos sur l\'appareil" - "Retirer" + "Supprimer" "Empreinte de l\'appareil : %1$s" "Échec de la connexion" "Vérifiez que l\'appareil %1$s est connecté au bon réseau" -- cgit v1.2.3 From aa170108bd27f0d694241d7a5875c9e326283ce1 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 31 Aug 2022 12:58:41 -0400 Subject: Lower per-app notificationchannel limit Test: PreferencesHelperTest Bug: 240422263 Change-Id: I8c12e3fc73e4a88842af275feaf2acffcced0402 Merged-In: I8c12e3fc73e4a88842af275feaf2acffcced0402 (cherry picked from commit f528b337dd48b7e8071269e07e610bd4a3668c75) --- .../core/java/com/android/server/notification/PreferencesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 185c0231b534..72b75f3e80d1 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -97,7 +97,7 @@ public class PreferencesHelper implements RankingConfig { private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":"; @VisibleForTesting - static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000; + static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; -- cgit v1.2.3 From 36acdd675890296151b7a99e05fa7436d59a289b Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 31 Aug 2022 12:58:41 -0400 Subject: Lower per-app notificationchannel limit Test: PreferencesHelperTest Bug: 240422263 Change-Id: I8c12e3fc73e4a88842af275feaf2acffcced0402 (cherry picked from commit f528b337dd48b7e8071269e07e610bd4a3668c75) Merged-In: I8c12e3fc73e4a88842af275feaf2acffcced0402 --- .../core/java/com/android/server/notification/PreferencesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index d5d5308015c7..c6cb3c0d2ab7 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -97,7 +97,7 @@ public class PreferencesHelper implements RankingConfig { private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":"; @VisibleForTesting - static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000; + static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; -- cgit v1.2.3 From 3b0929a30dd3e1302c90e96e809becc381986999 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 31 Aug 2022 12:58:41 -0400 Subject: Lower per-app notificationchannel limit Test: PreferencesHelperTest Bug: 240422263 Change-Id: I8c12e3fc73e4a88842af275feaf2acffcced0402 Merged-In: I8c12e3fc73e4a88842af275feaf2acffcced0402 (cherry picked from commit f528b337dd48b7e8071269e07e610bd4a3668c75) --- .../core/java/com/android/server/notification/PreferencesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 185c0231b534..72b75f3e80d1 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -97,7 +97,7 @@ public class PreferencesHelper implements RankingConfig { private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":"; @VisibleForTesting - static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000; + static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; -- cgit v1.2.3 From 34683275498914ece5ee9435846b7b429ccfc964 Mon Sep 17 00:00:00 2001 From: Hani Kazmi Date: Tue, 27 Sep 2022 10:19:45 +0000 Subject: Update Parcel readLazyValue to ignore negative object lengths Addresses a security vulnerability where a (-8) length object would cause dataPosition to be reset back to the statt of the value, and be re-read again. Bug: 240138294 Test: atest ParcelTest BundleTest AmbiguousBundlesTest Test: manually ran PoC Change-Id: I1ab1df6f2a802d8cdf02c89c12959b09d7b1a5c4 Merged-In: I1ab1df6f2a802d8cdf02c89c12959b09d7b1a5c4 --- core/java/android/os/Parcel.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 3d701389a98e..a7349f9e473e 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -4388,6 +4388,9 @@ public final class Parcel { int type = readInt(); if (isLengthPrefixed(type)) { int objectLength = readInt(); + if (objectLength < 0) { + return null; + } int end = MathUtils.addOrThrow(dataPosition(), objectLength); int valueLength = end - start; setDataPosition(end); -- cgit v1.2.3 From ba27731d04d95bf4b17c41a5d85aac09c39b9329 Mon Sep 17 00:00:00 2001 From: Hao Ke Date: Tue, 4 Oct 2022 19:43:58 +0000 Subject: Add safety checks on KEY_INTENT mismatch. For many years, Parcel mismatch typed exploits has been using the AccoungManagerService's passing of KEY_INTENT workflow, as a foothold of launching arbitrary intents. We are adding an extra check on the service side to simulate the final deserialization of the KEY_INTENT value, to make sure the client side won't get a mismatched KEY_INTENT value. Bug: 250588548 Bug: 240138294 Test: atest CtsAccountManagerTestCases Test: local test, also see b/250588548 Change-Id: I433e34f6e21ce15c89825044a15b1dec46bb25cc --- .../server/accounts/AccountManagerService.java | 34 +++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 2c465f44aa99..cc94a9a9acf0 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -89,6 +89,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.stats.devicepolicy.DevicePolicyEnums; import android.text.TextUtils; +import android.util.EventLog; import android.util.Log; import android.util.Pair; import android.util.Slog; @@ -3100,7 +3101,7 @@ public class AccountManagerService */ if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; @@ -3519,7 +3520,7 @@ public class AccountManagerService && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; @@ -4870,7 +4871,13 @@ public class AccountManagerService * into launching arbitrary intents on the device via by tricking to click authenticator * supplied entries in the system Settings app. */ - protected boolean checkKeyIntent(int authUid, Intent intent) { + protected boolean checkKeyIntent(int authUid, Bundle bundle) { + if (!checkKeyIntentParceledCorrectly(bundle)) { + EventLog.writeEvent(0x534e4554, "250588548", authUid, ""); + return false; + } + + Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT, Intent.class); // Explicitly set an empty ClipData to ensure that we don't offer to // promote any Uris contained inside for granting purposes if (intent.getClipData() == null) { @@ -4905,6 +4912,25 @@ public class AccountManagerService } } + /** + * Simulate the client side's deserialization of KEY_INTENT value, to make sure they don't + * violate our security policy. + * + * In particular we want to make sure the Authenticator doesn't trick users + * into launching arbitrary intents on the device via exploiting any other Parcel read/write + * mismatch problems. + */ + private boolean checkKeyIntentParceledCorrectly(Bundle bundle) { + Parcel p = Parcel.obtain(); + p.writeBundle(bundle); + p.setDataPosition(0); + Bundle simulateBundle = p.readBundle(); + p.recycle(); + Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT, Intent.class); + return (intent.filterEquals(simulateBundle.getParcelable(AccountManager.KEY_INTENT, + Intent.class))); + } + private boolean isExportedSystemActivity(ActivityInfo activityInfo) { String className = activityInfo.name; return "android".equals(activityInfo.packageName) && @@ -5051,7 +5077,7 @@ public class AccountManagerService && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; -- cgit v1.2.3 From eb9a0566a583fa13f8aff671c41f78a9e33eab82 Mon Sep 17 00:00:00 2001 From: Hao Ke Date: Tue, 4 Oct 2022 19:43:58 +0000 Subject: Add safety checks on KEY_INTENT mismatch. For many years, Parcel mismatch typed exploits has been using the AccoungManagerService's passing of KEY_INTENT workflow, as a foothold of launching arbitrary intents. We are adding an extra check on the service side to simulate the final deserialization of the KEY_INTENT value, to make sure the client side won't get a mismatched KEY_INTENT value. Bug: 250588548 Bug: 240138294 Test: atest CtsAccountManagerTestCases Test: local test, also see b/250588548 Change-Id: I433e34f6e21ce15c89825044a15b1dec46bb25cc --- .../server/accounts/AccountManagerService.java | 34 +++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 67cea2060cbf..36b202b980f3 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -87,6 +87,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; +import android.util.EventLog; import android.util.Log; import android.util.Pair; import android.util.Slog; @@ -3000,7 +3001,7 @@ public class AccountManagerService */ if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; @@ -3410,7 +3411,7 @@ public class AccountManagerService && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; @@ -4770,7 +4771,13 @@ public class AccountManagerService * into launching arbitrary intents on the device via by tricking to click authenticator * supplied entries in the system Settings app. */ - protected boolean checkKeyIntent(int authUid, Intent intent) { + protected boolean checkKeyIntent(int authUid, Bundle bundle) { + if (!checkKeyIntentParceledCorrectly(bundle)) { + EventLog.writeEvent(0x534e4554, "250588548", authUid, ""); + return false; + } + + Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); // Explicitly set an empty ClipData to ensure that we don't offer to // promote any Uris contained inside for granting purposes if (intent.getClipData() == null) { @@ -4807,6 +4814,25 @@ public class AccountManagerService } } + /** + * Simulate the client side's deserialization of KEY_INTENT value, to make sure they don't + * violate our security policy. + * + * In particular we want to make sure the Authenticator doesn't trick users + * into launching arbitrary intents on the device via exploiting any other Parcel read/write + * mismatch problems. + */ + private boolean checkKeyIntentParceledCorrectly(Bundle bundle) { + Parcel p = Parcel.obtain(); + p.writeBundle(bundle); + p.setDataPosition(0); + Bundle simulateBundle = p.readBundle(); + p.recycle(); + Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); + Intent simulateIntent = simulateBundle.getParcelable(AccountManager.KEY_INTENT); + return (intent.filterEquals(simulateIntent)); + } + private boolean isExportedSystemActivity(ActivityInfo activityInfo) { String className = activityInfo.name; return "android".equals(activityInfo.packageName) && @@ -4953,7 +4979,7 @@ public class AccountManagerService && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { if (!checkKeyIntent( Binder.getCallingUid(), - intent)) { + result)) { onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "invalid intent in bundle returned"); return; -- cgit v1.2.3 From e1f343acdeeddd9a08c9f6c832faf788ce101763 Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Wed, 5 Oct 2022 16:28:20 -0700 Subject: Disable all A11yServices from an uninstalled package. Previous logic would exit the loop after removing the first service matching the uninstalled package. Bug: 243378132 Test: atest AccessibilityEndToEndTest Test: m sts; sts-tradefed run sts-dynamic-develop -m \ CtsAccessibilityServiceTestCases Change-Id: I4ba30345d8600674ee8a9ea3ff411aecbf3655a3 --- .../accessibility/AccessibilityManagerService.java | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e095e9e8d0c0..697d2f0c7659 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -456,25 +456,27 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub userState.mBindingServices.removeIf(filter); userState.mCrashedServices.removeIf(filter); final Iterator it = userState.mEnabledServices.iterator(); + boolean anyServiceRemoved = false; while (it.hasNext()) { final ComponentName comp = it.next(); final String compPkg = comp.getPackageName(); if (compPkg.equals(packageName)) { it.remove(); - // Update the enabled services setting. - persistComponentNamesToSettingLocked( - Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, - userState.mEnabledServices, userId); - // Update the touch exploration granted services setting. userState.mTouchExplorationGrantedServices.remove(comp); - persistComponentNamesToSettingLocked( - Settings.Secure. - TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, - userState.mTouchExplorationGrantedServices, userId); - onUserStateChangedLocked(userState); - return; + anyServiceRemoved = true; } } + if (anyServiceRemoved) { + // Update the enabled services setting. + persistComponentNamesToSettingLocked( + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, + userState.mEnabledServices, userId); + // Update the touch exploration granted services setting. + persistComponentNamesToSettingLocked( + Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, + userState.mTouchExplorationGrantedServices, userId); + onUserStateChangedLocked(userState); + } } } -- cgit v1.2.3 From 37966299859153377e61a6a97b036388d231c2d0 Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Wed, 5 Oct 2022 16:28:20 -0700 Subject: RESTRICT AUTOMERGE Disable all A11yServices from an uninstalled package. Previous logic would exit the loop after removing the first service matching the uninstalled package. Bug: 243378132 Test: atest AccessibilityEndToEndTest Test: m sts; sts-tradefed run sts-dynamic-develop -m \ CtsAccessibilityServiceTestCases Change-Id: I4ba30345d8600674ee8a9ea3ff411aecbf3655a3 --- .../accessibility/AccessibilityManagerService.java | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 3ca6bf421fae..92c06d4b2d39 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -427,26 +427,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } UserState userState = getUserStateLocked(userId); Iterator it = userState.mEnabledServices.iterator(); + boolean anyServiceRemoved = false; while (it.hasNext()) { ComponentName comp = it.next(); String compPkg = comp.getPackageName(); if (compPkg.equals(packageName)) { it.remove(); userState.mBindingServices.remove(comp); - // Update the enabled services setting. - persistComponentNamesToSettingLocked( - Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, - userState.mEnabledServices, userId); - // Update the touch exploration granted services setting. userState.mTouchExplorationGrantedServices.remove(comp); - persistComponentNamesToSettingLocked( - Settings.Secure. - TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, - userState.mTouchExplorationGrantedServices, userId); - onUserStateChangedLocked(userState); - return; + anyServiceRemoved = true; } } + if (anyServiceRemoved) { + // Update the enabled services setting. + persistComponentNamesToSettingLocked( + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, + userState.mEnabledServices, userId); + // Update the touch exploration granted services setting. + persistComponentNamesToSettingLocked( + Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, + userState.mTouchExplorationGrantedServices, userId); + onUserStateChangedLocked(userState); + } } } -- cgit v1.2.3 From da9e46a91ce7722b33f6e07eb74de5ff43f0aa7b Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Wed, 28 Sep 2022 19:33:49 +0000 Subject: docs: Update READ_EXTERNAL_STORAGE explanation * Mention that T+ apps need to request media-specific permissions, instead of READ_EXTERNAL_STORAGE, to access other apps' media files * Add information about how scoped storage reduces the need for apps to declare this permission * Remove errant note about WRITE_EXTERNAL_STORAGE implicitly granting READ_EXTERNAL_STORAGE -- the converse is true Bug: 249520024 Change-Id: I03c354ab878090c0179382dd77014ba70cd7d17f Test: built docs using go/abtd --- core/res/AndroidManifest.xml | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index bc29e1995714..962b6156b6a1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1035,25 +1035,38 @@ android:priority="900" /> "%s-reserve for anrop" @@ -516,14 +516,14 @@ "Lar appen endre innstillingene for nettverkstilknytning." "endre tilknytningsoppsett" "Lar appen endre innstillingene for delt nettforbindelse." - "se Wi-Fi-tilkoblinger" - "Lar appen se informasjon om Wi-Fi-nettverk, f.eks. hvorvidt Wi-Fi er aktivert og navn på tilkoblede Wi-Fi-enheter." - "koble til og fra Wi-Fi" - "Lar appen koble til og fra Wi-Fi-tilgangspunkter, og å gjøre endringer i enhetens konfigurasjon for Wi-Fi-nettverk." + "se Wifi-tilkoblinger" + "Lar appen se informasjon om Wifi-nettverk, f.eks. hvorvidt Wifi er aktivert og navn på tilkoblede Wifi-enheter." + "koble til og fra wifi" + "Lar appen koble til og fra wifi-tilgangspunkter, og å gjøre endringer i enhetens konfigurasjon for wifi-nettverk." "tillate multicast for trådløse nettverk" - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, ikke bare Android TV-enheten din. Dette bruker mer strøm enn modus uten multikasting." - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, ikke bare Android TV-enheten din. Dette bruker mer strøm enn modus uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." "endre Bluetooth-innstillinger" "Lar appen konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter." "Lar appen konfigurere Bluetooth på Android TV-enheten din samt oppdage og koble sammen med eksterne enheter." @@ -546,8 +546,8 @@ "Lar appen vise annonser til Bluetooth-enheter i nærheten" "fastslå relativ posisjon mellom enheter som bruker ultrabredbånd" "tillate at appen fastslår den relative posisjonen mellom enheter i nærheten som bruker ultrabredbånd" - "samhandle med Wi-Fi-enheter i nærheten" - "Lar appen annonsere, koble til og fastslå den relative posisjonen til Wi-Fi-enheter i nærheten" + "samhandle med wifi-enheter i nærheten" + "Lar appen annonsere, koble til og fastslå den relative posisjonen til wifi-enheter i nærheten" "Informasjon om prioritert NFC-betalingstjeneste" "Gir appen tilgang til informasjon om prioritert NFC-betalingstjeneste, for eksempel registrerte hjelpemidler og destinasjon." "kontroller overføring av data med NFC-teknologi" @@ -1285,7 +1285,7 @@ "Alarmlyder" "Varsellyder" "Ukjent" - "Logg på Wi-Fi-nettverket" + "Logg på Wifi-nettverket" "Logg på nettverk" @@ -1568,10 +1568,10 @@ "Varsel om databruk" "Du har brukt %s med data" "Grensen for mobildata er nådd" - "Datagrensen for Wi-Fi er nådd" + "Datagrensen for wifi er nådd" "Data er på pause i resten av syklusen" "Over grensen for mobildata" - "Over grensen din for Wi-Fi-data" + "Over grensen din for wifi-data" "Du er %s over den angitte grensen din" "Bakgrunnsdata er begrenset" "Trykk for å fjerne begrensningen." diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index bd93bfe1b01d..72b77f16aa58 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -296,7 +296,7 @@ "%1$s, %2$s" "Modo de segurança" "Sistema Android" - "Deslize até o perfil pessoal" + "Mudar para o perfil pessoal" "Perfil de trabalho" "Contatos" "acesse seus contatos" @@ -740,7 +740,7 @@ "Permite que o proprietário use serviços da operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." - "iniciar uso da permissão para visualização" + "começar a usar a permissão para ver" "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "decisões de permissão da visualização inicial" "Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais." diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 25010a3df4e8..85b37c004684 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -164,7 +164,7 @@ "Não foi possível autenticar." "A autenticação através do servidor proxy falhou." "Não foi possível ligar ao servidor." - "Não foi possível comunicar com o servidor. Tente novamente mais tarde." + "Não foi possível comunicar com o servidor. Tente mais tarde." "Esgotou o tempo limite da ligação ao servidor." "A página contém demasiados redireccionamentos do servidor." "O protocolo não é suportado." @@ -172,7 +172,7 @@ "Não foi possível abrir a página porque o URL é inválido." "Não foi possível aceder ao ficheiro." "Não foi possível localizar o ficheiro solicitado." - "Existem demasiados pedidos em processamento. Tente novamente mais tarde." + "Existem demasiados pedidos em processamento. Tente mais tarde." "Erro de início de sessão de %1$s" "Sincronização" "Não é possível sincronizar" @@ -608,7 +608,7 @@ "Foi atingido o limite de tempo da impressão digital. Tente novamente." "Operação de impressão digital cancelada." "Operação de impressão digital cancelada pelo utilizador." - "Demasiadas tentativas. Tente novamente mais tarde." + "Demasiadas tentativas. Tente mais tarde." "Demasiadas tentativas. Sensor de impressões digitais desativado." "Tente novamente." "Nenhuma impressão digital registada." @@ -662,7 +662,7 @@ "Não pode guardar novos dados de rostos. Elimine um antigo." "Operação de rosto cancelada." "Desbloqueio facial cancelado pelo utilizador" - "Demasiadas tentativas. Tente novamente mais tarde." + "Demasiadas tentativas. Tente mais tarde." "Demasiadas tentativas. O Desbloqueio facial foi desativado." "Demasiadas tentativas. Em alternativa, introduza o bloqueio de ecrã." "Não é possível validar o rosto. Tente novamente." @@ -1828,7 +1828,7 @@ "Crie um PIN para modificar as restrições" "Os PINs não correspondem. Tente novamente." "O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos." - "Tente novamente mais tarde" + "Tente mais tarde" "Visualização de ecrã inteiro" "Para sair, deslize rapidamente para baixo a partir da parte superior." "OK" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index bd93bfe1b01d..72b77f16aa58 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -296,7 +296,7 @@ "%1$s, %2$s" "Modo de segurança" "Sistema Android" - "Deslize até o perfil pessoal" + "Mudar para o perfil pessoal" "Perfil de trabalho" "Contatos" "acesse seus contatos" @@ -740,7 +740,7 @@ "Permite que o proprietário use serviços da operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." - "iniciar uso da permissão para visualização" + "começar a usar a permissão para ver" "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "decisões de permissão da visualização inicial" "Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais." diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index f7b1da4bc900..92f80ef08c79 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1943,10 +1943,10 @@ "Настройки телефона недоступны" "Эта функция недоступна на устройстве %1$s. Используйте Android TV." "Эта функция недоступна на устройстве %1$s. Используйте планшет." - "Эта функция недоступна на устройстве %1$s. Используйте телефон." + "На устройстве %1$s эта функция недоступна. Используйте телефон." "Эта функция пока недоступна на устройстве %1$s. Используйте Android TV." "Эта функция пока недоступна на устройстве %1$s. Используйте планшет." - "Эта функция пока недоступна на устройстве %1$s. Используйте телефон." + "На устройстве %1$s эта функция пока недоступна. Используйте телефон." "Это приложение запрашивает дополнительные меры защиты. Используйте Android TV." "Это приложение запрашивает дополнительные меры защиты. Используйте планшет." "Это приложение запрашивает дополнительные меры защиты. Используйте телефон." @@ -2281,7 +2281,7 @@ "\"%1$s\" работает в фоновом режиме. Нажмите, чтобы изменить настройки, связанные с расходом заряда батареи." "Приложение \"%1$s\" может влиять на время работы батареи. Нажмите, чтобы увидеть активные приложения." "Проверить активные приложения" - "У устройства \"%1$s\" нет доступа к камере телефона." + "У устройства %1$s нет доступа к камере телефона." "У устройства \"%1$s\" нет доступа к камере планшета." "Системные настройки по умолчанию" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 8b3768c3642d..b5b6e0fee962 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1943,13 +1943,13 @@ "Nastavenia telefónu nie sú k dispozícii" "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť zariadenie Android TV." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť tablet." - "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť telefón." + "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste použiť telefón." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť zariadenie Android TV." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť tablet." - "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť telefón." + "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste použiť telefón." "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť zariadenie Android TV." "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť tablet." - "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť telefón." + "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste použiť telefón." "Táto aplikácia bola zostavená pre staršiu verziu Androidu a nemusí správne fungovať. Skúste skontrolovať dostupnosť aktualizácií alebo kontaktovať vývojára." "Skontrolovať dostupnosť aktualizácie" "Máte nové správy." diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 39f317adfa7f..a8e75df758fb 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1939,12 +1939,12 @@ "Mipangilio ya Android TV haipatikani" "Mipangilio ya kompyuta kibao haipatikani" "Mipangilio ya simu haipatikani" - "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kifaa chako cha Android TV." + "Huwezi kuifikia kwenye %1$s. Ijaribu kwenye kifaa chako cha Android TV." "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kompyuta yako kibao." - "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye simu yako." + "Huwezi kuifikia kwenye %1$s. Ijaribu kwenye simu yako." "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kifaa chako cha Android TV." "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kompyuta yako kibao." - "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye simu yako." + "Huwezi kuifikia kwenye %1$s kwa wakati huu. Ijaribu kwenye simu yako." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kifaa chako cha Android TV." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kompyuta yako kibao." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye simu yako." diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 4332b50e7871..e576522b0940 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -499,7 +499,7 @@ "వాల్‌పేపర్‌ను సెట్ చేయడం" "సిస్టమ్ వాల్‌పేపర్‌ను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "మీ వాల్‌పేపర్ పరిమాణాన్ని సర్దుబాటు చేయడం" - "సిస్టమ్ వాల్‌పేపర్ పరిమాణం సూచనలను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "సిస్టమ్ వాల్‌పేపర్ సైజ్‌ సూచనలను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "సమయ మండలిని సెట్ చేయడం" "టాబ్లెట్ యొక్క సమయ మండలిని మార్చడానికి యాప్‌ను అనుమతిస్తుంది." "మీ Android TV పరికరం సమయ మండలిని మార్చడానికి యాప్‌ని అనుమతిస్తుంది." @@ -1438,7 +1438,7 @@ "తొలగిస్తోంది…" "ఫార్మాట్ చేస్తోంది..." "చొప్పించబడలేదు" - "సరిపోలే కార్యాచరణలు కనుగొనబడలేదు." + "మ్యాచ్ అయ్యే కార్యాచరణలు కనుగొనబడలేదు." "మీడియా అవుట్‌పుట్‌ను మళ్లించడం" "మీడియా అవుట్‌పుట్‌ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్‌స్టాల్ సెషన్‌లను చదవడం" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 3c030a78aace..1578baba3a6d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1554,7 +1554,7 @@ "滑动手柄。触摸并按住。" "滑动解锁。" "导航首页" - "向上导航" + "返回" "更多选项" "%1$s:%2$s" "%1$s - %2$s:%3$s" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 76bccc862d74..bff44e6955ac 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1940,10 +1940,10 @@ "無法使用平板電腦設定" "無法使用手機設定" "無法在 %1$s 上存取這個應用程式,請改用 Android TV 裝置。" - "無法在 %1$s 上存取這個應用程式,請改用平板電腦。" + "無法在 %1$s 上存取這個項目,請改用平板電腦。" "無法在 %1$s 上存取這個應用程式,請改用手機。" "目前無法在 %1$s 上存取這個應用程式,請改用 Android TV 裝置。" - "目前無法在 %1$s 上存取這個應用程式,請改用平板電腦。" + "目前無法在 %1$s 上存取這個項目,請改用平板電腦。" "目前無法在 %1$s 上存取這個應用程式,請改用手機。" "這個應用程式要求進行額外的安全性驗證,請改用 Android TV 裝置。" "這個應用程式要求進行額外的安全性驗證,請改用平板電腦。" -- cgit v1.2.3 From 081431a65ee60380f33b719ea7b928eb88856537 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 13:34:34 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I77ed394f4a2e52b39e5b511a0ce5ade0f0117d38 --- core/res/res/values-ar/strings.xml | 4 +- core/res/res/values-as/strings.xml | 10 +- core/res/res/values-be/strings.xml | 2 +- core/res/res/values-ca/strings.xml | 14 +- core/res/res/values-da/strings.xml | 8 +- core/res/res/values-el/strings.xml | 2 +- core/res/res/values-es-rUS/strings.xml | 4 +- core/res/res/values-es/strings.xml | 4 +- core/res/res/values-et/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 20 +- core/res/res/values-fa/strings.xml | 6 +- core/res/res/values-fr-rCA/strings.xml | 14 +- core/res/res/values-fr/strings.xml | 4 +- core/res/res/values-gl/strings.xml | 4 +- core/res/res/values-hi/strings.xml | 6 +- core/res/res/values-it/strings.xml | 2 +- core/res/res/values-iw/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 4 +- core/res/res/values-lv/strings.xml | 2 +- core/res/res/values-nb/strings.xml | 32 +-- core/res/res/values-pt-rBR/strings.xml | 4 +- core/res/res/values-pt-rPT/strings.xml | 12 +- core/res/res/values-pt/strings.xml | 4 +- core/res/res/values-ro/strings.xml | 450 ++++++++++++++++----------------- core/res/res/values-ru/strings.xml | 6 +- core/res/res/values-sk/strings.xml | 6 +- core/res/res/values-sw/strings.xml | 12 +- core/res/res/values-te/strings.xml | 4 +- core/res/res/values-vi/strings.xml | 4 +- core/res/res/values-zh-rCN/strings.xml | 2 +- core/res/res/values-zh-rTW/strings.xml | 4 +- 31 files changed, 327 insertions(+), 327 deletions(-) diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 35be8cac1ed5..989849d3e039 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -514,7 +514,7 @@ "للسماح للتطبيق بالحصول على قائمة بالحسابات التي يعرفها الهاتف. وقد يتضمن ذلك أي حسابات تم إنشاؤها بواسطة التطبيقات التي ثبتها." "عرض اتصالات الشبكة" "للسماح للتطبيق بعرض معلومات حول اتصالات الشبكة كعرض معلومات عن الشبكات المتوفرة والشبكات المتصلة." - "حق الوصول الكامل إلى الشبكة" + "الإذن بالوصول الكامل إلى الشبكة" "للسماح للتطبيق بإنشاء مقابس شبكات واستخدام بروتوكولات شبكات مخصصة. ويوفر المتصفح وتطبيقات أخرى طرقًا لإرسال البيانات إلى الإنترنت، ولذلك لا يعد هذا الإذن مطلوبًا لإرسال البيانات إلى الإنترنت." "تغيير اتصال الشبكة" "للسماح للتطبيق بتغيير حالة اتصال الشبكة." @@ -1264,7 +1264,7 @@ "نَسْخ الذاكرة %1$s جاهز" "تم جمع مقدار كبير من بيانات الذاكرة. انقر للمشاركة." "هل تريد مشاركة نَسْخ الذاكرة؟" - "تجاوزت عملية %1$s حد الذاكرة المخصص لها وقدره %2$s، ويتوفر نَسْخ للذاكرة لمشاركته مع مطور برامج العملية ولكن توخ الحذر حيث قد يحتوي نَسْخ الذاكرة هذا على معلومات شخصية يملك التطبيق حق الوصول إليها." + "تجاوزت عملية %1$s حد الذاكرة المخصص لها وقدره %2$s، ويتوفر نَسْخ للذاكرة لمشاركته مع مطور برامج العملية ولكن توخ الحذر حيث قد يحتوي نَسْخ الذاكرة هذا على معلومات شخصية يملك التطبيق الإذن بالوصول إليها." "تجاوزت عملية %1$s القيد المفروض على الذاكرة الذي يبلغ %2$s. ويتوفّر نَسْخ ذاكرة يمكنك مشاركته. تحذير: قد يحتوي نَسْخ الذاكرة هذا على معلومات شخصية حسّاسة يمكن للعملية الوصول إليها، وقد يتضمن معلومات سبق لك كتابتها." "يتوفّر نَسْخ ذاكرة من عملية %1$s حتى تتمكّن من مشاركته. تحذير: قد يحتوي نَسْخ الذاكرة هذا على معلومات شخصية حسّاسة يمكن للعملية الوصول إليها، وقد يتضمن معلومات سبق لك كتابتها." "اختيار إجراء للنص" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 09c1870feb40..29c0a9540a98 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -437,8 +437,8 @@ "এই এপটোৱে আপোনাৰ টেবলেটত কেলেণ্ডাৰ কাৰ্যক্ৰম যোগ কৰিব, আঁতৰাব বা সলনি কৰিব পাৰে। ই এনে বাৰ্তা পঠিয়াব পাৰে যিবোৰ কেলেণ্ডাৰৰ গৰাকীৰ পৰা অহা যেন লাগিব বা ই গৰাকীক নজনোৱাকৈ কাৰ্যক্ৰম সলনি কৰিব পাৰে৷" "এই এপ্‌টোৱে আপোনাৰ Android TV ডিভাইচত কেলেণ্ডাৰ অনুষ্ঠানবোৰ যোগ দিব, আঁতৰাব অথবা সলনি কৰিব পাৰে। এই এপ্‌টোৱে এনে বাৰ্তা পঠিয়াব পাৰে যিবোৰ কেলেণ্ডাৰৰ গৰাকীৰ পৰা অহা বুলি প্ৰদর্শিত হ’ব পাৰে অথবা এইটোৱে গৰাকীসকলক নজনোৱাকৈ অনুষ্ঠানবোৰ সলনি কৰিব পাৰে।" "এই এপে আপোনাৰ ফ\'নৰ কেলেণ্ডাৰত কার্যক্ৰম যোগ দিব, আঁতৰাব বা সলনি কৰিব পাৰে। ই এনে বাৰ্তা পঠিয়াব পাৰে যিবোৰ কেলেণ্ডাৰৰ গৰাকীৰ পৰা অহা যেন লাগে বা ই গৰাকীক নজনোৱাকৈ কাৰ্যক্ৰম সলনি কৰিব পাৰে৷" - "অতিৰিক্ত অৱস্থান দেখুওৱা নির্দেশত প্ৰৱেশ কৰক" - "অৱস্থানৰ অতিৰিক্ত নির্দেশনাসমূহত প্ৰৱেশ কৰিবলৈ এপক অনুমতি দিয়ে। ইয়ে এপটোক জিপিএছ বা অন্য অৱস্থান উৎসসমূহৰ কাৰ্যকলাপত হস্তক্ষেপ কৰাৰ সুযোগ দিব পাৰে।" + "অতিৰিক্ত অৱস্থান প্ৰদানকাৰী নির্দেশসমূহ এক্সেছ কৰে" + "অৱস্থানৰ অতিৰিক্ত নির্দেশনাসমূহ এক্সেছ কৰিবলৈ এপক অনুমতি দিয়ে। ই এপ্‌টোক জিপিএছ বা অন্য অৱস্থান উৎসসমূহৰ কাৰ্যকলাপত হস্তক্ষেপ কৰাৰ সুযোগ দিব পাৰে।" "কেৱল অগ্ৰভূমিত অৱস্থানৰ সঠিক তথ্য পাওক" "এই এপ্‌টো ব্যৱহাৰ হৈ থকা অৱস্থাত ই অৱস্থান সেৱাসমূহৰ পৰা আপোনাৰ সঠিক অৱস্থান লাভ কৰিব পাৰে। এপ্‌টোৱে অৱস্থান লাভ কৰিবলৈ হ’লে আপোনাৰ ডিভাইচৰ অৱস্থান সেৱাসমূহ অন কৰি ৰাখিবই লাগিব। ইয়াৰ ফলত বেটাৰীৰ ব্যৱহাৰ বাঢ়িব পাৰে।" "কেৱল অগ্ৰভূমিত আনুমানিক অৱস্থান এক্সেছ কৰক" @@ -713,7 +713,7 @@ "এপটোক নেটৱৰ্ক সংযোগৰ নীতিসমূহ পৰিচালনা কৰিবলৈ আৰু এপ্-বিশেষ নিয়ম সংজ্ঞাবদ্ধ কৰিবলৈ অনুমতি দিয়ে।" "নেটৱর্ক ব্যৱহাৰৰ হিচাপ সলনি কৰক" "এপ অনুসুৰি নেটৱর্কৰ ব্যৱহাৰৰ হিচাপ সংশোধন কৰিবলৈ এপক অনুমতি দিয়ে। এয়া সাধাৰণ এপবোৰৰ ব্যৱহাৰৰ বাবে নহয়।" - "প্ৰৱেশ জাননীসমূহ" + "জাননীসমূহ এক্সেছ কৰে" "অন্য এপসমূহৰদ্বাৰা প\'ষ্ট কৰা জাননীসমূহকে ধৰি জাননী বিচাৰি উলিয়াবলৈ, পৰীক্ষা কৰিবলৈ আৰু মচিবলৈ অনুমতি দিয়ে।" "এটা জাননী শুনা সেৱাৰ লগত সংযুক্ত হ\'ব পাৰে" "এটা জাননী শ্ৰৱণ সেৱা প্ৰদানকাৰীৰ শীৰ্ষ স্তৰৰ ইণ্টাৰফেইচৰ লগত সংযুক্ত হ\'বলৈ ধাৰকক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন নহয়।" @@ -727,7 +727,7 @@ "এটা এপ্লিকেশ্বনক নেটৱৰ্ক অৱস্থাসমূহত নিৰীক্ষণৰ বাবে শুনিবলৈ অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন নহয়।" "ইনপুট ডিভাইচ কেলিব্ৰেশ্বন সলনি কৰিব পাৰে" "টাচ্চ স্ক্ৰীনৰ কেলিব্ৰেশ্বন পেৰামিটাৰ সংশোধন কৰিবলৈ এপক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে কেতিয়াও প্ৰয়োজন হোৱা উচিত নহয়।" - "DRM প্ৰমাণপত্ৰসমূহলৈ প্ৰৱেশ" + "DRM প্ৰমাণপত্ৰসমূহ এক্সেছ কৰে" "এটা এপ্লিকেশ্বনক DRM প্ৰমাণপত্ৰ গোটাবলৈ আৰু ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন নহয়।" "Android বীম স্থানান্তৰণৰ স্থিতি লাভ কৰিব পাৰে" "বৰ্তমানৰ Android Beam স্থানান্তৰণসমূহৰ বিষয়ে তথ্য পাবলৈ এই এপ্লিকেশ্বনক অনুমতি দিয়ে" @@ -1462,7 +1462,7 @@ "কার্য কৰক" "%s ব্যৱহাৰ কৰি \n নম্বৰটো ডায়েল কৰক" "%s ব্যৱহাৰ কৰি সম্পৰ্ক \n সৃষ্টি কৰক" - "বৰ্তমান আৰু ভৱিষ্যতে আপোনাৰ একাউণ্টত প্ৰৱেশ কৰিবলৈ তলৰ এটা বা অধিক এপে অনুমতি লাভৰ বাবে অনুৰোধ কৰিছে৷" + "তলৰ এটা বা একাধিক এপে বৰ্তমান আৰু ভৱিষ্যতে আপোনাৰ একাউণ্ট এক্সেছ কৰিবলৈ অনুমতি বিচাৰি অনুৰোধ কৰিছে৷" "আপুনি এই অনুৰোধক সন্মতি দিব বিচাৰেনে?" "ব্যৱহাৰ কৰাৰ অনুমতি বিচাৰি কৰা অনুৰোধ" "অনুমতি দিয়ক" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 3daea4b6896d..9b33e31c058e 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -195,7 +195,7 @@ "Ваша арганізацыя кіруе гэтай прыладай і можа сачыць за сеткавым трафікам. Дакраніцеся для атрымання дадатковай інфармацыі." "Праграмы могуць атрымліваць даныя пра ваша месцазнаходжанне" "Каб даведацца больш, звярніцеся да ІТ-адміністратара" - "Служба вызначэння геаперыметра" + "Сэрвіс геазаніравання" "Дэтэктар краіны" "Служба геалакацыі" "Служба GNSS" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e4a8f3919434..f4d8422167ec 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1938,13 +1938,13 @@ "El micròfon no està disponible" "La configuració d\'Android TV no està disponible" "La configuració de la tauleta no està disponible" - "La configuració del telèfon no està disponible" - "No es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho al dispositiu Android TV." - "No es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho a la tauleta." - "No es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho al telèfon." - "En aquests moments, no es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho al dispositiu Android TV." - "En aquests moments, no es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho a la tauleta." - "En aquests moments, no es pot accedir a aquesta aplicació al dispositiu %1$s. Prova-ho al telèfon." + "Configuració del telèfon no disponible" + "No s\'hi pot accedir des del teu %1$s. Prova-ho al dispositiu Android TV." + "No s\'hi pot accedir des del teu %1$s. Prova-ho a la tauleta." + "No es pot accedir a aquesta aplicació al teu %1$s. Prova-ho al telèfon." + "En aquests moments, no s\'hi pot accedir des del teu %1$s. Prova-ho al dispositiu Android TV." + "En aquests moments, no s\'hi pot accedir des del teu %1$s. Prova-ho a la tauleta." + "No s\'hi pot accedir des del teu %1$s. Prova-ho al telèfon." "Aquesta aplicació sol·licita seguretat addicional. Prova-ho al dispositiu Android TV." "Aquesta aplicació sol·licita seguretat addicional. Prova-ho a la tauleta." "Aquesta aplicació sol·licita seguretat addicional. Prova-ho al telèfon." diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index bea4410f0dcf..a4f910172f09 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1940,11 +1940,11 @@ "Tabletindstillingerne er ikke tilgængelige" "Telefonindstillingerne er ikke tilgængelige" "Du har ikke adgang til denne app på din %1$s. Prøv på din Android TV-enhed i stedet." - "Du har ikke adgang til denne app på din %1$s. Prøv på din tablet i stedet." - "Du har ikke adgang til denne app på din %1$s. Prøv på din telefon i stedet." - "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din Android TV-enhed i stedet." + "Dette er ikke tilgængeligt på din %1$s. Prøv på din tablet i stedet." + "Dette er ikke tilgængeligt på din %1$s. Prøv på din telefon i stedet." + "Dette er ikke tilgængeligt på din %1$s på nuværende tidspunkt. Prøv på din Android TV-enhed i stedet." "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din tablet i stedet." - "Du har ikke adgang til denne app på din %1$s på nuværende tidspunkt. Prøv på din telefon i stedet." + "Dette er ikke tilgængeligt på din %1$s på nuværende tidspunkt. Prøv på din telefon i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din Android TV-enhed i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din tablet i stedet." "Denne app anmoder om yderligere sikkerhed. Prøv på din telefon i stedet." diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 118b63b340dd..8f9d23e38010 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2279,7 +2279,7 @@ "Η εφαρμογή %1$s εκτελείται στο παρασκήνιο. Πατήστε για διαχείριση της χρήσης της μπαταρίας." "Η εφαρμογή %1$s μπορεί να επηρεάσει τη διάρκεια ζωής μπαταρίας. Πατήστε για έλεγχο των ενεργών εφαρμογών." "Έλεγχος ενεργών εφαρμογών" - "Δεν είναι δυνατή η πρόσβαση στην κάμερα του τηλεφώνου από τη συσκευή %1$s" + "Δεν είναι δυνατή η πρόσβαση στην κάμερα τηλεφώνου από το %1$s" "Δεν είναι δυνατή η πρόσβαση στην κάμερα του tablet από τη συσκευή %1$s" "Προεπιλογή συστήματος" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index ed9bd5b43247..5c0ef1303260 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1942,10 +1942,10 @@ "La configuración del teléfono no está disponible" "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu dispositivo Android TV." "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu tablet." - "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu teléfono." + "Por el momento no se puede acceder a este contenido en tu %1$s. Inténtalo en el teléfono." "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu dispositivo Android TV." "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu tablet." - "Por el momento, no se puede acceder a esto en tu %1$s. Inténtalo en tu teléfono." + "Por el momento no se puede acceder a este contenido en tu %1$s. Inténtalo en el teléfono." "Esta app solicita seguridad adicional. Inténtalo en tu dispositivo Android TV." "Esta app solicita seguridad adicional. Inténtalo en tu tablet." "Esta app solicita seguridad adicional. Inténtalo en tu teléfono." diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 96b813112c94..69e952605214 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1940,8 +1940,8 @@ "Ajustes de Android TV no disponibles" "Ajustes del tablet no disponibles" "Ajustes del teléfono no disponibles" - "No se puede acceder a este contenido en tu %1$s. Prueba en tu dispositivo Android TV." - "No se puede acceder a este contenido en tu %1$s. Prueba en tu tablet." + "No se puede acceder desde tu %1$s. Prueba en tu dispositivo Android TV." + "No se puede acceder desde tu %1$s. Prueba en tu tablet." "No se puede acceder a este contenido en tu %1$s. Prueba en tu teléfono." "En estos momentos, no se puede acceder a este contenido en tu %1$s. Prueba en tu dispositivo Android TV." "En estos momentos, no se puede acceder a este contenido en tu %1$s. Prueba en tu tablet." diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 8a8708c79afc..4044249ba1d6 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2279,7 +2279,7 @@ "Rakendus %1$s töötab taustal. Puudutage akukasutuse haldamiseks." "%1$s võib aku tööiga mõjutada. Puudutage aktiivsete rakenduste ülevaatamiseks." "Vaadake aktiivseid rakendusi" - "Teie seadmest %1$s ei pääse telefoni kaamerale juurde" + "Teie seadmest %1$s ei pääse telefoni kaamerale juurde." "Teie seadmest %1$s ei pääse tahvelarvuti kaamerale juurde" "Süsteemi vaikeseade" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 56ec3bca1df6..5212a8d22ff8 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -56,7 +56,7 @@ "IMEIa" "MEID" - "Sarrerako deien identifikazio-zerbitzua" + "Deitzailearen identitatea (jasotako deiak)" "Ezkutatu irteerako deitzailearen identitatea" "Konektatutako linearen IDa" "Konektatutako linearen ID murriztapena" @@ -71,12 +71,12 @@ "Nahigabeko dei gogaikarriak ukatzea" "Deitzailearen zenbakia ematea" "Ez molestatzeko modua" - "Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenekin" - "Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenik gabe" - "Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenekin" - "Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenik gabe" + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenekin" + "Deitzailearen identitatea adierazteko zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenik gabe." + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenekin." + "Deitzailearen identitatea zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenik gabe." "Zerbitzua ez da hornitu." - "Ezin duzu deien identifikazio-zerbitzuaren ezarpena aldatu." + "Ezin duzu aldatu deitzailearen identitatearen ezarpena." "Ez dago mugikorreko datu-zerbitzurik" "Ezin da egin larrialdi-deirik" "Ez dago ahots-deien zerbitzurik" @@ -524,9 +524,9 @@ "Wi-Fi sarearen bidez gailu guztiei bidalitako paketeak jasotzeko baimena ematen die aplikazioei multidifusio-helbideak erabilita, ez tableta soilik. Multidifusiokoa ez den moduak baino bateria gehiago erabiltzen du." "Multidifusio-helbideak erabiliz wifi-sare bateko gailu guztiei (ez bakarrik Android TV gailuari) bidalitako paketeak jasotzeko baimena ematen die aplikazioei. Multidifusiokoa ez den moduak baino bateria gehiago erabiltzen du." "Wi-Fi sarearen bidez gailu guztiei bidalitako paketeak jasotzeko baimena ematen die aplikazioei multidifusio-helbideak erabilita, ez telefonoa soilik. Multidifusiokoa ez den moduak baino bateria gehiago erabiltzen du." - "atzitu Bluetooth-aren ezarpenak" + "atzitu Bluetootharen ezarpenak" "Tokiko Bluetooth tableta konfiguratzea eta urruneko gailuak detektatzea eta haiekin parekatzea baimentzen die aplikazioei." - "Android TV gailuan Bluetooth-a konfiguratzeko eta urruneko gailuak hautemateko eta haiekin parekatzeko baimena ematen die aplikazioei." + "Android TV gailuan Bluetootha konfiguratzeko eta urruneko gailuak hautemateko eta haiekin parekatzeko baimena ematen die aplikazioei." "Tokiko Bluetooth telefonoa konfiguratzea eta urruneko gailuak detektatzea eta haiekin parekatzea baimentzen die aplikazioei." "WiMAX sarera konektatzea eta deskonektatzea" "WiMAX gaituta dagoen zehazteko eta konektatutako WiMAX sareei buruzko informazioa ikusteko baimena ematen die aplikazioei." @@ -1302,7 +1302,7 @@ "datu-konexioa" "Wifia" - "Bluetooth-a" + "Bluetootha" "Ethernet" "VPNa" @@ -2098,7 +2098,7 @@ "%1$s kalkulu-orria" "Aurkezpena" "%1$s aurkezpena" - "Bluetooth-ak aktibatuta jarraituko du hegaldi moduan" + "Bluetoothak aktibatuta jarraituko du hegaldi moduan" "Kargatzen" "{count,plural, =1{{file_name} eta beste # fitxategi}other{{file_name} eta beste # fitxategi}}" "Ez dago edukia partekatzeko pertsona gomendaturik" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 7300b44f59bf..b1d46e67ed25 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1941,10 +1941,10 @@ "تنظیمات تلفن دردسترس نیست" "‏نمی‌توان در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در دستگاه Android TV امتحان کنید." "نمی‌توان در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در رایانه لوحی‌تان امتحان کنید." - "نمی‌توان در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در تلفنتان امتحان کنید." + "در %1$s نمی‌توان به آن دسترسی داشت. باید در تلفنتان امتحان کنید." "‏درحال‌حاضر نمی‌توانید در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در دستگاه Android TV امتحان کنید." "درحال‌حاضر نمی‌توانید در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در رایانه لوحی‌تان امتحان کنید." - "درحال‌حاضر نمی‌توانید در %1$s به این برنامه دسترسی داشت. دسترسی به آن را در تلفنتان امتحان کنید." + "اکنون نمی‌توانید از %1$s به آن دسترسی داشته باشید. ازطریق تلفن امتحان کنید." "‏این برنامه درخواست امنیت اضافی دارد. دسترسی به آن را در دستگاه Android TV امتحان کنید." "این برنامه درخواست امنیت اضافی دارد. دسترسی به آن را در رایانه لوحی‌تان امتحان کنید." "این برنامه درخواست امنیت اضافی دارد. دسترسی به آن را در تلفنتان امتحان کنید." @@ -2279,7 +2279,7 @@ "%1$s در پس‌زمینه درحال اجرا است. برای مدیریت مصرف باتری ضربه بزنید." "%1$s ممکن است بر عمر باتری تأثیر بگذارد. برای مرور برنامه‌های فعال، ضربه بزنید." "بررسی برنامه‌های فعال" - "نمی‌توان از %1$s شما به دوربین تلفن دسترسی داشت" + "از %1$s به دوربین تلفن دسترسی ندارید" "نمی‌توان از %1$s شما به دوربین رایانه لوحی دسترسی داشت" "پیش‌فرض سیستم" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 558a163c50a7..8ca43d53e8b9 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1395,7 +1395,7 @@ "Analyse de l\'espace de stockage sur le support en cours…" "Nouveau périphérique %s" "%s ne fonctionne pas" - "Toucher pour configurer" + "Touchez pour configurer" "Sélectionnez pour configurer" "Vous devrez peut-être reformater l\'appareil. Touchez pour l\'éjecter." "Pour transférer des photos et d\'autres fichiers" @@ -1940,12 +1940,12 @@ "Paramètres Android TV non accessibles" "Paramètres de la tablette non accessibles" "Paramètres du téléphone non accessibles" - "Impossible d\'accéder à ce contenu sur votre appareil %1$s. Essayez sur votre appareil Android TV à la place." - "Impossible d\'accéder à ce contenu sur votre appareil %1$s. Essayez sur votre tablette à la place." - "Impossible d\'accéder à ce contenu sur votre appareil %1$s. Essayez sur votre téléphone à la place." - "Impossible d\'accéder à ce contenu sur votre appareil %1$s pour le moment. Essayez sur votre appareil Android TV à la place." - "Impossible d\'accéder à ce contenu sur votre appareil %1$s pour le moment. Essayez sur votre tablette à la place." - "Impossible d\'accéder à ce contenu sur votre appareil %1$s pour le moment. Essayez sur votre téléphone à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s. Essayez sur votre appareil Android TV à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s. Essayez sur votre tablette à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s. Essayez sur votre téléphone à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s pour le moment. Essayez sur votre appareil Android TV à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s pour le moment. Essayez sur votre tablette à la place." + "Impossible d\'accéder à ce contenu sur votre %1$s pour le moment. Essayez sur votre téléphone à la place." "Cette application demande une sécurité supplémentaire. Essayez sur votre appareil Android TV à la place." "Cette application demande une sécurité supplémentaire. Essayez sur votre tablette à la place." "Cette application demande une sécurité supplémentaire. Essayez sur votre téléphone à la place." diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 024cf3e89b34..da39213dbee5 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -580,7 +580,7 @@ "Utilisez la biométrie ou le verrouillage de l\'écran pour continuer" "Matériel biométrique indisponible" "Authentification annulée" - "Non reconnu" + "Non reconnue" "Authentification annulée" "Aucun code, schéma ni mot de passe n\'est défini" "Erreur d\'authentification" @@ -1941,7 +1941,7 @@ "Paramètres de la tablette indisponibles" "Paramètres du téléphone indisponibles" "Impossible d\'accéder à cette application sur votre %1$s. Essayez plutôt d\'y accéder sur votre appareil Android TV." - "Impossible d\'accéder à cette application sur votre %1$s. Essayez plutôt d\'y accéder sur votre tablette." + "Impossible sur votre %1$s. Essayez plutôt sur votre tablette." "Impossible d\'accéder à cette application sur votre %1$s. Essayez plutôt d\'y accéder sur votre téléphone." "Vous ne pouvez pas accéder à cette appli sur votre %1$s pour le moment. Essayez plutôt d\'y accéder sur votre appareil Android TV." "Vous ne pouvez pas accéder à cette appli sur votre %1$s pour le moment. Essayez plutôt d\'y accéder sur votre tablette." diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index c248c760dcf2..1963dd55c655 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -213,7 +213,7 @@ "Opcións da tableta" "Opcións de Android TV" "Opcións do teléfono" - "Modo de silencio" + "Modo silencioso" "Activar a conexión sen fíos" "Desactivar a conexión sen fíos" "Bloqueo de pantalla" @@ -257,7 +257,7 @@ "{count,plural, =1{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundo.}other{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundos.}}" "Realizouse a captura de pantalla co informe de erros" "Produciuse un erro ao realizar a captura de pantalla co informe de erros" - "Modo de silencio" + "Modo silencioso" "O son está desactivado" "O son está activado" "Modo avión" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ec9af29bf032..e315f548b402 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1938,13 +1938,13 @@ "माइक्रोफ़ोन उपलब्ध नहीं है" "Android TV की सेटिंग उपलब्ध नहीं हैं" "टैबलेट की सेटिंग उपलब्ध नहीं हैं" - "फ़ोन की सेटिंग उपलब्ध नहीं हैं" + "फ़ोन की सेटिंग उपलब्ध नहीं है" "आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने Android TV डिवाइस पर ऐक्सेस करने की कोशिश करें." "आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने टैबलेट पर ऐक्सेस करने की कोशिश करें." - "आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने फ़ोन पर ऐक्सेस करने की कोशिश करें." + "आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. अपने फ़ोन पर ऐक्सेस करने की कोशिश करें." "इस समय, आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने Android TV डिवाइस पर ऐक्सेस करने की कोशिश करें." "इस समय, आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने टैबलेट पर ऐक्सेस करने की कोशिश करें." - "इस समय, आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने फ़ोन पर ऐक्सेस करने की कोशिश करें." + "इस समय, आपके %1$s पर इसे ऐक्सेस नहीं किया जा सकता. अपने फ़ोन पर ऐक्सेस करने की कोशिश करें." "यह ऐप्लिकेशन ज़्यादा सुरक्षा का अनुरोध कर रहा है. इसके बजाय, अपने Android TV डिवाइस पर ऐक्सेस करने की कोशिश करें." "यह ऐप्लिकेशन ज़्यादा सुरक्षा का अनुरोध कर रहा है. इसके बजाय, अपने टैबलेट पर ऐक्सेस करने की कोशिश करें." "यह ऐप्लिकेशन ज़्यादा सुरक्षा का अनुरोध कर रहा है. इसके बजाय, अपने फ़ोन पर ऐक्सेस करने की कोशिश करें." diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 47e9d6586260..296e432e9a99 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1933,7 +1933,7 @@ "L\'app non è disponibile" "L\'app %1$s non è al momento disponibile." "%1$s non disponibile" - "È necessaria l\'autorizzazione" + "Autorizzazione necessaria" "Fotocamera non disponibile" "Continua sul telefono" "Microfono non disponibile" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 5b43fe921666..757fb9e1a424 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1946,7 +1946,7 @@ "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s. במקום זאת, יש לנסות בטלפון." "‏אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות במכשיר Android TV." "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות בטאבלט." - "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, יש לנסות בטלפון." + "אי אפשר לגשת לאפליקציה הזו במכשיר %1$s כרגע. במקום זאת, אפשר לנסות בטלפון." "‏האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות במכשיר Android TV." "האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות בטאבלט." "האפליקציה הזו מבקשת אמצעי אבטחה נוסף. במקום זאת, יש לנסות בטלפון." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 9e1b3f0612fb..8a3ef03361a8 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1156,8 +1156,8 @@ "취소" "주의" "로드 중.." - "ON" - "OFF" + "사용 설정" + "사용 안함" "선택함" "선택 안함" "선택됨" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 4d57390d3baa..ef9831987a01 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1942,7 +1942,7 @@ "Tālruņa iestatījumi nav pieejami" "Šajā ierīcē (%1$s) nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā Android TV ierīcē." "Šajā ierīcē (%1$s) nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā planšetdatorā." - "Šajā ierīcē (%1$s) nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā tālrunī." + "Ierīcē %1$s nevar piekļūt šai funkcijai. Mēģiniet tai piekļūt tālrunī." "Šajā ierīcē (%1$s) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā Android TV ierīcē." "Šajā ierīcē (%1$s) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā planšetdatorā." "Šajā ierīcē (%1$s) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā tālrunī." diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 2fe725a00791..1b0c46899b27 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -124,7 +124,7 @@ "Leter etter tjeneste" "Kunne ikke konfigurere wifi-anrop" - "For å ringe og sende meldinger over Wi-Fi, må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på wifi-anrop igjen fra Innstillinger. (Feilkode: %1$s)" + "For å ringe og sende meldinger over Wifi, må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på wifi-anrop igjen fra Innstillinger. (Feilkode: %1$s)" "Problem med å registrere wifi-anrop med operatøren din: %1$s" @@ -135,7 +135,7 @@ "%s-Wifi-anrop" "WLAN-anrop" "%s WLAN-anrop" - "%s Wi-Fi" + "%s Wifi" "Wifi-anrop | %s" "%s VoWifi" "Wifi-anrop" @@ -143,9 +143,9 @@ "Wifi-anrop" "VoWifi" "Av" - "Ring via Wi-Fi" + "Ring via Wifi" "Ring over mobilnettverk" - "Bare Wi-Fi" + "Bare Wifi" "%s-reserve for anrop" @@ -516,14 +516,14 @@ "Lar appen endre innstillingene for nettverkstilknytning." "endre tilknytningsoppsett" "Lar appen endre innstillingene for delt nettforbindelse." - "se Wi-Fi-tilkoblinger" - "Lar appen se informasjon om Wi-Fi-nettverk, f.eks. hvorvidt Wi-Fi er aktivert og navn på tilkoblede Wi-Fi-enheter." - "koble til og fra Wi-Fi" - "Lar appen koble til og fra Wi-Fi-tilgangspunkter, og å gjøre endringer i enhetens konfigurasjon for Wi-Fi-nettverk." + "se Wifi-tilkoblinger" + "Lar appen se informasjon om Wifi-nettverk, f.eks. hvorvidt Wifi er aktivert og navn på tilkoblede Wifi-enheter." + "koble til og fra wifi" + "Lar appen koble til og fra wifi-tilgangspunkter, og å gjøre endringer i enhetens konfigurasjon for wifi-nettverk." "tillate multicast for trådløse nettverk" - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, ikke bare Android TV-enheten din. Dette bruker mer strøm enn modus uten multikasting." - "Lar appen motta pakker som sendes til alle enhetene på et Wi-Fi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, ikke bare Android TV-enheten din. Dette bruker mer strøm enn modus uten multikasting." + "Lar appen motta pakker som sendes til alle enhetene på et Wifi-nettverk ved hjelp av multikastingsadresser, Dette bruker mer strøm enn modusen uten multikasting." "endre Bluetooth-innstillinger" "Lar appen konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter." "Lar appen konfigurere Bluetooth på Android TV-enheten din samt oppdage og koble sammen med eksterne enheter." @@ -546,8 +546,8 @@ "Lar appen vise annonser til Bluetooth-enheter i nærheten" "fastslå relativ posisjon mellom enheter som bruker ultrabredbånd" "tillate at appen fastslår den relative posisjonen mellom enheter i nærheten som bruker ultrabredbånd" - "samhandle med Wi-Fi-enheter i nærheten" - "Lar appen annonsere, koble til og fastslå den relative posisjonen til Wi-Fi-enheter i nærheten" + "samhandle med wifi-enheter i nærheten" + "Lar appen annonsere, koble til og fastslå den relative posisjonen til wifi-enheter i nærheten" "Informasjon om prioritert NFC-betalingstjeneste" "Gir appen tilgang til informasjon om prioritert NFC-betalingstjeneste, for eksempel registrerte hjelpemidler og destinasjon." "kontroller overføring av data med NFC-teknologi" @@ -1285,7 +1285,7 @@ "Alarmlyder" "Varsellyder" "Ukjent" - "Logg på Wi-Fi-nettverket" + "Logg på Wifi-nettverket" "Logg på nettverk" @@ -1568,10 +1568,10 @@ "Varsel om databruk" "Du har brukt %s med data" "Grensen for mobildata er nådd" - "Datagrensen for Wi-Fi er nådd" + "Datagrensen for wifi er nådd" "Data er på pause i resten av syklusen" "Over grensen for mobildata" - "Over grensen din for Wi-Fi-data" + "Over grensen din for wifi-data" "Du er %s over den angitte grensen din" "Bakgrunnsdata er begrenset" "Trykk for å fjerne begrensningen." diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index bd93bfe1b01d..72b77f16aa58 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -296,7 +296,7 @@ "%1$s, %2$s" "Modo de segurança" "Sistema Android" - "Deslize até o perfil pessoal" + "Mudar para o perfil pessoal" "Perfil de trabalho" "Contatos" "acesse seus contatos" @@ -740,7 +740,7 @@ "Permite que o proprietário use serviços da operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." - "iniciar uso da permissão para visualização" + "começar a usar a permissão para ver" "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "decisões de permissão da visualização inicial" "Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais." diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c170d1c8fe15..85b37c004684 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -164,7 +164,7 @@ "Não foi possível autenticar." "A autenticação através do servidor proxy falhou." "Não foi possível ligar ao servidor." - "Não foi possível comunicar com o servidor. Tente novamente mais tarde." + "Não foi possível comunicar com o servidor. Tente mais tarde." "Esgotou o tempo limite da ligação ao servidor." "A página contém demasiados redireccionamentos do servidor." "O protocolo não é suportado." @@ -172,7 +172,7 @@ "Não foi possível abrir a página porque o URL é inválido." "Não foi possível aceder ao ficheiro." "Não foi possível localizar o ficheiro solicitado." - "Existem demasiados pedidos em processamento. Tente novamente mais tarde." + "Existem demasiados pedidos em processamento. Tente mais tarde." "Erro de início de sessão de %1$s" "Sincronização" "Não é possível sincronizar" @@ -186,7 +186,7 @@ "Pelo gestor do seu perfil de trabalho" "Por %s" "Perfil de trabalho eliminado" - "A app de administração do perfil de trabalho está em falta ou danificada. Consequentemente, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o gestor para obter assistência." + "A app de administração do perfil de trabalho está em falta ou danificada. Por isso, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o gestor para obter assistência." "O seu perfil de trabalho já não está disponível neste dispositivo" "Demasiadas tentativas de introdução da palavra-passe" "O administrador anulou o dispositivo para utilização pessoal." @@ -608,7 +608,7 @@ "Foi atingido o limite de tempo da impressão digital. Tente novamente." "Operação de impressão digital cancelada." "Operação de impressão digital cancelada pelo utilizador." - "Demasiadas tentativas. Tente novamente mais tarde." + "Demasiadas tentativas. Tente mais tarde." "Demasiadas tentativas. Sensor de impressões digitais desativado." "Tente novamente." "Nenhuma impressão digital registada." @@ -662,7 +662,7 @@ "Não pode guardar novos dados de rostos. Elimine um antigo." "Operação de rosto cancelada." "Desbloqueio facial cancelado pelo utilizador" - "Demasiadas tentativas. Tente novamente mais tarde." + "Demasiadas tentativas. Tente mais tarde." "Demasiadas tentativas. O Desbloqueio facial foi desativado." "Demasiadas tentativas. Em alternativa, introduza o bloqueio de ecrã." "Não é possível validar o rosto. Tente novamente." @@ -1828,7 +1828,7 @@ "Crie um PIN para modificar as restrições" "Os PINs não correspondem. Tente novamente." "O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos." - "Tente novamente mais tarde" + "Tente mais tarde" "Visualização de ecrã inteiro" "Para sair, deslize rapidamente para baixo a partir da parte superior." "OK" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index bd93bfe1b01d..72b77f16aa58 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -296,7 +296,7 @@ "%1$s, %2$s" "Modo de segurança" "Sistema Android" - "Deslize até o perfil pessoal" + "Mudar para o perfil pessoal" "Perfil de trabalho" "Contatos" "acesse seus contatos" @@ -740,7 +740,7 @@ "Permite que o proprietário use serviços da operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." - "iniciar uso da permissão para visualização" + "começar a usar a permissão para ver" "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "decisões de permissão da visualização inicial" "Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais." diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 7a0c6cb3b80f..b8d8f648dff0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -44,16 +44,16 @@ "MMI finalizat." "Codul PIN vechi introdus nu este corect." "Codul PUK introdus nu este corect." - "Codurile PIN introduse nu se potrivesc." + "PIN-urile introduse nu sunt identice." "Introdu un cod PIN alcătuit din 4 până la 8 cifre." "Introdu un cod PUK care să aibă 8 cifre sau mai mult." "Cardul SIM este blocat cu codul PUK. Introdu codul PUK pentru a-l debloca." "Introdu codul PUK2 pentru a debloca cardul SIM." "Operațiunea nu a reușit. Activează blocarea cardului SIM/RUIM." - V-au mai rămas %d încercări până la blocarea cardului SIM. - V-au mai rămas %d de încercări până la blocarea cardului SIM. - V-a mai rămas %d încercare până la blocarea cardului SIM. + Ți-au mai rămas %d încercări până la blocarea cardului SIM. + Ți-au mai rămas %d de încercări până la blocarea cardului SIM. + Ți-a mai rămas %d încercare până la blocarea cardului SIM. "IMEI" "MEID" @@ -85,9 +85,9 @@ "Dezactivat temporar de operator" "Dezactivat temporar de operator pentru numărul de card SIM %d" "Nu se poate stabili conexiunea la rețeaua mobilă" - "Încercați să schimbați rețeaua preferată. Atingeți pentru a schimba." + "Încearcă să schimbi rețeaua preferată. Atinge pentru a schimba." "Apelurile de urgență nu sunt disponibile" - "Nu puteți efectua apeluri de urgență prin Wi-Fi" + "Nu poți face apeluri de urgență prin Wi-Fi" "Alerte" "Redirecționarea apelurilor" "Mod de apelare inversă de urgență" @@ -128,7 +128,7 @@ "Pentru a face apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicită configurarea acestui serviciu la operator. Apoi, activează din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: %1$s)" - "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: %1$s" + "A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul tău: %1$s" @@ -145,7 +145,7 @@ "VoWifi" "Dezactivată" "Apelează prin Wi-Fi" - "Apelați prin rețeaua mobilă" + "Sună prin rețeaua mobilă" "Numai Wi-Fi" @@ -176,7 +176,7 @@ "Eroare de conectare pentru %1$s" "Sincronizare" "Nu se poate sincroniza" - "Ați încercat să ștergeți prea multe %s." + "Ai încercat să ștergi prea multe %s." "Stocarea pe tabletă este plină. Șterge câteva fișiere pentru a elibera spațiu." "Spațiul de stocare de pe ceas este plin! Șterge câteva fișiere pentru a elibera spațiu." "Spațiul de stocare de pe dispozitivul Android TV este plin. Șterge câteva fișiere pentru a elibera spațiu." @@ -186,13 +186,13 @@ "De administratorul profilului de serviciu" "De %s" "Profilul de serviciu a fost șters" - "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul." + "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactează administratorul." "Profilul de serviciu nu mai este disponibil pe acest dispozitiv" "Prea multe încercări de introducere a parolei" "Administratorul a retras dispozitivul pentru uz personal" "Dispozitivul este gestionat" - "Organizația dvs. gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atingeți pentru mai multe detalii." - "Aplicațiile vă pot accesa locația" + "Organizația ta gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atinge pentru mai multe detalii." + "Aplicațiile îți pot accesa locația" "Contactează administratorul IT pentru a afla mai multe" "Serviciul de delimitare geografică" "Detector de țară" @@ -204,10 +204,10 @@ "Serviciul Manager de politici pentru dispozitive" "Serviciu de gestionare a recunoașterii de melodii" "Datele de pe dispozitiv vor fi șterse" - "Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs." + "Aplicația de administrare nu poate fi folosită. Dispozitivul va fi șters.\n\nDacă ai întrebări, contactează administratorul organizației." "Printare dezactivată de %s." "Activează profilul de serviciu" - "Aplicațiile personale sunt blocate până când activați profilul de serviciu" + "Aplicațiile personale sunt blocate până când activezi profilul de serviciu" "Aplicațiile personale vor fi blocate pe %1$s, la %2$s. Administratorul IT nu permite ca profilul de serviciu să fie dezactivat mai mult de %3$d zile." "Activează" "Eu" @@ -229,11 +229,11 @@ "Revenire la setările din fabrică" "Se repornește…" "Se închide..." - "Computerul dvs. tablet PC se va închide." + "Tableta se va închide." "Dispozitivul Android TV se va închide." - "Ceasul dvs. se va închide." - "Telefonul dvs. se va închide." - "Doriți să închideți?" + "Ceasul se va închide." + "Telefonul se va închide." + "Vrei să închizi?" "Repornește în modul sigur" "Repornești în modul sigur? Astfel vor fi dezactivate toate aplicațiile terță parte instalate. Acestea vor fi restabilite când repornești dispozitivul." "Recente" @@ -250,7 +250,7 @@ "Încheie sesiunea" "Instantaneu" "Raport de eroare" - "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis." + "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Ai răbdare după pornirea raportului despre erori până când va fi gata de trimis." "Raport interactiv" "Folosește această opțiune în majoritatea situațiilor. Astfel, poți să urmărești progresul raportului, să introduci mai multe detalii în privința problemei și să creezi capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult." "Raport complet" @@ -296,16 +296,16 @@ "%1$s, %2$s" "Mod sigur" "Sistemul Android" - "Comutați la profilul personal" - "Comutați la profilul de serviciu" + "Comută la profilul personal" + "Comută la profilul de serviciu" "Agendă" "să acceseze agenda" "Locație" "să acceseze locația acestui dispozitiv" "Calendar" - "acceseze calendarul" + "să acceseze calendarul" "SMS" - "trimită și să vadă mesajele SMS" + "să trimită și să vadă mesajele SMS" "Fișiere" "să acceseze fișiere de pe dispozitiv" "Muzică și conținut audio" @@ -319,7 +319,7 @@ "Camera foto" "fotografieze și să înregistreze videoclipuri" "Dispozitive din apropiere" - "descoperiți dispozitive din apropiere și conectați-vă la acestea" + "descoperă dispozitive din apropiere și conectează-te la acestea" "Jurnale de apeluri" "să citească și să scrie jurnalul de apeluri telefonice" "Telefon" @@ -328,19 +328,19 @@ "să acceseze datele de la senzori despre semnele vitale" "Notificări" "să afișeze notificări" - "Analizeze conținutul ferestrei" - "Inspectează conținutul unei ferestre cu care interacționați." + "să preia conținutul ferestrei" + "Inspectează conținutul unei ferestre cu care interacționezi." "să activeze funcția Explorează prin atingere" "Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi." - "Remarce textul pe care îl introduceți" - "Include date personale, cum ar fi numere ale cardurilor de credit sau parole." + "să vadă textul pe care îl introduci" + "Include date cu caracter personal, cum ar fi numere ale cardurilor de credit sau parole." "Controlează mărirea pe afișaj" "Controlează nivelul de zoom și poziționarea afișajului." "Folosește gesturi" "Poate atinge, glisa, ciupi sau folosi alte gesturi." - "Redea gesturi ce implică amprente" + "să redea gesturi ce implică amprente" "Poate reda gesturile făcute pe senzorul de amprentă al dispozitivului." - "Faceți o captură de ecran" + "Fă o captură de ecran" "Poate face o captură de ecran." "dezactivare sau modificare bare de stare" "Permite aplicației să dezactiveze bara de stare sau să adauge și să elimine pictograme de sistem." @@ -359,11 +359,11 @@ "să răspundă la apeluri telefonice" "Permite aplicației să răspundă la un apel telefonic." "primește mesaje text (SMS)" - "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "primește mesaje text (MMS)" "Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a ți le arăta." "Redirecționează mesajele cu transmisie celulară" - "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență." + "Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a te avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului când e primită o transmisie celulară de urgență." "Să gestioneze apelurile în desfășurare" "Permite unei aplicații să vadă detalii despre apelurile în desfășurare de pe dispozitiv și să gestioneze apelurile respective." "citește mesajele cu transmisie celulară" @@ -377,7 +377,7 @@ "Această aplicație poate să citească toate mesajele SMS (texT) stocate pe dispozitivul Android TV." "Această aplicație poate citi toate mesajele SMS stocate pe telefon." "primește mesaje text (WAP)" - "Permite aplicației să primească și să proceseze mesaje WAP. Această permisiune include capacitatea de a monitoriza sau șterge mesajele care v-au fost trimise fără a vi le arăta." + "Permite aplicației să primească și să proceseze mesaje WAP. Această permisiune include capacitatea de a monitoriza sau șterge mesajele care ți-au fost trimise fără a ți le arăta." "preluare aplicații care rulează" "Permite aplicației să preia informațiile despre activitățile care rulează în prezent și care au rulat recent. În acest fel, aplicația poate descoperi informații despre aplicațiile care sunt utilizate pe dispozitiv." "să gestioneze profilul și proprietarii dispozitivului" @@ -403,7 +403,7 @@ "măsurare spațiu de stocare al aplicației" "Permite aplicației să preia dimensiunile codului, ale datelor și ale memoriei cache" "modifică setări de sistem" - "Permite aplicației să modifice datele din setările sistemului. Aplicațiile rău intenționate pot corupe configurația sistemului dvs." + "Permite aplicației să modifice datele din setările sistemului. Aplicațiile rău intenționate pot corupe configurația sistemului." "rulează la pornire" "Permite aplicației să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea tabletei poate dura mai mult timp, iar rularea continuă a aplicației poate încetini dispozitivul." "Permite aplicației să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea dispozitivului Android TV poate dura mai mult timp, iar rularea continuă a aplicației poate încetini dispozitivul." @@ -413,9 +413,9 @@ "Permite aplicației să trimită mesaje difuzate persistente, care se păstrează după terminarea difuzării mesajului. Utilizarea excesivă a acestei funcții poate să încetinească sau să destabilizeze dispozitivul Android TV, determinându-l să utilizeze prea multă memorie." "Permite aplicației să trimită mesaje difuzate persistente, care se păstrează după terminarea difuzării mesajului. Utilizarea excesivă a acestei funcții poate să încetinească sau să destabilizeze telefonul, determinându-l să utilizeze prea multă memorie." "citește agenda" - "Permite aplicației să citească datele despre persoanele din agenda stocată pe tabletă. Aplicațiile vor avea și acces la conturile de pe tabletă care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." - "Permite aplicației să citească datele despre persoanele de contact din agenda stocată pe dispozitivul Android TV. Aplicațiile vor avea și acces la conturile de pe dispozitivul Android TV care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." - "Permite aplicației să citească datele despre persoanele de contact salvate pe telefon. Aplicațiile vor avea și acces la conturile de pe telefon care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ați instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău-intenționate pot permite accesul la datele de contact fără cunoștința dvs." + "Permite aplicației să citească datele despre persoanele din agenda stocată pe tabletă. Aplicațiile vor avea și acces la conturile de pe tabletă care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." + "Permite aplicației să citească datele despre persoanele de contact din agenda stocată pe dispozitivul Android TV. Aplicațiile vor avea și acces la conturile de pe dispozitivul Android TV care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." + "Permite aplicației să citească datele despre persoanele de contact salvate pe telefon. Aplicațiile vor avea și acces la conturile de pe telefon care au creat agenda. Aici pot fi incluse conturile create de aplicațiile pe care le-ai instalat. Cu această permisiune, aplicațiile pot salva datele de contact, iar aplicațiile rău intenționate pot permite accesul la datele de contact fără cunoștința ta." "modifică agenda" "Permite aplicației să modifice datele despre persoanele din agenda stocată pe tabletă. Cu această permisiune, aplicația poate șterge datele de contact." "Permite aplicației să modifice datele despre persoanele din agenda stocată pe dispozitivul Android TV. Cu această permisiune, aplicația poate șterge datele de contact." @@ -425,7 +425,7 @@ "scrie jurnalul de apeluri" "Permite aplicației să modifice jurnalul de apeluri al tabletei, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Permite aplicației să modifice jurnalul de apeluri al dispozitivului Android TV, inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul de apeluri." - "Permite aplicației să modifice jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri." + "Permite aplicației să modifice jurnalul de apeluri al telefonului, inclusiv datele despre apelurile primite sau făcute. Aplicațiile rău intenționate pot folosi această permisiune pentru a șterge sau a modifica jurnalul de apeluri." "Să acceseze date de la senzorii corporali, cum ar fi pulsul, în timpul folosirii" "Permite aplicației să acceseze date de la senzorii corporali, cum ar fi pulsul, temperatura și procentul de oxigen din sânge, în timpul folosirii aplicației." "Să acceseze date de la senzorii corporali, precum pulsul, când rulează în fundal" @@ -441,10 +441,10 @@ "accesare comenzi suplimentare ale furnizorului locației" "Permite aplicației să acceseze comenzi suplimentare pentru furnizorul locației. Aplicația ar putea să utilizeze această permisiune pentru a influența operațiile GPS sau ale altor surse de locații." "să acceseze locația exactă în prim-plan" - "Aplicația vă poate determina locația exactă cu ajutorul serviciilor de localizare atunci când este folosită. Pentru ca aplicația să poată determina locația, trebuie să activați serviciile de localizare pentru dispozitiv. Aceasta poate mări utilizarea bateriei." + "Aplicația îți poate stabili locația exactă cu ajutorul serviciilor de localizare când este folosită. Pentru ca aplicația să poată stabili locația, trebuie să activezi serviciile de localizare pentru dispozitiv. Aceasta poate mări utilizarea bateriei." "să acceseze locația aproximativă numai în prim-plan." - "Aplicația vă poate determina locația aproximativă cu ajutorul serviciilor de localizare atunci când este folosită. Pentru ca aplicația să poată determina locația, trebuie să activați serviciile de localizare pentru dispozitiv." - "accesați locația în fundal" + "Aplicația îți poate stabili locația aproximativă cu ajutorul serviciilor de localizare când este folosită. Pentru ca aplicația să poată stabili locația, trebuie să activezi serviciile de localizare pentru dispozitiv." + "să acceseze locația în fundal" "Aplicația poate accesa locația oricând, chiar dacă nu este folosită." "modificare setări audio" "Permite aplicației să modifice setările audio globale, cum ar fi volumul și difuzorul care este utilizat pentru ieșire." @@ -455,7 +455,7 @@ "să trimită comenzi către SIM" "Permite aplicației să trimită comenzi pe cardul SIM. Această permisiune este foarte periculoasă." "recunoașterea activității fizice" - "Această aplicație vă poate recunoaște activitatea fizică." + "Această aplicație îți poate recunoaște activitatea fizică." "realizarea de fotografii și videoclipuri" "Această aplicație poate să fotografieze și să înregistreze videoclipuri folosind camera foto când este în uz." "să fotografieze și să înregistreze videoclipuri în fundal" @@ -468,9 +468,9 @@ "Permite aplicației să controleze mecanismul de vibrare." "Permite aplicației să acceseze modul de vibrații." "să sune direct la numere de telefon" - "Permite aplicației să apeleze numere de telefon fără intervenția dvs. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." + "Permite aplicației să apeleze numere de telefon fără intervenția ta. Acest lucru poate determina apariția unor taxe sau a unor apeluri neașteptate. Cu această permisiune aplicația nu poate apela numerele de urgență. Aplicațiile rău intenționate pot acumula costuri prin efectuarea unor apeluri fără confirmare." "accesează serviciul de apelare IMS" - "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția dvs." + "Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția ta." "citește starea și identitatea telefonului" "Permite aplicației să acceseze funcțiile de telefon ale dispozitivului. Cu această permisiune aplicația stabilește numărul de telefon și ID-urile de dispozitiv, dacă un apel este activ, precum și numărul de la distanță conectat printr-un apel." "să citească informații de bază, precum activitatea și starea telefonului" @@ -507,8 +507,8 @@ "Permite aplicației să schimbe fusul orar al telefonului." "găsește conturi pe dispozitiv" "Permite aplicației să obțină lista de conturi cunoscute de tabletă. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." - "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." - "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ați instalat." + "Permite aplicației să obțină lista conturilor cunoscute de dispozitivul Android TV. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." + "Permite aplicației să obțină lista de conturi cunoscute de telefon. Aceasta poate include conturile create de aplicațiile pe care le-ai instalat." "să vadă conexiunile la rețea" "Permite aplicației să vadă informațiile despre conexiunile la rețea, cum ar fi rețelele existente și cele care sunt conectate." "să aibă acces deplin la rețea" @@ -522,13 +522,13 @@ "se conectează și se deconectează de la Wi-Fi" "Permite aplicației să se conecteze și să se deconecteze de la punctele de acces Wi-Fi, precum și să efectueze modificări în configurația dispozitivului pentru rețelele Wi-Fi." "permitere recepționare difuzare multiplă Wi-Fi" - "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar tableta dvs. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." + "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, folosind adrese cu difuzare multiplă, nu doar tableta ta. Această funcție folosește mai multă energie decât modul fără difuzare multiplă." "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar dispozitivul Android TV. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." - "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, utilizând adrese cu difuzare multiplă, nu doar telefonul dvs. Această funcție utilizează mai multă energie decât modul fără difuzare multiplă." + "Permite aplicației să primească pachetele trimise către toate dispozitivele dintr-o rețea Wi-Fi, folosind adrese cu difuzare multiplă, nu doar telefonul tău. Această funcție folosește mai multă energie decât modul fără difuzare multiplă." "accesează setările Bluetooth" - "Permite aplicației să configureze tableta Bluetooth locală, să descopere și să se împerecheze cu dispozitive la distanță." - "Permite aplicației să configureze conexiunea Bluetooth pe dispozitivul Android TV, să descopere și să se împerecheze cu dispozitive la distanță." - "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se împerecheze cu dispozitive la distanță." + "Permite aplicației să configureze tableta Bluetooth locală, să descopere și să se asocieze cu dispozitive la distanță." + "Permite aplicației să configureze conexiunea Bluetooth pe dispozitivul Android TV, să descopere și să se asocieze cu dispozitive la distanță." + "Permite aplicației să configureze telefonul Bluetooth local, să descopere și să se asocieze cu dispozitive la distanță." "se conectează și se deconectează de la WiMAX" "Permite aplicației să stabilească dacă o rețea WiMAX este activată și să vadă informațiile cu privire la toate rețelele WiMAX conectate." "schimbă starea WiMAX" @@ -537,8 +537,8 @@ "Permite aplicației să conecteze și să deconecteze telefonul la și de la rețelele WiMAX." "conectează dispozitive Bluetooth" "Permite aplicației să vadă configurația tabletei Bluetooth, să facă și să accepte conexiuni cu dispozitive asociate." - "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive împerecheate." - "Permite aplicației să vadă configurația telefonului Bluetooth, să efectueze și să accepte conexiuni cu dispozitive împerecheate." + "Permite aplicației să vadă configurația conexiunii prin Bluetooth a dispozitivului Android TV, să efectueze și să accepte conexiuni cu dispozitive asociate." + "Permite aplicației să vadă configurația telefonului Bluetooth, să stabilească și să accepte conexiuni cu dispozitive asociate." "să descopere și să asocieze dispozitive Bluetooth din apropiere" "Permite aplicației să descopere și să asocieze dispozitive Bluetooth din apropiere" "să se conecteze la dispozitive Bluetooth asociate" @@ -555,46 +555,46 @@ "Permite aplicației să comunice cu etichetele, cardurile și cititoarele NFC (Near Field Communication)." "dezactivează blocarea ecranului" "Permite aplicației să dezactiveze blocarea tastelor și orice modalitate asociată de securizare prin parolă. De exemplu, telefonul dezactivează blocarea tastelor când se primește un apel telefonic și reactivează blocarea tastelor la terminarea apelului." - "solicitați complexitatea blocării ecranului" - "Permite aplicației să învețe nivelul de complexitate al blocării ecranului (ridicat, mediu, scăzut sau fără), fapt ce indică intervalul posibil de lungime a parolei și tipul de blocare a ecranului. Aplicația le poate sugera utilizatorilor să își actualizeze blocarea ecranului la un anumit nivel, dar utilizatorii pot ignora sugestia și pot naviga în continuare. Rețineți că blocarea ecranului nu este stocată ca text simplu, astfel încât aplicația să nu cunoască parola exactă." + "să solicite complexitatea blocării ecranului" + "Permite aplicației să învețe nivelul de complexitate al blocării ecranului (ridicat, mediu, scăzut sau fără), fapt ce indică intervalul posibil de lungime a parolei și tipul de blocare a ecranului. Aplicația le poate sugera utilizatorilor să își actualizeze blocarea ecranului la un anumit nivel, dar utilizatorii pot ignora sugestia și pot naviga în continuare. Reține că blocarea ecranului nu e stocată ca text simplu, astfel încât aplicația să nu cunoască parola exactă." "să afișeze notificări" "Permite aplicației să afișeze notificări" - "utilizați hardware biometric" + "să folosească hardware biometric" "Permite aplicației să folosească hardware biometric pentru autentificare" "gestionează hardware-ul pentru amprentă" "Permite aplicației să invoce metode pentru a adăuga și pentru a șterge șabloane de amprentă pentru utilizare." "folosește hardware-ul pentru amprentă" "Permite aplicației să folosească hardware pentru amprentă pentru autentificare" - "modificați colecția de muzică" + "să modifice colecția de muzică" "Permite aplicației să modifice colecția de muzică." - "modificați colecția de videoclipuri" - "Permite aplicației să vă modifice colecția de videoclipuri." - "modificați colecția de fotografii" - "Permite aplicației să vă modifice colecția de fotografii." - "citiți locațiile din colecția media" - "Permite aplicației să citească locațiile din colecția dvs. media." + "să modifice colecția de videoclipuri" + "Permite aplicației să-ți modifice colecția de videoclipuri." + "să modifice colecția de fotografii" + "Permite aplicației să-ți modifice colecția de fotografii." + "să citească locațiile din colecția media" + "Permite aplicației să citească locațiile din colecția ta media." "Folosește sistemele biometrice" "Folosește sistemele biometrice sau blocarea ecranului" - "Confirmați-vă identitatea" + "Confirmă-ți identitatea" "Folosește sistemele biometrice pentru a continua" "Folosește sistemele biometrice sau blocarea ecranului pentru a continua" "Hardware biometric indisponibil" "Autentificarea a fost anulată" "Nu este recunoscut" "Autentificarea a fost anulată" - "Nu este setat niciun cod PIN, model sau parolă" + "Nu este setat un cod PIN, un model sau o parolă" "Eroare la autentificare" "Folosește blocarea ecranului" - "Introduceți blocarea ecranului ca să continuați" + "Introdu blocarea ecranului pentru a continua" "Apasă ferm pe senzor" "Amprenta nu a putut fi procesată. Încearcă din nou." - "Curățați senzorul de amprentă și încercați din nou" - "Curățați senzorul și încercați din nou" + "Curăță senzorul de amprentă și încearcă din nou" + "Curăță senzorul și încearcă din nou" "Apasă ferm pe senzor" "Ai mișcat degetul prea lent. Încearcă din nou." "Încearcă altă amprentă" "Prea luminos" - "Încercați să ajustați" + "Încearcă să ajustezi" "Schimbă ușor poziția degetului de fiecare dată" @@ -614,7 +614,7 @@ "Nu au fost înregistrate amprente." "Dispozitivul nu are senzor de amprentă." "Senzorul este dezactivat temporar." - "Nu se poate folosi senzorul de amprentă. Vizitați un furnizor de servicii de reparații." + "Nu se poate folosi senzorul de amprentă. Vizitează un furnizor de servicii de reparații." "Degetul %d" "Folosește amprenta" "Folosește amprenta sau blocarea ecranului" @@ -626,15 +626,15 @@ "Pictograma amprentă" "Deblocare facială" "Problemă cu Deblocarea facială" - "Atingeți pentru a șterge modelul facial, apoi adăugați din nou fața" + "Atinge pentru a șterge modelul facial, apoi adaugă din nou chipul" "Configurează Deblocarea facială" - "Deblocați-vă telefonul uitându-vă la acesta" - "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" + "Deblochează-ți telefonul uitându-te la el" + "Pentru a folosi Deblocarea facială, activează ""Accesul la cameră"" în Setări și confidențialitate" "Configurează mai multe moduri de deblocare" - "Atingeți ca să adăugați o amprentă" + "Atinge ca să adaugi o amprentă" "Deblocare cu amprenta" "Nu se poate folosi senzorul de amprentă" - "Vizitați un furnizor de servicii de reparații." + "Vizitează un furnizor de servicii de reparații." "Nu s-a putut fotografia fața cu precizie. Încearcă din nou." "Prea luminos. Încearcă o lumină mai slabă." "Prea întunecat. Încearcă o lumină mai puternică." @@ -644,17 +644,17 @@ "Mută telefonul mai jos." "Mută telefonul spre stânga." "Mută telefonul spre dreapta." - "Priviți mai direct spre dispozitiv." - "Stați cu capul direct în fața telefonului." - "Prea multă mișcare. Țineți telefonul nemișcat." + "Privește mai direct spre dispozitiv." + "Stai cu capul direct în fața telefonului." + "Prea multă mișcare. Ține telefonul nemișcat." "Reînregistrează-ți chipul." "Nu se mai poate recunoaște fața. Încearcă din nou." "Prea asemănător, schimbă poziția." "Întoarce capul mai puțin." - "Înclinați capul mai puțin." - "Întoarceți capul mai puțin." - "Eliminați orice vă ascunde chipul." - "Curățați partea de sus a ecranului, inclusiv bara neagră" + "Înclină capul mai puțin." + "Întoarce capul mai puțin." + "Îndepărtează orice îți ascunde chipul." + "Curăță partea de sus a ecranului, inclusiv bara neagră" "Nu se poate confirma fața. Hardware-ul nu este disponibil." @@ -666,14 +666,14 @@ "Prea multe încercări. Deblocarea facială este dezactivată." "Prea multe încercări. Folosește blocarea ecranului." "Nu se poate confirma fața. Încearcă din nou." - "Nu ați configurat Deblocarea facială" + "Nu ai configurat Deblocarea facială" "Deblocarea facială nu este acceptată pe acest dispozitiv" "Senzorul este dezactivat temporar." "Chip %d" "Folosește Deblocarea facială" "Folosește deblocarea facială sau ecranul de blocare" - "Folosiți-vă chipul ca să continuați" - "Folosiți-vă chipul sau blocarea ecranului pentru a continua" + "Folosește-ți chipul pentru a continua" + "Folosește-ți chipul sau blocarea ecranului pentru a continua" "A apărut o eroare. Încearcă din nou." @@ -712,7 +712,7 @@ "Permite aplicației să citească utilizarea statistică a rețelei pentru anumite rețele și aplicații." "gestionează politica de rețea" "Permite aplicației să gestioneze politicile de rețea și să definească regulile specifice aplicațiilor." - "modificați modul de calcul al utilizării rețelei" + "să modifice modul de calcul al utilizării rețelei" "Permite aplicației să modifice modul în care este calculată utilizarea rețelei pentru aplicații. Nu se utilizează de aplicațiile obișnuite." "accesare notificări" "Permite aplicației să recupereze, să examineze și să șteargă notificări, inclusiv pe cele postate de alte aplicații." @@ -726,7 +726,7 @@ "Permite proprietarului să apeleze aplicația de configurare furnizată de operator. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "ascultă observații despre starea rețelei" "Permite unei aplicații să asculte observații despre starea rețelei. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." - "schimbați calibrarea dispozitivului de intrare" + "schimbă calibrarea dispozitivului de intrare" "Permite aplicației să modifice parametrii de calibrare a ecranului tactil. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "accesează certificatele DRM" "Permite unei aplicații să furnizeze și să utilizeze certificate DRM. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." @@ -744,21 +744,21 @@ "Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "să înceapă să examineze deciziile privind permisiunile" "Permite proprietarului să deschidă ecranul pentru a examina deciziile privind permisiunile. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." - "începeți să vedeți funcțiile aplicației" + "să vadă funcțiile aplicației" "Permite proprietarului să înceapă să vadă informațiile despre funcții pentru o aplicație." "să acceseze date de la senzori la o rată de eșantionare mare" "Permite aplicației să colecteze date de la senzori la o rată de eșantionare de peste 200 Hz" "Să seteze reguli pentru parolă" - "Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului." + "Stabilește lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului." "Să monitorizeze încercările de deblocare a ecranului" - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți datele acesteia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele de pe acesta dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge datele acesteia dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele de pe acesta dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați dispozitivul Android TV sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați sistemul de infotainment sau ștergeți toate datele acestui profil dacă sunt introduse prea multe parole incorecte." - "Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestui profil dacă sunt introduse prea multe parole incorecte." + "Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează telefonul sau șterge toate datele acestui utilizator dacă se introduc prea multe parole incorecte." "Să schimbe blocarea ecranului" "Modifică blocarea ecranului." "Să blocheze ecranul" @@ -914,7 +914,7 @@ "Apasă Meniu pentru deblocare." "Desenează modelul pentru a debloca" "Urgență" - "Reveniți la apel" + "Revino la apel" "Corect!" "Încearcă din nou" "Încearcă din nou" @@ -927,7 +927,7 @@ "Introdu un card SIM." "Cardul SIM lipsește sau nu poate fi citit. Introdu un card SIM." "Card SIM inutilizabil." - "Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM." + "Cardul SIM este dezactivat definitiv.\n Contactează furnizorul de servicii wireless pentru a obține un alt card SIM." "Melodia anterioară" "Melodia următoare" "Pauză" @@ -938,31 +938,31 @@ "Numai apeluri de urgență" "Rețea blocată" "Cardul SIM este blocat cu codul PUK." - "Consultați Ghidul de utilizare sau contactați Serviciul de relații cu clienții." + "Consultă Ghidul de utilizare sau contactează asistența pentru clienți." "Cardul SIM este blocat." "Se deblochează cardul SIM..." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ați introdus incorect parola de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul datelor de conectare la Google.\n\n Încercați din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV prin conectarea la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul datelor de conectare la Google.\n\n Încearcă din nou peste %3$d secunde." "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Tableta va fi acum resetată la setările prestabilite din fabrică." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Acesta va fi acum resetat la setările prestabilite din fabrică." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Acesta va reveni acum la setările din fabrică." "Încearcă din nou peste %d secunde." "Ai uitat modelul?" "Deblocare cont" "Prea multe încercări de desenare a modelului" - "Pentru a debloca, conectați-vă folosind Contul Google." + "Pentru a debloca, conectează-te folosind Contul Google." "Nume de utilizator (e-mail)" "Parolă" "Conectează-te" "Nume de utilizator sau parolă nevalide." - "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." + "Ai uitat numele de utilizator sau parola?\nAccesează ""google.com/accounts/recovery""." "Se verifică..." "Deblochează" "Sunet activat" @@ -1011,7 +1011,7 @@ "JavaScript" "Confirmă părăsirea paginii" "Părăsește această pagină" - "Rămâneți în această pagină" + "Rămâi în această pagină" "%s\n\nSigur părăsești această pagină?" "Confirmă" "Sfat: mărește și micșorează prin dublă atingere." @@ -1046,7 +1046,7 @@ "Permite aplicației să adauge mesaje în Mesaje primite în mesageria vocală." "modificare permisiuni pentru locația geografică a browserului" "Permite aplicației să modifice permisiunile privind locația geografică a browserului. Aplicațiile rău intenționate pot utiliza această permisiune pentru a permite trimiterea informațiilor privind locația către site-uri web arbitrare." - "Doriți ca browserul să rețină această parolă?" + "Vrei ca browserul să rețină această parolă?" "Nu acum" "Reține" "Niciodată" @@ -1075,7 +1075,7 @@ "Șterge interogarea" "Trimite interogarea" "Căutare vocală" - "Activați Explorați prin atingere?" + "Activezi Explorează prin atingere?" "%1$s vrea să activeze funcția Explorează prin atingere. Când e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu tableta." "%1$s dorește să activeze funcția Explorează prin atingere. Când aceasta e activată, poți auzi sau vedea descrieri pentru ceea ce se află sub degetul tău sau poți face gesturi pentru a interacționa cu telefonul." "cu 1 lună în urmă" @@ -1090,9 +1090,9 @@ " zile" "oră" "ore" - "min" + "min." "min." - "sec" + "sec." "sec." "săptămână" "săptămâni" @@ -1117,7 +1117,7 @@ "{count,plural, =1{# an}few{# ani}other{# de ani}}" "Problemă video" "Acest fișier video nu este valid pentru a fi transmis în flux către acest dispozitiv." - "Nu puteți reda acest videoclip" + "Nu poți reda acest videoclip" "OK" "%1$s, %2$s" "prânz" @@ -1132,7 +1132,7 @@ "Eroare la copierea în clipboard" "Inserează" "Inserează ca text simplu" - "Înlocuiți..." + "Înlocuiește..." "Șterge" "Copiază adresa URL" "Selectează text" @@ -1145,10 +1145,10 @@ "Metodă de intrare" "Acțiuni pentru text" "Înapoi" - "Comutați metoda de introducere a textului" + "Schimbă metoda de introducere" "Spațiul de stocare aproape ocupat" "Este posibil ca unele funcții de sistem să nu funcționeze" - "Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți." + "Spațiu de stocare insuficient pentru sistem. Asigură-te că ai 250 MB de spațiu liber și repornește." "%1$s rulează acum" "Atinge pentru mai multe informații sau pentru a opri aplicația." "OK" @@ -1165,8 +1165,8 @@ "neselectat" "în curs" "Finalizare acțiune utilizând" - "Finalizați acțiunea utilizând %1$s" - "Finalizați acțiunea" + "Finalizează acțiunea folosind %1$s" + "Finalizează acțiunea" "Deschide cu" "Deschide cu %1$s" "Deschide" @@ -1185,13 +1185,13 @@ "Trimite folosind %1$s" "Trimite" "Selectează o aplicație de pe ecranul de pornire" - "Utilizați %1$s ca ecran de pornire" + "Folosește %1$s ca ecran de pornire" "Fotografiază" "Fotografiază cu" "Fotografiază cu %1$s" "Fotografiază" "Se utilizează în mod prestabilit pentru această acțiune." - "Utilizați altă aplicație" + "Folosește altă aplicație" "Șterge setările prestabilite din Setări de sistem > Aplicații > Descărcate." "Alege o acțiune" "Alege o aplicație pentru dispozitivul USB" @@ -1212,7 +1212,7 @@ "%1$s nu răspunde" "Procesul %1$s nu răspunde" "OK" - "Raportați" + "Raportează" "Așteaptă" "Pagina a devenit inactivă.\n\nO închizi?" "Aplicație redirecționată" @@ -1242,12 +1242,12 @@ "Se pregătește %1$s." "Se pornesc aplicațiile." "Se finalizează pornirea." - "Continuați configurarea?" - "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor când vă configurați amprenta." + "Continui configurarea?" + "Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor când îți configurezi amprenta." "Dezactivează ecranul" "Continuă configurarea" - "Continuați cu verificarea amprentei?" - "Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor pentru verificarea amprentei." + "Continui cu verificarea amprentei?" + "Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor pentru verificarea amprentei." "Dezactivează ecranul" "Continuă" "Rulează %1$s" @@ -1262,8 +1262,8 @@ "Datele privind memoria au fost culese. Atinge pentru a trimite." "Trimiți datele privind memoria?" "Procesul %1$s și-a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți trimite dezvoltatorului. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal la care aplicația are acces." - "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." - "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le puteți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastați." + "Procesul %1$s a depășit limita de memorie de %2$s. Sunt disponibile datele privind memoria heap, pe care le poți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastezi." + "Sunt disponibile datele privind memoria heap a procesului %1$s, pe care le poți distribui. Atenție: aceste date privind memoria heap pot conține informații cu caracter personal sensibile la care procesul are acces și care pot include ceea ce tastezi." "Alege o acțiune pentru text" "Volum sonerie" "Volum media" @@ -1296,7 +1296,7 @@ "Rețeaua nu are acces la internet" "Serverul DNS privat nu poate fi accesat" "%1$s are conectivitate limitată" - "Atingeți pentru a vă conecta oricum" + "Atinge pentru a te conecta oricum" "S-a comutat la %1$s" "Dispozitivul folosește %1$s când %2$s nu are acces la internet. Se pot aplica taxe." "S-a comutat de la %1$s la %2$s" @@ -1308,7 +1308,7 @@ "VPN" "un tip de rețea necunoscut" - "Acceptați" + "Accept" "Refuz" "Introdu caracterul" "Se trimit mesaje SMS" @@ -1320,18 +1320,18 @@ "Acest lucru va genera costuri în contul tău mobil." "Trimite" "Anulează" - "Doresc să se rețină opțiunea" + "Reține opțiunea" "Poți modifica ulterior în Setări > Aplicații" "Permite întotdeauna" "Nu permite niciodată" "Card SIM eliminat" - "Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus." + "Rețeaua mobilă va fi indisponibilă până când repornești cu un card SIM valid introdus." "Terminat" "Card SIM adăugat" "Repornește dispozitivul pentru a accesa rețeaua mobilă." "Repornește" "Activează serviciul mobil" - "Descărcați aplicația operatorului pentru a vă activa noul card SIM" + "Descarcă aplicația operatorului pentru a activa noul card SIM" "Descarcă aplicația %1$s pentru a-ți activa noul card SIM" "Descarcă aplicația" "S-a introdus un card SIM nou" @@ -1365,19 +1365,19 @@ "Modul Set de testare este activat" "Revino la setările din fabrică pentru a dezactiva modul Set de testare." "Consola din serie este activată" - "Performanța este afectată. Pentru a dezactiva, verificați programul bootloader." + "Performanța este afectată. Pentru a dezactiva, verifică programul bootloader." "MTE experimentală activată" - "Performanța și stabilitatea pot fi afectate. Reporniți pentru a dezactiva. Dacă s-a activat cu arm64.memtag.bootctl, setați înainte la niciuna." + "Performanța și stabilitatea pot fi afectate. Repornește pentru a dezactiva. Dacă s-a activat cu arm64.memtag.bootctl, setează dinainte la niciuna." "Lichide sau reziduuri în portul USB" - "Portul USB este dezactivat automat. Atingeți ca să aflați mai multe." + "Portul USB este dezactivat automat. Atinge ca să afli mai multe." "Portul USB poate fi folosit" "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" "Trimiți raportul de eroare?" "Se trimite raportul de eroare…" - "Administratorul dvs. a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la date și aplicații." - "TRIMITEȚI" - "REFUZAȚI" + "Administratorul a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. E posibil să se permită accesul la date și aplicații." + "TRIMITE" + "REFUZ" "Alege metoda de introducere de text" "Se păstrează pe ecran cât timp este activată tastatura fizică" "Afișează tastatura virtuală" @@ -1388,7 +1388,7 @@ "Afișare peste alte aplicații" "%s se afișează peste alte aplicații" "%s se afișează peste aplicații" - "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." + "Dacă nu vrei ca %s să folosească această funcție, atinge pentru a deschide setările și dezactiveaz-o." "Dezactivează" "Se verifică %s…" "Se examinează conținutul curent" @@ -1397,28 +1397,28 @@ "%s nu funcționează" "Atinge pentru a configura" "Selectează pentru a configura" - "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." + "Poate fi nevoie să reformatezi dispozitivul. Atinge pentru a-l scoate." "Pentru a transfera fotografii și fișiere media" - "Răsfoiți fișierele media" + "Răsfoiește fișierele media" "Problemă cu %s" "%s nu funcționează" "Atinge pentru a remedia" "%s este corupt. Selectează pentru a remedia." - "Poate fi nevoie să reformatați dispozitivul. Atingeți pentru a-l scoate." + "Poate fi nevoie să reformatezi dispozitivul. Atinge pentru a-l scoate." "%s necompatibil" "%s nu funcționează" "Dispozitivul nu este compatibil cu acest %s. Atinge pentru configurare într-un format compatibil." "Selectează pentru a configura %s într-un format acceptat." - "Poate fi nevoie să reformatați dispozitivul" + "Poate fi nevoie să reformatezi dispozitivul" "%s scos pe neașteptate" "Deconectează din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului" "S-a eliminat %s" "Funcționarea ar putea fi necorespunzătoare. Introdu un dispozitiv de stocare nou." "Se deconectează %s" - "Nu scoateți" + "Nu scoate" "Configurează" "Scoate" - "Explorați" + "Explorează" "Schimbă ieșirea" "%s lipsește" "Reintrodu dispozitivul" @@ -1460,10 +1460,10 @@ "Înainte" "Terminat" "Înapoi" - "Executați" - "Formați numărul\nutilizând %s" - "Creați contactul\nutilizând %s" - "Următoarele aplicații solicită permisiunea de a accesa contul dvs. acum și în viitor." + "Execută" + "Formează numărul\nfolosind %s" + "Creează contactul\nutilizând %s" + "Următoarele aplicații solicită permisiunea de a-ți accesa contul acum și în viitor." "Permiți această solicitare?" "Solicitare de acces" "Permite" @@ -1501,12 +1501,12 @@ "Înainte" "Omite" "Nicio potrivire" - "Găsiți pe pagină" + "Caută în pagină" "{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}}" "Terminat" "Se șterge spațiul de stocare distribuit..." "Distribuie" - "Găsiți" + "Caută" "Căutare pe web" "Următorul rezultat" "Rezultatul anterior" @@ -1516,29 +1516,29 @@ "Da" "Nu" "Limita pentru ștergere a fost depășită" - "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce doriți să faceți?" + "Există %1$d elemente șterse pentru %2$s, contul %3$s. Ce vrei să faci?" "Șterge elementele" "Anulează aceste ștergeri" - "Nu trebuie să luați nicio măsură deocamdată" + "Nu trebuie să iei nicio măsură deocamdată" "Alege un cont" "Adaugă un cont" "Adaugă un cont" - "Creșteți" - "Reduceți" - "%s atingeți lung." + "Mărește" + "Redu" + "%s atinge lung." "Glisează în sus pentru a crește și în jos pentru a reduce." - "Creșteți valoarea pentru minute" + "Mărește valoarea pentru minute" "Redu valoarea pentru minute" - "Creșteți valoarea pentru oră" + "Mărește valoarea pentru oră" "Redu valoarea pentru oră" "Setează valoarea PM" "Setează valoarea AM" "Mărește valoarea pentru lună" - "Reduceți valoarea pentru lună" + "Redu valoarea pentru lună" "Mărește valoarea pentru zi" - "Reduceți valoarea pentru zi" - "Creșteți valoarea pentru an" - "Reduceți valoarea pentru an" + "Redu valoarea pentru zi" + "Mărește valoarea pentru an" + "Redu valoarea pentru an" "Luna trecută" "Luna viitoare" "Alt" @@ -1552,7 +1552,7 @@ "Nu s-a putut lansa %s" "Permite accesul pentru" "Permite accesul pentru %s" - "Mâner glisant. Atingeți și țineți apăsat." + "Ghidaj glisant. Atinge și ține apăsat." "Glisează pentru a debloca." "Navighează la ecranul de pornire" "Navighează în sus" @@ -1636,59 +1636,59 @@ "Introdu codul PIN al cardului SIM" "Introdu codul PIN" "Introdu parola" - "Cardul SIM este acum dezactivat. Introduceți codul PUK pentru a continua. Contactați operatorul pentru mai multe detalii." + "Cardul SIM este acum dezactivat. Introdu codul PUK pentru a continua. Contactează operatorul pentru mai multe detalii." "Introdu codul PIN dorit" "Confirmă codul PIN dorit" "Se deblochează cardul SIM..." "Cod PIN incorect." "Introdu un cod PIN format din 4 până la 8 cifre." "Codul PUK trebuie să conțină 8 numere." - "Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." + "Reintrodu codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM." "Codurile PIN nu coincid" "Prea multe încercări de desenare a modelului" - "Pentru a debloca, conectați-vă cu Contul dvs. Google." + "Pentru a debloca, conectează-te folosind Contul Google." "Nume de utilizator (e-mail)" "Parolă" "Conectează-te" "Nume de utilizator sau parolă nevalide." - "Ați uitat numele de utilizator sau parola?\nAccesați ""google.com/accounts/recovery""." + "Ai uitat numele de utilizator sau parola?\nAccesează ""google.com/accounts/recovery""." "Se verifică contul…" - "Ați introdus incorect codul PIN de %1$d ori.\n\nÎncercați din nou peste %2$d secunde." + "Ai introdus incorect codul PIN de %1$d ori.\n\nÎncearcă din nou peste %2$d secunde." "Ai introdus incorect parola de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncercați din nou peste %2$d secunde." - "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. \n\nÎncearcă din nou peste %2$d secunde." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, aceasta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." "Ai făcut %1$d încercări incorecte de deblocare a dispozitivului Android TV. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." - "Ați efectuat %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va fi resetat la setările prestabilite din fabrică, iar toate datele de utilizator se vor pierde." - "Ați făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." + "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acesta va reveni la setările din fabrică, iar toate datele de utilizator se vor pierde." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Tableta va reveni acum la setările din fabrică." "Ai făcut %d încercări incorecte de deblocare a dispozitivului Android TV. Acesta va reveni la setările din fabrică." - "Ați efectuat %d încercări incorecte de deblocare a telefonului. Telefonul va fi acum resetat la setările prestabilite din fabrică." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." + "Ai făcut %d încercări incorecte de deblocare a telefonului. Telefonul va reveni acum la setările din fabrică." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi dispozitivul Android TV cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." " — " "Elimină" - "Ridicați volumul mai sus de nivelul recomandat?\n\nAscultarea la volum ridicat pe perioade lungi de timp vă poate afecta auzul." - "Utilizați comanda rapidă pentru accesibilitate?" - "Atunci când comanda rapidă este activată, dacă apăsați ambele butoane de volum timp de trei secunde, veți lansa o funcție de accesibilitate." + "Mărești volumul peste nivelul recomandat?\n\nDacă asculți perioade lungi la volum ridicat, auzul poate fi afectat." + "Folosești comanda rapidă pentru accesibilitate?" + "Când comanda rapidă e activată, dacă apeși ambele butoane de volum timp de trei secunde, vei lansa o funcție de accesibilitate." "Activezi comanda rapidă pentru funcțiile de accesibilitate?" - "Dacă apăsați ambele taste de volum câteva secunde, activați funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPuteți schimba funcțiile selectate din Setări > Accesibilitate." + "Dacă apeși ambele taste de volum câteva secunde, activezi funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n%1$s\nPoți schimba funcțiile selectate din Setări > Accesibilitate." " • %1$s\n" "Activezi comanda rapidă %1$s?" - "Dacă apăsați ambele taste de volum câteva secunde, activați funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPuteți alege altă funcție pentru această comandă în Setări > Accesibilitate." + "Dacă apeși ambele taste de volum câteva secunde, activezi funcția de accesibilitate %1$s. Acest lucru poate schimba funcționarea dispozitivului.\n\nPoți alege altă funcție pentru această comandă în Setări > Accesibilitate." "Activează" - "Nu activați" + "Nu activa" "ACTIVAT" "DEZACTIVAT" - "Permiteți serviciului %1$s să aibă control total asupra dispozitivului dvs.?" - "Controlul total este adecvat pentru aplicații care vă ajută cu accesibilitatea, însă nu pentru majoritatea aplicaților." - "Vă vede și vă controlează ecranul" + "Permiți serviciului %1$s să aibă control total asupra dispozitivului?" + "Controlul total este adecvat pentru aplicații care te ajută cu accesibilitatea, însă nu pentru majoritatea aplicaților." + "să vadă și să controleze ecranul" "Poate citi tot conținutul de pe ecran și poate afișa conținut peste alte aplicații." - "Vă vede interacțiunile și le realizează" - "Poate urmări interacțiunile dvs. cu o aplicație sau cu un senzor hardware și poate interacționa cu aplicații în numele dvs." + "să vadă și să facă acțiuni" + "Poate să urmărească interacțiunile tale cu o aplicație sau cu un senzor hardware și să interacționeze cu aplicații în numele tău." "Permite" "Refuz" - "Atingeți o funcție ca să începeți să o folosiți:" - "Alegeți funcțiile pe care să le folosiți cu butonul de accesibilitate" + "Atinge o funcție ca să începi să o folosești:" + "Alege funcțiile pe care să le folosești cu butonul de accesibilitate" "Alege funcțiile pentru comanda rapidă a butonului de volum" "%s a fost dezactivat" "Editează comenzile rapide" @@ -1702,12 +1702,12 @@ "S-au apăsat lung tastele de volum. S-a activat %1$s." "S-au apăsat lung tastele de volum. S-a dezactivat %1$s." "Apasă ambele butoane de volum timp de trei secunde pentru a folosi %1$s" - "Alegeți o funcție pe care să o folosiți când atingeți butonul de accesibilitate:" - "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):" - "Alegeți o funcție pe care să o folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):" - "Pentru a comuta între funcții, atingeți lung butonul de accesibilitate." - "Pentru a comuta între funcții, glisați în sus cu două degete și mențineți apăsat." - "Pentru a comuta între funcții, glisați în sus cu trei degete și mențineți apăsat." + "Alege o funcție pe care să o folosești când atingi butonul de accesibilitate:" + "Alege o funcție pe care să o folosești cu gestul de accesibilitate (glisează în sus cu două degete din partea de jos a ecranului):" + "Alege o funcție pe care să o folosești cu gestul de accesibilitate (glisează în sus cu trei degete din partea de jos a ecranului):" + "Pentru a comuta între funcții, atinge lung butonul de accesibilitate." + "Pentru a comuta între funcții, glisează în sus cu două degete și ține apăsat." + "Pentru a comuta între funcții, glisează în sus cu trei degete și ține apăsat." "Mărire" "Utilizator curent: %1$s." "Se comută la %1$s…" @@ -1717,7 +1717,7 @@ "Eroare" "Această modificare nu este permisă de administrator" "Nicio aplicație pentru gestionarea acestei acțiuni" - "Revocați" + "Revocă" "ISO A0" "ISO A1" "ISO A2" @@ -1825,12 +1825,12 @@ "Codul PIN actual" "Codul PIN nou" "Confirmă noul cod PIN" - "Creați un cod PIN pentru modificarea restricțiilor" - "Codurile PIN nu se potrivesc. Încercați din nou." + "Creează un cod PIN pentru modificarea restricțiilor" + "PIN-urile nu sunt identice. Încearcă din nou." "Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre." "Reîncearcă mai târziu" "Vizualizare pe ecran complet" - "Pentru a ieși, glisați de sus în jos." + "Pentru a ieși, glisează de sus în jos." "Am înțeles" "Terminat" "Selector circular pentru ore" @@ -1848,7 +1848,7 @@ "Solicită parola înainte de a anula fixarea" "Instalat de administrator" "Actualizat de administrator" - "Șters de administratorul dvs." + "Șters de administrator" "OK" "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." "Economisirea bateriei activează tema întunecată și restricționează sau dezactivează activitatea în fundal, unele efecte vizuale, alte funcții și câteva conexiuni la rețea." @@ -1866,8 +1866,8 @@ "Până %1$s" "Până la %1$s" "Până la %1$s (următoarea alarmă)" - "Până când dezactivați" - "Până când dezactivați „Nu deranja”" + "Până dezactivezi" + "Până când dezactivezi „Nu deranja”" "%1$s/%2$s" "Restrânge" "Nu deranja" @@ -1899,13 +1899,13 @@ "Port USB periferic" "Mai multe opțiuni" "Închide meniul suplimentar" - "Maximizați" + "Maximizează" "Închide" "%1$s: %2$s" "Răspunde" "Video" - "Respingeți" - "Încheiați" + "Respinge" + "Închide" "Apel primit" "Apel în desfășurare" "Se filtrează un apel primit" @@ -1928,7 +1928,7 @@ "Află mai multe" "Anulează întreruperea aplicației" "Activezi aplicațiile pentru lucru?" - "Obțineți acces la aplicațiile pentru lucru și notificări" + "Obține acces la aplicațiile și notificările pentru lucru" "Activează" "Aplicația nu este disponibilă" "%1$s nu este disponibilă momentan." @@ -1949,17 +1949,17 @@ "Aplicația necesită securitate suplimentară. Încearcă pe dispozitivul Android TV." "Aplicația necesită securitate suplimentară. Încearcă pe tabletă." "Aplicația necesită securitate suplimentară. Încearcă pe telefon." - "Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul." + "Această aplicație a fost creată pentru o versiune Android mai veche și e posibil să nu funcționeze corect. Încearcă să cauți actualizări sau contactează dezvoltatorul." "Caută actualizări" - "Aveți mesaje noi" + "Ai mesaje noi" "Deschide aplicația pentru SMS-uri ca să vezi" "Unele funcții ar putea fi limitate" "Profil de serviciu blocat" "Atinge ca să deblochezi" "Conectat la %1$s" "Atinge pentru a vedea fișierele" - "Fixați" - "Fixați %1$s" + "Fixează" + "Fixează %1$s" "Anulează fixarea" "Anulează fixarea pentru %1$s" "Informații despre aplicație" @@ -1985,7 +1985,7 @@ "Setează ora" "Introdu o oră validă" "Introdu ora" - "Pentru a introduce ora, comutați la modul de introducere a textului." + "Pentru a introduce ora, comută la modul de introducere a textului." "Pentru a introduce ora, comută la modul ceas." "Opțiuni de completare automată" "Salvează pentru completare automată" @@ -2014,9 +2014,9 @@ "card" "nume de utilizator" "adresă de e-mail" - "Păstrați-vă calmul și căutați un adăpost în apropiere." - "Părăsiți imediat zonele de coastă și din apropierea râurilor și îndreptați-vă spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." - "Păstrați-vă calmul și căutați un adăpost în apropiere." + "Păstrează-ți calmul și caută un adăpost în apropiere." + "Părăsește imediat zonele de coastă și din apropierea râurilor și îndreaptă-te spre un loc mai sigur, cum ar fi o zonă aflată la înălțime." + "Păstrează-ți calmul și caută un adăpost în apropiere." "Testarea mesajelor de urgență" "Răspunde" @@ -2035,13 +2035,13 @@ "Nu s-a putut restabili comanda rapidă din cauza nepotrivirii semnăturii aplicației" "Nu s-a putut restabili comanda rapidă" "Comanda rapidă este dezactivată" - "DEZINSTALAȚI" + "DEZINSTALEAZĂ" "Deschide oricum" "Aplicație dăunătoare detectată" "Permiți ca %s să acceseze toate jurnalele dispozitivului?" "Permite accesul o dată" "Nu permite" - "Jurnalele dispozitivului înregistrează activitatea de pe dispozitivul dvs. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permiteți accesul la toate jurnalele dispozitivului doar aplicațiilor în care aveți încredere. \n\nDacă nu permiteți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. Este posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Aflați mai multe" + "Jurnalele dispozitivului înregistrează activitatea de pe acesta. Aplicațiile pot folosi aceste jurnale pentru a identifica și a remedia probleme.\n\nUnele jurnale pot să conțină informații sensibile, prin urmare permite accesul la toate jurnalele dispozitivului doar aplicațiilor în care ai încredere. \n\nDacă nu permiți accesul aplicației la toate jurnalele dispozitivului, aceasta poate în continuare să acceseze propriile jurnale. E posibil ca producătorul dispozitivului să acceseze în continuare unele jurnale sau informații de pe dispozitiv. Află mai multe." "Nu mai afișa" "%1$s vrea să afișeze porțiuni din %2$s" "Editează" @@ -2050,11 +2050,11 @@ "Modificări de sistem" "Nu deranja" "Funcția nouă Nu deranja ascunde notificările" - "Atingeți ca să aflați mai multe și să modificați" + "Atinge ca să afli mai multe și să modifici" "Funcția Nu deranja s-a schimbat" "Atinge pentru a verifica ce este blocat." - "Examinați setările pentru notificări" - "Începând cu Android 13, aplicațiile pe care le instalați necesită permisiunea de a trimite notificări. Atingeți ca să modificați permisiunea pentru aplicațiile existente." + "Verifică setările pentru notificări" + "Începând cu Android 13, aplicațiile pe care le instalezi necesită permisiunea de a trimite notificări. Atinge ca să modifici permisiunea pentru aplicațiile existente." "Mai târziu" "Închide" "Sistem" @@ -2062,7 +2062,7 @@ "Cameră foto" "Microfon" "se afișează peste alte aplicații de pe ecran" - "Oferiți feedback" + "Oferă feedback" "Notificarea a fost promovată la Prestabilită. Atinge pentru a oferi feedback." "Notificarea a fost mutată în jos la Silențioasă. Atinge pentru a oferi feedback." "Notificarea a fost mutată la un nivel superior. Atinge pentru a oferi feedback." @@ -2072,7 +2072,7 @@ "OK" "Dezactivează" "Află mai multe" - "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și vă organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." + "Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja." "Notificare pentru informații despre modul Rutină" "Bateria se poate descărca înainte de încărcarea obișnuită" "Economisirea bateriei este activată pentru a mări autonomia" @@ -2260,9 +2260,9 @@ "Noi setări de mărire" - "Acum puteți mări o parte a ecranului" + "Acum poți mări o parte a ecranului" "Activează din Setări" - "Respingeți" + "Închide" "Deblochează microfonul dispozitivului" "Deblochează camera dispozitivului" "Pentru <b>%s</b> și toate aplicațiile și serviciile" @@ -2270,8 +2270,8 @@ "Confidențialitatea privind senzorii" "Pictograma aplicației" "Imaginea de branding a aplicației" - "Verificați setările pentru acces" - "%s poate să vadă și să vă controleze ecranul. Atingeți pentru a examina." + "Verifică setările pentru acces" + "%s poate să vadă și să controleze ecranul. Atinge pentru a verifica." "%1$s a fost tradus." "Mesaj tradus din %1$s în %2$s." "Activitate de fundal" @@ -2279,7 +2279,7 @@ "O aplicație este încă activă" "%1$s rulează în fundal. Atinge pentru a gestiona utilizarea bateriei." "%1$s poate afecta autonomia bateriei. Atinge pentru a examina aplicațiile active." - "Verificați aplicațiile active" + "Verifică aplicațiile active" "Nu se poate accesa camera foto a telefonului de pe %1$s" "Nu se poate accesa camera foto a tabletei de pe %1$s" "Prestabilit de sistem" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index f7b1da4bc900..92f80ef08c79 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1943,10 +1943,10 @@ "Настройки телефона недоступны" "Эта функция недоступна на устройстве %1$s. Используйте Android TV." "Эта функция недоступна на устройстве %1$s. Используйте планшет." - "Эта функция недоступна на устройстве %1$s. Используйте телефон." + "На устройстве %1$s эта функция недоступна. Используйте телефон." "Эта функция пока недоступна на устройстве %1$s. Используйте Android TV." "Эта функция пока недоступна на устройстве %1$s. Используйте планшет." - "Эта функция пока недоступна на устройстве %1$s. Используйте телефон." + "На устройстве %1$s эта функция пока недоступна. Используйте телефон." "Это приложение запрашивает дополнительные меры защиты. Используйте Android TV." "Это приложение запрашивает дополнительные меры защиты. Используйте планшет." "Это приложение запрашивает дополнительные меры защиты. Используйте телефон." @@ -2281,7 +2281,7 @@ "\"%1$s\" работает в фоновом режиме. Нажмите, чтобы изменить настройки, связанные с расходом заряда батареи." "Приложение \"%1$s\" может влиять на время работы батареи. Нажмите, чтобы увидеть активные приложения." "Проверить активные приложения" - "У устройства \"%1$s\" нет доступа к камере телефона." + "У устройства %1$s нет доступа к камере телефона." "У устройства \"%1$s\" нет доступа к камере планшета." "Системные настройки по умолчанию" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 8b3768c3642d..b5b6e0fee962 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1943,13 +1943,13 @@ "Nastavenia telefónu nie sú k dispozícii" "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť zariadenie Android TV." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť tablet." - "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť telefón." + "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste použiť telefón." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť zariadenie Android TV." "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť tablet." - "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste namiesto toho použiť telefón." + "V zariadení %1$s momentálne nemáte prístup k tomuto obsahu. Skúste použiť telefón." "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť zariadenie Android TV." "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť tablet." - "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste namiesto toho použiť telefón." + "Táto aplikácia požaduje dodatočné zabezpečenie. Skúste použiť telefón." "Táto aplikácia bola zostavená pre staršiu verziu Androidu a nemusí správne fungovať. Skúste skontrolovať dostupnosť aktualizácií alebo kontaktovať vývojára." "Skontrolovať dostupnosť aktualizácie" "Máte nové správy." diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index d64b7e6d9c54..a8e75df758fb 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1939,12 +1939,12 @@ "Mipangilio ya Android TV haipatikani" "Mipangilio ya kompyuta kibao haipatikani" "Mipangilio ya simu haipatikani" - "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kifaa chako cha Android TV." + "Huwezi kuifikia kwenye %1$s. Ijaribu kwenye kifaa chako cha Android TV." "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye kompyuta yako kibao." - "Huwezi kufikia programu hii kwenye %1$s chako. Badala yake jaribu kwenye simu yako." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye kifaa chako cha Android TV." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye kompyuta yako kibao." - "Huwezi kufikia programu hii kwenye %1$s chako kwa muda huu. Badala yake jaribu kwenye simu yako." + "Huwezi kuifikia kwenye %1$s. Ijaribu kwenye simu yako." + "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kifaa chako cha Android TV." + "Huwezi kufikia programu hii kwenye kifaa chako cha %1$s kwa wakati huu. Badala yake jaribu kwenye kompyuta yako kibao." + "Huwezi kuifikia kwenye %1$s kwa wakati huu. Ijaribu kwenye simu yako." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kifaa chako cha Android TV." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye kompyuta yako kibao." "Programu hii inaomba usalama wa ziada. Badala yake jaribu kwenye simu yako." @@ -2279,7 +2279,7 @@ "%1$s inatumika chinichini. Gusa ili udhibiti matumizi ya betri." "%1$s inaweza kuathiri muda wa matumizi ya betri. Gusa ili ukague programu zinazotumika." "Angalia programu zinazotumika" - "Haiwezi kufikia kamera ya simu kutoka kwenye %1$s yako" + "Huwezi kufikia kamera ya simu kutoka kwenye %1$s yako" "Haiwezi kufikia kamera ya kompyuta kibao kutoka kwenye %1$s yako" "Chaguomsingi la mfumo" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 4332b50e7871..e576522b0940 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -499,7 +499,7 @@ "వాల్‌పేపర్‌ను సెట్ చేయడం" "సిస్టమ్ వాల్‌పేపర్‌ను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "మీ వాల్‌పేపర్ పరిమాణాన్ని సర్దుబాటు చేయడం" - "సిస్టమ్ వాల్‌పేపర్ పరిమాణం సూచనలను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "సిస్టమ్ వాల్‌పేపర్ సైజ్‌ సూచనలను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "సమయ మండలిని సెట్ చేయడం" "టాబ్లెట్ యొక్క సమయ మండలిని మార్చడానికి యాప్‌ను అనుమతిస్తుంది." "మీ Android TV పరికరం సమయ మండలిని మార్చడానికి యాప్‌ని అనుమతిస్తుంది." @@ -1438,7 +1438,7 @@ "తొలగిస్తోంది…" "ఫార్మాట్ చేస్తోంది..." "చొప్పించబడలేదు" - "సరిపోలే కార్యాచరణలు కనుగొనబడలేదు." + "మ్యాచ్ అయ్యే కార్యాచరణలు కనుగొనబడలేదు." "మీడియా అవుట్‌పుట్‌ను మళ్లించడం" "మీడియా అవుట్‌పుట్‌ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్‌స్టాల్ సెషన్‌లను చదవడం" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index bbbedfab23de..4a2f0f918b59 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1224,7 +1224,7 @@ "Luôn hiển thị" "%1$s được xây dựng cho phiên bản không tương thích của hệ điều hành Android và có thể hoạt động không như mong đợi. Bạn có thể sử dụng phiên bản cập nhật của ứng dụng." "Luôn hiển thị" - "Kiểm tra bản cập nhật" + "Kiểm tra để tìm bản cập nhật" "Ứng dụng %1$s (quá trình %2$s) đã vi phạm chính sách StrictMode tự thi hành của mình." "Quá trình %1$s đã vi phạm chính sách StrictMode tự thi hành của mình." "Điện thoại đang cập nhật…" @@ -1949,7 +1949,7 @@ "Ứng dụng này đang yêu cầu tính năng bảo mật bổ sung. Hãy thử trên máy tính bảng." "Ứng dụng này đang yêu cầu tính năng bảo mật bổ sung. Hãy thử trên điện thoại." "Ứng dụng này được xây dựng cho một phiên bản Android cũ hơn và có thể hoạt động không bình thường. Hãy thử kiểm tra các bản cập nhật hoặc liên hệ với nhà phát triển." - "Kiểm tra bản cập nhật" + "Kiểm tra để tìm bản cập nhật" "Bạn có tin nhắn mới" "Mở ứng dụng SMS để xem" "Một số chức năng có thể bị hạn chế" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 3c030a78aace..1578baba3a6d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1554,7 +1554,7 @@ "滑动手柄。触摸并按住。" "滑动解锁。" "导航首页" - "向上导航" + "返回" "更多选项" "%1$s:%2$s" "%1$s - %2$s:%3$s" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 76bccc862d74..bff44e6955ac 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1940,10 +1940,10 @@ "無法使用平板電腦設定" "無法使用手機設定" "無法在 %1$s 上存取這個應用程式,請改用 Android TV 裝置。" - "無法在 %1$s 上存取這個應用程式,請改用平板電腦。" + "無法在 %1$s 上存取這個項目,請改用平板電腦。" "無法在 %1$s 上存取這個應用程式,請改用手機。" "目前無法在 %1$s 上存取這個應用程式,請改用 Android TV 裝置。" - "目前無法在 %1$s 上存取這個應用程式,請改用平板電腦。" + "目前無法在 %1$s 上存取這個項目,請改用平板電腦。" "目前無法在 %1$s 上存取這個應用程式,請改用手機。" "這個應用程式要求進行額外的安全性驗證,請改用 Android TV 裝置。" "這個應用程式要求進行額外的安全性驗證,請改用平板電腦。" -- cgit v1.2.3 From b33b0296316eafcf697586dd9db85a262b303931 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 13:58:08 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1892b2a0139528022e092852409d4fd690c96214 --- packages/VpnDialogs/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml index 94a79090bb51..f86a5d64fcce 100644 --- a/packages/VpnDialogs/res/values-ro/strings.xml +++ b/packages/VpnDialogs/res/values-ro/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Solicitare de conexiune" "%s dorește să configureze o conexiune VPN care să îi permită să monitorizeze traficul în rețea. Acceptă numai dacă ai încredere în sursă. Când conexiunea VPN e activă, <br /> <br /> <img src=vpn_icon /> se afișează în partea de sus a ecranului." - "%s solicită permisiunea de a configura o conexiune VPN care să îi permită să monitorizeze traficul de rețea. Acceptați numai dacă aveți încredere în sursă. <br /> <br /> <img src=vpn_icon /> va apărea pe ecran atunci când conexiunea VPN este activă." + "%s solicită permisiunea de a configura o conexiune VPN care să îi permită să monitorizeze traficul de rețea. Acceptă numai dacă ai încredere în sursă. <br /> <br /> <img src=vpn_icon /> va apărea pe ecran când conexiunea VPN e activă." "VPN este conectat" "Sesiune:" "Durată:" -- cgit v1.2.3 From 553dea558133e77d27e696c829431b9e79e48ca4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 14:55:15 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5dfe71551a15dee87efa703b31a229415779d69b --- libs/WindowManager/Shell/res/values-ro/strings_tv.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml index 36df2864a752..b5245ffbf0bc 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml @@ -26,8 +26,8 @@ "Restrânge" " Apasă de două ori ""butonul ecran de pornire"" pentru comenzi" "Meniu picture-in-picture." - "Mută spre stânga" - "Mută spre dreapta" + "Mută la stânga" + "Mută la dreapta" "Mută în sus" "Mută în jos" "Gata" -- cgit v1.2.3 From 5aa5f41c0b36f25e85e0f615f415dcd316dff253 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 14:58:56 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iccc06a50a2202991a91435378065d73bbf7ff03f --- libs/WindowManager/Shell/res/values-ro/strings.xml | 30 +++++++++++----------- libs/WindowManager/Shell/res/values-te/strings.xml | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index ba3701dc734c..05942d368647 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -23,13 +23,13 @@ "Accesează ecranul împărțit" "Meniu" "%s este în modul picture-in-picture" - "Dacă nu doriți ca %s să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o." + "Dacă nu vrei ca %s să folosească această funcție, atinge pentru a deschide setările și dezactiveaz-o." "Redă" "Întrerupe" - "Treceți la următorul" - "Treceți la cel anterior" - "Redimensionați" - "Stocați" + "Treci la următorul" + "Treci la cel anterior" + "Redimensionează" + "Stochează" "Anulează stocarea" "Este posibil ca aplicația să nu funcționeze cu ecranul împărțit." "Aplicația nu acceptă ecranul împărțit." @@ -47,9 +47,9 @@ "Partea de sus: 30%" "Partea de jos pe ecran complet" "Folosirea modului cu o mână" - "Pentru a ieși, glisați în sus din partea de jos a ecranului sau atingeți oriunde deasupra ferestrei aplicației" + "Pentru a ieși, glisează în sus din partea de jos a ecranului sau atinge oriunde deasupra ferestrei aplicației" "Activează modul cu o mână" - "Părăsiți modul cu o mână" + "Ieși din modul cu o mână" "Setări pentru baloanele %1$s" "Suplimentar" "Adaugă înapoi în stivă" @@ -61,21 +61,21 @@ "Mută în dreapta jos" "Setări %1$s" "Închide balonul" - "Nu afișați conversația în balon" + "Nu afișa conversația în balon" "Chat cu baloane" - "Conversațiile noi apar ca pictograme flotante sau baloane. Atingeți pentru a deschide balonul. Trageți pentru a-l muta." - "Controlați oricând baloanele" - "Atingeți Gestionați pentru a dezactiva baloanele din această aplicație" + "Conversațiile noi apar ca pictograme flotante sau baloane. Atinge pentru a deschide balonul. Trage pentru a-l muta." + "Controlează oricând baloanele" + "Atinge Gestionează pentru a dezactiva baloanele din această aplicație" "OK" "Nu există baloane recente" "Baloanele recente și baloanele respinse vor apărea aici" "Balon" "Gestionează" "Balonul a fost respins." - "Atingeți ca să reporniți aplicația și să treceți în modul ecran complet." - "Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra" - "Nu ați remediat problema?\nAtingeți pentru a reveni" - "Nu aveți probleme cu camera foto? Atingeți pentru a închide." + "Atinge ca să repornești aplicația și să treci în modul ecran complet." + "Ai probleme cu camera foto?\nAtinge pentru a reîncadra" + "Nu ai remediat problema?\nAtinge pentru a reveni" + "Nu ai probleme cu camera foto? Atinge pentru a închide." "Unele aplicații funcționează cel mai bine în orientarea portret" "Încearcă una dintre aceste opțiuni pentru a profita din plin de spațiu" "Rotește dispozitivul pentru a trece în modul ecran complet" diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 733075550007..11da09d1e71e 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -28,7 +28,7 @@ "పాజ్ చేయి" "దాటవేసి తర్వాత దానికి వెళ్లు" "దాటవేసి మునుపటి దానికి వెళ్లు" - "పరిమాణం మార్చు" + "సైజ్‌ మార్చు" "స్టాచ్" "ఆన్‌స్టాచ్" "స్క్రీన్ విభజనతో యాప్‌ పని చేయకపోవచ్చు." -- cgit v1.2.3 From 67db62487dc6442feca192f41406d58929616b2c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 15:02:53 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib794b01d4a2d7bf7c2fbfde5a294e9c86f2c0a04 --- .../CompanionDeviceManager/res/values-be/strings.xml | 2 +- .../CompanionDeviceManager/res/values-bg/strings.xml | 2 +- .../CompanionDeviceManager/res/values-de/strings.xml | 2 +- .../CompanionDeviceManager/res/values-es/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-eu/strings.xml | 2 +- .../CompanionDeviceManager/res/values-fa/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-gl/strings.xml | 2 +- .../CompanionDeviceManager/res/values-hi/strings.xml | 2 +- .../CompanionDeviceManager/res/values-is/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-ja/strings.xml | 2 +- .../CompanionDeviceManager/res/values-ko/strings.xml | 2 +- .../CompanionDeviceManager/res/values-ky/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-mk/strings.xml | 2 +- .../CompanionDeviceManager/res/values-nb/strings.xml | 2 +- .../CompanionDeviceManager/res/values-nl/strings.xml | 2 +- .../res/values-pt-rPT/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-ro/strings.xml | 18 +++++++++--------- .../CompanionDeviceManager/res/values-sk/strings.xml | 2 +- .../CompanionDeviceManager/res/values-sw/strings.xml | 4 ++-- .../CompanionDeviceManager/res/values-te/strings.xml | 2 +- .../CompanionDeviceManager/res/values-ur/strings.xml | 4 ++-- .../res/values-zh-rHK/strings.xml | 2 +- 22 files changed, 37 insertions(+), 37 deletions(-) diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml index 2086f2eddf09..0c13c18eddd7 100644 --- a/packages/CompanionDeviceManager/res/values-be/strings.xml +++ b/packages/CompanionDeviceManager/res/values-be/strings.xml @@ -35,7 +35,7 @@ "Фота і медыяфайлы" "Сэрвісы Google Play" - "Праграма \"%1$s\" запытвае дазвол ад імя вашай прылады \"%2$s\" на перадачу праграм плынню паміж вашымі прыладамі" + "Праграма \"%1$s\" запытвае дазвол ад імя вашай прылады \"%2$s\" на трансляцыю праграм паміж вашымі прыладамі" "прылада" "Дазволіць" diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml index 134ae1c90bab..1d52103255f3 100644 --- a/packages/CompanionDeviceManager/res/values-bg/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml @@ -35,7 +35,7 @@ "Снимки и мултимедия" "Услуги за Google Play" - "%1$s иска разрешение от името на %2$s да предава поточно приложения между устройствата ви" + "„%1$s“ иска разрешение от името на %2$s да предава поточно приложения между устройствата ви" "устройство" "Разрешаване" diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml index 0b6a195763c6..934d33896bbe 100644 --- a/packages/CompanionDeviceManager/res/values-de/strings.xml +++ b/packages/CompanionDeviceManager/res/values-de/strings.xml @@ -35,7 +35,7 @@ "Fotos und Medien" "Google Play-Dienste" - "%1$s bittet im Namen deines %2$s um die Berechtigung zum Streamen von Apps zwischen deinen Geräten" + "%1$s bittet für dein %2$s um die Berechtigung zum Streamen von Apps zwischen deinen Geräten" "Gerät" "Zulassen" diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml index 66bb1b9fd152..ee4c849e29f7 100644 --- a/packages/CompanionDeviceManager/res/values-es/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es/strings.xml @@ -23,12 +23,12 @@ "Se necesita esta aplicación para gestionar tu %1$s. %2$s podrá interactuar con tus notificaciones y acceder a tus permisos de teléfono, SMS, contactos, calendario, registros de llamadas y dispositivos cercanos." "Aplicaciones" "Proyecta aplicaciones de tu teléfono" - "Permitir que <strong>%1$s</strong> acceda a esta información desde tu teléfono" + "Permitir que <strong>%1$s</strong> acceda a esta información de tu teléfono" "Servicios multidispositivo" "%1$s está pidiendo permiso en nombre de tu %2$s para acceder a las fotos, los archivos multimedia y las notificaciones de tu teléfono" - "Permitir que <strong>%1$s</strong> acceda a esta información desde tu teléfono" + "Permitir que <strong>%1$s</strong> acceda a esta información de tu teléfono" "Notificaciones" "Puede leer todas las notificaciones, incluida información como contactos, mensajes y fotos" diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml index 395c385948da..a089e50fd5f6 100644 --- a/packages/CompanionDeviceManager/res/values-eu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml @@ -28,7 +28,7 @@ "Telefonoko argazkiak, multimedia-edukia eta jakinarazpenak atzitzeko baimena eskatzen ari da %1$s, %2$s gailuaren izenean" - "Eman informazio hori telefonotik hartzeko baimena <strong>%1$s</strong> aplikazioari" + "Eman telefonoko informazio hau atzitzeko baimena <strong>%1$s</strong> aplikazioari" "Jakinarazpenak" "Jakinarazpen guztiak irakur ditzake; besteak beste, kontaktuak, mezuak, argazkiak eta antzeko informazioa" diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml index beabaf1842bd..e77e517c9090 100644 --- a/packages/CompanionDeviceManager/res/values-fa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml @@ -28,7 +28,7 @@ "%1$s اجازه می‌خواهد ازطرف %2$s به عکس‌ها، رسانه، و اعلان‌های تلفن شما دسترسی پیدا کند" - "‏<strong>%1$s</strong> مجاز می‌شود به این اطلاعات در دستگاهتان دسترسی پیدا کند" + "‏به <strong>%1$s</strong> اجازه دسترسی به این اطلاعات در دستگاهتان داده شود" "اعلان‌ها" "می‌تواند همه اعلان‌ها، ازجمله اطلاعاتی مثل مخاطبین، پیام‌ها، و عکس‌ها را بخواند" @@ -40,7 +40,7 @@ "اجازه دادن" "اجازه ندادن" - "برگشت" + "برگشتن" "انتقال اجازه‌های برنامه به ساعت" "برای آسان‌تر کردن راه‌اندازی ساعت، برنامه‌های نصب‌شده در ساعت درحین راه‌اندازی از همان اجازه‌های تلفن استفاده خواهند کرد.\n\n ممکن است این اجازه‌ها شامل دسترسی به میکروفون و مکان ساعت باشد." "نماد برنامه" diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml index c692c034cf22..3348e0561c9e 100644 --- a/packages/CompanionDeviceManager/res/values-gl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml @@ -28,7 +28,7 @@ "%1$s está solicitando permiso en nome do teu dispositivo (%2$s) para acceder ás fotos, ao contido multimedia e ás notificacións do teléfono" - "Permitir que <strong>%1$s</strong> acceda a esta información desde o teu teléfono" + "Permitir que <strong>%1$s</strong> acceda a esta información do teu teléfono" "Notificacións" "Pode ler todas as notificacións (que poden incluír información como contactos, mensaxes e fotos)" diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml index dfe5038541ea..f1ff1d0678dc 100644 --- a/packages/CompanionDeviceManager/res/values-hi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml @@ -31,7 +31,7 @@ "<strong>%1$s</strong> को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें" "सूचनाएं" - "इससे सभी सूचनाएं देखी जा सकती हैं. इसमें संपर्क, मैसेज, और फ़ोटो जैसी जानकारी शामिल होती है" + "इससे सभी सूचनाएं देखी जा सकती हैं. इनमें संपर्क, मैसेज, और फ़ोटो जैसी जानकारी शामिल होती है" "फ़ोटो और मीडिया" "Google Play services" diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml index 3f5a3de9de77..3d372a88d101 100644 --- a/packages/CompanionDeviceManager/res/values-is/strings.xml +++ b/packages/CompanionDeviceManager/res/values-is/strings.xml @@ -31,11 +31,11 @@ "Veita <strong>%1$s</strong> aðgang að þessum upplýsingum úr símanum þínum" "Tilkynningar" - "Getur lesið allar tilkynningar, þar á meðal upplýsingar á borð við tengiliði skilaboð og myndir" + "Getur lesið allar tilkynningar, þar á meðal upplýsingar á borð við tengiliði, skilaboð og myndir" "Myndir og efni" "Þjónusta Google Play" - "%1$s sendir beiðni um heimild fyrir straumspilun forrita á milli tækjanna þinna fyrir hönd %2$s" + "%1$s sendir beiðni um heimild til straumspilunar forrita á milli tækjanna þinna fyrir hönd %2$s" "tæki" "Leyfa" diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml index 26b8a9055fdc..34acbabb4643 100644 --- a/packages/CompanionDeviceManager/res/values-ja/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml @@ -28,7 +28,7 @@ "%1$s%2$s に代わってスマートフォンの写真、メディア、通知にアクセスする権限をリクエストしています" - "このスマートフォンからの情報へのアクセスを <strong>%1$s</strong> に許可" + "スマートフォンのこの情報へのアクセスを <strong>%1$s</strong> に許可" "通知" "連絡先、メッセージ、写真に関する情報を含め、すべての通知を読み取ることができます" diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml index 5c0e005bbb68..c23772a8272f 100644 --- a/packages/CompanionDeviceManager/res/values-ko/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml @@ -28,7 +28,7 @@ "%1$s에서 %2$s 대신 휴대전화의 사진, 미디어, 알림에 액세스할 수 있는 권한을 요청하고 있습니다." - "<strong>%1$s</strong> 앱이 휴대전화에서 이 정보에 액세스하도록 허용합니다." + "<strong>%1$s</strong> 앱이 휴대전화에서 이 정보에 액세스하도록 허용" "알림" "연락처, 메시지, 사진 등의 정보를 포함한 모든 알림을 읽을 수 있습니다." diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml index d641f299d652..f31ed382451f 100644 --- a/packages/CompanionDeviceManager/res/values-ky/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml @@ -32,10 +32,10 @@ "Билдирмелер" "Бардык билдирмелерди, анын ичинде байланыштар, билдирүүлөр жана сүрөттөр сыяктуу маалыматты окуй алат" - "Сүрөттөр жана медиа" + "Сүрөттөр жана медиафайлдар" "Google Play кызматтары" - "%1$s колдонмосу %2$s түзмөгүңүздүн атынан түзмөктөрүңүздүн ортосунда колдонмолорду тышкы экранга чыгарууга уруксат сурап жатат" + "%1$s %2$s түзмөгүңүздүн атынан түзмөктөрүңүздүн ортосунда колдонмолорду өткөрүүгө уруксат сурап жатат" "түзмөк" "Ооба" diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml index e09a5b395efa..198c628279fb 100644 --- a/packages/CompanionDeviceManager/res/values-mk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml @@ -28,7 +28,7 @@ "%1$s бара дозвола во име на вашиот %2$s за да пристапува до фотографиите, аудиовизуелните содржини и известувањата на телефонот" - "Овозможете <strong>%1$s</strong> да пристапува до овие податоци на телефонот" + "Дозволете <strong>%1$s</strong> да пристапува до овие податоци на телефонот" "Известувања" "може да ги чита сите известувања, вклучително и податоци како контакти, пораки и фотографии" diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml index 274b1a9b5e8c..7668d20e4e55 100644 --- a/packages/CompanionDeviceManager/res/values-nb/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml @@ -35,7 +35,7 @@ "Bilder og medier" "Google Play-tjenester" - "%1$s ber om tillatelse på vegne av %2$s for å strømme apper mellom enhetene dine" + "%1$s ber om tillatelse på vegne av %2$s til å strømme apper mellom enhetene dine" "enhet" "Tillat" diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml index 3eb49c556a29..486cd219e4b1 100644 --- a/packages/CompanionDeviceManager/res/values-nl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml @@ -22,7 +22,7 @@ "Een %1$s kiezen om te beheren met <strong>%2$s</strong>" "Deze app is vereist om je %1$s te beheren. %2$s kan interactie hebben met je meldingen en toegang krijgen tot rechten voor Telefoon, Sms, Contacten, Agenda, Gesprekslijsten en Apparaten in de buurt." "Apps" - "De apps van je telefoon streamen" + "Stream de apps van je telefoon" "<strong>%1$s</strong> toegang geven tot deze informatie op je telefoon" "Cross-device-services" "%1$s vraagt namens jouw %2$s toegang tot de foto\'s, media en meldingen van je telefoon" diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml index 8d84eb76dded..ca719fbf58f6 100644 --- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml @@ -28,10 +28,10 @@ "A app %1$s está a pedir autorização em nome do seu dispositivo %2$s para aceder às fotos, conteúdo multimédia e notificações do seu telemóvel" - "Permita que a app <strong>%1$s</strong> aceda a estas informações do seu telemóvel" + "Permita que <strong>%1$s</strong> aceda a estas informações do seu telemóvel" "Notificações" - "Pode ler todas as notificações, incluindo informações como contratos, mensagens e fotos" + "Pode ler todas as notificações, incluindo informações como contactos, mensagens e fotos" "Fotos e multimédia" "Serviços do Google Play" diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml index 8870335318a8..ced75d262ab8 100644 --- a/packages/CompanionDeviceManager/res/values-ro/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml @@ -17,32 +17,32 @@ "Manager de dispozitiv Companion" - "Permiteți ca <strong>%1$s</strong> să vă acceseze dispozitivul <strong>%2$s</strong>" + "Permite ca <strong>%1$s</strong> să acceseze dispozitivul <strong>%2$s</strong>" "ceas" "Alege un profil %1$s pe care să îl gestioneze <strong>%2$s</strong>" - "Această aplicație este necesară pentru a gestiona %1$s. %2$s va putea să interacționeze cu notificările dvs. și să vă acceseze permisiunile pentru Telefon, SMS, Agendă, Calendar, Jurnale de apeluri și Dispozitive din apropiere." + "Această aplicație este necesară pentru a gestiona %1$s. %2$s va putea să interacționeze cu notificările și să acceseze permisiunile pentru Telefon, SMS, Agendă, Calendar, Jurnale de apeluri și Dispozitive din apropiere." "Aplicații" "Să redea în stream aplicațiile telefonului" - "Permiteți ca <strong>%1$s</strong> să acceseze aceste informații de pe telefon" + "Permite ca <strong>%1$s</strong> să acceseze aceste informații de pe telefon" "Servicii pe mai multe dispozitive" "%1$s solicită permisiunea pentru %2$s de a accesa fotografiile, conținutul media și notificările de pe telefon" - "Permiteți ca <strong>%1$s</strong> să acceseze aceste informații de pe telefon" + "Permite ca <strong>%1$s</strong> să acceseze aceste informații de pe telefon" "Notificări" "Poate să citească toate notificările, inclusiv informații cum ar fi agenda, mesajele și fotografiile" "Fotografii și media" "Servicii Google Play" - "%1$s solicită permisiunea pentru %2$s de a reda în stream aplicații între dispozitivele dvs." + "%1$s solicită permisiunea pentru %2$s de a reda în stream aplicații între dispozitivele tale" "dispozitiv" - "Permiteți" - "Nu permiteți" + "Permite" + "Nu permite" "Înapoi" - "Transferați permisiunile pentru aplicații pe ceas" - "Ca să configurați mai ușor ceasul, aplicațiile instalate pe ceas în timpul procesului de configurare vor folosi aceleași permisiuni ca telefonul.\n\n Între acestea se poate număra accesul la microfonul și locația ceasului." + "Transferă permisiunile pentru aplicații pe ceas" + "Ca să configurezi mai ușor ceasul, aplicațiile instalate pe ceas în timpul procesului de configurare vor folosi aceleași permisiuni ca telefonul.\n\n Între acestea se poate număra accesul la microfonul și locația ceasului." "Pictograma aplicației" "Butonul Mai multe informații" diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml index 83df578f8c10..d95ee2456b9c 100644 --- a/packages/CompanionDeviceManager/res/values-sk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml @@ -35,7 +35,7 @@ "Fotky a médiá" "Služby Google Play" - "%1$s vyžaduje povolenie na streamovanie aplikácií medzi vašimi zariadeniami v mene tohto zariadenia (%2$s)" + "Aplikácia %1$s vyžaduje povolenie na streamovanie aplikácií medzi vašimi zariadeniami v mene tohto zariadenia (%2$s)" "zariadenie" "Povoliť" diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml index 6b5ca21a69de..65ff65c832a8 100644 --- a/packages/CompanionDeviceManager/res/values-sw/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml @@ -25,7 +25,7 @@ "Tiririsha programu za simu yako" "Ruhusu <strong>%1$s</strong> ifikie maelezo haya kutoka kwenye simu yako" "Huduma za kifaa kilichounganishwa kwingine" - "%1$s inaomba ruhusa kwa niaba ya %2$s yako ili kufikia picha, maudhui na arifa za simu yako" + "Programu ya %1$s inaomba ruhusa kwa niaba ya %2$s yako ili ifikie picha, maudhui na arifa za simu yako" "Ruhusu <strong>%1$s</strong> ifikie maelezo haya kutoka kwenye simu yako" @@ -35,7 +35,7 @@ "Picha na maudhui" "Huduma za Google Play" - "%1$s inaomba ruhusa kwa niaba ya %2$s yako ili kutiririsha programu kati ya vifaa vyako" + "Programu ya %1$s inaomba ruhusa kwa niaba ya %2$s yako ili itiririshe programu kati ya vifaa vyako" "kifaa" "Ruhusu" diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml index d0fa24d3e665..1f1673487f6f 100644 --- a/packages/CompanionDeviceManager/res/values-te/strings.xml +++ b/packages/CompanionDeviceManager/res/values-te/strings.xml @@ -31,7 +31,7 @@ "మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి <strong>%1$s</strong> యాప్‌ను అనుమతించండి" "నోటిఫికేషన్‌లు" - "కాంటాక్ట్‌లు, మెసేజ్‌లు, ఫోటోల వంటి సమాచారంతో సహా అన్ని నోటిఫికేషన్‌లను చదవగలరు" + "కాంటాక్ట్‌లు, మెసేజ్‌లు, ఫోటోల వంటి సమాచారంతో సహా అన్ని నోటిఫికేషన్‌లను చదవగలదు" "ఫోటోలు, మీడియా" "Google Play సర్వీసులు" diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml index a311bd4936a8..f98f60c36196 100644 --- a/packages/CompanionDeviceManager/res/values-ur/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml @@ -23,12 +23,12 @@ "‏آپ کے %1$s کا نظم کرنے کے لئے اس ایپ کی ضرورت ہے۔ %2$s کو آپ کی اطلاعات کے ساتھ تعامل کرنے اور آپ کے فون، SMS، رابطوں، کیلنڈر، کال لاگز اور قریبی آلات کی اجازتوں تک رسائی کی اجازت ہوگی۔" "ایپس" "اپنے فون کی ایپس کی سلسلہ بندی کریں" - "‏‎<strong>%1$s</strong>‎ کو اپنے فون سے ان معلومات تک رسائی حاصل کرنے کی اجازت دیں" + "‏اپنے فون سے ان معلومات تک رسائی حاصل کرنے کی <strong>%1$s</strong> کو اجازت دیں" "کراس ڈیوائس سروسز" "%1$s ایپ آپ کے %2$s کی جانب سے آپ کے فون کی تصاویر، میڈیا اور اطلاعات تک رسائی کی اجازت طلب کر رہی ہے" - "‏اپنے فون سے اس معلومات تک رسائی حاصل Allow <strong>%1$s</strong> کرنے کی اجازت دیں" + "‏اپنے فون سے اس معلومات تک رسائی حاصل کرنے کی <strong>%1$s</strong> کو اجازت دیں" "اطلاعات" "رابطوں، پیغامات اور تصاویر جیسی معلومات سمیت تمام اطلاعات پڑھ سکتے ہیں" diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml index 4748ece86a5a..046a5e343345 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml @@ -35,7 +35,7 @@ "相片和媒體" "Google Play 服務" - "「%1$s」正在代表 %2$s 要求必要權限,以便在裝置之間串流應用程式內容" + "「%1$s」正在為 %2$s 要求必要權限,以在裝置之間串流應用程式內容" "裝置" "允許" -- cgit v1.2.3 From 19d6b2943368cc714af6401e9cb287052436c6d5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 15:36:48 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia806ed610e1c4d8d77afa1d601bc240a8f0ad29a --- .../DynamicSystemInstallationService/res/values-ro/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml index 22a46d5ec748..a8a512569de3 100644 --- a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -1,14 +1,14 @@ - "Introdu parola și accesați Actualizările de sistem dinamice" - "Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul." + "Introdu parola și accesează Actualizările de sistem dinamice" + "Sistemul dinamic e pregătit. Ca să începi să-l folosești, repornește dispozitivul." "Se instalează" "Instalarea nu a reușit" - "Nu s-a validat imaginea. Abandonați instalarea." + "Nu s-a validat imaginea. Abandonează instalarea." "Rulăm un sistem dinamic. Repornește pentru a folosi versiunea Android inițială." "Anulează" - "Renunțați" + "Renunță" "Repornește" "Repornește" "S-a renunțat la sistemul dinamic" -- cgit v1.2.3 From b93d7be3925b97c2ebc22ae9cb7357ebb1f90457 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 15:38:33 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6997bc205d98f698863d1e3da95d7d388a9c1612 --- .../DynamicSystemInstallationService/res/values-ro/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml index 22a46d5ec748..a8a512569de3 100644 --- a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -1,14 +1,14 @@ - "Introdu parola și accesați Actualizările de sistem dinamice" - "Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul." + "Introdu parola și accesează Actualizările de sistem dinamice" + "Sistemul dinamic e pregătit. Ca să începi să-l folosești, repornește dispozitivul." "Se instalează" "Instalarea nu a reușit" - "Nu s-a validat imaginea. Abandonați instalarea." + "Nu s-a validat imaginea. Abandonează instalarea." "Rulăm un sistem dinamic. Repornește pentru a folosi versiunea Android inițială." "Anulează" - "Renunțați" + "Renunță" "Repornește" "Repornește" "S-a renunțat la sistemul dinamic" -- cgit v1.2.3 From 703d0f1d6a50b8973933efd182a3478e7953263d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:19:59 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8b9b03cfeecc918c96d54cf0c5821c1cc8cd966d --- packages/PackageInstaller/res/values-ro/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 6b793fcd810c..9ca454377cd0 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -24,8 +24,8 @@ "Se instalează…" "Se instalează %1$s…" "Aplicație instalată." - "Doriți să instalați această aplicație?" - "Doriți să actualizați această aplicație?" + "Vrei să instalezi această aplicație?" + "Vrei să actualizezi această aplicație?" "Aplicația nu a fost instalată." "Instalarea pachetului a fost blocată." "Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent." @@ -56,7 +56,7 @@ "Dezinstalezi această aplicație?" "Dezinstalezi această aplicație pentru ""toți"" utilizatorii? Aplicația și datele acesteia vor fi eliminate de la ""toți"" utilizatorii de pe acest dispozitiv." "Dezinstalezi această aplicație pentru utilizatorul %1$s?" - "Doriți să dezinstalați această aplicație din profilul de serviciu?" + "Dezinstalezi această aplicație din profilul de serviciu?" "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate." "Înlocuiești această aplicație cu versiunea din fabrică? Toate datele vor fi eliminate. Această acțiune va afecta toți utilizatorii dispozitivului, inclusiv pe cei cu profiluri de serviciu." "Păstrează %1$s din datele aplicației." @@ -81,9 +81,9 @@ "Acțiunile de instalare și dezinstalare nu sunt acceptate pe Wear." "Se pregătește aplicația…" "Necunoscut" - "Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." - "Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă. Puteți modifica această opțiune în Setări." + "Din motive de securitate, tableta nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." + "Din motive de securitate, televizorul nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." + "Din motive de securitate, telefonul nu are permisiunea să instaleze aplicații necunoscute din această sursă. Poți modifica această opțiune în setări." "Telefonul și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." "Tableta și datele tale personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi aplicația, accepți că ești singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." "Televizorul și datele tale cu caracter personal sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalezi această aplicație, accepți că ești singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia." -- cgit v1.2.3 From 45e5320c1e66c38d8460c21ff91b0579674fec9d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:23:01 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic2af49c72c423a5bebe6d2f54fc6a7a7749e0162 --- packages/PrintSpooler/res/values-te/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml index e00e28ce3b68..3ab43f13713e 100644 --- a/packages/PrintSpooler/res/values-te/strings.xml +++ b/packages/PrintSpooler/res/values-te/strings.xml @@ -21,8 +21,8 @@ "గమ్యం" "కాపీలు" "కాపీలు:" - "కాగితపు పరిమాణం" - "కాగితపు పరిమాణం:" + "కాగితపు సైజ్‌" + "కాగితపు సైజ్‌:" "రంగు" "రెండు వైపుల" "ఓరియంటేషన్" @@ -40,7 +40,7 @@ "ముద్రణ డైలాగ్" "%1$d/%2$d" "%2$dలో %1$dవ పేజీ" - "సారాంశం, కాపీలు %1$s, కాగితం పరిమాణం %2$s" + "సారాంశం, కాపీలు %1$s, కాగితం సైజ్‌ %2$s" "విస్తరణ హ్యాండిల్" "కుదింపు హ్యాండిల్" "ప్రింట్ చేయండి" -- cgit v1.2.3 From ecc1529f96bc9e607b49e807b8460cf19e396bd5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:25:15 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic1b80a18e20ff451b2c8707b625e32fcc6b709ba --- packages/PrintSpooler/res/values-te/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml index e00e28ce3b68..3ab43f13713e 100644 --- a/packages/PrintSpooler/res/values-te/strings.xml +++ b/packages/PrintSpooler/res/values-te/strings.xml @@ -21,8 +21,8 @@ "గమ్యం" "కాపీలు" "కాపీలు:" - "కాగితపు పరిమాణం" - "కాగితపు పరిమాణం:" + "కాగితపు సైజ్‌" + "కాగితపు సైజ్‌:" "రంగు" "రెండు వైపుల" "ఓరియంటేషన్" @@ -40,7 +40,7 @@ "ముద్రణ డైలాగ్" "%1$d/%2$d" "%2$dలో %1$dవ పేజీ" - "సారాంశం, కాపీలు %1$s, కాగితం పరిమాణం %2$s" + "సారాంశం, కాపీలు %1$s, కాగితం సైజ్‌ %2$s" "విస్తరణ హ్యాండిల్" "కుదింపు హ్యాండిల్" "ప్రింట్ చేయండి" -- cgit v1.2.3 From 4b570a86c0b976883994f26ab2d3159bda96b783 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:28:30 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5019566b4ab1e98753463ef86b91acdb52064146 --- packages/SimAppDialog/res/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SimAppDialog/res/values-ro/strings.xml b/packages/SimAppDialog/res/values-ro/strings.xml index 5d876eac82d8..2117191ca3d3 100644 --- a/packages/SimAppDialog/res/values-ro/strings.xml +++ b/packages/SimAppDialog/res/values-ro/strings.xml @@ -19,8 +19,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Sim App Dialog" "Activează serviciul mobil" - "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația %1$s" - "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația operatorului" + "Pentru ca noul card SIM să funcționeze corect, va trebui să instalezi aplicația %1$s" + "Pentru ca noul card SIM să funcționeze corect, va trebui să instalezi aplicația operatorului" "Nu acum" "Descarcă aplicația" -- cgit v1.2.3 From f6c1d786a1d34417021ccd016eecbd261b4a5f1b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:30:14 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9acadf71c69cde786dbb989f0e0ddcec656f1a30 --- packages/SimAppDialog/res/values-ro/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SimAppDialog/res/values-ro/strings.xml b/packages/SimAppDialog/res/values-ro/strings.xml index 5d876eac82d8..2117191ca3d3 100644 --- a/packages/SimAppDialog/res/values-ro/strings.xml +++ b/packages/SimAppDialog/res/values-ro/strings.xml @@ -19,8 +19,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Sim App Dialog" "Activează serviciul mobil" - "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația %1$s" - "Pentru ca noul card SIM să funcționeze corect, va trebui să instalați aplicația operatorului" + "Pentru ca noul card SIM să funcționeze corect, va trebui să instalezi aplicația %1$s" + "Pentru ca noul card SIM să funcționeze corect, va trebui să instalezi aplicația operatorului" "Nu acum" "Descarcă aplicația" -- cgit v1.2.3 From fc34efb502eb8a5c9cf2c813aaedbabb9dbcfbdc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:42:08 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8ca93beb19b896430dbe94e98d49dff614afce8e --- packages/SystemUI/res/values-as/strings.xml | 4 ++-- packages/SystemUI/res/values-eu/strings.xml | 8 ++++---- packages/SystemUI/res/values-fr/strings.xml | 12 ++++++------ packages/SystemUI/res/values-nb/strings.xml | 12 ++++++------ packages/SystemUI/res/values-pt-rPT/strings.xml | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index f35dd98d91c8..71b4716ae9ea 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -32,13 +32,13 @@ "অন কৰক" "নালাগে, ধন্যবাদ" "স্বয়ং-ঘূৰ্ণন স্ক্ৰীন" - "%2$sত প্ৰৱেশ কৰিবলৈ %1$sক অনুমতি দিবনে?" + "%2$s এক্সেছ কৰিবলৈ %1$sক অনুমতি দিবনে?" "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?\nএই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে।" "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?" "%2$s নিয়ন্ত্ৰণ কৰিবলৈ %1$s খুলিবনে?" "এই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে। এইটো ডিভাইচৰ সৈতে %1$s ব্যৱহাৰ কৰিলে কল, জাননী আৰু এলাৰ্ম শুনাটো অৱৰুদ্ধ হ’ব পাৰে।" "এইটো ডিভাইচৰ সৈতে %1$s ব্যৱহাৰ কৰিলে কল, জাননী আৰু এলাৰ্ম শুনাটো অৱৰুদ্ধ হ’ব পাৰে।" - "%1$s%2$sত প্ৰৱেশ কৰিবলৈ অনুমতি দিবনে?" + "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?" "%2$sক ব্যৱহাৰ কৰিবলৈ %1$sক খোলেনে?" "%2$s ব্যৱহাৰ কৰিবলৈ %1$sক খুলিবনে?\nএই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে।" "%2$sক ব্যৱহাৰ কৰিবলৈ %1$sক খোলেনে?" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index d6fa51409dea..5c79b1d932f9 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -161,7 +161,7 @@ "Ezin da hauteman aurpegia. Erabili hatz-marka." - "Bluetooth-a konektatuta." + "Bluetootha konektatuta." "Bateriaren ehunekoa ezezaguna da." "%s gailura konektatuta." "Hona konektatuta: %s." @@ -187,7 +187,7 @@ "isiltasun osoa" "alarmak soilik" "Ez molestatzeko modua." - "Bluetooth-a." + "Bluetootha." "Bluetooth bidezko konexioa aktibatuta dago." "Alarma ordu honetarako ezarri da: %s." "Denbora gehiago." @@ -212,7 +212,7 @@ "Pantaila-babeslea" "Ethernet" "Ez molestatzeko modua" - "Bluetooth-a" + "Bluetootha" "Ez dago parekatutako gailurik erabilgarri" "Bateria: %s" "Audioa" @@ -438,7 +438,7 @@ "Multimedia-edukia" "Alarma" "Jakinarazpena" - "Bluetooth-a" + "Bluetootha" "Tonu anitzeko maiztasun duala" "Erabilerraztasuna" "Jo tonua" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 554bff39492e..5a41888ccb7f 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -322,7 +322,7 @@ "Déplacer vers le haut" "Balayez l\'écran vers le haut pour réessayer" - "Déverrouillez l\'écran pour pouvoir utiliser la NFC" + "Déverrouillez l\'écran pour pouvoir utiliser le NFC" "Cet appareil appartient à votre organisation" "Cet appareil appartient à %s" "Cet appareil est fourni par %s" @@ -336,11 +336,11 @@ "Aucune\ninterruption" "Priorité\nuniquement" "Alarmes\nuniquement" - "%2$s • Recharge sans fil • Chargé dans %1$s" - "%2$s • En charge • Chargé dans %1$s" - "%2$s • Recharge rapide • Chargé dans %1$s" - "%2$s • Recharge lente • Chargé dans %1$s" - "%2$s • Station de charge • Chargé dans %1$s" + "%2$s • Recharge sans fil • Temps restant : %1$s" + "%2$s • En charge • Temps restant : %1$s" + "%2$s • Recharge rapide • Temps restant : %1$s" + "%2$s • Recharge lente • Temps restant : %1$s" + "%2$s • Station de charge • Temps restant : %1$s" "Changer d\'utilisateur" "Toutes les applications et les données de cette session seront supprimées." "Heureux de vous revoir, Invité" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 13ffdd88870e..725c2d46c15b 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -233,13 +233,13 @@ "Internett" "Tilgjengelige nettverk" "Nettverk er utilgjengelige" - "Ingen tilgjengelige Wi-Fi-nettverk" + "Ingen tilgjengelige Wifi-nettverk" "Slår på …" "Skjermcasting" "Casting" "Enhet uten navn" "Ingen enheter er tilgjengelige" - "Wi-Fi er ikke tilkoblet" + "Wifi er ikke tilkoblet" "Lysstyrke" "Fargeinvertering" "Fargekorrigering" @@ -703,7 +703,7 @@ "Mobildata" "%1$s%2$s" "%1$s %2$s" - "Wi-Fi er av" + "Wifi er av" "Bluetooth er av" "Ikke forstyrr er av" "Ikke forstyrr ble slått på av en automatisk regel (%s)." @@ -712,7 +712,7 @@ "Apper kjører i bakgrunnen" "Trykk for detaljer om batteri- og databruk" "Vil du slå av mobildata?" - "Du får ikke tilgang til data eller internett via %s. Internett er bare tilgjengelig via Wi-Fi." + "Du får ikke tilgang til data eller internett via %s. Internett er bare tilgjengelig via Wifi." "operatøren din" "Fordi en app skjuler tillatelsesforespørselen, kan ikke Innstillinger bekrefte svaret ditt." "Vil du tillate at %1$s viser %2$s-utsnitt?" @@ -916,10 +916,10 @@ "Lås opp for å se nettverk" "Søker etter nettverk …" "Kunne ikke koble til nettverket" - "Wi-Fi kobles ikke til automatisk inntil videre" + "Wifi kobles ikke til automatisk inntil videre" "Se alle" "For å bytte nettverk, koble fra Ethernet" - "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter Wi-Fi-nettverk når som helst – også når Wi-Fi er slått av. Du kan endre dette i innstillingene for wifi-skanning. ""Endre" + "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter Wifi-nettverk når som helst – også når Wifi er slått av. Du kan endre dette i innstillingene for wifi-skanning. ""Endre" "Slå av flymodus" "%1$s vil legge til denne brikken i Hurtiginnstillinger" "Legg til brikke" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cb94df96a8da..fcc75f684a63 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -471,7 +471,7 @@ "Tocar para abrir" "A atualizar" "Desbloquear para utilizar" - "Ocorreu um problema ao obter os seus cartões. Tente novamente mais tarde." + "Ocorreu um problema ao obter os seus cartões. Tente mais tarde." "Definições do ecrã de bloqueio" "Leia o código QR" "Perfil de trabalho" -- cgit v1.2.3 From 5659e99e6bb4cc7221e9a06b8e66add50d6b1b24 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:43:11 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3cb34e2e5f0ef176af31e6f4922b1b8504330669 --- packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml | 4 ++-- packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml | 4 ++-- packages/SystemUI/res/values-pt/tiles_states_strings.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml index abf8749e84d7..0ae323908445 100644 --- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml @@ -138,8 +138,8 @@ "Indisponível" - "Desativada" - "Ativada" + "Desligada" + "Ligada" "Indisponível" diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml index c8e557b38f9b..8fdd0c421a5e 100644 --- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml @@ -138,8 +138,8 @@ "Indisponível" - "Desligado" - "Ligado" + "Desligada" + "Ligada" "Indisponível" diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml index abf8749e84d7..0ae323908445 100644 --- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml @@ -138,8 +138,8 @@ "Indisponível" - "Desativada" - "Ativada" + "Desligada" + "Ligada" "Indisponível" -- cgit v1.2.3 From 28e3b71988cb15c1c97bb492be05630b42f6bbc4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:46:49 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib1fe5b46ede9499497a21d5207297b15428f1ff5 --- packages/SystemUI/res-keyguard/values-fr/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-ro/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index b9de6ff2c84a..750e2bd25f7a 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -29,7 +29,7 @@ "%s • Station de charge" "%s • Recharge…" "%s • Recharge rapide…" - "%s • Recharge lente…" + "%s • Recharge lente" "%s • Recharge momentanément limitée" "Appuyez sur \"Menu\" pour déverrouiller le clavier." "Réseau verrouillé" diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index e52c7b16c90e..8379f3f7ffa2 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -92,11 +92,11 @@ "Dispozitiv blocat de administrator" "Dispozitivul a fost blocat manual" "Nu este recunoscut" - "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" + "Pentru a folosi Deblocarea facială, activează ""Accesul la cameră"" în Setări și confidențialitate" Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d încercări. Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d de încercări. - Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactezi operatorul pentru a debloca dispozitivul. Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. -- cgit v1.2.3 From f14c7f7c85d3e82c0e036502de70665eabdd4a70 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:47:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8af108c3ce87cda1fc39289baa38a094b39986fb --- packages/SystemUI/res-product/values-ro/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index 807ebfe03bef..471f01e678e1 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -19,16 +19,16 @@ - "Repoziționați telefonul pentru încărcare mai rapidă" - "Repoziționați telefonul pentru încărcarea wireless" + "Repoziționează telefonul pentru încărcare mai rapidă" + "Repoziționează telefonul pentru încărcarea wireless" "Dispozitivul Android TV se va opri în curând. Apasă un buton pentru a-l menține pornit." "Dispozitivul se va opri în curând. Apasă pentru a-l menține pornit." "Nu există card SIM în tabletă." "Nu există card SIM în telefon." "Codurile PIN nu coincid" - "Ați efectuat %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." + "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, tableta va fi resetată, iar toate datele vor fi șterse." "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." - "Ați efectuat %d încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse." + "Ai făcut %d încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele vor fi șterse." "Ai făcut %d încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse." "Ai făcut %1$d încercări incorecte de deblocare a tabletei. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse." @@ -38,8 +38,8 @@ "Ai făcut %1$d încercări incorecte de deblocare a telefonului. După încă %2$d încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." "Ai făcut %d încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." "Ai făcut %d încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." - "Ați desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." + "Ai desenat incorect modelul pentru deblocare de %1$d ori. După încă %2$d încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste %3$d secunde." "Deblochează telefonul pentru mai multe opțiuni" "Deblochează tableta pentru mai multe opțiuni" "Deblochează dispozitivul pentru mai multe opțiuni" -- cgit v1.2.3 From 38efa1ed66bfbb60897cfe8303607d84fb911096 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 16:51:08 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib543f58bf577984b33ab24ca37aea7fdd9c056a6 --- packages/SystemUI/res/values-as/strings.xml | 4 +- packages/SystemUI/res/values-eu/strings.xml | 8 +- packages/SystemUI/res/values-fr/strings.xml | 12 +- packages/SystemUI/res/values-nb/strings.xml | 12 +- packages/SystemUI/res/values-pt-rPT/strings.xml | 2 +- packages/SystemUI/res/values-ro/strings.xml | 218 ++++++++++++------------ packages/SystemUI/res/values-sk/strings.xml | 2 +- 7 files changed, 129 insertions(+), 129 deletions(-) diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index f35dd98d91c8..71b4716ae9ea 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -32,13 +32,13 @@ "অন কৰক" "নালাগে, ধন্যবাদ" "স্বয়ং-ঘূৰ্ণন স্ক্ৰীন" - "%2$sত প্ৰৱেশ কৰিবলৈ %1$sক অনুমতি দিবনে?" + "%2$s এক্সেছ কৰিবলৈ %1$sক অনুমতি দিবনে?" "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?\nএই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে।" "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?" "%2$s নিয়ন্ত্ৰণ কৰিবলৈ %1$s খুলিবনে?" "এই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে। এইটো ডিভাইচৰ সৈতে %1$s ব্যৱহাৰ কৰিলে কল, জাননী আৰু এলাৰ্ম শুনাটো অৱৰুদ্ধ হ’ব পাৰে।" "এইটো ডিভাইচৰ সৈতে %1$s ব্যৱহাৰ কৰিলে কল, জাননী আৰু এলাৰ্ম শুনাটো অৱৰুদ্ধ হ’ব পাৰে।" - "%1$s%2$sত প্ৰৱেশ কৰিবলৈ অনুমতি দিবনে?" + "%1$s%2$s এক্সেছ কৰিবলৈ অনুমতি দিবনে?" "%2$sক ব্যৱহাৰ কৰিবলৈ %1$sক খোলেনে?" "%2$s ব্যৱহাৰ কৰিবলৈ %1$sক খুলিবনে?\nএই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে।" "%2$sক ব্যৱহাৰ কৰিবলৈ %1$sক খোলেনে?" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index d6fa51409dea..5c79b1d932f9 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -161,7 +161,7 @@ "Ezin da hauteman aurpegia. Erabili hatz-marka." - "Bluetooth-a konektatuta." + "Bluetootha konektatuta." "Bateriaren ehunekoa ezezaguna da." "%s gailura konektatuta." "Hona konektatuta: %s." @@ -187,7 +187,7 @@ "isiltasun osoa" "alarmak soilik" "Ez molestatzeko modua." - "Bluetooth-a." + "Bluetootha." "Bluetooth bidezko konexioa aktibatuta dago." "Alarma ordu honetarako ezarri da: %s." "Denbora gehiago." @@ -212,7 +212,7 @@ "Pantaila-babeslea" "Ethernet" "Ez molestatzeko modua" - "Bluetooth-a" + "Bluetootha" "Ez dago parekatutako gailurik erabilgarri" "Bateria: %s" "Audioa" @@ -438,7 +438,7 @@ "Multimedia-edukia" "Alarma" "Jakinarazpena" - "Bluetooth-a" + "Bluetootha" "Tonu anitzeko maiztasun duala" "Erabilerraztasuna" "Jo tonua" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 554bff39492e..5a41888ccb7f 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -322,7 +322,7 @@ "Déplacer vers le haut" "Balayez l\'écran vers le haut pour réessayer" - "Déverrouillez l\'écran pour pouvoir utiliser la NFC" + "Déverrouillez l\'écran pour pouvoir utiliser le NFC" "Cet appareil appartient à votre organisation" "Cet appareil appartient à %s" "Cet appareil est fourni par %s" @@ -336,11 +336,11 @@ "Aucune\ninterruption" "Priorité\nuniquement" "Alarmes\nuniquement" - "%2$s • Recharge sans fil • Chargé dans %1$s" - "%2$s • En charge • Chargé dans %1$s" - "%2$s • Recharge rapide • Chargé dans %1$s" - "%2$s • Recharge lente • Chargé dans %1$s" - "%2$s • Station de charge • Chargé dans %1$s" + "%2$s • Recharge sans fil • Temps restant : %1$s" + "%2$s • En charge • Temps restant : %1$s" + "%2$s • Recharge rapide • Temps restant : %1$s" + "%2$s • Recharge lente • Temps restant : %1$s" + "%2$s • Station de charge • Temps restant : %1$s" "Changer d\'utilisateur" "Toutes les applications et les données de cette session seront supprimées." "Heureux de vous revoir, Invité" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 13ffdd88870e..725c2d46c15b 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -233,13 +233,13 @@ "Internett" "Tilgjengelige nettverk" "Nettverk er utilgjengelige" - "Ingen tilgjengelige Wi-Fi-nettverk" + "Ingen tilgjengelige Wifi-nettverk" "Slår på …" "Skjermcasting" "Casting" "Enhet uten navn" "Ingen enheter er tilgjengelige" - "Wi-Fi er ikke tilkoblet" + "Wifi er ikke tilkoblet" "Lysstyrke" "Fargeinvertering" "Fargekorrigering" @@ -703,7 +703,7 @@ "Mobildata" "%1$s%2$s" "%1$s %2$s" - "Wi-Fi er av" + "Wifi er av" "Bluetooth er av" "Ikke forstyrr er av" "Ikke forstyrr ble slått på av en automatisk regel (%s)." @@ -712,7 +712,7 @@ "Apper kjører i bakgrunnen" "Trykk for detaljer om batteri- og databruk" "Vil du slå av mobildata?" - "Du får ikke tilgang til data eller internett via %s. Internett er bare tilgjengelig via Wi-Fi." + "Du får ikke tilgang til data eller internett via %s. Internett er bare tilgjengelig via Wifi." "operatøren din" "Fordi en app skjuler tillatelsesforespørselen, kan ikke Innstillinger bekrefte svaret ditt." "Vil du tillate at %1$s viser %2$s-utsnitt?" @@ -916,10 +916,10 @@ "Lås opp for å se nettverk" "Søker etter nettverk …" "Kunne ikke koble til nettverket" - "Wi-Fi kobles ikke til automatisk inntil videre" + "Wifi kobles ikke til automatisk inntil videre" "Se alle" "For å bytte nettverk, koble fra Ethernet" - "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter Wi-Fi-nettverk når som helst – også når Wi-Fi er slått av. Du kan endre dette i innstillingene for wifi-skanning. ""Endre" + "For å forbedre brukeropplevelsen på enheten kan apper og tjenester søke etter Wifi-nettverk når som helst – også når Wifi er slått av. Du kan endre dette i innstillingene for wifi-skanning. ""Endre" "Slå av flymodus" "%1$s vil legge til denne brikken i Hurtiginnstillinger" "Legg til brikke" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cb94df96a8da..fcc75f684a63 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -471,7 +471,7 @@ "Tocar para abrir" "A atualizar" "Desbloquear para utilizar" - "Ocorreu um problema ao obter os seus cartões. Tente novamente mais tarde." + "Ocorreu um problema ao obter os seus cartões. Tente mais tarde." "Definições do ecrã de bloqueio" "Leia o código QR" "Perfil de trabalho" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a91245d99b49..78e7beb25359 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "UI sistem" "Activezi Economisirea bateriei?" - "Mai aveți %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." + "Mai ai %s din baterie. Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Economisirea bateriei activează Tema întunecată, restricționează activitatea în fundal și amână notificările." "Procent rămas din baterie: %s" "Nu se poate realiza încărcarea prin USB" @@ -36,8 +36,8 @@ "Permiți accesul aplicației %1$s la %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." "Permiți ca %1$s să acceseze %2$s?" "Deschizi %1$s ca să gestioneze %2$s?" - "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." - "Dacă folosiți %1$s cu acest dispozitiv, acest lucru vă poate împiedica să auziți apeluri, notificări și alarme." + "Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB. Dacă folosești %1$s cu acest dispozitiv, acest lucru te poate împiedica să auzi apeluri, notificări și alarme." + "Dacă folosești %1$s cu acest dispozitiv, acest lucru te poate împiedica să auzi apeluri, notificări și alarme." "Permiți ca %1$s să acceseze %2$s?" "Deschizi %1$s ca să gestioneze %2$s?" "Deschizi %1$s pentru a gestiona %2$s?\nPermisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB." @@ -53,7 +53,7 @@ "Permite" "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comută la utilizatorul principal." - "Schimbați limba de sistem la %1$s?" + "Schimbi limba de sistem la %1$s?" "Alt dispozitiv solicită schimbarea limbii de sistem" "Schimbă limba" "Păstrează limba actuală" @@ -62,7 +62,7 @@ "Permite întotdeauna în această rețea" "Permite" "Remedierea erorilor wireless nu este permisă" - "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comutați la utilizatorul principal." + "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor wireless. Pentru a folosi această funcție, comută la utilizatorul principal." "Portul USB a fost dezactivat" "Pentru a proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVei primi o notificare când poți folosi din nou portul USB." "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" @@ -74,7 +74,7 @@ "Se salvează captura de ecran..." "Captură de ecran salvată" "Nu s-a putut salva captura de ecran" - "Pentru a salva captura de ecran, trebuie să deblocați dispozitivul" + "Pentru a salva captura de ecran, trebuie să deblochezi dispozitivul" "Încearcă să faci din nou o captură de ecran" "Nu se poate salva captura de ecran" "Crearea capturilor de ecran nu e permisă de aplicație sau de organizația ta" @@ -82,7 +82,7 @@ "Editează" "Editează captura de ecran" "Trimite captura de ecran" - "Surprindeți mai mult" + "Surprinde mai mult" "Închide captura de ecran" "Previzualizare a capturii de ecran" "Marginea de sus la %1$d %%" @@ -92,14 +92,14 @@ "Recorder pentru ecran" "Se procesează înregistrarea" "Notificare în curs pentru o sesiune de înregistrare a ecranului" - "Începeți înregistrarea?" + "Începi înregistrarea?" "În timpul înregistrării, sistemul Android poate captura informațiile sensibile vizibile pe ecran sau redate pe dispozitiv. Aici sunt incluse parole, informații de plată, fotografii, mesaje și conținut audio." - "Înregistrați conținut audio" + "Înregistrează audio" "Conținutul audio de la dispozitiv" "Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de sonerie" "Microfon" "Conținutul audio de la dispozitiv și microfon" - "Începeți" + "Începe" "Se înregistrează ecranul" "Se înregistrează ecranul și conținutul audio" "Afișează atingerile de pe ecran" @@ -136,7 +136,7 @@ "Chip autentificat" "Confirmat" "Atinge Confirm pentru a finaliza" - "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a continua" + "Deblocat facial. Apasă pictograma Deblocare ca să continui." "Autentificat" "Folosește PIN-ul" "Folosește modelul" @@ -146,16 +146,16 @@ "Parolă greșită" "Prea multe încercări incorecte.\nÎncearcă din nou peste %d secunde." "Încearcă din nou. Încercarea %1$d din %2$d." - "Datele dvs. vor fi șterse" - "Dacă la următoarea încercare introduceți un model incorect, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți o parolă incorectă, datele de pe acest dispozitiv vor fi șterse." - "Dacă la următoarea încercare introduceți un model incorect, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți un cod PIN incorect, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți o parolă incorectă, acest utilizator va fi șters." - "Dacă la următoarea încercare introduceți un model incorect, profilul de serviciu și datele sale vor fi șterse." - "Dacă la următoarea încercare introduceți un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." - "Dacă la următoarea încercare introduceți o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." + "Datele tale vor fi șterse" + "Dacă la următoarea încercare introduci un model incorect, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci un cod PIN incorect, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci o parolă incorectă, datele de pe acest dispozitiv vor fi șterse." + "Dacă la următoarea încercare introduci un model incorect, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci un cod PIN incorect, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci o parolă incorectă, acest utilizator va fi șters." + "Dacă la următoarea încercare introduci un model incorect, profilul de serviciu și datele sale vor fi șterse." + "Dacă la următoarea încercare introduci un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse." + "Dacă la următoarea încercare introduci o parolă incorectă, profilul de serviciu și datele sale vor fi șterse." "Atinge senzorul de amprente" "Pictograma amprentă" "Chipul nu a fost recunoscut. Folosește amprenta." @@ -285,21 +285,21 @@ "Serviciul NFC este dezactivat" "Serviciul NFC este activat" "Înregistrarea ecranului" - "Începeți" + "Începe" "Oprește" "Modul cu o mână" - "Deblocați microfonul dispozitivului?" - "Deblocați camera dispozitivului?" - "Deblocați camera și microfonul dispozitivului?" - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi microfonul." - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera." - "Astfel, deblocați accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera sau microfonul." + "Deblochezi microfonul dispozitivului?" + "Deblochezi camera dispozitivului?" + "Deblochezi camera și microfonul dispozitivului?" + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi microfonul." + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera." + "Astfel, deblochezi accesul pentru toate aplicațiile și serviciile care au permisiunea de a folosi camera sau microfonul." "Microfonul este blocat" "Camera este blocată" "Microfonul și camera sunt blocate" - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Microfon activat pentru a permite accesul la microfon. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Cameră foto activată pentru a permite accesul la cameră. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." - "Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Deblocat(ă) pentru a permite accesul. Consultați manualul dispozitivului ca să găsiți comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Microfon activat pentru a permite accesul la microfon. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Cameră foto activată pentru a permite accesul la cameră. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." + "Pentru deblocare, mută comutatorul de confidențialitate de pe dispozitiv în poziția Deblocat(ă) pentru a permite accesul. Consultă manualul dispozitivului ca să găsești comutatorul de confidențialitate." "Microfon disponibil" "Cameră foto disponibilă" "Microfon și cameră disponibile" @@ -314,16 +314,16 @@ "Atinge din nou" "Glisează în sus pentru a deschide" "Apasă pictograma de deblocare pentru a deschide" - "S-a deblocat cu ajutorul feței. Apasă pictograma de deblocare pentru a deschide" + "Deblocat facial. Apasă pictograma Deblocare ca să deschizi." - "Deplasați spre stânga" - "Deplasați în jos" - "Deplasați spre dreapta" - "Deplasați în sus" + "Mută la stânga" + "Mută în jos" + "Mută la dreapta" + "Mută în sus" "Glisează pentru a încerca din nou" "Deblochează pentru a folosi NFC" - "Dispozitivul aparține organizației dvs." + "Dispozitivul aparține organizației tale" "Acest dispozitiv aparține organizației %s" "Acest dispozitiv este oferit de %s" "Glisează dinspre telefon" @@ -353,13 +353,13 @@ Poți adăuga maximum %d de utilizatori. Poate fi creat doar un utilizator. - "Elimini utilizatorul?" + "Excluzi utilizatorul?" "Toate aplicațiile și datele acestui utilizator vor fi șterse." "Elimină" - "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." - "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrați sau proiectați. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redați." - "Începeți să înregistrați sau să proiectați?" - "Începeți să înregistrați sau să proiectați cu %s?" + "%s va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai." + "Serviciul care oferă această funcție va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai." + "Începi să înregistrezi sau să proiectezi?" + "Începi să înregistrezi sau să proiectezi cu %s?" "Șterge toate notificările" "Gestionează" "Istoric" @@ -372,22 +372,22 @@ "Începe acum" "Nicio notificare" "Dispozitivul este gestionat de unul dintre părinți" - "Organizația dvs. deține acest dispozitiv și poate monitoriza traficul de rețea" + "Organizația ta deține acest dispozitiv și poate monitoriza traficul de rețea" "%1$s deține acest dispozitiv și poate monitoriza traficul din rețea" "Acest dispozitiv este oferit de %s" - "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin aplicația %1$s." + "Acest dispozitiv aparține organizației tale și e conectat la internet prin %1$s." "Acest dispozitiv aparține organizației %1$s și e conectat la internet prin %2$s." - "Dispozitivul aparține organizației dvs." + "Dispozitivul aparține organizației tale" "Acest dispozitiv aparține organizației %1$s" - "Acest dispozitiv aparține organizației dvs. și este conectat la internet prin rețele VPN." + "Acest dispozitiv aparține organizației tale și e conectat la internet prin VPN-uri." "Acest dispozitiv aparține organizației %1$s și este conectat la internet prin rețele VPN." "E posibil ca organizația ta să monitorizeze traficul de rețea în profilul de serviciu" "E posibil ca %1$s să monitorizeze traficul de rețea din profilul tău de serviciu" "Adminul IT poate vedea profilul de serviciu" "Este posibil ca rețeaua să fie monitorizată" "Acest dispozitiv este conectat la internet prin rețele VPN." - "Aplicațiile dvs. pentru lucru sunt conectate la internet prin %1$s" - "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s." + "Aplicațiile pentru lucru sunt conectate la internet prin %1$s" + "Aplicațiile personale sunt conectate la internet prin %1$s." "Acest dispozitiv este conectat la internet prin aplicația %1$s." "Acest dispozitiv este oferit de %s" "Gestionarea dispozitivului" @@ -396,18 +396,18 @@ "Certificate CA" "Afișează politicile" "Vezi opțiunile" - "Dispozitivul aparține organizației %1$s.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." - "Este posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă aveți întrebări, luați legătura cu %2$s." - "Dispozitivul aparține organizației dvs.\n\nAdministratorul dvs. IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul IT." + "Dispozitivul aparține organizației %1$s.\n\nAdministratorul IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactează administratorul IT." + "E posibil ca %1$s să acceseze date asociate dispozitivului, să gestioneze aplicații și să modifice setările acestuia.\n\nDacă ai întrebări, ia legătura cu %2$s." + "Dispozitivul aparține organizației tale.\n\nAdministratorul IT poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactează administratorul IT." "Organizația ta a instalat un certificat CA pe acest dispozitiv. Traficul de rețea securizat poate fi monitorizat sau modificat." "Organizația ta a instalat un certificat CA în profilul tău de serviciu. Traficul de rețea securizat poate fi monitorizat sau modificat." "Pe acest dispozitiv este instalat un certificat CA. Traficul de rețea securizat poate fi monitorizat sau modificat." "Administratorul tău a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul de pe dispozitivul tău." - "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul în profilul dvs. de serviciu, dar nu și în profilul personal." + "Administratorul a activat înregistrarea în jurnal pentru rețea, funcție care monitorizează traficul în profilul de serviciu, dar nu și în profilul personal." "Acest dispozitiv este conectat la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." "Acest dispozitiv este conectat la internet prin aplicațiile %1$s și %2$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT." - "Aplicațiile dvs. pentru lucru sunt conectate la internet prin aplicația %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." - "Aplicațiile dvs. personale sunt conectate la internet prin aplicația %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." + "Aplicațiile pentru lucru sunt conectate la internet prin %1$s. Activitatea în rețea cu aplicațiile pentru lucru, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru administratorul IT și pentru furnizorul de servicii VPN." + "Aplicațiile personale sunt conectate la internet prin %1$s. Activitatea în rețea, inclusiv e-mailurile și datele de navigare, sunt vizibile pentru furnizorul de servicii VPN." " " "Deschide Setări VPN" "Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului." @@ -423,14 +423,14 @@ "Aplicația este fixată" "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Recente pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Acasă pentru a anula fixarea." - "Astfel rămâne afișată până anulați fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." + "Astfel rămâne afișată până anulezi fixarea. Glisează în sus și ține apăsat pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Recente pentru a anula fixarea." "Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunea Acasă pentru a anula fixarea." "Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)." "Aplicațiile fixate pot deschide alte aplicații." - "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Recente" - "Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Acasă" - "Pentru a anula fixarea acestei aplicații, glisați în sus și mențineți" + "Pentru a anula fixarea acestei aplicații, atinge lung butoanele Înapoi și Recente" + "Pentru a anula fixarea acestei aplicații, atinge lung butoanele Înapoi și Acasă" + "Pentru a anula fixarea acestei aplicații, glisează în sus și menține" "Am înțeles" "Nu, mulțumesc" "Aplicație fixată" @@ -466,14 +466,14 @@ "Ethernet" "Alarmă" "Portofel" - "Configurați pentru a face achiziții mai rapide și mai sigure cu telefonul dvs." + "Configurează pentru a face achiziții mai rapide și mai sigure cu telefonul" "Afișează-le pe toate" "Atinge pentru a deschide" "Se actualizează" "Deblochează pentru a folosi" "A apărut o problemă la preluarea cardurilor. Încearcă din nou mai târziu" "Setările ecranului de blocare" - "Scanați codul QR" + "Scanează codul QR" "Profil de serviciu" "Mod Avion" "Nu vei auzi următoarea alarmă %1$s" @@ -504,7 +504,7 @@ "Fără sunet sau vibrații și apare în partea de jos a secțiunii de conversație" "Poate să sune sau să vibreze, în funcție de setările telefonului" "Poate să sune sau să vibreze, în funcție de setările telefonului. Conversațiile din balonul %1$s în mod prestabilit." - "Solicitați-i sistemului să stabilească dacă această notificare este sonoră sau cu vibrații." + "Solicită-i sistemului să stabilească dacă această notificare e sonoră sau cu vibrații." "<b>Stare:</b> promovată la prestabilită" "<b>Stare:</b> setată ca Silențioasă" "<b>Stare:</b> clasificată mai sus" @@ -646,8 +646,8 @@ "Afișează pictogramele de notificare cu prioritate redusă" "Altele" - "eliminați cardul" - "adăugați cardul la sfârșit" + "elimină cardul" + "adaugă cardul la sfârșit" "Mută cardul" "Adaugă un card" "Mută pe poziția %1$d" @@ -673,7 +673,7 @@ "Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descarci/încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate." "Vezi pașii pentru îngrijire" "Telefonul se încălzește" - "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații" + "Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații." "Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." "Vezi pașii pentru îngrijire" "Deconectează încărcătorul" @@ -749,25 +749,25 @@ "Standby" "Fereastra de mărire" "Comenzi pentru fereastra de mărire" - "Măriți" - "Micșorați" - "Deplasați în sus" - "Deplasați în jos" - "Deplasați spre stânga" - "Deplasați spre dreapta" + "Mărește" + "Micșorează" + "Mută în sus" + "Mută în jos" + "Mută la stânga" + "Mută spre dreapta" "Comutator de mărire" - "Măriți tot ecranul" - "Măriți o parte a ecranului" + "Mărește tot ecranul" + "Mărește o parte a ecranului" "Comutator" - "Atingeți pentru a deschide funcțiile de accesibilitate. Personalizați sau înlocuiți butonul în Setări.\n\n""Afișați setările" + "Atinge ca să deschizi funcțiile de accesibilitate. Personalizează sau înlocuiește butonul în setări.\n\n""Vezi setările" "Mută butonul spre margine pentru a-l ascunde temporar" "Mută în stânga sus" "Mută în dreapta sus" "Mută în stânga jos" "Mută în dreapta jos" - "Mutați în afară și ascundeți" - "Mutați în afară și afișați" - "Activați / dezactivați" + "Mută la margine și ascunde" + "Mută de la margine și afișează" + "Activează / dezactivează" "Comenzile dispozitivelor" "Alege aplicația pentru a adăuga comenzi" @@ -779,30 +779,30 @@ "Marcată ca preferată" "Marcată ca preferată, poziția %d" "S-a anulat marcarea ca preferată" - "marcați ca preferată" - "anulați marcarea ca preferată" + "marchează ca preferată" + "anulează marcarea ca preferată" "Mută pe poziția %d" "Comenzi" "Alege comenzile de accesat din Setările rapide" - "Țineți apăsat și trageți pentru a rearanja comenzile" + "Ține apăsat și trage pentru a rearanja comenzile" "Au fost șterse toate comenzile" "Modificările nu au fost salvate" "Vezi alte aplicații" - "Comenzile nu au putut fi încărcate. Accesați aplicația %s pentru a vă asigura că setările aplicației nu s-au schimbat." + "Comenzile nu au putut fi încărcate. Accesează aplicația %s pentru a te asigura că setările aplicației nu s-au schimbat." "Nu sunt disponibile comenzi compatibile" "Altul" "Adaugă la comenzile dispozitivelor" "Adaugă" "Sugerat de %s" "Dispozitiv blocat" - "Vedeți și controlați dispozitivele de pe ecranul de blocare?" - "Puteți adăuga comenzi pentru dispozitivele externe pe ecranul de blocare.\n\nAplicația de pe dispozitiv vă poate da posibilitatea să controlați unele dispozitive fără să deblocați telefonul.\n\nPuteți face modificări oricând în Setări." - "Controlați dispozitivele de pe ecranul de blocare?" - "Puteți să controlați unele dispozitive fără să deblocați telefonul sau tableta.\n\nAplicația de pe dispozitiv stabilește dispozitivele care pot fi controlate astfel." + "Afișezi și controlezi dispozitivele de pe ecranul de blocare?" + "Poți adăuga comenzi pentru dispozitivele externe pe ecranul de blocare.\n\nAplicația de pe dispozitiv îți poate permite să controlezi unele dispozitive fără să deblochezi telefonul.\n\nPoți face modificări oricând în setări." + "Controlezi dispozitivele de pe ecranul de blocare?" + "Poți controla unele dispozitive fără să deblochezi telefonul sau tableta.\n\nAplicația de pe dispozitiv stabilește dispozitivele care pot fi controlate astfel." "Nu, mulțumesc" "Da" "Codul PIN conține litere sau simboluri" - "Verificați %s" + "Verifică %s" "Cod PIN greșit" "Introdu codul PIN" "Încearcă alt cod PIN" @@ -810,7 +810,7 @@ "Glisează pentru a vedea mai multe" "Se încarcă recomandările" "Media" - "Ascundeți comanda media pentru %1$s?" + "Ascunzi comanda media pentru %1$s?" "Sesiunea media actuală nu se poate ascunde." "Ascunde" "Reia" @@ -827,17 +827,17 @@ "Redă %1$s de la %2$s în %3$s" "Redă %1$s în %2$s" "Anulează" - "Apropiați-vă pentru a reda pe %1$s" - "Mergeți mai aproape de %1$s ca să redați acolo" + "Apropie-te pentru a reda pe %1$s" + "Apropie-te de %1$s ca să redai acolo" "Se redă pe %1$s" "A apărut o eroare. Încearcă din nou." - "Inactiv, verificați aplicația" + "Inactiv, verifică aplicația" "Nu s-a găsit" "Comanda este indisponibilă" - "Nu s-a putut accesa %1$s. Accesați aplicația %2$s pentru a vă asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." + "Nu s-a putut accesa %1$s. Accesează aplicația %2$s pentru a te asigura de disponibilitatea comenzii și că setările aplicației nu s-au schimbat." "Deschide aplicația" "Starea nu se poate încărca" - "Eroare, încercați din nou" + "Eroare, încearcă din nou" "Adaugă comenzi" "Editează comenzile" "Adaugă ieșiri" @@ -846,16 +846,16 @@ "S-au selectat %1$d dispozitive" "(deconectat)" "Nu se poate comuta. Atinge pentru a încerca din nou." - "Asociați un nou dispozitiv" - "Pentru a proiecta această sesiune, deschideți aplicația." + "Asociază un dispozitiv nou" + "Pentru a proiecta această sesiune, deschide aplicația." "Aplicație necunoscută" - "Nu mai proiectați" + "Nu mai proiecta" "Dispozitive disponibile pentru ieșire audio." "Volum" "Cum funcționează transmisia" - "Transmiteți" - "Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiteți" - "Ca să asculte transmisia dvs., persoanele din apropiere cu dispozitive Bluetooth compatibile vă pot scana codul QR sau pot folosi numele și parola transmisiei." + "Transmite" + "Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiți" + "Ca să-ți asculte transmisia, persoanele din apropiere cu dispozitive Bluetooth compatibile pot să îți scaneze codul QR sau să folosească numele și parola transmisiei." "Numele transmisiei" "Parolă" "Salvează" @@ -867,8 +867,8 @@ "Numărul versiunii s-a copiat în clipboard." "Deschide conversația" "Widgeturi pentru conversație" - "Atingeți o conversație ca să o adăugați pe ecranul de pornire" - "Conversațiile dvs. recente se vor afișa aici" + "Atinge o conversație ca să o adaugi pe ecranul de pornire" + "Conversațiile recente se vor afișa aici" "Conversații cu prioritate" "Conversații recente" "Acum %1$s zile" @@ -905,10 +905,10 @@ "Atinge pentru mai multe informații" "Nicio alarmă setată" "Senzor de amprentă" - "Autentificați-vă" + "autentifică-te" "Accesează dispozitivul" - "Folosiți amprenta ca să deschideți" - "Autentificare obligatorie. Atingeți senzorul de amprentă pentru a vă autentifica." + "Folosește amprenta ca să deschizi" + "Autentificare obligatorie. Atinge senzorul de amprentă pentru a te autentifica." "Apel telefonic în desfășurare" "Date mobile" "%1$s/%2$s" @@ -918,18 +918,18 @@ "Nu sunt disponibile alte rețele" "Nicio rețea disponibilă" "Wi-Fi" - "Atingeți o rețea pentru a vă conecta" + "Atinge o rețea pentru a te conecta" "Deblochează pentru a vedea rețelele" "Se caută rețele…" "Nu s-a realizat conexiunea la rețea" "Deocamdată, Wi-Fi nu se poate conecta automat" "Afișează-le pe toate" - "Pentru a schimba rețeaua, deconectați ethernet" - "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi este dezactivată. Puteți să schimbați acest aspect din setările pentru căutarea de rețele Wi-Fi. ""Schimbați" + "Pentru a schimba rețeaua, deconectează ethernet" + "Pentru a îmbunătăți experiența cu dispozitivul, aplicațiile și serviciile pot să caute în continuare rețele Wi‑Fi chiar și atunci când conexiunea Wi-Fi e dezactivată. Poți schimba opțiunea din setările pentru căutarea de rețele Wi-Fi. ""Schimbă" "Dezactivează modul Avion" "%1$s vrea să adauge următorul card la Setări rapide" - "Adaugă un card" - "Nu adăugați un card" + "Adaugă cardul" + "Nu adăuga cardul" "Alege utilizatorul" %s aplicații sunt active @@ -938,7 +938,7 @@ "Informații noi" "Aplicații active" - "Aceste aplicații sunt active și rulează, chiar dacă nu le folosiți. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." + "Aceste aplicații sunt active și rulează, chiar dacă nu le folosești. Astfel, funcțiile lor sunt îmbunătățite, dar autonomia bateriei poate fi afectată." "Oprește" "Oprită" "Gata" @@ -955,7 +955,7 @@ "Editor de clipboard" "Clipboard" "Previzualizarea imaginii" - "editați" + "editează" "Adaugă" "Gestionează utilizatorii" "Notificarea nu acceptă tragerea pe ecranul împărțit." diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 8a6c3671d5ea..b23b50aaa189 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -633,7 +633,7 @@ "Pravý kód klávesnice" "Ľavá ikona" "Pravá ikona" - "Pridržaním a presunutím pridáte dlaždice" + "Pridržaním a presunutím pridáte karty" "Dlaždice môžete usporiadať pridržaním a presunutím" "Presunutím sem odstránite" "Minimálny počet vyžadovaných dlaždíc: %1$d" -- cgit v1.2.3 From 3783eb96614f64420adcc8d717fbbe765b889151 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 17:11:03 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I18ead1bc62ff8f74e8f15be208be2aaeee9c7cef --- packages/SystemUI/res-keyguard/values-fr/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-ro/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index b9de6ff2c84a..750e2bd25f7a 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -29,7 +29,7 @@ "%s • Station de charge" "%s • Recharge…" "%s • Recharge rapide…" - "%s • Recharge lente…" + "%s • Recharge lente" "%s • Recharge momentanément limitée" "Appuyez sur \"Menu\" pour déverrouiller le clavier." "Réseau verrouillé" diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index e52c7b16c90e..8379f3f7ffa2 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -92,11 +92,11 @@ "Dispozitiv blocat de administrator" "Dispozitivul a fost blocat manual" "Nu este recunoscut" - "Pentru a folosi Deblocarea facială, activați ""Accesul la cameră"" în Setări și confidențialitate" + "Pentru a folosi Deblocarea facială, activează ""Accesul la cameră"" în Setări și confidențialitate" Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d încercări. Introdu codul PIN pentru cardul SIM. Ți-au mai rămas %d de încercări. - Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul. + Introdu codul PIN pentru cardul SIM. Ți-a mai rămas %d încercare, după care va trebui să contactezi operatorul pentru a debloca dispozitivul. Cardul SIM este dezactivat acum. Introdu codul PUK pentru a continua. Ți-au mai rămas %d încercări până când cardul SIM va deveni inutilizabil definitiv. Contactează operatorul pentru detalii. -- cgit v1.2.3 From 1c30ae08fa68fb8d6806263a3e7a51679a4be0f5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 19:24:51 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idf7cdb7f2786ecb2bd7b14bfc929bbebb201609e --- packages/SettingsLib/BannerMessagePreference/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/BannerMessagePreference/res/values-ro/strings.xml b/packages/SettingsLib/BannerMessagePreference/res/values-ro/strings.xml index 18b6a0e4c830..ff260f528c99 100644 --- a/packages/SettingsLib/BannerMessagePreference/res/values-ro/strings.xml +++ b/packages/SettingsLib/BannerMessagePreference/res/values-ro/strings.xml @@ -17,5 +17,5 @@ - "Respingeți" + "Închide" -- cgit v1.2.3 From 4e695538494a92899e0548299b1cf2c89ba5ed86 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 19:52:19 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ieaf38d12902e6866c6b0bff649137b625d1cda34 --- packages/SettingsLib/res/values-ar/strings.xml | 2 +- packages/SettingsLib/res/values-as/strings.xml | 10 ++++----- packages/SettingsLib/res/values-eu/strings.xml | 2 +- packages/SettingsLib/res/values-nb/strings.xml | 30 +++++++++++++------------- packages/SettingsLib/res/values-sv/strings.xml | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index cad3ae78e245..577c6d018f68 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -116,7 +116,7 @@ "المكالمات الهاتفية" "نقل الملف" "جهاز الإرسال" - "استخدام الإنترنت" + "الوصول إلى الإنترنت" "مشاركة جهات الاتصال" "استخدام مع مشاركة جهة الاتصال" "مشاركة اتصال الإنترنت" diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index c09221b3c476..94f30fd08947 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -75,7 +75,7 @@ "ইণ্টাৰনেট সংযোগ সীমিত" "ইণ্টাৰনেট সংযোগ নাই" "ছাইন ইন কৰা দৰকাৰী" - "একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে" + "এক্সেছ পইণ্ট সাময়িকভাৱে পূৰ্ণ হৈ আছে" "%1$sৰ যোগেৰে সংযোজিত" "%1$sৰ মাধ্যমেৰে উপলব্ধ" "%1$s খুলি থকা হৈছে" @@ -98,7 +98,7 @@ "যোৰা লগোৱা হৈছে…" "সংযোগ কৰা হ’ল (ফ\'ন নাই)%1$s" "সংযোগ কৰা হ’ল (মিডিয়া নাই)%1$s" - "সংযোগ কৰা হ’ল (বাৰ্তাত প্ৰৱেশাধিকাৰ নাই)%1$s" + "সংযোগ কৰা হ’ল (বাৰ্তাৰ এক্সেছ নাই)%1$s" "সংযোগ কৰা হ’ল (কোনো ফ\'ন বা মিডিয়া নাই)%1$s" "সংযোগ কৰা হ’ল, বেটাৰীৰ স্তৰ %1$s%2$s" "সংযোগ কৰা হ’ল (ফ\'ন নাই), বেটাৰীৰ স্তৰ %1$s%2$s" @@ -139,7 +139,7 @@ "ডিভাইচৰ সৈতে স্থানীয় ইণ্টাৰনেট সংযোগ শ্বেয়াৰ কৰা হৈছে" "ইণ্টাৰনেট চলাবলৈ ব্যৱহাৰ কৰক" "মেপৰ বাবে ব্যৱহাৰ কৰক" - "ছিমত প্ৰৱেশৰ বাবে ব্যৱহাৰ কৰক" + "ছিমৰ এক্সেছৰ বাবে ব্যৱহাৰ কৰক" "মিডিয়া অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক" "ফ\'ন অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক" "ফাইল স্থানান্তৰ কৰিবলৈ ব্যৱহাৰ কৰক" @@ -149,7 +149,7 @@ "পেয়াৰ কৰক" "পেয়াৰ কৰক" "বাতিল কৰক" - "যোৰা লগালে ইয়ে সংযোজিত কৰাৰ সময়ত আপোনাৰ সম্পৰ্কসমূহ আৰু কলৰ ইতিহাস চাবলৈ অনুমতি দিব।" + "পেয়াৰিঙে সংযোজিত হ\'লে আপোনাৰ সম্পৰ্ক আৰু কলৰ ইতিহাসৰ এক্সেছ প্ৰদান কৰে।" "%1$sৰ সৈতে পেয়াৰ কৰিব পৰা নগ’ল।" "এটা ভুল পিন বা পাছকীৰ কাৰণে %1$sৰ সৈতে পেয়াৰ কৰিব পৰা নাই।" "%1$sৰ সৈতে যোগাযোগ কৰিব পৰা নগ\'ল" @@ -342,7 +342,7 @@ "ব্লুটুথ Gabeldorche সুবিধাৰ সমষ্টিটো সক্ষম কৰে।" "উন্নত সংযোগ সুবিধাটো সক্ষম কৰে।" "স্থানীয় টাৰ্মিনেল" - "স্থানীয় শ্বেল প্ৰৱেশাধিকাৰ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক" + "স্থানীয় শ্বেলৰ এক্সেছ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক" "HDCP পৰীক্ষণ" "HDCP পৰীক্ষণ আচৰণ ছেট কৰক" "ডিবাগিং" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index e442ccf541c6..966d867641b4 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -268,7 +268,7 @@ "Mantendu aktibo" "Pantaila ez da ezarriko inoiz inaktibo kargatu bitartean" "Gaitu Bluetooth HCI miatze-erregistroa" - "Hauteman Bluetooth paketeak (aktibatu edo desaktibatu Bluetooth-a ezarpena aldatu ostean)" + "Hauteman Bluetooth paketeak (aktibatu edo desaktibatu Bluetootha ezarpena aldatu ostean)" "OEM desblokeoa" "Onartu abiarazlea desblokeatzea" "OEM desblokeoa onartu nahi duzu?" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 2f0b46f08261..e7f6b3f17232 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -54,7 +54,7 @@ "Slått av" "IP-konfigurasjonsfeil" "Ikke tilkoblet på grunn av nettverk av lav kvalitet" - "Wi-Fi-tilkoblingsfeil" + "Wifi-tilkoblingsfeil" "Autentiseringsproblem" "Kan ikke koble til" "Kan ikke koble til «%1$s»" @@ -161,12 +161,12 @@ "Øretelefoner" "Inndata fra ytre utstyrsenheter" "Bluetooth" - "Wi-Fi er av." - "Wi-Fi er frakoblet." - "Wi-Fi-signal med én stolpe." - "Wi-Fi-signal med to stolper." - "Wi-Fi-signal med tre stolper." - "Wi-Fi-signalet er ved full styrke." + "Wifi er av." + "Wifi er frakoblet." + "Wifi-signal med én stolpe." + "Wifi-signal med to stolper." + "Wifi-signal med tre stolper." + "Wifi-signalet er ved full styrke." "Åpent nettverk" "Sikkert nettverk" "Android-operativsystem" @@ -236,7 +236,7 @@ "Feilsøkingsmodus når USB kobles til" "USB-feilsøking – opphev autorisasjon" "Trådløs feilsøking" - "Feilsøkingsmodus når Wi-Fi er tilkoblet" + "Feilsøkingsmodus når Wifi er tilkoblet" "Feil" "Trådløs feilsøking" "For å se og bruke tilgjengelige enheter, slå på trådløs feilsøking" @@ -255,13 +255,13 @@ "Wi‑Fi-tilkoblingskode" "Tilkoblingen mislyktes" "Sørg for at enheten er koblet til samme nettverk." - "Koble til enheten via Wi-Fi ved å skanne en QR-kode" + "Koble til enheten via Wifi ved å skanne en QR-kode" "Kobler til enheten …" "Kunne ikke koble til enheten. Enten var QR-koden feil, eller enheten er ikke koblet til samme nettverk." "IP-adresse og port" "Skann QR-koden" - "Koble til enheten via Wi-Fi ved å skanne en QR-kode" - "Koble til et Wi-Fi-nettverk" + "Koble til enheten via Wifi ved å skanne en QR-kode" + "Koble til et Wifi-nettverk" "adb, feilsøking, utvikler" "Snarvei til feilrapport" "Vis en knapp for generering av feilrapport i batterimenyen" @@ -278,7 +278,7 @@ "App for fiktiv posisjon: %1$s" "Nettverk" "Trådløs skjerm-sertifisering" - "Slå på detaljert Wi-Fi-loggføring" + "Slå på detaljert Wifi-loggføring" "Begrensning av Wi‑Fi-skanning" "Ikke-vedvarende tilfeldiggjøring av MAC-adresse for Wi‑Fi" "Mobildata er alltid aktiv" @@ -310,7 +310,7 @@ "Skriv inn DNS-leverandørens vertsnavn" "Kunne ikke koble til" "Vis alternativer for sertifisering av trådløs skjerm" - "Øk nivået av Wi-Fi-logging – vis per SSID RSSI i Wi-Fi-velgeren" + "Øk nivået av Wifi-logging – vis per SSID RSSI i Wifi-velgeren" "Reduserer batteriforbruket og forbedrer nettverksytelsen" "Når denne modusen er slått på, kan MAC-adressen til denne enheten endres hver gang den kobler seg til et nettverk som har tilfeldiggjøring av MAC-adresse slått på." "Med datamåling" @@ -326,7 +326,7 @@ "Tillat simulert posisjon" "Tillat bruk av simulerte GPS-koordinater" "Slå på inspeksjon av visningsattributt" - "Ha alltid mobildata slått på, selv når Wi-Fi er aktiv (for hurtig nettverksbytting)." + "Ha alltid mobildata slått på, selv når Wifi er aktiv (for hurtig nettverksbytting)." "Bruk maskinvareakselerasjon for internettdeling hvis det er tilgjengelig" "Tillate USB-feilsøking?" "USB-feilsøking er bare ment for utviklingsformål. Bruk det til å kopiere data mellom datamaskinen og enheten, installere apper på enheten uten varsel og lese loggdata." @@ -569,7 +569,7 @@ "Bruker" "Begrenset profil" "Vil du legge til en ny bruker?" - "Du kan dele denne enheten med andre folk ved å opprette flere brukere. Hver bruker har sin egen plass de kan tilpasse med apper, bakgrunner og annet. Brukere kan også justere enhetsinnstillinger, for eksempel Wi-Fi, som påvirker alle.\n\nNår du legger til en ny bruker, må vedkommende angi innstillinger for plassen sin.\n\nAlle brukere kan oppdatere apper for alle andre brukere. Innstillinger og tjenester for tilgjengelighet overføres kanskje ikke til den nye brukeren." + "Du kan dele denne enheten med andre folk ved å opprette flere brukere. Hver bruker har sin egen plass de kan tilpasse med apper, bakgrunner og annet. Brukere kan også justere enhetsinnstillinger, for eksempel Wifi, som påvirker alle.\n\nNår du legger til en ny bruker, må vedkommende angi innstillinger for plassen sin.\n\nAlle brukere kan oppdatere apper for alle andre brukere. Innstillinger og tjenester for tilgjengelighet overføres kanskje ikke til den nye brukeren." "Når du legger til en ny bruker, må hen konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere." "Konfigurere brukeren nå?" "Sørg for at brukeren er tilgjengelig for å konfigurere området sitt på enheten" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index ea859e492af0..3aca05ed004d 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -95,7 +95,7 @@ "Kopplar ifrån…" "Ansluter…" "Ansluten%1$s" - "Parkoppling…" + "Parkopplar…" "Ansluten (ingen mobil)%1$s" "Ansluten (inga medier)%1$s" "Ansluten (ingen meddelandeåtkomst)%1$s" -- cgit v1.2.3 From 4feae217053fb58f307d9d85edbfbc0255b34ccc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 9 Oct 2022 19:57:41 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1d03aa72a7cc44cad43cb2db52f5d1892793e429 --- packages/SettingsLib/res/values-ar/strings.xml | 2 +- packages/SettingsLib/res/values-as/strings.xml | 10 ++++----- packages/SettingsLib/res/values-eu/strings.xml | 2 +- packages/SettingsLib/res/values-nb/strings.xml | 30 +++++++++++++------------- packages/SettingsLib/res/values-sv/strings.xml | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index cad3ae78e245..577c6d018f68 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -116,7 +116,7 @@ "المكالمات الهاتفية" "نقل الملف" "جهاز الإرسال" - "استخدام الإنترنت" + "الوصول إلى الإنترنت" "مشاركة جهات الاتصال" "استخدام مع مشاركة جهة الاتصال" "مشاركة اتصال الإنترنت" diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index c09221b3c476..94f30fd08947 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -75,7 +75,7 @@ "ইণ্টাৰনেট সংযোগ সীমিত" "ইণ্টাৰনেট সংযোগ নাই" "ছাইন ইন কৰা দৰকাৰী" - "একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে" + "এক্সেছ পইণ্ট সাময়িকভাৱে পূৰ্ণ হৈ আছে" "%1$sৰ যোগেৰে সংযোজিত" "%1$sৰ মাধ্যমেৰে উপলব্ধ" "%1$s খুলি থকা হৈছে" @@ -98,7 +98,7 @@ "যোৰা লগোৱা হৈছে…" "সংযোগ কৰা হ’ল (ফ\'ন নাই)%1$s" "সংযোগ কৰা হ’ল (মিডিয়া নাই)%1$s" - "সংযোগ কৰা হ’ল (বাৰ্তাত প্ৰৱেশাধিকাৰ নাই)%1$s" + "সংযোগ কৰা হ’ল (বাৰ্তাৰ এক্সেছ নাই)%1$s" "সংযোগ কৰা হ’ল (কোনো ফ\'ন বা মিডিয়া নাই)%1$s" "সংযোগ কৰা হ’ল, বেটাৰীৰ স্তৰ %1$s%2$s" "সংযোগ কৰা হ’ল (ফ\'ন নাই), বেটাৰীৰ স্তৰ %1$s%2$s" @@ -139,7 +139,7 @@ "ডিভাইচৰ সৈতে স্থানীয় ইণ্টাৰনেট সংযোগ শ্বেয়াৰ কৰা হৈছে" "ইণ্টাৰনেট চলাবলৈ ব্যৱহাৰ কৰক" "মেপৰ বাবে ব্যৱহাৰ কৰক" - "ছিমত প্ৰৱেশৰ বাবে ব্যৱহাৰ কৰক" + "ছিমৰ এক্সেছৰ বাবে ব্যৱহাৰ কৰক" "মিডিয়া অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক" "ফ\'ন অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক" "ফাইল স্থানান্তৰ কৰিবলৈ ব্যৱহাৰ কৰক" @@ -149,7 +149,7 @@ "পেয়াৰ কৰক" "পেয়াৰ কৰক" "বাতিল কৰক" - "যোৰা লগালে ইয়ে সংযোজিত কৰাৰ সময়ত আপোনাৰ সম্পৰ্কসমূহ আৰু কলৰ ইতিহাস চাবলৈ অনুমতি দিব।" + "পেয়াৰিঙে সংযোজিত হ\'লে আপোনাৰ সম্পৰ্ক আৰু কলৰ ইতিহাসৰ এক্সেছ প্ৰদান কৰে।" "%1$sৰ সৈতে পেয়াৰ কৰিব পৰা নগ’ল।" "এটা ভুল পিন বা পাছকীৰ কাৰণে %1$sৰ সৈতে পেয়াৰ কৰিব পৰা নাই।" "%1$sৰ সৈতে যোগাযোগ কৰিব পৰা নগ\'ল" @@ -342,7 +342,7 @@ "ব্লুটুথ Gabeldorche সুবিধাৰ সমষ্টিটো সক্ষম কৰে।" "উন্নত সংযোগ সুবিধাটো সক্ষম কৰে।" "স্থানীয় টাৰ্মিনেল" - "স্থানীয় শ্বেল প্ৰৱেশাধিকাৰ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক" + "স্থানীয় শ্বেলৰ এক্সেছ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক" "HDCP পৰীক্ষণ" "HDCP পৰীক্ষণ আচৰণ ছেট কৰক" "ডিবাগিং" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index e442ccf541c6..966d867641b4 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -268,7 +268,7 @@ "Mantendu aktibo" "Pantaila ez da ezarriko inoiz inaktibo kargatu bitartean" "Gaitu Bluetooth HCI miatze-erregistroa" - "Hauteman Bluetooth paketeak (aktibatu edo desaktibatu Bluetooth-a ezarpena aldatu ostean)" + "Hauteman Bluetooth paketeak (aktibatu edo desaktibatu Bluetootha ezarpena aldatu ostean)" "OEM desblokeoa" "Onartu abiarazlea desblokeatzea" "OEM desblokeoa onartu nahi duzu?" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 2f0b46f08261..e7f6b3f17232 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -54,7 +54,7 @@ "Slått av" "IP-konfigurasjonsfeil" "Ikke tilkoblet på grunn av nettverk av lav kvalitet" - "Wi-Fi-tilkoblingsfeil" + "Wifi-tilkoblingsfeil" "Autentiseringsproblem" "Kan ikke koble til" "Kan ikke koble til «%1$s»" @@ -161,12 +161,12 @@ "Øretelefoner" "Inndata fra ytre utstyrsenheter" "Bluetooth" - "Wi-Fi er av." - "Wi-Fi er frakoblet." - "Wi-Fi-signal med én stolpe." - "Wi-Fi-signal med to stolper." - "Wi-Fi-signal med tre stolper." - "Wi-Fi-signalet er ved full styrke." + "Wifi er av." + "Wifi er frakoblet." + "Wifi-signal med én stolpe." + "Wifi-signal med to stolper." + "Wifi-signal med tre stolper." + "Wifi-signalet er ved full styrke." "Åpent nettverk" "Sikkert nettverk" "Android-operativsystem" @@ -236,7 +236,7 @@ "Feilsøkingsmodus når USB kobles til" "USB-feilsøking – opphev autorisasjon" "Trådløs feilsøking" - "Feilsøkingsmodus når Wi-Fi er tilkoblet" + "Feilsøkingsmodus når Wifi er tilkoblet" "Feil" "Trådløs feilsøking" "For å se og bruke tilgjengelige enheter, slå på trådløs feilsøking" @@ -255,13 +255,13 @@ "Wi‑Fi-tilkoblingskode" "Tilkoblingen mislyktes" "Sørg for at enheten er koblet til samme nettverk." - "Koble til enheten via Wi-Fi ved å skanne en QR-kode" + "Koble til enheten via Wifi ved å skanne en QR-kode" "Kobler til enheten …" "Kunne ikke koble til enheten. Enten var QR-koden feil, eller enheten er ikke koblet til samme nettverk." "IP-adresse og port" "Skann QR-koden" - "Koble til enheten via Wi-Fi ved å skanne en QR-kode" - "Koble til et Wi-Fi-nettverk" + "Koble til enheten via Wifi ved å skanne en QR-kode" + "Koble til et Wifi-nettverk" "adb, feilsøking, utvikler" "Snarvei til feilrapport" "Vis en knapp for generering av feilrapport i batterimenyen" @@ -278,7 +278,7 @@ "App for fiktiv posisjon: %1$s" "Nettverk" "Trådløs skjerm-sertifisering" - "Slå på detaljert Wi-Fi-loggføring" + "Slå på detaljert Wifi-loggføring" "Begrensning av Wi‑Fi-skanning" "Ikke-vedvarende tilfeldiggjøring av MAC-adresse for Wi‑Fi" "Mobildata er alltid aktiv" @@ -310,7 +310,7 @@ "Skriv inn DNS-leverandørens vertsnavn" "Kunne ikke koble til" "Vis alternativer for sertifisering av trådløs skjerm" - "Øk nivået av Wi-Fi-logging – vis per SSID RSSI i Wi-Fi-velgeren" + "Øk nivået av Wifi-logging – vis per SSID RSSI i Wifi-velgeren" "Reduserer batteriforbruket og forbedrer nettverksytelsen" "Når denne modusen er slått på, kan MAC-adressen til denne enheten endres hver gang den kobler seg til et nettverk som har tilfeldiggjøring av MAC-adresse slått på." "Med datamåling" @@ -326,7 +326,7 @@ "Tillat simulert posisjon" "Tillat bruk av simulerte GPS-koordinater" "Slå på inspeksjon av visningsattributt" - "Ha alltid mobildata slått på, selv når Wi-Fi er aktiv (for hurtig nettverksbytting)." + "Ha alltid mobildata slått på, selv når Wifi er aktiv (for hurtig nettverksbytting)." "Bruk maskinvareakselerasjon for internettdeling hvis det er tilgjengelig" "Tillate USB-feilsøking?" "USB-feilsøking er bare ment for utviklingsformål. Bruk det til å kopiere data mellom datamaskinen og enheten, installere apper på enheten uten varsel og lese loggdata." @@ -569,7 +569,7 @@ "Bruker" "Begrenset profil" "Vil du legge til en ny bruker?" - "Du kan dele denne enheten med andre folk ved å opprette flere brukere. Hver bruker har sin egen plass de kan tilpasse med apper, bakgrunner og annet. Brukere kan også justere enhetsinnstillinger, for eksempel Wi-Fi, som påvirker alle.\n\nNår du legger til en ny bruker, må vedkommende angi innstillinger for plassen sin.\n\nAlle brukere kan oppdatere apper for alle andre brukere. Innstillinger og tjenester for tilgjengelighet overføres kanskje ikke til den nye brukeren." + "Du kan dele denne enheten med andre folk ved å opprette flere brukere. Hver bruker har sin egen plass de kan tilpasse med apper, bakgrunner og annet. Brukere kan også justere enhetsinnstillinger, for eksempel Wifi, som påvirker alle.\n\nNår du legger til en ny bruker, må vedkommende angi innstillinger for plassen sin.\n\nAlle brukere kan oppdatere apper for alle andre brukere. Innstillinger og tjenester for tilgjengelighet overføres kanskje ikke til den nye brukeren." "Når du legger til en ny bruker, må hen konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere." "Konfigurere brukeren nå?" "Sørg for at brukeren er tilgjengelig for å konfigurere området sitt på enheten" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index ea859e492af0..3aca05ed004d 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -95,7 +95,7 @@ "Kopplar ifrån…" "Ansluter…" "Ansluten%1$s" - "Parkoppling…" + "Parkopplar…" "Ansluten (ingen mobil)%1$s" "Ansluten (inga medier)%1$s" "Ansluten (ingen meddelandeåtkomst)%1$s" -- cgit v1.2.3 From d80824b57d64be02ca2f50660ae170680d2d9613 Mon Sep 17 00:00:00 2001 From: Andrew Solovay Date: Mon, 10 Oct 2022 16:55:46 -0700 Subject: docs: Fixing badly-formatted doc comment The Javadoc specification doesn't actually define a {@more} tag. The Java-reference engine interpreted it as a paragraph break, but the Kotlin doc engine (more properly) passed the tag through verbatim. Replaced it with a

to make it a paragraph break in both languages. Bug: 247563816 Test: (docs build) Change-Id: Ib7bb4c2628141b7479c338f1d3fb28da503b847f --- core/java/android/app/NotificationManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 392f52a08fb5..f6d27ad08b00 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -66,9 +66,9 @@ import java.util.Objects; /** * Class to notify the user of events that happen. This is how you tell - * the user that something has happened in the background. {@more} + * the user that something has happened in the background. * - * Notifications can take different forms: + *

Notifications can take different forms: *

    *
  • A persistent icon that goes in the status bar and is accessible * through the launcher, (when the user selects it, a designated Intent -- cgit v1.2.3 From 3ae3406b9706163073c282a8c4081faa32b606b2 Mon Sep 17 00:00:00 2001 From: William Loh Date: Tue, 30 Aug 2022 00:11:15 +0000 Subject: Limit length and number of MIME types you can set Limit character length of MIME types to 255. If this length is exceeded then a IllegalArugmentException is thrown. The number of MIME types that can be set is also limited to 500 per MIME group with the number of total MIME Groups also limited to 500. A IllegalStateException is thrown if this number is exceeded. Bug: 237291548 Test: Installed and ran POC app from b/237291548 Change-Id: I1d57e674f778cfacdc89225ac3273c432a39af63 Merged-In: I1d57e674f778cfacdc89225ac3273c432a39af63 --- core/java/android/content/pm/parsing/ParsingPackageImpl.java | 3 +++ services/core/java/com/android/server/pm/PackageSetting.java | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java index d851b612999c..c1222854fea1 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java +++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java @@ -1580,6 +1580,9 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { for (int i = component.getIntents().size() - 1; i >= 0; i--) { IntentFilter filter = component.getIntents().get(i); for (int groupIndex = filter.countMimeGroups() - 1; groupIndex >= 0; groupIndex--) { + if (mimeGroups != null && mimeGroups.size() > 500) { + throw new IllegalStateException("Max limit on number of MIME Groups reached"); + } mimeGroups = ArrayUtils.add(mimeGroups, filter.getMimeGroup(groupIndex)); } } diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 432d7f335ebc..d3f557d18178 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -242,11 +242,20 @@ public class PackageSetting extends PackageSettingBase { } public boolean setMimeGroup(String mimeGroup, List mimeTypes) { + for (String mimeType : mimeTypes) { + if (mimeType.length() > 255) { + throw new IllegalArgumentException("MIME type length exceeds 255 characters"); + } + } ArraySet oldMimeTypes = getMimeGroupInternal(mimeGroup); if (oldMimeTypes == null) { throw new IllegalArgumentException("Unknown MIME group " + mimeGroup + " for package " + name); } + if (mimeTypes.size() > 500) { + throw new IllegalStateException("Max limit on MIME types for MIME group " + + mimeGroup + " exceeded for package " + name); + } ArraySet newMimeTypes = new ArraySet<>(mimeTypes); boolean hasChanges = !newMimeTypes.equals(oldMimeTypes); -- cgit v1.2.3 From 598b28a058f92440cc23c1db68574e64ad6b1c31 Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 72 ++++++---- .../notification/NotificationListenersTest.java | 148 ++++++++++++++------- .../NotificationManagerServiceTest.java | 68 +++++++++- 3 files changed, 203 insertions(+), 85 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index fe361184f70c..354aa252c671 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1903,34 +1903,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -9192,11 +9197,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -9204,14 +9212,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -9403,12 +9420,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), record.getNotificationType(), info)) { continue; } @@ -9450,8 +9470,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -10507,7 +10527,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10608,7 +10628,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10657,10 +10677,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; // TODO (b/73052211): if the ranking update changed the notification type, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index eb9847f7eb7e..e36223558ba7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -67,7 +67,6 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.util.List; public class NotificationListenersTest extends UiServiceTestCase { @@ -379,63 +378,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 3970ec3f3cb7..a17ebd8cc4c9 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -159,6 +159,7 @@ import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -194,6 +195,7 @@ import com.android.server.SystemService.TargetUser; import com.android.server.UiServiceTestCase; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -344,6 +346,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService(Context context, NotificationRecordLogger logger, InstanceIdSequence notificationInstanceIdSequence) { super(context, logger, notificationInstanceIdSequence); @@ -412,6 +417,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { void onGranted(ComponentName assistant, int userId, boolean granted, boolean userSet); } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, int notificationType, + ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, notificationType, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -8485,10 +8503,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -8504,8 +8522,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -8514,9 +8532,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + //verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From 9281fb98e3a3b25c74a68ad29069d4649535cd4e Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 72 ++++++---- .../notification/NotificationListenersTest.java | 149 ++++++++++++++------- .../NotificationManagerServiceTest.java | 68 +++++++++- 3 files changed, 204 insertions(+), 85 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6e7737faa87c..5a4d9ad6772c 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2013,34 +2013,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -9299,11 +9304,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -9311,14 +9319,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -9510,12 +9527,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), record.getNotificationType(), info)) { continue; } @@ -9557,8 +9577,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -10614,7 +10634,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10715,7 +10735,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10764,10 +10784,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; // TODO (b/73052211): if the ranking update changed the notification type, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 313f3078908d..9d693b82f331 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -39,6 +39,7 @@ import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.content.pm.VersionedPackage; import android.os.Bundle; +import android.os.UserHandle; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; @@ -61,7 +62,6 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.util.List; public class NotificationListenersTest extends UiServiceTestCase { @@ -362,63 +362,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 ce0fefa6e213..bd75bd74ce65 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -160,6 +160,7 @@ import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -195,6 +196,7 @@ import com.android.server.SystemService.TargetUser; import com.android.server.UiServiceTestCase; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -345,6 +347,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService(Context context, NotificationRecordLogger logger, InstanceIdSequence notificationInstanceIdSequence) { super(context, logger, notificationInstanceIdSequence); @@ -413,6 +418,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { void onGranted(ComponentName assistant, int userId, boolean granted, boolean userSet); } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, int notificationType, + ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, notificationType, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -8549,10 +8567,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -8568,8 +8586,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -8578,9 +8596,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + //verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From 0b56ec9aa245f7bbdf065a4b33b5ef00a558dbe4 Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 72 ++++++---- .../notification/NotificationListenersTest.java | 149 ++++++++++++++------- .../NotificationManagerServiceTest.java | 70 ++++++++-- 3 files changed, 205 insertions(+), 86 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 42a3dc5214c7..47ab34c57b8a 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2013,34 +2013,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -9180,11 +9185,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -9192,14 +9200,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -9391,12 +9408,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), record.getNotificationType(), info)) { continue; } @@ -9438,8 +9458,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -10495,7 +10515,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10596,7 +10616,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -10645,10 +10665,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; // TODO (b/73052211): if the ranking update changed the notification type, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 313f3078908d..9d693b82f331 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -39,6 +39,7 @@ import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.content.pm.VersionedPackage; import android.os.Bundle; +import android.os.UserHandle; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; @@ -61,7 +62,6 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.util.List; public class NotificationListenersTest extends UiServiceTestCase { @@ -362,63 +362,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 e7d67bfdf087..aaa995e63956 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -160,6 +160,7 @@ import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -195,6 +196,7 @@ import com.android.server.SystemService.TargetUser; import com.android.server.UiServiceTestCase; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -345,6 +347,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService(Context context, NotificationRecordLogger logger, InstanceIdSequence notificationInstanceIdSequence) { super(context, logger, notificationInstanceIdSequence); @@ -413,6 +418,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { void onGranted(ComponentName assistant, int userId, boolean granted, boolean userSet); } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, int notificationType, + ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, notificationType, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -538,7 +556,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mWorkerHandler = mService.new WorkerHandler(mTestableLooper.getLooper()); + mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper())); mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm, @@ -8393,10 +8411,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -8412,8 +8430,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -8422,9 +8440,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + //verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From a4156b6f4ddb04f267d5126e991aaeee65ebca06 Mon Sep 17 00:00:00 2001 From: Simon Wingrove Date: Fri, 14 Oct 2022 11:45:56 +0100 Subject: Allow ActivityEmbedding in APEX modules. Also this lib uses HTTP and doesn't declare it, so after manifest merge the APEX module won't build. Add the uses-library. Bug: 253394518 Test: test builds Change-Id: I94cb2be58d88521ed10e4fba5b5e11169bead624 --- packages/SettingsLib/ActivityEmbedding/Android.bp | 5 +++++ packages/SettingsLib/ActivityEmbedding/AndroidManifest.xml | 1 + 2 files changed, 6 insertions(+) diff --git a/packages/SettingsLib/ActivityEmbedding/Android.bp b/packages/SettingsLib/ActivityEmbedding/Android.bp index 332bebffb637..c35fb3b17880 100644 --- a/packages/SettingsLib/ActivityEmbedding/Android.bp +++ b/packages/SettingsLib/ActivityEmbedding/Android.bp @@ -26,4 +26,9 @@ android_library { "androidx.window.extensions", "androidx.window.sidecar", ], + + apex_available: [ + "//apex_available:platform", + "com.android.permission", + ], } diff --git a/packages/SettingsLib/ActivityEmbedding/AndroidManifest.xml b/packages/SettingsLib/ActivityEmbedding/AndroidManifest.xml index 5ce08b7747a4..0f13f6498346 100644 --- a/packages/SettingsLib/ActivityEmbedding/AndroidManifest.xml +++ b/packages/SettingsLib/ActivityEmbedding/AndroidManifest.xml @@ -21,6 +21,7 @@ + -- cgit v1.2.3 From ce5a334f1d39762d70917a3a87f1c6593d84c615 Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 75 ++++++---- .../notification/NotificationListenersTest.java | 158 ++++++++++++++------- .../NotificationManagerServiceTest.java | 72 ++++++++-- 3 files changed, 219 insertions(+), 86 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 443747e6d75e..ee0540ea3761 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1475,34 +1475,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -7398,11 +7403,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -7410,14 +7418,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -7590,12 +7607,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.sbn, info)) { continue; } @@ -7630,8 +7650,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -7666,7 +7686,8 @@ public class NotificationManagerService extends SystemService { ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)); } - private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + @VisibleForTesting + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { if (!listener.enabledAndUserMatches(sbn.getUserId())) { return false; } @@ -8254,7 +8275,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -8320,7 +8341,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -8375,10 +8396,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 793739bfe8f5..0a6ed98859de 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.app.INotificationManager; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.os.UserHandle; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.testing.TestableContext; @@ -40,8 +41,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.internal.util.reflection.FieldSetter; -import java.util.List; - public class NotificationListenersTest extends UiServiceTestCase { @Mock @@ -70,66 +69,127 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(mListeners, times(2)).getServices(); + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); - // in the lockdown mode - reset(r); - reset(old); + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + + verify(mListeners, times(4)).getServices(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); reset(mListeners); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(mListeners, never()).getServices(); - } - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, times(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + + verify(mListeners, times(2)).getServices(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - StatusBarNotification sbn = mock(StatusBarNotification.class); - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); - FieldSetter.setField(r, + StatusBarNotification sbn0 = mock(StatusBarNotification.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + FieldSetter.setField(r0, NotificationRecord.class.getDeclaredField("sbn"), - sbn); + sbn0); + + StatusBarNotification sbn1 = mock(StatusBarNotification.class); + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + FieldSetter.setField(r1, + NotificationRecord.class.getDeclaredField("sbn"), + sbn1); + FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(sbn, times(2)).cloneLight(); - - // in the lockdown mode - reset(sbn); - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(sbn, never()).cloneLight(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(sbn0, times(2)).cloneLight(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(sbn1, times(2)).cloneLight(); + + // Reset + reset(sbn0); + reset(r0); + reset(rs0); + reset(sbn1); + reset(r1); + reset(rs1); + + FieldSetter.setField(r0, + NotificationRecord.class.getDeclaredField("sbn"), + sbn0); + FieldSetter.setField(r1, + NotificationRecord.class.getDeclaredField("sbn"), + sbn1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(sbn0, never()).cloneLight(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(sbn1, times(2)).cloneLight(); } } 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 15a8464a096c..1097a7c791b0 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -123,6 +123,7 @@ import android.provider.MediaStore; import android.provider.Settings; import android.service.notification.Adjustment; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -148,6 +149,7 @@ import com.android.server.SystemService; import com.android.server.UiServiceTestCase; import com.android.server.lights.Light; import com.android.server.lights.LightsManager; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -267,6 +269,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService(Context context, InjectableSystemClock systemClock) { super(context, systemClock); } @@ -347,6 +352,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { return true; } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -442,7 +459,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mService.init(mTestableLooper.getLooper(), mPackageManager, mPackageManagerClient, mockLightsManager, mListeners, mAssistants, mConditionProviders, @@ -5519,14 +5535,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test public void testCancelAndPostNotificationsWhenEnterAndExitLockDownMode() { + NotificationManagerService.WorkerHandler mWorkerHandler = spy( + mService.new WorkerHandler(mTestableLooper.getLooper())); + mService.setHandler(mWorkerHandler); + // post 2 notifications from 2 packages NotificationRecord pkgA = new NotificationRecord(mContext, generateSbn("a", 1000, 9, 0), mTestNotificationChannel); @@ -5538,8 +5558,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -5548,9 +5568,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + //verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From 23cb84f8695a2e3f24403274e4b77010da43e9db Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 72 ++++++---- .../notification/NotificationListenersTest.java | 147 ++++++++++++++------- .../NotificationManagerServiceTest.java | 51 ++++++- .../TestableNotificationManagerService.java | 18 +++ 4 files changed, 204 insertions(+), 84 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index a8647c624bdc..06c74d26b84b 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1952,34 +1952,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -9625,11 +9630,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -9637,14 +9645,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -9817,12 +9834,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), record.getNotificationType(), info)) { continue; } @@ -9864,8 +9884,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -10921,7 +10941,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -11022,7 +11042,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -11071,10 +11091,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; // TODO (b/73052211): if the ranking update changed the notification type, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 76d4059eb436..0f6606f74ae9 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -398,63 +398,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 98adefa1178a..b18da0d0df73 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -170,6 +170,7 @@ import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -9658,10 +9659,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -9677,8 +9678,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_CANCEL_ALL. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -9687,10 +9688,46 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + //verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } @Test diff --git a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java index b49e5cbfa9dc..8cf74fbf88b7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java @@ -19,10 +19,12 @@ package com.android.server.notification; import android.companion.ICompanionDeviceManager; import android.content.ComponentName; import android.content.Context; +import android.service.notification.StatusBarNotification; import androidx.annotation.Nullable; import com.android.internal.logging.InstanceIdSequence; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import java.util.HashSet; import java.util.Set; @@ -37,6 +39,9 @@ public class TestableNotificationManagerService extends NotificationManagerServi @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService(Context context, NotificationRecordLogger logger, InstanceIdSequence notificationInstanceIdSequence) { super(context, logger, notificationInstanceIdSequence); @@ -119,6 +124,19 @@ public class TestableNotificationManagerService extends NotificationManagerServi mShowReviewPermissionsNotification = setting; } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, int notificationType, + ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, notificationType, listener); + } + public class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { -- cgit v1.2.3 From 5e40f39f5bd4ae769d79ce022a64f1345512b65d Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 75 +++++++---- .../notification/NotificationListenersTest.java | 150 ++++++++++++++------- .../NotificationManagerServiceTest.java | 72 ++++++++-- 3 files changed, 209 insertions(+), 88 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index c1327463f8a1..0036e5d75278 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1726,34 +1726,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -8568,11 +8573,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -8580,14 +8588,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -8776,12 +8793,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), info)) { continue; } @@ -8820,8 +8840,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -8856,7 +8876,8 @@ public class NotificationManagerService extends SystemService { ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)); } - private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + @VisibleForTesting + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { if (!listener.enabledAndUserMatches(sbn.getUserId())) { return false; } @@ -9540,7 +9561,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -9611,7 +9632,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -9667,10 +9688,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 7244fcdda731..a4727a09570c 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.app.INotificationManager; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.os.UserHandle; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.testing.TestableContext; @@ -40,8 +41,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.internal.util.reflection.FieldSetter; -import java.util.List; - public class NotificationListenersTest extends UiServiceTestCase { @Mock @@ -71,63 +70,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 58115bde59a8..d82eaf18f241 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -140,6 +140,7 @@ import android.provider.Settings; import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -173,6 +174,7 @@ import com.android.server.SystemService; import com.android.server.UiServiceTestCase; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -301,6 +303,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { StatusBarManagerInternal mStatusBar; private final FakeSystemClock mSystemClock = new FakeSystemClock(); + private NotificationManagerService.WorkerHandler mWorkerHandler; + // Use a Testable subclass so we can simulate calls from the system without failing. private static class TestableNotificationManagerService extends NotificationManagerService { int countSystemChecks = 0; @@ -313,6 +317,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService( Context context, NotificationRecordLogger logger, @@ -399,6 +406,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { void onGranted(ComponentName assistant, int userId, boolean granted); } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -521,7 +540,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mService.init(mService.new WorkerHandler(mTestableLooper.getLooper()), + mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper())); + mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, @@ -590,6 +610,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.unregisterDeviceConfigChange(); InstrumentationRegistry.getInstrumentation() .getUiAutomation().dropShellPermissionIdentity(); + mWorkerHandler.removeCallbacksAndMessages(null); } private ArrayMap> generateResetComponentValues() { @@ -7238,10 +7259,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -7257,8 +7278,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -7267,9 +7288,44 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From baca9125f1dbf9529a3242324780f3ab6250895c Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Tue, 30 Aug 2022 11:09:46 -0700 Subject: Enable user graularity for lockdown mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker to observe the StrongAuth changes of every user. More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. Via this flag, NotificationManagerService can perform the following operations when the user enter or exit lockdown mode: Enter lockdown: 1. Remove all the notifications belonging to the user. 2. Set the local flag to indicate the lockdown is on for the user. The local flag will suppress the user's notifications on the post, remove and update functions. Exit lockdown: 1. Clear the local flag to indicate the lockdown is off for the user. 2. Repost the user’s notifications (suppressed during lockdown mode). The CL also updates corresponding tests. Bug: 173721373 Bug: 250743174 Test: atest NotificationManagerServiceTest Test: atest NotificationListenersTest Ignore-AOSP-First: pending fix for a security issue. Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d (cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) --- .../notification/NotificationManagerService.java | 76 ++++++----- .../notification/NotificationListenersTest.java | 150 ++++++++++++++------- .../NotificationManagerServiceTest.java | 72 ++++++++-- 3 files changed, 209 insertions(+), 89 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ea4c5c4d3ea7..5222ff86c93f 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -59,7 +59,6 @@ import static android.content.pm.PackageManager.MATCH_ALL; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.media.AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY; import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL; @@ -1727,34 +1726,39 @@ public class NotificationManagerService extends SystemService { return (haystack & needle) != 0; } - public boolean isInLockDownMode() { - return mIsInLockDownMode; + // Return whether the user is in lockdown mode. + // If the flag is not set, we assume the user is not in lockdown. + public boolean isInLockDownMode(int userId) { + return mUserInLockDownMode.get(userId, false); } @Override public synchronized void onStrongAuthRequiredChanged(int userId) { boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mUserInLockDownMode.put(userId, userInLockDownModeNext); - boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - if (mIsInLockDownMode == isInLockDownModeNext) { + // Nothing happens if the lockdown mode of userId keeps the same. + if (userInLockDownModeNext == isInLockDownMode(userId)) { return; } - if (isInLockDownModeNext) { - cancelNotificationsWhenEnterLockDownMode(); + // When the lockdown mode is changed, we perform the following steps. + // If the userInLockDownModeNext is true, all the function calls to + // notifyPostedLocked and notifyRemovedLocked will not be executed. + // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked + // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. + // So we shall call cancelNotificationsWhenEnterLockDownMode before + // we set mUserInLockDownMode as true. + // On the other hand, if the userInLockDownModeNext is false, we shall call + // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode + if (userInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(userId); } - // When the mIsInLockDownMode is true, both notifyPostedLocked and - // notifyRemovedLocked will be dismissed. So we shall call - // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode - // as true and call postNotificationsWhenExitLockDownMode after we set - // mIsInLockDownMode as false. - mIsInLockDownMode = isInLockDownModeNext; + mUserInLockDownMode.put(userId, userInLockDownModeNext); - if (!isInLockDownModeNext) { - postNotificationsWhenExitLockDownMode(); + if (!userInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(userId); } } } @@ -8610,11 +8614,14 @@ public class NotificationManagerService extends SystemService { } } - private void cancelNotificationsWhenEnterLockDownMode() { + private void cancelNotificationsWhenEnterLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); + if (rec.getUser().getIdentifier() != userId) { + continue; + } mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, rec.getStats()); } @@ -8622,14 +8629,23 @@ public class NotificationManagerService extends SystemService { } } - private void postNotificationsWhenExitLockDownMode() { + private void postNotificationsWhenExitLockDownMode(int userId) { synchronized (mNotificationLock) { int numNotifications = mNotificationList.size(); + // Set the delay to spread out the burst of notifications. + long delay = 0; for (int i = 0; i < numNotifications; i++) { NotificationRecord rec = mNotificationList.get(i); - mListeners.notifyPostedLocked(rec, rec); + if (rec.getUser().getIdentifier() != userId) { + continue; + } + mHandler.postDelayed(() -> { + synchronized (mNotificationLock) { + mListeners.notifyPostedLocked(rec, rec); + } + }, delay); + delay += 20; } - } } @@ -8832,12 +8848,15 @@ public class NotificationManagerService extends SystemService { * notifications visible to the given listener. */ @GuardedBy("mNotificationLock") - private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { + NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { final int N = mNotificationList.size(); final ArrayList rankings = new ArrayList<>(); for (int i = 0; i < N; i++) { NotificationRecord record = mNotificationList.get(i); + if (isInLockDownMode(record.getUser().getIdentifier())) { + continue; + } if (!isVisibleToListener(record.getSbn(), info)) { continue; } @@ -8876,8 +8895,8 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } - boolean isInLockDownMode() { - return mStrongAuthTracker.isInLockDownMode(); + boolean isInLockDownMode(int userId) { + return mStrongAuthTracker.isInLockDownMode(userId); } boolean hasCompanionDevice(ManagedServiceInfo info) { @@ -8912,7 +8931,8 @@ public class NotificationManagerService extends SystemService { ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)); } - private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + @VisibleForTesting + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { if (!listener.enabledAndUserMatches(sbn.getUserId())) { return false; } @@ -9598,7 +9618,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -9698,7 +9718,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { - if (isInLockDownMode()) { + if (isInLockDownMode(r.getUser().getIdentifier())) { return; } @@ -9747,10 +9767,6 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List changedHiddenNotifications) { - if (isInLockDownMode()) { - return; - } - boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 7244fcdda731..a4727a09570c 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.app.INotificationManager; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.os.UserHandle; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.testing.TestableContext; @@ -40,8 +41,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.internal.util.reflection.FieldSetter; -import java.util.List; - public class NotificationListenersTest extends UiServiceTestCase { @Mock @@ -71,63 +70,112 @@ public class NotificationListenersTest extends UiServiceTestCase { @Test public void testNotifyPostedLockedInLockdownMode() { - NotificationRecord r = mock(NotificationRecord.class); - NotificationRecord old = mock(NotificationRecord.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(old); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyPostedLocked(r, old, true); - mListeners.notifyPostedLocked(r, old, false); - verify(r, never()).getSbn(); - } - - @Test - public void testnotifyRankingUpdateLockedInLockdownMode() { - List chn = mock(List.class); - - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, atLeast(1)).size(); - - // in the lockdown mode - reset(chn); - when(mNm.isInLockDownMode()).thenReturn(true); - mListeners.notifyRankingUpdateLocked(chn); - verify(chn, never()).size(); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationRecord old0 = mock(NotificationRecord.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationRecord old1 = mock(NotificationRecord.class); + UserHandle uh1 = mock(UserHandle.class); + + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(old0); + reset(r1); + reset(old1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + + mListeners.notifyPostedLocked(r0, old0, true); + mListeners.notifyPostedLocked(r0, old0, false); + verify(r0, never()).getSbn(); + + mListeners.notifyPostedLocked(r1, old1, true); + mListeners.notifyPostedLocked(r1, old1, false); + verify(r1, atLeast(2)).getSbn(); } @Test public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - NotificationRecord r = mock(NotificationRecord.class); - NotificationStats rs = mock(NotificationStats.class); + NotificationRecord r0 = mock(NotificationRecord.class); + NotificationStats rs0 = mock(NotificationStats.class); + UserHandle uh0 = mock(UserHandle.class); + + NotificationRecord r1 = mock(NotificationRecord.class); + NotificationStats rs1 = mock(NotificationStats.class); + UserHandle uh1 = mock(UserHandle.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); FieldSetter.setField(mNm, NotificationManagerService.class.getDeclaredField("mHandler"), mock(NotificationManagerService.WorkerHandler.class)); - // before the lockdown mode - when(mNm.isInLockDownMode()).thenReturn(false); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, atLeast(2)).getSbn(); - - // in the lockdown mode - reset(r); - reset(rs); - when(mNm.isInLockDownMode()).thenReturn(true); - when(r.getSbn()).thenReturn(sbn); - mListeners.notifyRemovedLocked(r, 0, rs); - mListeners.notifyRemovedLocked(r, 0, rs); - verify(r, never()).getSbn(); + // Neither user0 and user1 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(false); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, atLeast(2)).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); + + // Reset + reset(r0); + reset(rs0); + reset(r1); + reset(rs1); + + // Only user 0 is in the lockdown mode + when(r0.getUser()).thenReturn(uh0); + when(uh0.getIdentifier()).thenReturn(0); + when(mNm.isInLockDownMode(0)).thenReturn(true); + when(r0.getSbn()).thenReturn(sbn); + + when(r1.getUser()).thenReturn(uh1); + when(uh1.getIdentifier()).thenReturn(1); + when(mNm.isInLockDownMode(1)).thenReturn(false); + when(r1.getSbn()).thenReturn(sbn); + + mListeners.notifyRemovedLocked(r0, 0, rs0); + mListeners.notifyRemovedLocked(r0, 0, rs0); + verify(r0, never()).getSbn(); + + mListeners.notifyRemovedLocked(r1, 0, rs1); + mListeners.notifyRemovedLocked(r1, 0, rs1); + verify(r1, atLeast(2)).getSbn(); } } 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 c7b328717d34..4e2e35fb13d1 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -141,6 +141,7 @@ import android.provider.Settings; import android.service.notification.Adjustment; import android.service.notification.ConversationChannelWrapper; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationRankingUpdate; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; @@ -174,6 +175,7 @@ import com.android.server.SystemService; import com.android.server.UiServiceTestCase; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; +import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; import com.android.server.pm.PackageManagerService; @@ -304,6 +306,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { StatusBarManagerInternal mStatusBar; private final FakeSystemClock mSystemClock = new FakeSystemClock(); + private NotificationManagerService.WorkerHandler mWorkerHandler; + // Use a Testable subclass so we can simulate calls from the system without failing. private static class TestableNotificationManagerService extends NotificationManagerService { int countSystemChecks = 0; @@ -316,6 +320,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; + @Nullable + Boolean mIsVisibleToListenerReturnValue = null; + TestableNotificationManagerService( Context context, NotificationRecordLogger logger, @@ -402,6 +409,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { void onGranted(ComponentName assistant, int userId, boolean granted); } + protected void setIsVisibleToListenerReturnValue(boolean value) { + mIsVisibleToListenerReturnValue = value; + } + + @Override + boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { + if (mIsVisibleToListenerReturnValue != null) { + return mIsVisibleToListenerReturnValue; + } + return super.isVisibleToListener(sbn, listener); + } + class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { private int mGetStrongAuthForUserReturnValue = 0; StrongAuthTrackerFake(Context context) { @@ -524,7 +543,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mService.init(mService.new WorkerHandler(mTestableLooper.getLooper()), + mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper())); + mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, @@ -593,6 +613,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.unregisterDeviceConfigChange(); InstrumentationRegistry.getInstrumentation() .getUiAutomation().dropShellPermissionIdentity(); + mWorkerHandler.removeCallbacksAndMessages(null); } private ArrayMap> generateResetComponentValues() { @@ -7261,10 +7282,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertFalse(mStrongAuthTracker.isInLockDownMode()); + assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); } @Test @@ -7280,8 +7301,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // when entering the lockdown mode, cancel the 2 notifications. mStrongAuthTracker.setGetStrongAuthForUserReturnValue( STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); - assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. ArgumentCaptor captor = ArgumentCaptor.forClass(Integer.class); @@ -7290,9 +7311,44 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // exit lockdown mode. mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); // the notifyPostedLocked function is called twice. - verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); + } + + @Test + public void testMakeRankingUpdateLockedInLockDownMode() { + // post 2 notifications from a same package + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 1), mTestNotificationChannel); + mService.addNotification(pkgB); + + mService.setIsVisibleToListenerReturnValue(true); + NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); + + // when only user 0 entering the lockdown mode, its notification will be suppressed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertTrue(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(1, nru.getRankingMap().getOrderedKeys().length); + + // User 0 exits lockdown mode. Its notification will be resumed. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(0); + assertFalse(mStrongAuthTracker.isInLockDownMode(0)); + assertFalse(mStrongAuthTracker.isInLockDownMode(1)); + + nru = mService.makeRankingUpdateLocked(null); + assertEquals(2, nru.getRankingMap().getOrderedKeys().length); } } -- cgit v1.2.3 From 58e7e596540e7ab53fc3bdd2ac5a64e474130656 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 11:20:04 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7faa016f96d6047e1098d9cfec5c174993f1849d --- core/res/res/values-am/strings.xml | 14 +-- core/res/res/values-as/strings.xml | 178 ++++++++++++++++++------------------- core/res/res/values-eu/strings.xml | 10 +-- core/res/res/values-hr/strings.xml | 2 +- core/res/res/values-te/strings.xml | 12 +-- core/res/res/values-tl/strings.xml | 2 +- 6 files changed, 109 insertions(+), 109 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a49c923e9e5b..c7dabd9065a7 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -178,7 +178,7 @@ "በጣም ብዙ %s ለመሰረዝ ተሞክሯል።" "የጡባዊ ተኮ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።" "የእጅ ሰዓት ማከማቻ ሙሉ ነው። ቦታ ለማስለቀቅ አንዳንድ ፋይሎችን ይሰርዙ።" - "Android TV መሣሪያ ማከማቻ ሙሉ ነው። ባዶ ቦታን ነጻ ለማድረግ አንዳንድ ፋይሎችን ይሰርዙ።" + "Android TV መሣሪያ ማከማቻ ሙሉ ነው። ባዶ ቦታን ነፃ ለማድረግ አንዳንድ ፋይሎችን ይሰርዙ።" "የስልክ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።" "{count,plural, =1{የእውቅና ማረጋገጫ ባለስልጣን ተጭኗል}one{የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል}other{የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል}}" "ባልታወቀ ሶስተኛ ወገን" @@ -1147,7 +1147,7 @@ "የግቤት ስልትን ቀይር" "የማከማቻ ቦታ እያለቀ ነው" "አንዳንድ የስርዓት ተግባራት ላይሰሩ ይችላሉ" - "ለስርዓቱ የሚሆን በቂ ቦታ የለም። 250 ሜባ ነጻ ቦታ እንዳለዎት ያረጋግጡና ዳግም ያስጀምሩ።" + "ለስርዓቱ የሚሆን በቂ ቦታ የለም። 250 ሜባ ነፃ ቦታ እንዳለዎት ያረጋግጡና ዳግም ያስጀምሩ።" "%1$s እያሄደ ነው" "ተጨማሪ መረጃ ለማግኘት ወይም መተግበሪያውን ለማቆም መታ ያድርጉ።" "እሺ" @@ -1202,7 +1202,7 @@ "መተግበሪያውን እንደገና ክፈት" "ግብረመልስ ይላኩ" "ዝጋ" - "መሣሪያ ዳግም እስኪጀመር ድረስ ድምጽ ያጥፉ" + "መሣሪያ ዳግም እስኪጀመር ድረስ ድምፅ ያጥፉ" "ጠብቅ" "መተግበሪያን ዝጋ" @@ -1265,7 +1265,7 @@ "የ%1$s ሂደት ተራጋፊ ክምር ለማጋራት ለእርስዎ ይገኛል። ይጠንቀቁ፦ ይህ ተራጋፊ ክምር ሂደቱ ሊደርስባቸው የሚችለው ማንኛውም የግል መረጃ ሊኖረው ይችላል፣ ይህ እርስዎ የተየቧቸውን ነገሮች ሊያካትት ይችላል።" "ለፅሁፍ ድርጊት ምረጥ" "የስልክ ጥሪ ድምፅ" - "የማህደረ መረጃ ድምጽ መጠን" + "የማህደረ መረጃ ድምፅ መጠን" "በብሉቱዝ በኩል ማጫወት" "የፀጥታ የስልክ የደውል ድምፅ ተዘጋጅቷል" "የጥሪ ላይ ድም ፅ መጨመሪያ/መቀነሻ" @@ -1276,7 +1276,7 @@ "የብሉቱዝ ድምፅ መጠን" "የስልክ ጥሪ ድምፅ መጠን" "የስልክ ጥሪ ድምፅ መጠን" - "የማህደረ መረጃ ድምጽ መጠን" + "የማህደረ መረጃ ድምፅ መጠን" "የማሳወቂያ ክፍልፍል" "ነባሪ የስልክ ላይ ጥሪ" "ነባሪ (%1$s)" @@ -1609,7 +1609,7 @@ "የጆሮ ማዳመጫዎች" "ዩ ኤስ ቢ" "ስርዓት" - "የብሉቱዝ ድምጽ" + "የብሉቱዝ ድምፅ" "ገመድ አልባ ማሳያ" "Cast" "ከመሳሪያ ጋር ያገናኙ" @@ -1666,7 +1666,7 @@ "የመክፈቻ ስርዓተ ጥለቱን %1$d ጊዜ በትክክል አልሳሉትም። ከ%2$d ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።\n\nእባክዎ ከ%3$d ሰከንዶች በኋላ እንደገና ይሞክሩ።" " — " "አስወግድ" - "ድምጹ ከሚመከረው መጠን በላይ ከፍ ይበል?\n\nበከፍተኛ ድምጽ ለረጅም ጊዜ ማዳመጥ ጆሮዎን ሊጎዳው ይችላል።" + "ድምጹ ከሚመከረው መጠን በላይ ከፍ ይበል?\n\nበከፍተኛ ድምፅ ለረጅም ጊዜ ማዳመጥ ጆሮዎን ሊጎዳው ይችላል።" "የተደራሽነት አቋራጭ ጥቅም ላይ ይዋል?" "አቋራጩ ሲበራ ሁለቱንም የድምጽ አዝራሮች ለ3 ሰከንዶች ተጭኖ መቆየት የተደራሽነት ባህሪን ያስጀምረዋል።" "የተደራሽነት ባህሪዎች አቋራጭ ይብራ?" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 29c0a9540a98..30774e81f027 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -171,7 +171,7 @@ "অমান্য URLৰ বাবে পৃষ্ঠাটো খুলিব পৰা নগ\'ল।" "ফাইলত খুলিব পৰা নগ\'ল।" "অনুৰোধ কৰা ফাইলটো বিচাৰি পোৱা নগ\'ল।" - "বহুত বেছি অনুৰোধৰ প্ৰক্ৰিয়া চলি আছে৷ অনুগ্ৰহ কৰি পিছত আকৌ চেষ্টা কৰক৷" + "বহুত বেছি অনুৰোধৰ প্ৰক্ৰিয়া চলি আছে৷ অনুগ্ৰহ কৰি পাছত আকৌ চেষ্টা কৰক৷" "%1$sত ছাইন ইন কৰাত আসোঁৱাহ" "ছিংক ত্ৰুটি" "ছিংক কৰিব নোৱাৰি" @@ -203,7 +203,7 @@ "ডিভাইচৰ নীতিৰ পৰিচালক সেৱা" "সংগীত চিনাক্তকৰণ পৰিচালক সেৱা" "আপোনাৰ ডিভাইচৰ ডেটা মচা হ\'ব" - "এই প্ৰশাসক এপটো ব্যৱহাৰ কৰিব নোৱাৰি। এতিয়া আপোনাৰ ডিভাইচটোৰ ডেটা মচা হ\'ব।\n\nআপোনাৰ কিবা প্ৰশ্ন থাকিলে আপোনাৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।" + "এই প্ৰশাসক এপ্‌টো ব্যৱহাৰ কৰিব নোৱাৰি। এতিয়া আপোনাৰ ডিভাইচটোৰ ডেটা মচা হ\'ব।\n\nআপোনাৰ কিবা প্ৰশ্ন থাকিলে আপোনাৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।" "প্ৰিণ্ট কৰা কাৰ্য %sএ অক্ষম কৰি ৰাখিছে।" "কৰ্মস্থানৰ প্ৰ’ফাইলটো অন কৰক" "আপুনি নিজৰ কৰ্মস্থানৰ প্ৰ’ফাইলটো অন নকৰালৈকে আপোনাৰ ব্যক্তিগত এপ্‌সমূহ অৱৰোধ কৰা থাকে" @@ -342,23 +342,23 @@ "স্ক্ৰীনশ্বট লওক" "ডিছপ্লে’খনৰ এটা স্ক্ৰীনশ্বট ল\'ব পাৰে।" "স্থিতি দণ্ড অক্ষম কৰক বা সলনি কৰক" - "স্থিতি দণ্ড অক্ষম কৰিবলৈ বা ছিষ্টেম আইকন আঁতৰাবলৈ এপটোক অনুমতি দিয়ে।" + "স্থিতি দণ্ড অক্ষম কৰিবলৈ বা ছিষ্টেম আইকন আঁতৰাবলৈ এপ্‌টোক অনুমতি দিয়ে।" "স্থিতি দণ্ড হ\'ব পাৰে" - "নিজকে স্থিতি দণ্ডৰূপে দেখুওৱাবলৈ এপটোক অনুমতি দিয়ে।" + "নিজকে স্থিতি দণ্ডৰূপে দেখুওৱাবলৈ এপ্‌টোক অনুমতি দিয়ে।" "স্থিতি দণ্ড সম্প্ৰসাৰিত বা সংকোচিত কৰক" - "স্থিতি দণ্ড বিস্তাৰিত বা সংকুচিত কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "স্থিতি দণ্ড বিস্তাৰিত বা সংকুচিত কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "কোনো লক কৰি ৰখা ডিভাইচত জাননী পূৰ্ণ স্ক্ৰীনৰ কাৰ্যকলাপ হিচাপে প্ৰদৰ্শন কৰক" "এপ্‌টোক কোনো লক কৰি ৰখা ডিভাইচত জাননী পূৰ্ণ স্ক্ৰীনৰ কাৰ্যকলাপ হিচাপে প্ৰদৰ্শন কৰিবলৈ অনুমতি দিয়ে" "শ্বৰ্টকাট ইনষ্টল কৰিব পাৰে" - "এটা এপ্লিকেশ্বনক ব্যৱহাৰকাৰীৰ হস্তক্ষেপৰ অবিহনে গৃহ স্ক্ৰীণ শ্বৰ্টকাট যোগ কৰিবলৈ অনুমতি দিয়ে।" + "এটা এপ্লিকেশ্বনক ব্যৱহাৰকাৰীৰ হস্তক্ষেপৰ অবিহনে গৃহ স্ক্ৰীন শ্বৰ্টকাট যোগ কৰিবলৈ অনুমতি দিয়ে।" "শ্বৰ্টকাট আনইনষ্টল কৰিব পাৰে" - "ব্যৱহাৰকাৰীৰ হস্তক্ষেপৰ অবিহনে গৃহ স্ক্ৰীণৰ শ্বৰ্টকাটসমূহ আঁতৰাবলৈ এপ্লিকেশ্বনক অনুমতি দিয়ে।" + "ব্যৱহাৰকাৰীৰ হস্তক্ষেপৰ অবিহনে গৃহ স্ক্ৰীনৰ শ্বৰ্টকাটসমূহ আঁতৰাবলৈ এপ্লিকেশ্বনক অনুমতি দিয়ে।" "বহিৰ্গামী কলসমূহ অন্য ক\'ৰবালৈ পঠিয়াওক" "এটা বৰ্হিগামী কল কৰি থকাৰ সময়ত ডায়েল কৰা নম্বৰ চাবলৈ আৰু লগতে এটা পৃথক নম্বৰলৈ কল সংযোগ কৰিবলৈ বা সকলোকে একেলগে বন্ধ কৰিবলৈ এপক অনুমতি দিয়ে।" "ফ\'ন কলৰ উত্তৰ দিব পাৰে" - "এপটোক অন্তৰ্গামী ফ\'ন কলৰ উত্তৰ দিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক অন্তৰ্গামী ফ\'ন কলৰ উত্তৰ দিবলৈ অনুমতি দিয়ে।" "পাঠ বার্তা (এছএমএছ) বোৰ লাভ কৰক" - "এপটোক এছএমএছ বাৰ্তাবোৰ পাবলৈ আৰু প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ অনুমতি দিয়ে৷ ইয়াৰ অৰ্থ এইটোৱেই যে এপটোৱে আপোনাক বাৰ্তাবোৰ নেদেখুৱাকৈয়ে আপোনাৰ ডিভাইচলৈ পঠিওৱা বাৰ্তাবোৰ নিৰীক্ষণ কৰিব বা মচিব পাৰে৷" + "এপ্‌টোক এছএমএছ বাৰ্তাবোৰ পাবলৈ আৰু প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ অনুমতি দিয়ে৷ ইয়াৰ অৰ্থ এইটোৱেই যে এপটোৱে আপোনাক বাৰ্তাবোৰ নেদেখুৱাকৈয়ে আপোনাৰ ডিভাইচলৈ পঠিওৱা বাৰ্তাবোৰ নিৰীক্ষণ কৰিব বা মচিব পাৰে৷" "পাঠ বার্তা (এমএমএছ) বোৰ লাভ কৰক" "এমএমএছ বার্তাবোৰ লাভ আৰু ইয়াৰ প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ এপক অনুমতি দিয়ে। ইয়াৰ অৰ্থ হৈছে এই এপে আপোনাৰ ডিভাইচলৈ প্ৰেৰণ কৰা বার্তাসমূহ আপোনাক নেদেখুৱাকৈয়ে পৰ্যবেক্ষণ আৰু মচিব পাৰে।" "চেল সম্প্ৰচাৰ বাৰ্তাসমূহ ফৰৱাৰ্ড কৰক" @@ -368,26 +368,26 @@ "চেল সম্প্ৰচাৰৰ বার্তাবোৰ পঢ়ক" "আপোনাৰ ডিভাইচে লাভ কৰা চেল সম্প্ৰচাৰৰ বার্তাবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। আপোনাক জৰুৰীকালীন পৰিস্থিতিবোৰত সর্তক কৰিবলৈ চেল সম্প্ৰচাৰৰ বার্তাবোৰ প্ৰেৰণ কৰা হয়। জৰুৰীকালীন চেল সম্প্ৰচাৰ লাভ কৰাৰ সময়ত আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা বা কাৰ্যপ্ৰণালীত ক্ষতিকাৰক এপবোৰে হস্তক্ষেপ কৰিব পাৰে।" "আপুনি সদস্যভুক্ত হোৱা ফীডসমূহ পঢ়ক" - "বৰ্তমান ছিংক কৰা ফীডৰ সবিশেষ লাভ কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "বৰ্তমান ছিংক কৰা ফীডৰ সবিশেষ লাভ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "এছএমএছ ৰ বার্তাবোৰ প্ৰেৰণ কৰিব আৰু চাব পাৰে" - "এপটোক এছএমএছ বাৰ্তা পঠিয়াবলৈ অনুমতি দিয়ে৷ ইয়াৰ ফলত অপ্ৰত্যাশিত মাচুল ভৰিবলগা হ\'ব পাৰে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ অনুমতি নোলোৱাকৈয়ে বাৰ্তা পঠিয়াই আপোনাৰ পৰা মাচুল কাটিব পাৰে৷" + "এপ্‌টোক এছএমএছ বাৰ্তা পঠিয়াবলৈ অনুমতি দিয়ে৷ ইয়াৰ ফলত অপ্ৰত্যাশিত মাচুল ভৰিবলগা হ\'ব পাৰে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ অনুমতি নোলোৱাকৈয়ে বাৰ্তা পঠিয়াই আপোনাৰ পৰা মাচুল কাটিব পাৰে৷" "আপোনাৰ পাঠ বার্তাবোৰ পঢ়ক (এছএমএছ বা এমএমএছ)" "এই এপ্‌টোৱে আপোনাৰ টেবলেটটোত সংৰক্ষিত আটাইবোৰ এছএমএছ (পাঠ) বাৰ্তা পঢ়িব পাৰে।" "এই এপ্‌টোৱে আপোনাৰ Android TV ডিভাইচত ষ্ট’ৰ কৰি ৰখা আটাইবোৰ এছএমএছ (পাঠ) বাৰ্তা পঢ়িব পাৰে।" "এই এপ্‌টোৱে আপোনাৰ ফ\'নত সংৰক্ষিত আটাইবোৰ এছএমএছ (পাঠ) বাৰ্তা পঢ়িব পাৰে।" "পাঠ বার্তা (WAP) বোৰ লাভ কৰক" - "এপটোক WAP বাৰ্তাবোৰ পাবলৈ আৰু প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ অনুমতি দিয়ে৷ এই অনুমতিত আপোনালৈ পঠিওৱা বাৰ্তাবোৰ আপোনাক নেদেখুৱাকৈয়ে নিৰীক্ষণ বা মচাৰ সক্ষমতা অন্তৰ্ভুক্ত থাকে৷" + "এপ্‌টোক WAP বাৰ্তাবোৰ পাবলৈ আৰু প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ অনুমতি দিয়ে৷ এই অনুমতিত আপোনালৈ পঠিওৱা বাৰ্তাবোৰ আপোনাক নেদেখুৱাকৈয়ে নিৰীক্ষণ বা মচাৰ সক্ষমতা অন্তৰ্ভুক্ত থাকে৷" "চলি থকা এপসমূহ বিচাৰি উলিয়াওক" - "এপটোক বৰ্তমানে আৰু শেহতীয়াভাৱে চলি থকা কাৰ্যসমূহৰ বিষয়ে তথ্য পুনৰুদ্ধাৰ কৰিবলৈ অনুমতি দিয়ে৷ এইটোৱে এপটোক ডিভাইচটোত কোনবোৰ এপ্লিকেশ্বন ব্যৱহাৰ হৈ আছে তাৰ বিষয়ে তথ্য বিচাৰি উলিয়াবলৈ অনুমতি দিব পাৰে৷" + "এপ্‌টোক বৰ্তমানে আৰু শেহতীয়াভাৱে চলি থকা কাৰ্যসমূহৰ বিষয়ে তথ্য পুনৰুদ্ধাৰ কৰিবলৈ অনুমতি দিয়ে৷ এইটোৱে এপ্‌টোক ডিভাইচটোত কোনবোৰ এপ্লিকেশ্বন ব্যৱহাৰ হৈ আছে তাৰ বিষয়ে তথ্য বিচাৰি উলিয়াবলৈ অনুমতি দিব পাৰে৷" "প্ৰ\'ফাইল আৰু ডিভাইচৰ গৰাকীসকলক পৰিচালনা কৰিব পাৰে" - "প্ৰ\'ফাইলৰ গৰাকী আৰু ডিভাইচৰ গৰাকী ছেট কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "প্ৰ\'ফাইলৰ গৰাকী আৰু ডিভাইচৰ গৰাকী ছেট কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "চলি থকা এপসমূহক পুনৰাই ক্ৰমবদ্ধ কৰক" "গতিবিধিক অগ্ৰভাগ আৰু নেপথ্যলৈ নিবলৈ এপক অনুমতি দিয়ে। এপে এই কার্য আপোনাৰ ইনপুট অবিহনেই কৰিব পাৰে।" "গাড়ীৰ ম\'ড সক্ষম কৰক" - "গাড়ী ম\'ড সক্ষম কৰিবলৈ এপটোক অনুমতি দিয়ে৷" + "গাড়ী ম\'ড সক্ষম কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "অন্য এপবোৰ বন্ধ কৰক" - "এপটোক অন্য এপসমূহৰ নেপথ্যৰ প্ৰক্ৰিয়াসমূহ শেষ কৰিবলৈ অনুমতি দিয়ে৷ এই কার্যৰ বাবে অন্য এপসমূহ চলাটো বন্ধ হ\'ব পাৰে৷" - "এই এপটো অইন এপৰ ওপৰত প্ৰদৰ্শিত হ\'ব পাৰে" + "এপ্‌টোক অন্য এপসমূহৰ নেপথ্যৰ প্ৰক্ৰিয়াসমূহ শেষ কৰিবলৈ অনুমতি দিয়ে৷ এই কার্যৰ বাবে অন্য এপসমূহ চলাটো বন্ধ হ\'ব পাৰে৷" + "এই এপ্‌টো অইন এপৰ ওপৰত প্ৰদৰ্শিত হ\'ব পাৰে" "এই এপ্‌টো অন্য এপৰ ওপৰত বা স্ক্ৰীনৰ অন্য অংশত প্ৰদৰ্শিত হ\'ব পাৰে। এই কাৰ্যই এপৰ স্বাভাৱিক ব্যৱহাৰত ব্যাঘাত জন্মাব পাৰে আৰু অন্য এপ্‌সমূহক স্ক্ৰীনত কেনেকৈ দেখা পোৱা যায় সেইটো সলনি কৰিব পাৰে।" "নেপথ্যত চলিব পাৰে" "এই এপ্‌টো নেপথ্যত চলিব পাৰে। ইয়াৰ ফলত বেটাৰী সোনকালে শেষ হ’ব পাৰে।" @@ -398,15 +398,15 @@ "এপ্‌টোক মেম’ৰীত নিজৰ বাবে প্ৰয়োজনীয় ঠাই পৃথক কৰিবলৈ অনুমতি দিয়ে। এই কার্যই আপোনাৰ Android TV ডিভাইচটোক লেহেমীয়া কৰি অন্য এপ্‌সমূহৰ বাবে উপলব্ধ মেম’ৰীক সীমাবদ্ধ কৰিব পাৰে।" "মেম\'ৰিত নিজৰ বাবে প্ৰয়োজনীয় ঠাই পৃথক কৰিবলৈ এপক অনুমতি দিয়ে। এই কার্যই ফ\'নৰ কার্যক লেহেমীয়া কৰি অন্য এপবোৰৰ বাবে উপলব্ধ মেম\'ৰিক সীমাবদ্ধ কৰে।" "অগ্ৰভূমিৰ সেৱা চলাব পাৰে" - "এপটোক অগ্ৰভূমি সেৱাসমূহ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক অগ্ৰভূমি সেৱাসমূহ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে।" "এপৰ ষ্ট’ৰেজৰ খালী ঠাই হিচাপ কৰক" - "এপটোক ইয়াৰ ক\'ড, ডেটা আৰু কেশ্বৰ আকাৰ বিচাৰি উলিয়াবলৈ অনুমতি দিয়ে" + "এপ্‌টোক ইয়াৰ ক\'ড, ডেটা আৰু কেশ্বৰ আকাৰ বিচাৰি উলিয়াবলৈ অনুমতি দিয়ে" "ছিষ্টেম ছেটিংহ সংশোধন কৰক" "এপ্‌টোক ছিষ্টেমৰ ছেটিঙৰ ডেটা সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ ক্ষতিকাৰক এপ্‌সমূহে আপোনাৰ ছিষ্টেম কনফিগাৰেশ্বনক ক্ষতিগ্ৰস্ত কৰিব পাৰে৷" "আৰম্ভ হোৱাৰ সময়ত চলাওক" - "ছিষ্টেমে বুট কৰা কাৰ্য সমাপ্ত কৰাৰ লগে লগে এপটোক নিজে নিজে আৰম্ভ হ\'বলৈ অনুমতি দিয়ে। ইয়াৰ ফলত ফ\'নটো ষ্টাৰ্ট হওতে বেছি সময়ৰ প্ৰয়োজন হ\'ব পাৰে, আৰু এপটো সদায় চলি থকাৰ কাৰণে ফ\'নটো সামগ্ৰিকভাৱে লেহেমীয়া হ\'ব পাৰে।" + "ছিষ্টেমে বুট কৰা কাৰ্য সমাপ্ত কৰাৰ লগে লগে এপ্‌টোক নিজে নিজে আৰম্ভ হ\'বলৈ অনুমতি দিয়ে। ইয়াৰ ফলত ফ\'নটো ষ্টাৰ্ট হওতে বেছি সময়ৰ প্ৰয়োজন হ\'ব পাৰে, আৰু এপ্‌টো সদায় চলি থকাৰ কাৰণে ফ\'নটো সামগ্ৰিকভাৱে লেহেমীয়া হ\'ব পাৰে।" "ছিষ্টেমে বুটিং সমাপ্ত কৰাৰ লগে লগে এই এপ্‌টোক নিজে নিজে আৰম্ভ হ’বলৈ অনুমতি দিয়ে। এই কাৰ্যৰ বাবে আপোনাৰ Android TV ডিভাইচটো আৰম্ভ হ’বলৈ দীঘলীয়া সময়ৰ প্ৰয়োজন হ’ব পাৰে আৰু সকলো সময়তে চলি থাকি এপ্‌টোক সামগ্ৰিকভাৱে ডিভাইচটো লেহেমীয়া কৰিবলৈ দিয়ে।" - "ছিষ্টেমে বুট কৰা কাৰ্য সমাপ্ত কৰাৰ লগে লগে এপটোক নিজে নিজে আৰম্ভ হ\'বলৈ অনুমতি দিয়ে। ইয়াৰ ফলত ফ\'নটো ষ্টাৰ্ট হওতে বেছি সময়ৰ প্ৰয়োজন হ\'ব পাৰে, আৰু এপটো সদায় চলি থকাৰ কাৰণে ফ\'নটো সামগ্ৰিকভাৱে লেহেমীয়া হ\'ব পাৰে।" + "ছিষ্টেমে বুট কৰা কাৰ্য সমাপ্ত কৰাৰ লগে লগে এপ্‌টোক নিজে নিজে আৰম্ভ হ\'বলৈ অনুমতি দিয়ে। ইয়াৰ ফলত ফ\'নটো ষ্টাৰ্ট হওতে বেছি সময়ৰ প্ৰয়োজন হ\'ব পাৰে, আৰু এপ্‌টো সদায় চলি থকাৰ কাৰণে ফ\'নটো সামগ্ৰিকভাৱে লেহেমীয়া হ\'ব পাৰে।" "ষ্টিকী ব্ৰ\'ডকাষ্ট পঠিয়াওক" "সম্প্ৰচাৰৰ শেষত বাকী ৰোৱা ষ্টিকী ব্ৰ\'ডকাষ্টবোৰ প্ৰেৰণ কৰিবলৈ এপক অনুমতি দিয়ে। ইয়াক অত্য়ধিক ব্যৱহাৰ কৰাৰ ফলত মেম\'ৰি অধিক খৰচ হোৱাৰ বাবে টেবলেট লেহেমীয়া বা অস্থিৰ হৈ পৰে।" "এপ্‌টোক ব্ৰ’ডকাষ্ট শেষ হোৱাৰ পাছত বাকী থকা ষ্টিকী ব্ৰ’ডকাষ্টবোৰ পঠিয়াবলৈ অনুমতি দিয়ে। ইয়াক অত্যধিক ব্যৱহাৰ কৰিলে আপোনাৰ Android TV ডিভাইচটোক অতি বেছি পৰিমাণৰ মেম’ৰী খৰচ কৰাই লেহেমীয়া অথবা অস্থিৰ কৰিব পাৰে।" @@ -464,62 +464,62 @@ "কোনো এপ্লিকেশ্বন অথবা সেৱাক কেমেৰা ডিভাইচসমূহ খোলা অথবা বন্ধ কৰাৰ বিষয়ে কলবেকসমূহ গ্ৰহণ কৰিবলৈ অনুমতি দিয়ক।" "যিকোনো কেমেৰা ডিভাইচ খুলি থকা অথবা বন্ধ কৰি থকাৰ সময়ত (কোনো এপ্লিকেশ্বনৰ দ্বাৰা) এই এপ্‌টোৱে কলবেক গ্ৰহণ কৰিব পাৰে।" "কম্পন নিয়ন্ত্ৰণ কৰক" - "ভাইব্ৰেটৰ নিয়ন্ত্ৰণ কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "ভাইব্ৰেটৰ নিয়ন্ত্ৰণ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "এপ্‌টোক কম্পন স্থিতিটো এক্সেছ কৰিবলৈ অনুমতি দিয়ে।" "পোনপটীয়াকৈ ফ\'ন নম্বৰলৈ কল কৰক" - "আপোনাৰ কোনো ব্যাঘাত নোহোৱাকৈ ফ\'ন নম্বৰবোৰত কল কৰিবলৈ এপক অনুমতি দিয়ে৷ ইয়াৰ ফলত অপ্ৰত্যাশিত মাচুল ভৰিবলগা বা কলবোৰ কৰা হ\'ব পাৰে৷ মনত ৰাখিব যে ই এপটোক জৰুৰীকালীন নম্বৰবোৰত কল কৰিবলৈ অনুমতি নিদিয়ে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ অনুমতি নোলোৱাকৈয়ে কল কৰি আপোনাক টকা খৰছ কৰাব পাৰে৷" + "আপোনাৰ কোনো ব্যাঘাত নোহোৱাকৈ ফ\'ন নম্বৰবোৰত কল কৰিবলৈ এপক অনুমতি দিয়ে৷ ইয়াৰ ফলত অপ্ৰত্যাশিত মাচুল ভৰিবলগা বা কলবোৰ কৰা হ\'ব পাৰে৷ মনত ৰাখিব যে ই এপ্‌টোক জৰুৰীকালীন নম্বৰবোৰত কল কৰিবলৈ অনুমতি নিদিয়ে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ অনুমতি নোলোৱাকৈয়ে কল কৰি আপোনাক টকা খৰছ কৰাব পাৰে৷" "আইএমএছ কল সেৱা ব্যৱহাৰ কৰিব পাৰে" "আপোনাৰ হস্তক্ষেপৰ অবিহনে আইএমএছ সেৱা ব্যৱহাৰ কৰি কল কৰিবলৈ এপক অনুমতি দিয়ে।" "ফ\'নৰ স্থিতি আৰু পৰিচয় পঢ়ক" - "ডিভাইচত থকা ফ\'নৰ সুবিধাসমূহ ব্যৱহাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে৷ এই অনুমতিয়ে কোনো কল সক্ৰিয় হৈ থাককেই বা নাথাকক আৰু দূৰবৰ্তী নম্বৰটো কলৰ দ্বাৰা সংযোজিত হওকেই বা নহওক এপটোক ফ\'ন নম্বৰ আৰু ডিভাইচৰ পৰিচয় নিৰ্ধাৰণ কৰিবলৈ অনুমতি দিয়ে৷" + "ডিভাইচত থকা ফ\'নৰ সুবিধাসমূহ ব্যৱহাৰ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷ এই অনুমতিয়ে কোনো কল সক্ৰিয় হৈ থাককেই বা নাথাকক আৰু দূৰবৰ্তী নম্বৰটো কলৰ দ্বাৰা সংযোজিত হওকেই বা নহওক এপ্‌টোক ফ\'ন নম্বৰ আৰু ডিভাইচৰ পৰিচয় নিৰ্ধাৰণ কৰিবলৈ অনুমতি দিয়ে৷" "প্ৰাথমিক টেলিফ\'নী স্থিতি আৰু পৰিচয় পঢ়ক" "এপ্‌টোক ডিভাইচটোৰ প্ৰাথমিক টেলিফ’নী সুবিধাসমূহ এক্সেছ কৰাৰ অনুমতি দিয়ে।" "ছিষ্টেমৰ জৰিয়তে কল কৰিব পাৰে" - "কল কৰাৰ অভিজ্ঞতাক উন্নত কৰিবলৈ এপটোক ছিষ্টেমৰ জৰিয়তে কলসমূহ কৰিবলৈ দিয়ে।" + "কল কৰাৰ অভিজ্ঞতাক উন্নত কৰিবলৈ এপ্‌টোক ছিষ্টেমৰ জৰিয়তে কলসমূহ কৰিবলৈ দিয়ে।" "ছিষ্টেমৰ জৰিয়তে কলবোৰ চোৱা আৰু নিয়ন্ত্ৰণ কৰা।" - "এপটোক ডিভাইচত চলি থকা কল চাবলৈ আৰু নিয়ন্ত্ৰণ কৰিবলৈ অনুমতি দিয়ে। কলৰ সংখ্যা আৰু কলবোৰৰ স্থিতি ইয়াত অন্তৰ্ভুক্ত হয়।" + "এপ্‌টোক ডিভাইচত চলি থকা কল চাবলৈ আৰু নিয়ন্ত্ৰণ কৰিবলৈ অনুমতি দিয়ে। কলৰ সংখ্যা আৰু কলবোৰৰ স্থিতি ইয়াত অন্তৰ্ভুক্ত হয়।" "অডিঅ’ ৰেকৰ্ড কৰাৰ প্ৰতিবন্ধকতাসমূহৰ পৰা ৰেহাই দিয়ক" "অডিঅ’ ৰেকৰ্ড কৰাৰ প্ৰতিবন্ধকতাসমূহৰ পৰা এপ্‌টোক ৰেহাই দিয়ক।" "অইন এটা এপত আৰম্ভ হোৱা কল এটা অব্যাহত ৰাখিব পাৰে" - "এপটোক এনে কল কৰিবলৈ দিয়ে যিটোৰ আৰম্ভণি অইন এটা এপত হৈছিল।" + "এপ্‌টোক এনে কল কৰিবলৈ দিয়ে যিটোৰ আৰম্ভণি অইন এটা এপত হৈছিল।" "ফ\'ন নম্বৰসমূহ পঢ়ে" - "এপটোক ডিভাইচটোৰ ফ\'ন নম্বৰসমূহ চাবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক ডিভাইচটোৰ ফ\'ন নম্বৰসমূহ চাবলৈ অনুমতি দিয়ে।" "গাড়ীৰ স্ক্রীনখন অন কৰি ৰখা" "টে\'বলেট সুপ্ত অৱস্থালৈ যোৱাত বাধা দিয়ক" "আপোনাৰ Android TV ডিভাইচটো সুপ্ত অৱস্থালৈ যোৱাত বাধা দিয়ক" "ফ\'ন সুপ্ত অৱস্থালৈ যোৱাত বাধা দিয়ক" "এপ্‌টোক গাড়ীৰ স্ক্রীনখন অন কৰি ৰাখিবলৈ অনুমতি দিয়ে।" - "টে\'বলেট সুপ্ত অৱস্থালৈ যোৱাৰ পৰা প্ৰতিৰোধ কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "টে\'বলেট সুপ্ত অৱস্থালৈ যোৱাৰ পৰা প্ৰতিৰোধ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "এপ্‌টোক আপোনাৰ Android TV ডিভাইচটো সুপ্ত অৱস্থালৈ যোৱাত বাধা দিবলৈ অনুমতি দিয়ে।" - "ফ\'ন সুপ্ত অৱস্থালৈ যোৱাৰ পৰা প্ৰতিৰোধ কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "ফ\'ন সুপ্ত অৱস্থালৈ যোৱাৰ পৰা প্ৰতিৰোধ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "ইনফ্ৰাৰেড ট্ৰান্সমিট কৰিব পাৰে" "টে\'বলেটৰ ইনফ্ৰাৰেড ট্ৰান্সমিটাৰ ব্যৱহাৰ কৰিবলৈ এপক অনুমতি দিয়ে।" "এপ্‌টোক আপোনাৰ Android TV ডিভাইচৰ ইনফ্ৰাৰেড ট্ৰান্সমিটাৰ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে।" "ফ\'নৰ ইনফ্ৰাৰেড ট্ৰান্সমিটাৰ ব্যৱহাৰ কৰিবলৈ এপক অনুমতি দিয়ে।" "ৱালপেপাৰ ছেট কৰক" - "ছিষ্টেমৰ ৱালপেপাৰ ছেট কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "ছিষ্টেমৰ ৱালপেপাৰ ছেট কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "আপোনাৰ ৱালপেপাৰৰ আকাৰ মিলাওক" - "ছিষ্টেমৰ ৱালপেপাৰৰ আকাৰ হিণ্ট ছেট কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "ছিষ্টেমৰ ৱালপেপাৰৰ আকাৰ হিণ্ট ছেট কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "সময় মণ্ডল ছেট কৰক" - "টে\'বলেটৰ সময় মণ্ডল সলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "টে\'বলেটৰ সময় মণ্ডল সলনি কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "এপ্‌টোক আপোনাৰ Android TV ডিভাইচটোৰ সময় মণ্ডল সলনি কৰিবলৈ অনুমতি দিয়ে।" - "ফ\'নৰ সময় মণ্ডল সলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "ফ\'নৰ সময় মণ্ডল সলনি কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "ডিভাইচত একাউণ্টবোৰ বিচাৰক" - "এপটোক টেবলেটটোৰ জ্ঞাত একাউণ্টসমূহৰ সূচীখন পাবলৈ অনুমতি দিয়ে৷ এইটোৱে আপুনি ইনষ্টল কৰি ৰখা এপ্লিকেশ্বনসমূহে সৃষ্টি কৰা যিকোনো একাউণ্টক অন্তৰ্ভুক্ত কৰিব পাৰে৷" + "এপ্‌টোক টেবলেটটোৰ জ্ঞাত একাউণ্টসমূহৰ সূচীখন পাবলৈ অনুমতি দিয়ে৷ এইটোৱে আপুনি ইনষ্টল কৰি ৰখা এপ্লিকেশ্বনসমূহে সৃষ্টি কৰা যিকোনো একাউণ্টক অন্তৰ্ভুক্ত কৰিব পাৰে৷" "আপোনাৰ Android TV ডিভাইচটোৰ পৰিচিত একাউণ্টসমূহৰ সূচীখন পাবলৈ অনুমতি দিয়ে। আপুনি ইনষ্টল কৰি ৰখা এপ্লিকেশ্বনসমূহে সৃষ্টি কৰা যিকোনো একাউণ্ট অন্তৰ্ভুক্ত হ’ব পাৰে।" - "এপটোক ফ\'নটোৰ জ্ঞাত একাউণ্টসমূহৰ সূচীখন পাবলৈ অনুমতি দিয়ে৷ এইটোৱে আপুনি ইনষ্টল কৰি ৰখা এপ্লিকেশ্বনসমূহে সৃষ্টি কৰা যিকোনো একাউণ্টক অন্তৰ্ভুক্ত কৰিব পাৰে৷" + "এপ্‌টোক ফ\'নটোৰ জ্ঞাত একাউণ্টসমূহৰ সূচীখন পাবলৈ অনুমতি দিয়ে৷ এইটোৱে আপুনি ইনষ্টল কৰি ৰখা এপ্লিকেশ্বনসমূহে সৃষ্টি কৰা যিকোনো একাউণ্টক অন্তৰ্ভুক্ত কৰিব পাৰে৷" "নেটৱৰ্কৰ সংযোগবোৰ চাওক" - "মজুত থকা আৰু সংযোগ হৈ থকা নেটৱৰ্ক সংযোগসমূহৰ বিষয়ে তথ্য চাবলৈ এপটোক অনুমতি দিয়ে৷" + "মজুত থকা আৰু সংযোগ হৈ থকা নেটৱৰ্ক সংযোগসমূহৰ বিষয়ে তথ্য চাবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "সম্পূর্ণ নেটৱর্কৰ সুবিধা লাভ কৰিব পাৰে" - "এপটোক নেটৱৰ্ক ছ\'কেটবোৰ সৃষ্টি কৰিবলৈ আৰু কাষ্টম নেটৱৰ্ক প্ৰ\'ট\'কল ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে৷ ব্ৰাউজাৰ আৰু অন্য এপ্লিকেশ্বনসমূহে ইণ্টাৰনেটলৈ ডেটা পঠিওৱা মাধ্য়ম প্ৰদান কৰে, গতিকে ইণ্টাৰনেটলৈ ডেটা পঠিয়াবলৈ এই অনুমতিৰ প্ৰয়োজন নাই৷" + "এপ্‌টোক নেটৱৰ্ক ছ\'কেটবোৰ সৃষ্টি কৰিবলৈ আৰু কাষ্টম নেটৱৰ্ক প্ৰ\'ট\'কল ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে৷ ব্ৰাউজাৰ আৰু অন্য এপ্লিকেশ্বনসমূহে ইণ্টাৰনেটলৈ ডেটা পঠিওৱা মাধ্য়ম প্ৰদান কৰে, গতিকে ইণ্টাৰনেটলৈ ডেটা পঠিয়াবলৈ এই অনুমতিৰ প্ৰয়োজন নাই৷" "নেটৱৰ্কৰ সংযোগ সলনি কৰক" - "নেটৱৰ্ক সংযোগৰ অৱস্থাটো সলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "নেটৱৰ্ক সংযোগৰ অৱস্থাটো সলনি কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "টেডাৰিং সংযোগ সলনি কৰক" - "টেডাৰ হৈ থকা ইণ্টাৰনেট সংযোগৰ অৱস্থা সলনি কৰিবলৈ এপটোক অনুমতি দিয়ে৷" + "টেডাৰ হৈ থকা ইণ্টাৰনেট সংযোগৰ অৱস্থা সলনি কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "ৱাই-ফাইৰ সংযোগবোৰ চাওক" "ৱাই-ফাই সক্ষম কৰা হ’ল নে নাই আৰু সংযোগ হৈ থকা ৱাই-ফাই ডিভাইচসমূহৰ নামবোৰৰ দৰে ৱাই-ফাইৰ ইণ্টাৰনেট সম্পর্কীয় তথ্য চাবলৈ এপক অনুমতি দিয়ে।" "ৱাই-ফাই সংযোগ কৰক আৰু ইয়াৰ সংযোগ বিচ্ছিন্ন কৰক" - "এপটোক ৱাই-ফাই এক্সেছ পইণ্টলৈ সংযোগ কৰিবলৈ আৰু তাৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ আৰু ৱাই-ফাই নেটৱৰ্কসমূহৰ বাবে ডিভাইচ কনফিগাৰেশ্বনত সাল-সলনি কৰিবলৈ অনুমতি দিয়ে৷" + "এপ্‌টোক ৱাই-ফাই এক্সেছ পইণ্টলৈ সংযোগ কৰিবলৈ আৰু তাৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ আৰু ৱাই-ফাই নেটৱৰ্কসমূহৰ বাবে ডিভাইচ কনফিগাৰেশ্বনত সাল-সলনি কৰিবলৈ অনুমতি দিয়ে৷" "ৱাই-ফাই মাল্টিকাষ্ট প্ৰচাৰৰ অনুমতি দিয়ক" "কেৱল আপোনাৰ টেবলেটটোৱেই নহয়, মাল্টিকাষ্ট ঠিকনা ব্যৱহাৰ কৰি এটা ৱাই-ফাই নেটৱর্কত থকা আটাইবোৰ ডিভাইচলৈ পঠিওৱা পেকেট লাভ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে। এই কার্যই নন মাল্টিকাষ্ট ম\'ডতকৈ অধিক বেটাৰী ব্যৱহাৰ কৰে।" "কেৱল আপোনাৰ Android TV ডিভাইচটোৱেই নহয়, মাল্টিকাষ্ট ঠিকনাবোৰ ব্যৱহাৰ কৰি এটা ৱাই-ফাই নেটৱর্কত থকা আটাইবোৰ ডিভাইচলৈ পঠিওৱা পেকেট লাভ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে। এই কার্যই নন-মাল্টিকাষ্ট ম’ডতকৈ অধিক পাৱাৰ ব্যৱহাৰ কৰে।" @@ -529,15 +529,15 @@ "এপ্‌টোক আপোনাৰ Android TV ডিভাইচটোত ব্লুটুথ কনফিগাৰ কৰিবলৈ আৰু ৰিম’ট ডিভাইচসমূহ বিচাৰি উলিয়াবলৈ আৰু পেয়াৰ কৰিবলৈ অনুমতি দিয়ে।" "স্থানীয় ব্লুটুথ ফ’ন কনফিগাৰ কৰিবলৈ আৰু দূৰৱৰ্তী ডিভাইচসমূহৰ সৈতে পেয়াৰ কৰিবলৈ আৰু বিচাৰি উলিয়াবলৈ এপ্‌টোক অনুমতি দিয়ে।" "WiMAXৰ লগত সংযোগ কৰক আৰু ইয়াৰ পৰা সংযোগ বিচ্ছিন্ন কৰক" - "WiMAX সক্ষম হৈ আছেনে নাই আৰু সংযোজিত যিকোনো WiMAX নেটৱৰ্কৰ বিষয়ে তথ্য নিৰ্ধাৰণ কৰিবলৈ এপটোক অনুমতি দিয়ে৷" + "WiMAX সক্ষম হৈ আছেনে নাই আৰু সংযোজিত যিকোনো WiMAX নেটৱৰ্কৰ বিষয়ে তথ্য নিৰ্ধাৰণ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "WiMAXৰ স্থিতি সলনি কৰক" - "এপটোক টেবলেটলৈ সংযোগ কৰিবলৈ আৰু WiMAX নেটৱৰ্কসমূহৰ পৰা টেবলেটৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ অনুমতি দিয়ে৷" + "এপ্‌টোক টেবলেটলৈ সংযোগ কৰিবলৈ আৰু WiMAX নেটৱৰ্কসমূহৰ পৰা টেবলেটৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ অনুমতি দিয়ে৷" "এপ্‌টোক আপোনাৰ Android TV ডিভাইচৰ সৈতে সংযোগ কৰিবলৈ আৰু WiMAX নেটৱৰ্কসমূহৰ পৰা আপোনাৰ Android TV ডিভাইচৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ অনুমতি দিয়ে।" - "এপটোক ফ\'নলৈ সংযোগ কৰিবলৈ আৰু WiMAX নেটৱৰ্কসমূহৰ পৰা ফ\'নৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ অনুমতি দিয়ে৷" + "এপ্‌টোক ফ\'নলৈ সংযোগ কৰিবলৈ আৰু WiMAX নেটৱৰ্কসমূহৰ পৰা ফ\'নৰ সংযোগ বিচ্ছিন্ন কৰিবলৈ অনুমতি দিয়ে৷" "ব্লুটুথ ডিভাইচবোৰৰ সৈতে পেয়াৰ কৰক" - "টেবলেটত ব্লুটুথৰ কনফিগাৰেশ্বন চাবলৈ আৰু যোৰা লগোৱা ডিভাইচসমূহৰ জৰিয়তে সংযোগ কৰিবলৈ আৰু সংযোগৰ অনুৰোধ স্বীকাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে৷" + "টেবলেটত ব্লুটুথৰ কনফিগাৰেশ্বন চাবলৈ আৰু যোৰা লগোৱা ডিভাইচসমূহৰ জৰিয়তে সংযোগ কৰিবলৈ আৰু সংযোগৰ অনুৰোধ স্বীকাৰ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "এপ্‌টোক আপোনাৰ Android TV ডিভাইচটোত ব্লুটুথৰ কনফিগাৰেশ্বন চাবলৈ আৰু পেয়াৰ কৰি থোৱা ডিভাইচসমূহৰ সৈতে সংযোগ কৰিবলৈ আৰু গ্ৰহণ কৰিবলৈ অনুমতি দিয়ে।" - "ফ\'নটোত ব্লুটুথৰ কনফিগাৰেশ্বন চাবলৈ আৰু যোৰা লগোৱা ডিভাইচসমূহৰ জৰিয়তে সংযোগ কৰিবলৈ আৰু সংযোগৰ অনুৰোধ স্বীকাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে৷" + "ফ\'নটোত ব্লুটুথৰ কনফিগাৰেশ্বন চাবলৈ আৰু যোৰা লগোৱা ডিভাইচসমূহৰ জৰিয়তে সংযোগ কৰিবলৈ আৰু সংযোগৰ অনুৰোধ স্বীকাৰ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷" "নিকটৱৰ্তী ব্লুটুথ ডিভাইচ বিচাৰক আৰু তাৰ সৈতে পেয়াৰ কৰক" "এপ্‌টোক নিকটৱৰ্তী ব্লুটুথ ডিভাইচ বিচাৰি উলিয়াবলৈ আৰু সেইসমূহৰ সৈতে পেয়াৰ কৰিবলৈ অনুমতি দিয়ে" "পেয়াৰ কৰা ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰক" @@ -551,9 +551,9 @@ "অগ্ৰাধিকাৰ দিয়া NFC পৰিশোধ সেৱাৰ তথ্য" "এপ্‌টোক অগ্ৰাধিকাৰ দিয়া nfc পৰিশোধ সেৱাৰ পঞ্জীকৃত সহায়কসমূহ আৰু পৰিশোধ কৰিব লগা লক্ষ্যস্থান দৰে তথ্য পাবলৈ অনুমতি দিয়ে।" "নিয়েৰ ফিল্ড কমিউনিকেশ্বন নিয়ন্ত্ৰণ কৰক" - "এপটোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।" "আপোনাৰ স্ক্ৰীন লক অক্ষম কৰক" - "এপটোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণস্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰ পিছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷" + "এপ্‌টোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণস্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰ পাছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷" "স্ক্ৰীন লকৰ জটিলতাৰ অনুৰোধ" "এপ্‌টোক স্ক্ৰীন লকৰ জটিলতাৰ স্তৰ (উচ্চ, মধ্যম, নিম্ন বা একেবাৰে নাই)ৰ বিষয়ে জানিবলৈ অনুমতি দিয়ে, যিয়ে স্ক্ৰীন লকৰ সম্ভাব্য দৈৰ্ঘ্য বা স্ক্ৰীন লকৰ প্ৰকাৰ দৰ্শায়। লগতে এপ্‌টোৱে ব্যৱহাৰকাৰীক স্ক্ৰীন লকটো এটা নিৰ্দিষ্ট স্তৰলৈ আপডে’ট কৰিবলৈ পৰামৰ্শ দিব পাৰে যিটো ব্যৱহাৰকাৰীয়ে অৱজ্ঞা কৰি পৰৱর্তী পৃষ্ঠালৈ যাব পাৰে। মনত ৰাখিব যে স্ক্ৰীন লকটো সাধাৰণ পাঠ হিচাপে ষ্ট\'ৰ কৰা নহয়; সেয়েহে, এপ্‌টোৱে সঠিক পাছৱৰ্ডটো জানিব নোৱাৰে।" "জাননী দেখুৱাওক" @@ -561,9 +561,9 @@ "বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্যৱহাৰ কৰক" "বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে" "ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ পৰিচালনা কৰিব পাৰে" - "ফিংগাৰপ্ৰিণ্ট টেম্প্লেটসমূহ যোগ কৰা বা মচাৰ পদ্ধতিসমূহ কামত লগাবলৈ নিৰ্দেশ দিবলৈ এপটোক অনুমতি দিয়ে।" + "ফিংগাৰপ্ৰিণ্ট টেম্প্লেটসমূহ যোগ কৰা বা মচাৰ পদ্ধতিসমূহ কামত লগাবলৈ নিৰ্দেশ দিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ ব্যৱহাৰ কৰিব পাৰে" - "প্ৰমাণীকৰণৰ বাবে ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে" + "প্ৰমাণীকৰণৰ বাবে ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে" "আপোনাৰ সংগীত সংগ্ৰহ সালসলনি কৰিবলৈ" "এপক আপোনাৰ সংগীত সংগ্ৰহ সালসলনি কৰিবলৈ দিয়ে।" "আপোনাৰ ভিডিঅ’ সংগ্ৰহ সালসলনি কৰিবলৈ" @@ -680,7 +680,7 @@ "ছিংকৰ ছেটিং পঢ়ক" "একাউণ্টৰ ছিংক ছেটিংবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। যেনে, People এপ্‌টো কোনো একাউণ্টৰ সৈতে ছিংক কৰা হৈছে নে নাই সেয়া নির্ধাৰণ কৰিব পাৰে।" "ছিংকক অন আৰু অফ ট\'গল কৰক" - "এপটোক কোনো একাউণ্টৰ ছিংক সম্পৰ্কীয় ছেটিংসমূহ সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ উদাহৰণস্বৰূপে, এই কাৰ্যক কোনো একাউণ্টৰ জৰিয়তে People এপটোৰ ছিংক সক্ষম কৰিবলৈ ব্যৱহাৰ কৰিব পাৰি৷" + "এপ্‌টোক কোনো একাউণ্টৰ ছিংক সম্পৰ্কীয় ছেটিংসমূহ সংশোধন কৰিবলৈ অনুমতি দিয়ে৷ উদাহৰণস্বৰূপে, এই কাৰ্যক কোনো একাউণ্টৰ জৰিয়তে People এপ্‌টোৰ ছিংক সক্ষম কৰিবলৈ ব্যৱহাৰ কৰিব পাৰি৷" "ছিংকৰ পৰিসংখ্যা পঢ়ক" "ছিংকৰ কাৰ্যক্ৰমসমূহৰ ইতিহাস আৰু ছিংক কৰা ডেটাৰ পৰিমাণসহ কোনো একাউণ্টৰ ছিংকৰ তথ্য পঢ়িবলৈ এপক অনুমতি দিয়ে।" "আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল পঢ়িব পাৰে" @@ -694,23 +694,23 @@ "আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল সংশোধন কৰিব বা মচিব পাৰে" "আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল লিখিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "SIP কল কৰা/পোৱা" - "এপটোক SIP কলসমূহ কৰিবলৈ আৰু পাবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক SIP কলসমূহ কৰিবলৈ আৰু পাবলৈ অনুমতি দিয়ে।" "নতুন টেলিকম ছিম সংযোগসমূহ পঞ্জীয়ন কৰা" - "এপটোক নতুন টেলিকম সংযোগ পঞ্জীয়ন কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক নতুন টেলিকম সংযোগ পঞ্জীয়ন কৰিবলৈ অনুমতি দিয়ে।" "নতুন টেলিকম সংযোগসমূহ পঞ্জীয়ন কৰা" - "এপটোক নতুন টেলিকম সংযোগ পঞ্জীয়ন কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক নতুন টেলিকম সংযোগ পঞ্জীয়ন কৰিবলৈ অনুমতি দিয়ে।" "টেলিকম সংযোগ পৰিচালনা কৰা" - "এপটোক টেলিকম সংযোগ পৰিচালনা কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক টেলিকম সংযোগ পৰিচালনা কৰিবলৈ অনুমতি দিয়ে।" "ইন-কল স্ক্ৰীনৰ সৈতে সংযোগ স্থাপন" "ব্যৱহাৰকাৰীগৰাকীয়ে কেতিয়া আৰু কেনেদৰে ইন-কল-স্ক্ৰীন চায় সেয়া নিয়ন্ত্ৰণ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "টেলিফ\'নী সেৱাসমূহৰ সৈতে সংযোগ স্থাপন" "কল কৰিবলৈ/লাভ কৰিবলৈ টেলিফ\'নী সেৱাসমূহৰ সৈতে এপক সংযোগ স্থাপনৰ বাবে অনুমতি দিয়ে।" "ইন-কল ব্যৱহাৰকাৰীৰ অভিজ্ঞতা প্ৰদান কৰা" - "এপটোক ইন-কল ব্যৱহাৰকাৰীৰ অভিজ্ঞতা প্ৰদান কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক ইন-কল ব্যৱহাৰকাৰীৰ অভিজ্ঞতা প্ৰদান কৰিবলৈ অনুমতি দিয়ে।" "নেটৱর্কৰ পূৰ্বতে হোৱা ব্যৱহাৰৰ বিষয়ে পঢ়ক" - "এপটোক বিশেষ নেটৱৰ্কবিলাকৰ আৰু এপ্‌সমূহৰ নেটৱৰ্ক ব্যৱহাৰৰ ইতিহাস পঢ়িবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক বিশেষ নেটৱৰ্কবিলাকৰ আৰু এপ্‌সমূহৰ নেটৱৰ্ক ব্যৱহাৰৰ ইতিহাস পঢ়িবলৈ অনুমতি দিয়ে।" "নেটৱর্কৰ নীতি পৰিচালনা কৰক" - "এপটোক নেটৱৰ্ক সংযোগৰ নীতিসমূহ পৰিচালনা কৰিবলৈ আৰু এপ্-বিশেষ নিয়ম সংজ্ঞাবদ্ধ কৰিবলৈ অনুমতি দিয়ে।" + "এপ্‌টোক নেটৱৰ্ক সংযোগৰ নীতিসমূহ পৰিচালনা কৰিবলৈ আৰু এপ্-বিশেষ নিয়ম সংজ্ঞাবদ্ধ কৰিবলৈ অনুমতি দিয়ে।" "নেটৱর্ক ব্যৱহাৰৰ হিচাপ সলনি কৰক" "এপ অনুসুৰি নেটৱর্কৰ ব্যৱহাৰৰ হিচাপ সংশোধন কৰিবলৈ এপক অনুমতি দিয়ে। এয়া সাধাৰণ এপবোৰৰ ব্যৱহাৰৰ বাবে নহয়।" "জাননীসমূহ এক্সেছ কৰে" @@ -738,7 +738,7 @@ "বাহক সেৱাসমূহৰ সৈতে সংযুক্ত হ\'ব পাৰে" "বাহক সেৱাৰ সৈতে সংযুক্ত হ\'বলৈ ধাৰকক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন হ\'ব নালাগে।" "অসুবিধা নিদিব চাব পাৰে" - "অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "চোৱাৰ অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰক" "ধাৰকক কোনো এপৰ বাবে অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰিবলৈ দিয়ে। সাধাৰণ এপ্‌সমূহৰ বাবে কেতিয়াও প্ৰয়োজন হ’ব নালাগে।" "অনুমতিৰ সিদ্ধান্তসমূহ চোৱা আৰম্ভ কৰক" @@ -905,7 +905,7 @@ "আনলক কৰিবলৈ পাছৱৰ্ড লিখক" "আনলক কৰিবলৈ পিন লিখক" "ভুল পিন ক\'ড।" - "আনলক কৰিবলৈ মেনু টিপাৰ পিছত ০ টিপক।" + "আনলক কৰিবলৈ মেনু টিপাৰ পাছত ০ টিপক।" "জৰুৰীকালীন নম্বৰ" "কোনো সেৱা নাই" "স্ক্ৰীন লক কৰা হ’ল।" @@ -940,12 +940,12 @@ "ব্যৱহাৰকাৰীৰ নিৰ্দেশনা চাওক বা গ্ৰাহক সেৱা কেন্দ্ৰৰ সৈতে যোগাযোগ কৰক।" "ছিম কাৰ্ড লক কৰা হৈছে।" "ছিম কার্ড আনলক কৰি থকা হৈছে…" - "আপুনি অশুদ্ধভাৱে আপোনাৰ আনলক আৰ্হি %1$d বাৰ আঁকিছে। \n\n %2$d ছেকেণ্ডৰ পিছত পুনৰ চেষ্টা কৰক।" - "আপুনি অশুদ্ধভাৱে আপোনাৰ পাছৱৰ্ড %1$d বাৰ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পিছত পুনৰ চেষ্টা কৰক।" - "আপুনি অশুদ্ধভাৱে আপোনাৰ পিন %1$d বাৰ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পিছত পুনৰ চেষ্টা কৰক।" - "আপুনি অশুদ্ধভাৱে আপোনাৰ লক খোলাৰ আৰ্হিটো %1$d বাৰ আঁকিলে৷ %2$d তকৈ অধিকবাৰ অসফলভাৱে কৰা প্ৰয়াসৰ পিছত, আপোনাৰ ফ\'নটো আনলক কৰিবৰ বাবে Google ছাইন ইনৰ জৰিয়তে কাৰ্যটো কৰিবলৈ কোৱা হ\'ব৷\n\n %3$d ছেকেণ্ডৰ পিছত পুনৰ চেষ্টা কৰক৷" + "আপুনি অশুদ্ধভাৱে আপোনাৰ আনলক আৰ্হি %1$d বাৰ আঁকিছে। \n\n %2$d ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।" + "আপুনি অশুদ্ধভাৱে আপোনাৰ পাছৱৰ্ড %1$d বাৰ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।" + "আপুনি অশুদ্ধভাৱে আপোনাৰ পিন %1$d বাৰ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।" + "আপুনি অশুদ্ধভাৱে আপোনাৰ লক খোলাৰ আৰ্হিটো %1$d বাৰ আঁকিলে৷ %2$d তকৈ অধিকবাৰ অসফলভাৱে কৰা প্ৰয়াসৰ পাছত, আপোনাৰ ফ\'নটো আনলক কৰিবৰ বাবে Google ছাইন ইনৰ জৰিয়তে কাৰ্যটো কৰিবলৈ কোৱা হ\'ব৷\n\n %3$d ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক৷" "আপুনি নিজৰ আনলক আৰ্হিটো %1$dবাৰ ভুলকৈ দিলে। আকৌ %2$dবাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক নিজৰ Google ছাইন ইন ব্যৱহাৰ কৰি আপোনাৰ Android TV ডিভাইচটো আনলক কৰিবলৈ কোৱা হ’ব।\n\n %3$dছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।" - "আপুনি অশুদ্ধভাৱে আপোনাৰ লক খোলাৰ আৰ্হিটো %1$d বাৰ আঁকিলে৷ %2$d তকৈ অধিকবাৰ অসফলভাৱে কৰা প্ৰয়াসৰ পিছত, আপোনাৰ ফ\'নটো আনলক কৰিবৰ বাবে Google ছাইন ইনৰ জৰিয়তে কাৰ্যটো কৰিবলৈ কোৱা হ\'ব৷\n\n %3$d ছেকেণ্ডৰ পিছত পুনৰ চেষ্টা কৰক৷" + "আপুনি অশুদ্ধভাৱে আপোনাৰ লক খোলাৰ আৰ্হিটো %1$d বাৰ আঁকিলে৷ %2$d তকৈ অধিকবাৰ অসফলভাৱে কৰা প্ৰয়াসৰ পাছত, আপোনাৰ ফ\'নটো আনলক কৰিবৰ বাবে Google ছাইন ইনৰ জৰিয়তে কাৰ্যটো কৰিবলৈ কোৱা হ\'ব৷\n\n %3$d ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক৷" "আপুনি টে\'বলেটটো %1$d বাৰ ভুলকৈ আনলক কৰিবলৈ প্ৰয়াস কৰিছে। %2$d বাৰতকৈ বেছি প্ৰয়াস কৰিলে টে\'বলেটটো ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব আৰু আটাইবোৰ ব্যৱহাৰকাৰী ডেটা হেৰুৱাব।" "আপুনি নিজৰ Android TV ডিভাইচটো আনলক কৰিবলৈ %1$dবাৰ ভুলকৈ প্ৰয়াস কৰিছে। %2$dতকৈ বেছি বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাৰ Android TV ডিভাইচটো ফেক্টৰী ডিফ’ল্টলৈ ৰিছেট কৰা হ’ব আৰু ব্যৱহাৰকাৰীৰ সকলো ডেটা হেৰুৱাব।" "আপুনি ফ\'নটো %1$d বাৰ ভুলকৈ আনলক কৰিবলৈ প্ৰয়াস কৰিছে। %2$d বাৰতকৈ বেছি প্ৰয়াস কৰিলে ফ\'নটো ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব আৰু আটাইবোৰ ব্যৱহাৰকাৰী ডেটা হেৰুৱাব।" @@ -1040,11 +1040,11 @@ "এপ্‌টোক আপোনাৰ Android TV ডিভাইচত ষ্ট’ৰ কৰি ৰখা ব্ৰাউজাৰৰ ইতিহাস আৰু বুকমার্কবোৰ সংশোধন কৰিবলৈ অনুমতি দিয়ে। ব্ৰাউজাৰ ডেটা মোহাৰিবলৈ অথবা সংশোধন কৰিবলৈ ই এপ্‌টোক অনুমতি দিব পাৰে। টোকা: এই অনুমতি তৃতীয় পক্ষৰ ব্ৰাউজাৰবোৰ অথবা ৱেব ব্ৰাউজিঙৰ ক্ষমতা থকা অন্য এপ্লিকেশ্বনবোৰৰ দ্বাৰা বলৱৎ কৰা নহ’বও পাৰে।" "আপোনাৰ ফ\'নত সঞ্চয় কৰি ৰখা ব্ৰাউজাৰৰ বুকমার্ক আৰু ব্ৰাউজাৰৰ ইতিহাস সংশোধন কৰিবলৈ এপক অনুমতি দিয়ে। টোকা: এই অনুমতি তৃতীয় পক্ষৰ ব্ৰাউজাৰবোৰ বা ৱেব ব্ৰাউজিং কৰিব পৰা অন্য এপ্লিকেশ্বনবোৰৰ দ্বাৰা বলৱৎ নহ\'বও পাৰে।" "এলাৰ্ম ছেট কৰক" - "এপটোক ইনষ্টল হৈ থকা এলাৰ্ম ক্লক এপত এলাৰ্ম ছেট কৰিবলৈ অনুমতি দিয়ে। কিছুমান এলাৰ্ম ক্লক এপত এই সুবিধাটো প্ৰযোজ্য নহ’ব পাৰে।" + "এপ্‌টোক ইনষ্টল হৈ থকা এলাৰ্ম ক্লক এপত এলাৰ্ম ছেট কৰিবলৈ অনুমতি দিয়ে। কিছুমান এলাৰ্ম ক্লক এপত এই সুবিধাটো প্ৰযোজ্য নহ’ব পাৰে।" "ভইচমেইল যোগ কৰক" - "আপোনাৰ ভইচমেইল ইনবক্সত বাৰ্তাবোৰ যোগ কৰিবলৈ এপটোক অনুমতি দিয়ক।" + "আপোনাৰ ভইচমেইল ইনবক্সত বাৰ্তাবোৰ যোগ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ক।" "ব্ৰাউজাৰৰ জিঅ\'লোকেশ্বনৰ অনুমতিসমূহ সংশোধন কৰক" - "ব্ৰাউজাৰৰ জিঅ\'লোকেশ্বন বিষয়ক অনুমতিসমূহ সংশোধন কৰিবলৈ এপটোক অনুমতি দিয়ে৷ ক্ষতিকাৰক এপবোৰে একপক্ষীয় ৱেবছাইটসমূহলৈ অৱস্থান সেৱাৰ তথ্য পঠিয়াবলৈ ইয়াক ব্যৱহাৰ কৰিব পাৰে৷" + "ব্ৰাউজাৰৰ জিঅ\'লোকেশ্বন বিষয়ক অনুমতিসমূহ সংশোধন কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে৷ ক্ষতিকাৰক এপবোৰে একপক্ষীয় ৱেবছাইটসমূহলৈ অৱস্থান সেৱাৰ তথ্য পঠিয়াবলৈ ইয়াক ব্যৱহাৰ কৰিব পাৰে৷" "ব্ৰাউজাৰে এই পাছৱর্ডটো মনত ৰখাটো বিচাৰেনে?" "এতিয়াই নহয়" "মনত ৰাখিব" @@ -1199,12 +1199,12 @@ "%1$s বন্ধ হ’ল" "%1$s বাৰে বাৰে বন্ধ হৈ গৈছে" "%1$s বাৰে বাৰে বন্ধ হৈ গৈছে" - "আকৌ এপটো খোলক" + "আকৌ এপ্‌টো খোলক" "আপোনাৰ প্ৰতিক্ৰিয়া পঠিয়াওক" "বন্ধ কৰক" "ডিভাইচ ৰিষ্টাৰ্ট নোহোৱালৈ মিউট কৰক" "অপেক্ষা কৰক" - "এপটো বন্ধ কৰক" + "এপ্‌টো বন্ধ কৰক" "%2$sয়ে সঁহাৰি দিয়া নাই" "%1$sয়ে সঁহাৰি দিয়া নাই" @@ -1222,7 +1222,7 @@ "ছিষ্টেমৰ ছেটিং > এপ্‌ > ডাউনল’ড কৰা সমল-লৈ গৈ ইয়াক আকৌ সক্ষম কৰক।" "%1$sএ বর্তমানৰ ডিছপ্লে’ৰ আকাৰ ছেটিং ব্যৱহাৰ কৰিব নোৱাৰে আৰু ই সঠিকভাৱে নচলিবও পাৰে।" "সদায় দেখুৱাওক" - "%1$sক এটা খাপ নোখোৱা Android OS সংস্কৰণৰ বাবে তৈয়াৰ কৰা হৈছিল, যাৰ ফলত ই অস্বাভাৱিকধৰণে আচৰণ কৰিব পাৰে। এপটোৰ শেহতীয়া সংস্কৰণ উপলব্ধ হ\'ব পাৰে।" + "%1$sক এটা খাপ নোখোৱা Android OS সংস্কৰণৰ বাবে তৈয়াৰ কৰা হৈছিল, যাৰ ফলত ই অস্বাভাৱিকধৰণে আচৰণ কৰিব পাৰে। এপ্‌টোৰ শেহতীয়া সংস্কৰণ উপলব্ধ হ\'ব পাৰে।" "সদায় দেখুৱাওক" "আপডে’ট আছে নেকি চাওক" "এপটোৱে %1$s (প্ৰক্ৰিয়াটোৱে %2$s) নিজে বলবৎ কৰা StrictMode নীতি ভংগ কৰিলে।" @@ -1320,7 +1320,7 @@ "পঠিয়াওক" "বাতিল কৰক" "মোৰ পচন্দ মনত ৰাখিব" - "আপুনি ইয়াক পিছত ছেটিং > এপত সলনি কৰিব পাৰে" + "আপুনি ইয়াক পাছত ছেটিং > এপত সলনি কৰিব পাৰে" "যিকোনো সময়ত অনুমতি দিয়ক" "কেতিয়াও অনুমতি নিদিব" "ছিম কাৰ্ড আঁতৰোৱা হ’ল" @@ -1330,8 +1330,8 @@ "ম\'বাইলৰ নেটৱর্ক ব্যৱহাৰ কৰিবলৈ আপোনাৰ ডিভাইচটো ৰিষ্টার্ট কৰক।" "ৰিষ্টাৰ্ট কৰক" "ম’বাইল সেৱা সক্ৰিয় কৰক" - "আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ বাহকৰ এপটো ডাউনল’ড কৰক" - "আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ %1$s এপটো ডাউনল’ড কৰক" + "আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ বাহকৰ এপ্‌টো ডাউনল’ড কৰক" + "আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ %1$s এপ্‌টো ডাউনল’ড কৰক" "এপ্ ডাউনল’ড কৰক" "নতুন ছিম ভৰোৱা হৈছে" "ছেট আপ কৰিবলৈ টিপক" @@ -1444,9 +1444,9 @@ "ইনষ্টল কৰা ছেশ্বনসমূহ পঢ়িব পাৰে" "এটা এপ্লিকেশ্বনক ইনষ্টল কৰা ছেশ্বনসমূহ পঢ়িবলৈ অনুমতি দিয়ে। এই কাৰ্যই সক্ৰিয় পেকেজ ইনষ্টলেশ্বনৰ বিষয়ে চাবলৈ অনুমতি দিয়ে।" "পেকেজ ইনষ্টলৰ বাবে অনুৰোধ কৰিব পাৰে" - "পেকেজ ইনষ্টল কৰাৰ অনুৰোধ প্ৰেৰণ কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "পেকেজ ইনষ্টল কৰাৰ অনুৰোধ প্ৰেৰণ কৰিবলৈ এপ্‌টোক অনুমতি দিয়ে।" "পেকেজ মচাৰ অনুৰোধ কৰিব পাৰে" - "এপটোক পেকেজবোৰ মচাৰ অনুৰোধ কৰিবলৈ দিয়ে।" + "এপ্‌টোক পেকেজবোৰ মচাৰ অনুৰোধ কৰিবলৈ দিয়ে।" "বেটাৰী অপ্টিমাইজেশ্বন উপেক্ষা কৰিবলৈ বিচাৰক" "কোনো এপক সেই এপ্‌টোৰ বাবে বেটাৰী অপ্টিমাইজেশ্বন উপেক্ষা কৰিবলৈ অনুমতি বিচাৰিবলৈ দিয়ে।" "আটাইবোৰ পেকেজত প্ৰশ্ন সোধক" @@ -1470,8 +1470,8 @@ "অনুমতি বিচাৰি অনুৰোধ কৰা হৈছে" "%s একাউণ্টৰ বাবে\nঅনুমতি বিচাৰি অনুৰোধ কৰা হৈছে।" "%1$s%2$s একাউণ্টটো এক্সেছৰ \nঅনুমতি বিচাৰি অনুৰোধ জনাইছে।" - "আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ বাহিৰত এই এপটো ব্যৱহাৰ কৰি আছে" - "আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ ভিতৰত এই এপটো ব্যৱহাৰ কৰি আছে" + "আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ বাহিৰত এই এপ্‌টো ব্যৱহাৰ কৰি আছে" + "আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ ভিতৰত এই এপ্‌টো ব্যৱহাৰ কৰি আছে" "ইনপুট পদ্ধতি" "ছিংক" "সাধ্য সুবিধাসমূহ" @@ -1552,7 +1552,7 @@ "ইয়াৰ জৰিয়তে শ্বেয়াৰ কৰক" "%sৰ জৰিয়তে শ্বেয়াৰ কৰক" "শ্লাইড কৰা হেণ্ডেল৷ স্পৰ্শ কৰক আৰু ধৰি ৰাখক৷" - "স্ক্ৰীণ আনলক কৰিবলৈ ছোৱাইপ কৰক৷" + "স্ক্ৰীন আনলক কৰিবলৈ ছোৱাইপ কৰক৷" "গৃহ পৃষ্ঠালৈ যাওক" "ওপৰলৈ যাওক" "অধিক বিকল্প" @@ -1652,18 +1652,18 @@ "ব্যৱহাৰকাৰীৰ অমান্য নাম বা পাছৱর্ড।" "নিজৰ ব্যৱহাৰকাৰী নাম আৰু পাছৱর্ড পাহৰিলেনে?\n""google.com/accounts/recovery"" লৈ যাওক।" "একাউণ্ট পৰীক্ষা কৰি থকা হৈছে…" - "আপুনি আপোনাৰ পিন %1$dবাৰ ভুলকৈ লিখিছে। \n\n%2$dছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" - "আপুনি আপোনাৰ পাছৱৰ্ড %1$dবাৰ ভুলকৈ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" - "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হি %1$dবাৰ ভুলকৈ আঁকিছে। \n\n%2$dছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ পিন %1$dবাৰ ভুলকৈ লিখিছে। \n\n%2$dছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ পাছৱৰ্ড %1$dবাৰ ভুলকৈ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হি %1$dবাৰ ভুলকৈ আঁকিছে। \n\n%2$dছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" "আপুনি %1$dবাৰ ভুলকৈ টেবলেটৰ ল\'ক খোলাৰ প্ৰয়াস কৰিছে। %2$dতকৈ বেছি বাৰ ভুল প্ৰয়াস কৰিলে টেবলেটটো ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব আৰু আটাইবোৰ ব্যৱহাৰকাৰীৰ ডেটা হেৰুৱাব।" "আপুনি নিজৰ Android TV ডিভাইচটো আনলক কৰিবলৈ %1$dবাৰ ভুলকৈ প্ৰয়াস কৰিছে। %2$dতকৈ বেছি বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাৰ Android TV ডিভাইচটো ফেক্টৰী ডিফ’ল্টলৈ ৰিছেট কৰা হ’ব আৰু ব্যৱহাৰকাৰীৰ আটাইবোৰ ডেটা হেৰুৱাব।" "আপুনি %1$dবাৰ ভুলকৈ ফ\'নৰ ল\'ক খোলাৰ প্ৰয়াস কৰিছে। %2$dতকৈ বেছি বাৰ ভুল প্ৰয়াস কৰিলে ফ\'নটো ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব আৰু ব্যৱহাৰকাৰীৰ আটাইবোৰ ডেটা হেৰুৱাব।" "আপুনি %dবাৰ ভুলকৈ টেবলেটৰ ল\'ক খোলাৰ প্ৰয়াস কৰিছে। টেবলেটটো এতিয়া ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব।" "আপুনি নিজৰ Android TV ডিভাইচটো আনলক কৰিবলৈ %dবাৰ ভুলকৈ প্ৰয়াস কৰিছে। আপোনাৰ Android TV ডিভাইচটো এতিয়া ফেক্টৰী ডিফ’ল্টলৈ ৰিছেট কৰা হ’ব।" "আপুনি %dবাৰ ভুলকৈ ফ\'নৰ ল\'ক খোলাৰ প্ৰয়াস কৰিছে। ফ\'নটো এতিয়া ফেক্টৰী ডিফ\'ল্টলৈ ৰিছেট কৰা হ\'ব।" - "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হিটো %1$dবাৰ ভুলকৈ আঁকিছে। %2$dতকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ টেবলেটটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n %3$d ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হিটো %1$dবাৰ ভুলকৈ আঁকিছে। %2$dতকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ টেবলেটটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n %3$d ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" "আপুনি নিজৰ আনলক আর্হিটো %1$dবাৰ ভুলকৈ দিয়ে। আকৌ %2$dবাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক এটা ইমেইল একাউণ্ট ব্যৱহাৰ কৰি নিজৰ Android TV ডিভাইচটো আনলক কৰিবলৈ কোৱা হ’ব।\n\n %3$dছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।" - "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হিটো %1$dবাৰ ভুলকৈ আঁকিছে। %2$dতকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ ফ\'নটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n %3$d ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ ল\'ক খোলাৰ আৰ্হিটো %1$dবাৰ ভুলকৈ আঁকিছে। %2$dতকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ ফ\'নটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n %3$d ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" " — " "আঁতৰাওক" "অনুমোদিত স্তৰতকৈ ওপৰলৈ ভলিউম বঢ়াব নেকি?\n\nদীৰ্ঘ সময়ৰ বাবে উচ্চ ভলিউমত শুনাৰ ফলত শ্ৰৱণ ক্ষমতাৰ ক্ষতি হ\'ব পাৰে।" @@ -1827,7 +1827,7 @@ "সীমাবদ্ধতা সংশোধন কৰিবলৈ এটা পিন সৃষ্টি কৰক" "পিনবোৰ মিলা নাই। আকৌ চেষ্টা কৰক।" "পিনটো অতি চুটি। কমেও ৪টা সংখ্যাৰ হ\'ব লাগিব।" - "পিছত আকৌ চেষ্টা কৰক" + "পাছত আকৌ চেষ্টা কৰক" "স্ক্ৰীন পূৰ্ণৰূপত চাই আছে" "বাহিৰ হ\'বলৈ ওপৰৰপৰা তললৈ ছোৱাইপ কৰক।" "বুজি পালোঁ" @@ -1922,7 +1922,7 @@ "সকলো ভাষা" "আটাইবোৰ অঞ্চল" "সন্ধান কৰক" - "এপটো নাই" + "এপ্‌টো নাই" "এই মুহূৰ্তত %1$s উপলব্ধ নহয়। ইয়াক %2$sএ পৰিচালনা কৰে।" "অধিক জানক" "এপ্‌ আনপজ কৰক" @@ -1948,7 +1948,7 @@ "এই এপ্‌টোৱে অতিৰিক্ত সুৰক্ষাৰ বাবে অনুৰোধ কৰিছে। তাৰ পৰিৱৰ্তে আপোনাৰ Android TV ডিভাইচত চেষ্টা কৰি চাওক।" "এই এপ্‌টোৱে অতিৰিক্ত সুৰক্ষাৰ বাবে অনুৰোধ কৰিছে। তাৰ পৰিৱৰ্তে আপোনাৰ টেবলেটত চেষ্টা কৰি চাওক।" "এই এপ্‌টোৱে অতিৰিক্ত সুৰক্ষাৰ বাবে অনুৰোধ কৰিছে। তাৰ পৰিৱৰ্তে আপোনাৰ ফ’নত চেষ্টা কৰি চাওক।" - "এই এপটো Androidৰ এটা পুৰণা সংস্কৰণৰ বাবে প্ৰস্তুত কৰা হৈছিল, আৰু ই বিচৰাধৰণে কাম নকৰিবও পাৰে। ইয়াৰ আপডে’ট আছে নেকি চাওক, বা বিকাশকৰ্তাৰ সৈতে যোগাযোগ কৰক।" + "এই এপ্‌টো Androidৰ এটা পুৰণা সংস্কৰণৰ বাবে প্ৰস্তুত কৰা হৈছিল, আৰু ই বিচৰাধৰণে কাম নকৰিবও পাৰে। ইয়াৰ আপডে’ট আছে নেকি চাওক, বা বিকাশকৰ্তাৰ সৈতে যোগাযোগ কৰক।" "আপডে’ট আছে নেকি চাওক" "আপুনি নতুন বার্তা লাভ কৰিছে" "চাবলৈ এছএমএছ এপ্ খোলক" @@ -1987,7 +1987,7 @@ "সময়ৰ ইনপুটৰ বাবে পাঠৰ ইনপুট ম\'ডলৈ যাওক।" "সময়ৰ ইনপুটৰ বাবে ঘড়ী ম\'ডলৈ যাওক।" "স্বয়ংপূৰ্তিৰ বিকল্পসমূহ" - "পিছত স্বয়ংপূৰ্তি কৰিবলৈ ছেভ কৰক" + "পাছত স্বয়ংপূৰ্তি কৰিবলৈ ছেভ কৰক" "সমলসমূহ স্বয়ংপূৰ্তি কৰিব নোৱাৰি" "কোনো স্বয়ংপূৰ্তি পৰামৰ্শ নাই" "{count,plural, =1{এটা স্বয়ংপূৰ্তি পৰামৰ্শ}one{# টা স্বয়ংপূৰ্তি পৰামৰ্শ}other{# টা স্বয়ংপূৰ্তি পৰামৰ্শ}}" @@ -2030,7 +2030,7 @@ "পপআপ ৱিণ্ড\'" "+ %1$d" "এপৰ সংস্কৰণ অৱনমিত কৰা হৈছে, বা ই এই শ্বৰ্টকাটটোৰ লগত খাপ নাখায়" - "এপটোত বেকআপ আৰু পুনঃস্থাপন সুবিধা নথকাৰ বাবে শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল" + "এপ্‌টোত বেকআপ আৰু পুনঃস্থাপন সুবিধা নথকাৰ বাবে শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল" "এপৰ স্বাক্ষৰৰ অমিল হোৱাৰ বাবে শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল" "শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল" "শ্বৰ্টকাট অক্ষম কৰি থোৱা হৈছে" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 5212a8d22ff8..4567e198ce2a 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -754,10 +754,10 @@ "Kontrolatu zenbat aldiz idatzi duzun oker pasahitza pantaila desblokeatzen saiatzean, eta blokeatu Android TV gailua edo ezabatu bertako datu guztiak pasahitza gehiegitan idazten baduzu oker." "Kontrolatu zenbatetan idazten duzun pasahitza oker pantaila desblokeatzen saiatzean eta, gehiegitan idazten bada oker, blokeatu informazio- eta aisia-sistema edo ezabatu hango eduki guztia." "Kontrolatu pantaila desblokeatzen saiatzean idatzitako pasahitz oker kopurua, eta blokeatu telefonoa edo ezabatu bere datuak pasahitza gehiegitan oker idazten bada." - "Kontrolatu pantaila desblokeatzen saiatzean idatzitako pasahitz oker kopurua, eta blokeatu tableta edo ezabatu erabiltzailearen datuak pasahitza gehiegitan oker idazten bada." - "Kontrolatu zenbat aldiz idatzi duzun oker pasahitza pantaila desblokeatzen saiatzean, eta blokeatu Android TV gailua edo ezabatu erabiltzailearen datuak pasahitza gehiegitan idazten baduzu oker." + "Kontrolatu pantaila desblokeatzen saiatzean idatzitako pasahitz oker kopurua, eta blokeatu tableta edo ezabatu erabiltzaile-datuak pasahitza gehiegitan oker idazten bada." + "Kontrolatu zenbat aldiz idatzi duzun oker pasahitza pantaila desblokeatzen saiatzean, eta blokeatu Android TV gailua edo ezabatu erabiltzaile-datuak pasahitza gehiegitan idazten baduzu oker." "Kontrolatu zenbatetan idazten duzun pasahitza oker pantaila desblokeatzen saiatzean eta, gehiegitan idazten bada oker, blokeatu informazio- eta aisia-sistema edo ezabatu profil honetako eduki guztia." - "Kontrolatu pantaila desblokeatzen saiatzean idatzitako pasahitz oker kopurua, eta blokeatu telefonoa edo ezabatu erabiltzailearen datuak pasahitza gehiegitan oker idazten bada." + "Kontrolatu pantaila desblokeatzen saiatzean idatzitako pasahitz oker kopurua, eta blokeatu telefonoa edo ezabatu erabiltzaile-datuak pasahitza gehiegitan oker idazten bada." "Aldatu pantailaren blokeoa" "Aldatu pantailaren blokeoa." "Blokeatu pantaila" @@ -768,7 +768,7 @@ "Berrezarri informazio- eta aisia-sistemako jatorrizko datuak abisatu gabe, bertan zegoen eduki guztia ezabatzeko." "Ezabatu telefonoaren datuak abisatu gabe, jatorrizko datuak berrezarrita." "Ezabatu profileko eduki guztia" - "Ezabatu erabiltzailearen datuak" + "Ezabatu erabiltzaile-datuak" "Ezabatu erabiltzaileak tabletan dituen datuak abisatu gabe." "Ezabatu erabiltzaileak Android TV gailuan dituen datuak abisatu gabe." "Ezabatu informazio- eta aisia-sisteman dagoen profil honetako eduki guztia abisatu gabe." @@ -1125,7 +1125,7 @@ "Gauerdia" "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "Hautatu guztiak" + "Hautatu dena" "Ebaki" "Kopiatu" "Ezin izan da kopiatu arbelean" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b0bc0b73da1c..3d05e52d76d5 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1201,7 +1201,7 @@ "Aplikacija %1$s neprekidno se ruši" "Postupak %1$s neprekidno se ruši" "Ponovo otvori aplikaciju" - "Pošalji povratne informacije" + "Pošaljite povratne informacije" "Zatvori" "Zanemari do ponovnog pokretanja uređaja" "Čekaj" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index e576522b0940..b594bbcbc9a2 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -560,7 +560,7 @@ "నోటిఫికేషన్‌లను చూపించడానికి యాప్‌ను అనుమతించండి" "బయోమెట్రిక్ హార్డ్‌వేర్‌ని ఉపయోగించు" "ప్రమాణీకరణ కోసం బయోమెట్రిక్ హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది" - "వేలిముద్ర హార్డ్‌వేర్‌ని నిర్వహించడానికి అనుమతి" + "వేలిముద్ర హార్డ్‌వేర్‌ని మేనేజ్ చేయడానికి అనుమతి" "వినియోగం కోసం వేలిముద్ర టెంప్లేట్‌లను జోడించే, తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "వేలిముద్ర హార్డ్‌వేర్‌ని ఉపయోగించడానికి అనుమతి" "ప్రామాణీకరణ కోసం వేలిముద్ర హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది" @@ -700,7 +700,7 @@ "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడం" "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "టెలికామ్ కనెక్షన్‌లను నిర్వహించడం" - "టెలికామ్ కనెక్షన్‌లను నిర్వహించడానికి యాప్‌ను అనుమతిస్తుంది." + "టెలికామ్ కనెక్షన్‌లను మేనేజ్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్-కాల్ స్క్రీన్‌తో పరస్పర చర్య చేయడం" "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం" @@ -710,7 +710,7 @@ "చారిత్రక నెట్‌వర్క్ వినియోగాన్ని చదవడం" "నిర్దిష్ట నెట్‌వర్క్‌లు మరియు యాప్‌ల కోసం చారిత్రాత్మక నెట్‌వర్క్ వినియోగాన్ని చదవడానికి యాప్‌ను అనుమతిస్తుంది." "నెట్‌వర్క్ విధానాన్ని నిర్వహించడం" - "నెట్‌వర్క్ విధానాలను నిర్వహించడానికి మరియు యాప్-నిర్దిష్ట నిబంధనలను నిర్వచించడానికి యాప్‌ను అనుమతిస్తుంది." + "నెట్‌వర్క్ విధానాలను మేనేజ్ చేయడానికి మరియు యాప్-నిర్దిష్ట నిబంధనలను నిర్వచించడానికి యాప్‌ను అనుమతిస్తుంది." "నెట్‌వర్క్ వినియోగ అకౌంటింగ్‌ను ఎడిట్ చేయడం" "యాప్‌లలో నెట్‌వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు." "నోటిఫికేషన్‌లను యాక్సెస్ చేయడం" @@ -1483,8 +1483,8 @@ "నోటిఫికేషన్ ర్యాంకర్ సేవ" "VPN సక్రియం చేయబడింది" "%s ద్వారా VPN సక్రియం చేయబడింది" - "నెట్‌వర్క్‌ను నిర్వహించడానికి నొక్కండి." - "%sకు కనెక్ట్ చేయబడింది. నెట్‌వర్క్‌ను నిర్వహించడానికి నొక్కండి." + "నెట్‌వర్క్‌ను మేనేజ్ చేయడానికి నొక్కండి." + "%sకు కనెక్ట్ చేయబడింది. నెట్‌వర్క్‌ను మేనేజ్ చేయడానికి నొక్కండి." "ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడుతోంది…" "ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడింది" "ఎల్లప్పుడూ ఆన్‌లో ఉండే VPN నుండి డిస్‌కనెక్ట్ చేయబడింది" @@ -1715,7 +1715,7 @@ "గెస్ట్" "ఎర్రర్" "ఈ మార్పును మీ నిర్వాహకులు అనుమతించలేదు" - "ఈ చర్యను నిర్వహించడానికి యాప్ ఏదీ కనుగొనబడలేదు" + "ఈ చర్యను మేనేజ్ చేయడానికి యాప్ ఏదీ కనుగొనబడలేదు" "ఉపసంహరించండి" "ISO A0" "ISO A1" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 5179d3eaa40d..77fe0bab6591 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -979,7 +979,7 @@ "Pinaliit ang bahagi ng pag-unlock." "%1$s widget." "Tagapili ng user" - "Katayuan" + "Status" "Camera" "Mga kontrol ng media" "Nagsimula na ang pagbabago ng ayos ng widget." -- cgit v1.2.3 From 0f6d0232b84ebfef850db065b43806edebe92d51 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 13:03:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7dee933110cabf94b92479cc415e019be74cfb4e --- .../PackageInstaller/res/values-as/strings.xml | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index dd776a986df6..84053353ebb3 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -28,11 +28,11 @@ "আপুনি এই এপ্‌টো আপডে’ট কৰিবলৈ বিচাৰেনে?" "এপ্ ইনষ্টল কৰা হোৱা নাই।" "পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।" - "এপটো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।" - "আপোনাৰ টেবলেটৰ সৈতে খাপ নোখোৱাৰ বাবে এপটো ইনষ্টল কৰা নহ\'ল।" - "আপোনাৰ টিভিত এই এপটো নচলে" - "আপোনাৰ ফ\'নৰ সৈতে খাপ নোখোৱাৰ বাবে এপটো ইনষ্টল কৰা নহ\'ল।" - "পেকেজটো মান্য নোহোৱাৰ বাবে এপটো ইনষ্টল কৰা নহ\'ল।" + "এপ্‌টো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।" + "আপোনাৰ টেবলেটৰ সৈতে খাপ নোখোৱাৰ বাবে এপ্‌টো ইনষ্টল কৰা নহ\'ল।" + "আপোনাৰ টিভিত এই এপ্‌টো নচলে" + "আপোনাৰ ফ\'নৰ সৈতে খাপ নোখোৱাৰ বাবে এপ্‌টো ইনষ্টল কৰা নহ\'ল।" + "পেকেজটো মান্য নোহোৱাৰ বাবে এপ্‌টো ইনষ্টল কৰা নহ\'ল।" "আপোনাৰ টে\'বলেটত %1$s ইনষ্টল কৰিব পৰা নগ\'ল৷" "আপোনাৰ টিভিত %1$s ইনষ্টল কৰিব পৰা নগ\'ল।" "আপোনাৰ ফ\'নত %1$s ইনষ্টল কৰিব পৰা নগ\'ল৷" @@ -44,21 +44,21 @@ "এপ্ পৰিচালনা" "খালী ঠাই নাই" "%1$s ইনষ্টল কৰিব পৰা নগ\'ল। কিছু খালী ঠাই উলিয়াই আকৌ চেষ্টা কৰক৷" - "এপটো পোৱা নগ\'ল" - "ইনষ্টল কৰি ৰখা এপৰ তালিকাত এই এপটো পোৱা নগ\'ল।" + "এপ্‌টো পোৱা নগ\'ল" + "ইনষ্টল কৰি ৰখা এপৰ তালিকাত এই এপ্‌টো পোৱা নগ\'ল।" "অনুমতি নাই" "বর্তমানৰ ব্যৱহাৰকাৰীজনক এইটো আনইনষ্টল কৰিবলৈ অনুমতি দিয়া হোৱা নাই।" "আসোঁৱাহ" "এপ্ আনইনষ্টল কৰিব পৰা নগ\'ল।" "এপ্ আনইনষ্টল কৰক" "আপডে’ট আনইনষ্টল কৰক" - "%1$s হৈছে তলৰ এপটোৰ এটা অংশ:" + "%1$s হৈছে তলৰ এপ্‌টোৰ এটা অংশ:" "আপুনি এই এপ্‌টো আনইনষ্টল কৰিব বিচাৰে নেকি?" - "আপুনি ""সকলো"" ব্যৱহাৰকাৰীৰ বাবে এই এপটো আনইনষ্টল কৰিব বিচাৰেনে? এপ্লিকেশ্বন আৰু ইয়াৰ ডেটা ডিভাইচটোত থকা ""সকলো"" ব্যৱহাৰকাৰীৰ পৰা আঁতৰোৱা হ\'ব৷" - "আপুনি ব্যৱহাৰকাৰীৰ %1$s বাবে এই এপটো আনইনষ্টল কৰিব বিচাৰেনে?" + "আপুনি ""সকলো"" ব্যৱহাৰকাৰীৰ বাবে এই এপ্‌টো আনইনষ্টল কৰিব বিচাৰেনে? এপ্লিকেশ্বন আৰু ইয়াৰ ডেটা ডিভাইচটোত থকা ""সকলো"" ব্যৱহাৰকাৰীৰ পৰা আঁতৰোৱা হ\'ব৷" + "আপুনি ব্যৱহাৰকাৰীৰ %1$s বাবে এই এপ্‌টো আনইনষ্টল কৰিব বিচাৰেনে?" "আপুনি নিজৰ কৰ্মস্থানৰ প্ৰ’ফাইলৰ পৰা এই এপ্‌টো আনইনষ্টল কৰিব বিচাৰেনে?" "এই এপ্‌টোৰ ফেক্টৰী সংস্কৰণ ব্যৱহাৰ কৰিব বিচাৰেনে? আটাইবোৰ ডেটা মচা হ\'ব।" - "এই এপটোৰ ফেক্টৰী সংস্কৰণ ব্যৱহাৰ কৰিব বিচাৰেনে? সকলো ডেটা মচা হ\'ব। কর্মস্থানৰ প্ৰফাইল থকা ব্যৱহাৰকাৰীৰ লগতে ডিভাইচটোৰ সকলো ব্যৱহাৰকাৰীৰ ওপৰত ইয়াৰ প্ৰভাৱ পৰিব।" + "এই এপ্‌টোৰ ফেক্টৰী সংস্কৰণ ব্যৱহাৰ কৰিব বিচাৰেনে? সকলো ডেটা মচা হ\'ব। কর্মস্থানৰ প্ৰফাইল থকা ব্যৱহাৰকাৰীৰ লগতে ডিভাইচটোৰ সকলো ব্যৱহাৰকাৰীৰ ওপৰত ইয়াৰ প্ৰভাৱ পৰিব।" "এপৰ ডেটাৰ %1$s ৰাখক" "আনইনষ্টল কৰি থকা হৈছে" "যিবোৰ আনইনষ্টল পৰা নগ\'ল" @@ -70,9 +70,9 @@ "%1$s আনইনষ্টল কৰিব পৰা নগ\'ল।" "ডিভাইচৰ সক্ৰিয় প্ৰশাসক এপ্ আনইনষ্টল কৰিব নোৱাৰি" "%1$sৰ সক্ৰিয় ডিভাইচৰ প্ৰশাসকীয় এপ্ আনইনষ্টল কৰিব নোৱাৰি" - "এই এপটো কিছুসংখ্যক ব্যৱহাৰকাৰী বা প্ৰ\'ফাইলৰ বাবে প্ৰয়োজনীয় আৰু বাকীসকলৰ বাবে ইয়াক আনইনষ্টল কৰা হৈছে" - "আপোনাৰ প্ৰ\'ফাইলৰ বাবে এই এপটোৰ প্ৰয়োজন আছে গতিকে আনইনষ্টল কৰিব পৰা নাযায়।" - "এই এপটো আনইনষ্টল কৰিব পৰা নাযায় কাৰণ আপোনাৰ ডিভাইচৰ প্ৰশাসকে এই এপ্ ৰখাটো বাধ্যতামূলক কৰি ৰাখিছে।" + "এই এপ্‌টো কিছুসংখ্যক ব্যৱহাৰকাৰী বা প্ৰ\'ফাইলৰ বাবে প্ৰয়োজনীয় আৰু বাকীসকলৰ বাবে ইয়াক আনইনষ্টল কৰা হৈছে" + "আপোনাৰ প্ৰ\'ফাইলৰ বাবে এই এপ্‌টোৰ প্ৰয়োজন আছে গতিকে আনইনষ্টল কৰিব পৰা নাযায়।" + "এই এপ্‌টো আনইনষ্টল কৰিব পৰা নাযায় কাৰণ আপোনাৰ ডিভাইচৰ প্ৰশাসকে এই এপ্ ৰখাটো বাধ্যতামূলক কৰি ৰাখিছে।" "ডিভাইচৰ প্ৰশাসক এপসমূহ পৰিচালনা কৰক" "ব্যৱহাৰকাৰী পৰিচালনা কৰক" "%1$s আনইনষ্টল কৰিব নোৱাৰি।" @@ -84,9 +84,9 @@ "আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ টেবলেটটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্‌ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।" "আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ টিভিটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্‌ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।" "আপোনাৰ সুৰক্ষাৰ বাবে আপোনাৰ ফ’নটোক বৰ্তমান এই উৎসটোৰ পৰা অজ্ঞাত এপ্‌ ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই। আপুনি এইটো ছেটিঙত সলনি কৰিব পাৰে।" - "আপোনাৰ ফ\'ন আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" - "আপোনাৰ টেবলেট আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" - "আপোনাৰ টিভি আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপটো ইনষ্টল কৰি এপটোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" + "আপোনাৰ ফ\'ন আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপ্‌টো ইনষ্টল কৰি এপ্‌টোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" + "আপোনাৰ টেবলেট আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপ্‌টো ইনষ্টল কৰি এপ্‌টোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" + "আপোনাৰ টিভি আৰু ব্যক্তিগত ডেটা অজ্ঞাত এপৰ আক্ৰমণৰ বলি হোৱাৰ সম্ভাৱনা অধিক। আপুনি এই এপ্‌টো ইনষ্টল কৰি এপ্‌টোৰ ব্যৱহাৰৰ ফলত আপোনাৰ টিভিত হ\'ব পৰা যিকোনো ক্ষতি বা ডেটা ক্ষয়ৰ বাবে আপুনি নিজে দায়ী হ\'ব বুলি সন্মতি দিয়ে।" "অব্যাহত ৰাখক" "ছেটিং" "ৱেৰ এপসমূহ ইনষ্টল/আনইনষ্টল কৰি থকা হৈছে" -- cgit v1.2.3 From 0fa39d4f6bbb9013546f09bbdc00c43989a0c962 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 13:12:45 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib905240cba3b6e133dcde42e9a1738cdd0b927ce --- packages/SoundPicker/res/values-am/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SoundPicker/res/values-am/strings.xml b/packages/SoundPicker/res/values-am/strings.xml index 07aee8a646ec..85206c0b46a0 100644 --- a/packages/SoundPicker/res/values-am/strings.xml +++ b/packages/SoundPicker/res/values-am/strings.xml @@ -17,7 +17,7 @@ "ነባሪ የስልክ ላይ ጥሪ" - "ነባሪ የማሳወቂያ ድምጽ" + "ነባሪ የማሳወቂያ ድምፅ" "ነባሪ የማንቂያ ድምፅ" "የጥሪ ቅላጼ አክል" "የማንቂያ ደውል አክል" -- cgit v1.2.3 From c4549c263df8e224b630758e6883b76051cc5c22 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 13:19:17 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I666dc26610897d9c3db548406ea5d9dcb8687b17 --- packages/SystemUI/res/values-am/strings.xml | 16 ++++++++-------- packages/SystemUI/res/values-as/strings.xml | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index fe7218b3753c..61b3be622e71 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -96,7 +96,7 @@ "እየቀረጹ ሳለ የAndroid ስርዓት በማያ ገጽዎ ላይ የሚታይ ወይም በመሣሪያዎ ላይ የሚጫወት ማንኛውም ሚስጥራዊነት ያለው መረጃን መያዝ ይችላል። ይህ የይለፍ ቃላትን፣ የክፍያ መረጃን፣ ፎቶዎችን፣ መልዕክቶችን እና ኦዲዮን ያካትታል።" "ኦዲዮን ቅረጽ" "የመሣሪያ ኦዲዮ" - "እንደ ሙዚቃ፣ ጥሪዎች እና የጥሪ ቅላጼዎች ያሉ የመሣሪያዎ ድምጽ" + "እንደ ሙዚቃ፣ ጥሪዎች እና የጥሪ ቅላጼዎች ያሉ የመሣሪያዎ ድምፅ" "ማይክሮፎን" "የመሣሪያ ኦዲዮ እና ማይክሮፎን" "ጀምር" @@ -267,14 +267,14 @@ "የ%s ማስጠንቀቂያ" "የሥራ መተግበሪያዎች" "የምሽት ብርሃን" - "ጸሐይ ስትጠልቅ ይበራል" - "ጸሐይ እስክትወጣ ድረስ" + "ፀሐይ ስትጠልቅ ይበራል" + "ፀሐይ እስክትወጣ ድረስ" "%s ላይ ይበራል" "እስከ %s ድረስ" "ጨለማ ገጽታ" "ባትሪ ቆጣቢ" - "ጸሐይ ስትጠልቅ ይበራል" - "ጸሐይ እስክትወጣ ድረስ" + "ፀሐይ ስትጠልቅ ይበራል" + "ፀሐይ እስክትወጣ ድረስ" "%s ላይ ይበራል" "እስከ %s ድረስ" "በመኝታ ሰዓት ላይ" @@ -497,11 +497,11 @@ "ፀጥ ያለ" "ነባሪ" "ራስ-ሰር" - "ምንም ድምጽ ወይም ንዝረት የለም" - "ምንም ድምጽ ወይም ንዝረት የለም እና በውይይት ክፍል ላይ አይታይም" + "ምንም ድምፅ ወይም ንዝረት የለም" + "ምንም ድምፅ ወይም ንዝረት የለም እና በውይይት ክፍል ላይ አይታይም" "በእርስዎ የስልክ ቅንብሮች የሚወሰን ሆኖ ሊደውል ወይም ሊነዝር ይችላል" "በእርስዎ የስልክ ቅንብሮች የሚወሰን ሆኖ ሊደውል ወይም ሊነዝር ይችላል። የ%1$s አረፋ ውይይቶች በነባሪነት።" - "ይህ ማሳወቂያ ድምጽ ወይም ንዝረት መደረግ ካለበት ስርዓቱ እንዲወሰን ያድርጉት" + "ይህ ማሳወቂያ ድምፅ ወይም ንዝረት መደረግ ካለበት ስርዓቱ እንዲወሰን ያድርጉት" "<b>ሁኔታ:</b> ለነባሪ ከፍ ተዋውቋል።" "<b>ሁኔታ:</b> ወደ ዝምታ ዝቅ ተደርጓል" "<b>ሁኔታ:</b> ክፍተኛ ደረጃ ተሰጥቶታል" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 71b4716ae9ea..fa9057abd9e8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -551,7 +551,7 @@ "তললৈ" "বাওঁফালে" "সোঁফালে" - "স্ক্ৰীণৰ মাজত" + "স্ক্ৰীনৰ মাজত" "Tab" "স্পেচ" "এণ্টাৰ" @@ -572,7 +572,7 @@ "নামপেড %1$s" "সংলগ্নক আঁতৰাওক" "ছিষ্টেম" - "গৃহ স্ক্ৰীণ" + "গৃহ স্ক্ৰীন" "শেহতীয়াসমূহ" "উভতি যাওক" "জাননীসমূহ" @@ -669,7 +669,7 @@ "যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক" "ফ\'নটো গৰম হ\'বলৈ ধৰিছে" "ফ’নটো ঠাণ্ডা হৈ থকাৰ সময়ত কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক" - "আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।" + "আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পাছত ই আগৰ নিচিনাকৈয়েই চলিব।" "যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক" "চ্চার্জাৰ আনপ্লাগ কৰক" "এই ডিভাইচটো চাৰ্জ কৰোঁতে কিবা সমস্যা হৈছে। পাৱাৰ এডাপ্টাৰটো আনপ্লাগ কৰক আৰু কে’বলডাল গৰম হ’ব পাৰে; গতিকে সাবধান হ’ব।" @@ -697,7 +697,7 @@ "Instant Apps" "%1$s চলি আছে" "এপ্‌টো ইনষ্ট\'ল নকৰাকৈ খোলা হৈছে।" - "ইনষ্ট\'ল নকৰাকৈয়েই এপটো খোলা হৈছে। অধিক জানিবলৈ টিপক।" + "ইনষ্ট\'ল নকৰাকৈয়েই এপ্‌টো খোলা হৈছে। অধিক জানিবলৈ টিপক।" "এপৰ তথ্য" "ব্ৰাউজাৰলৈ যাওক" "ম’বাইল ডেটা" -- cgit v1.2.3 From 93624d9f646f555ff7228d8d86520b4bdda1e926 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 13:23:44 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2fe2e531e4bcffa632400f067c0609e0c1e1bb9d --- packages/SystemUI/res-keyguard/values-as/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index 186f47a461ac..03a6a05e0941 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -64,9 +64,9 @@ "ছিম কার্ড আনলক কৰি থকা হৈছে…" "৪টাৰ পৰা ৮টা সংখ্যাযুক্ত এটা পিন লিখক।" "PUK ক\'ডটো ৮টা বা তাতকৈ অধিক সংখ্যা থকা হ\'ব লাগিব।" - "আপুনি আপোনাৰ পিন %1$d বাৰ ভুলকৈ লিখিছে। \n\n%2$dছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ পিন %1$d বাৰ ভুলকৈ লিখিছে। \n\n%2$dছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" "আপুনি আপোনাৰ পাছৱৰ্ড %1$dবাৰ ভুলকৈ লিখিছে। \n\n%2$d ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" - "আপুনি আপোনাৰ আনলক আৰ্হি %1$d বাৰ ভুলকৈ আঁকিছে। \n\n%2$dছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।" + "আপুনি আপোনাৰ আনলক আৰ্হি %1$d বাৰ ভুলকৈ আঁকিছে। \n\n%2$dছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।" "ছিমৰ ভুল পিন ক\'ড, আপোনাৰ ডিভাইচটো আনলক কৰিবলৈ আপুনি এতিয়া আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰিবই লাগিব।" ছিমৰ ভুল পিন ক’ড, আপুনি আৰু %d বাৰ প্ৰয়াস কৰিব পাৰিব। @@ -81,9 +81,9 @@ "ছিম PUKৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!" "ইনপুট পদ্ধতি সলনি কৰক" "এয়াৰপ্লে’ন ম’ড" - "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত আৰ্হি দিয়াটো বাধ্যতামূলক" - "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক" - "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক" + "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত আৰ্হি দিয়াটো বাধ্যতামূলক" + "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত পিন দিয়াটো বাধ্যতামূলক" + "ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক" "অতিৰিক্ত সুৰক্ষাৰ বাবে আর্হি দিয়াটো বাধ্যতামূলক" "অতিৰিক্ত সুৰক্ষাৰ বাবে পিন দিয়াটো বাধ্যতামূলক" "অতিৰিক্ত সুৰক্ষাৰ বাবে পাছৱর্ড দিয়াটো বাধ্যতামূলক" -- cgit v1.2.3 From 2eeb0da7efa5a1863bb396ab2f53a3b2c8597465 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 15 Oct 2022 15:25:00 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9277fb06e4cd3c28a609cb65314e50374f5b39c0 --- packages/SettingsLib/res/values-am/strings.xml | 4 ++-- packages/SettingsLib/res/values-as/strings.xml | 6 +++--- packages/SettingsLib/res/values-fr/strings.xml | 2 +- packages/SettingsLib/res/values-te/strings.xml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 9116f6046259..1bcbd4057279 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -209,7 +209,7 @@ "የፍርግም ቅንብሮችን ያስጀምሩ" "የተመረጠ ፍርግም" "አጠቃላይ" - "የንግግር ድምጽ ውፍረት ዳግም አስጀምር" + "የንግግር ድምፅ ውፍረት ዳግም አስጀምር" "ጽሑፉ የሚነገርበትን የድምጽ ውፍረት ወደ ነባሪ ዳግም አስጀምር።" "በጣም ቀርፋፋ" @@ -407,7 +407,7 @@ "እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ" "የዝርዝር ሰነድ እሴቶች ምንም ይሁኑ ምን ለበርካታ መስኮቶች ሁሉንም እንቅስቃሴዎች መጠናቸው የሚቀየሩ እንዲሆኑ ያደርጋቸዋል።" "የነጻ ቅርጽ መስኮቶችን ያንቁ" - "የሙከራ ነጻ መልክ መስኮቶች ድጋፍን አንቃ" + "የሙከራ ነፃ መልክ መስኮቶች ድጋፍን አንቃ" "የዴስክቶፕ መጠባበቂያ ይለፍ ቃል" "ዴስክቶፕ ሙሉ ምትኬዎች በአሁኑ ሰዓት አልተጠበቁም" "የዴስክቶፕ ሙሉ ምትኬዎች የይለፍ ቃሉን ለመለወጥ ወይም ለማስወገድ ነካ ያድርጉ" diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 94f30fd08947..277393ad4620 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -268,7 +268,7 @@ "জাগ্ৰত কৰি ৰাখক" "চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীন কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়" "ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক" - "ব্লুটুথ পেকেট সংগ্ৰহ কৰক। (এই ছেটিংটো সলনি কৰাৰ পিছত ব্লুটুথ ট’গল কৰক)" + "ব্লুটুথ পেকেট সংগ্ৰহ কৰক। (এই ছেটিংটো সলনি কৰাৰ পাছত ব্লুটুথ ট’গল কৰক)" "ঔইএম আনলক" "বুটল\'ডাৰটো আনলক কৰিবলৈ অনুমতি দিয়ক" "ঔইএম আনলক কৰাৰ অনুমতি দিবনে?" @@ -513,8 +513,8 @@ "সক্ৰিয়হৈ থকা ইনপুট পদ্ধতিসমূহ" "ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক" "%1$sৰ ছেটিং খুলিব পৰা নগ\'ল" - "এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি আটাইবোৰ পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। %1$s এপটোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?" - "টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ’ব" + "এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি আটাইবোৰ পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। %1$s এপ্‌টোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?" + "টোকা: ৰিবুট কৰাৰ পাছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপ্‌টো ষ্টাৰ্ট নহ’ব" "আইএমএছ পঞ্জীয়ন স্থিতি" "পঞ্জীকৃত" "পঞ্জীকৃত নহয়" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index a47b5283a89c..b667fc0519b2 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -247,7 +247,7 @@ "Appareils associés" "Actuellement connecté" "Infos sur l\'appareil" - "Supprimer" + "Retirer" "Empreinte de l\'appareil : %1$s" "Échec de la connexion" "Vérifiez que l\'appareil %1$s est connecté au bon réseau" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 9cee4a3550c6..9ba7db4eeb26 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -507,7 +507,7 @@ "అతి పెద్దగా" "అనుకూలం (%d)" "మెనూ" - "డెమో మోడ్‌లో ఫ్యాక్టరీ రీసెట్‌ను నిర్వహించడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి" + "డెమో మోడ్‌లో ఫ్యాక్టరీ రీసెట్‌ను మేనేజ్ చేయడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి" "తర్వాత" "పాస్‌వర్డ్ అవసరం" "సక్రియ ఇన్‌పుట్ పద్ధతులు" -- cgit v1.2.3 From b3192809643eff948d9457c8a7b36b968a7388a1 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 8 Feb 2022 06:22:47 +0000 Subject: Backport missing permission check for querying main activity intent - This was fixed in T in ag/16820166, but the original code was submitted in S. This ensures that the caller of this method is either holding the ACCESS_SHORTCUTS permission or is the default launcher. Bug: 229256049 Test: atest WMShellUnitTests Change-Id: Ib233ad754a6c6e3c4e0d0e10ed788ab8e055cccc Merged-In: Ib233ad754a6c6e3c4e0d0e10ed788ab8e055cccc (cherry picked from commit f4ed441e180d7113b5f6ebfe711e61a2dd3fd8b1) --- core/java/android/content/pm/ILauncherApps.aidl | 4 ++-- core/java/android/content/pm/LauncherApps.java | 3 ++- services/core/java/com/android/server/pm/LauncherAppsService.java | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index 37fd3ffdeafa..2eaadb05276c 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -56,8 +56,8 @@ interface ILauncherApps { void startActivityAsUser(in IApplicationThread caller, String callingPackage, String callingFeatureId, in ComponentName component, in Rect sourceBounds, in Bundle opts, in UserHandle user); - PendingIntent getActivityLaunchIntent(in ComponentName component, in Bundle opts, - in UserHandle user); + PendingIntent getActivityLaunchIntent(String callingPackage, in ComponentName component, + in Bundle opts, in UserHandle user); void showAppDetailsAsUser(in IApplicationThread caller, String callingPackage, String callingFeatureId, in ComponentName component, in Rect sourceBounds, in Bundle opts, in UserHandle user); diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 0f9acadb11f9..4b6c586266a9 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -752,7 +752,8 @@ public class LauncherApps { } try { // due to b/209607104, startActivityOptions will be ignored - return mService.getActivityLaunchIntent(component, null /* opts */, user); + return mService.getActivityLaunchIntent(mContext.getPackageName(), component, + null /* opts */, user); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 24b9f48e71a6..a238593a96f8 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -1098,8 +1098,9 @@ public class LauncherAppsService extends SystemService { } @Override - public PendingIntent getActivityLaunchIntent(ComponentName component, Bundle opts, - UserHandle user) { + public PendingIntent getActivityLaunchIntent(String callingPackage, ComponentName component, + Bundle opts, UserHandle user) { + ensureShortcutPermission(callingPackage); if (!canAccessProfile(user.getIdentifier(), "Cannot start activity")) { throw new ActivityNotFoundException("Activity could not be found"); } -- cgit v1.2.3 From 303f6bde896877793370c1697fa8c8331b808e56 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec Merged-In: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 37b336382769..9a92515ee794 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 83d23fb275d2bcfb090a9c6efd6c71a5f519372f Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec Merged-In: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 37b336382769..9a92515ee794 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 313a84f0330c71fd061e195a5a1227afdb788d07 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec Merged-In: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 37b336382769..9a92515ee794 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 7533d0420d85d56ec42bdb30a2ef1ae55ae95080 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec Merged-In: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 27a9a27e59a2..2573d9857671 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 4ed0f171be9c4dcc4b8ad3157fcb522ecca36a9e Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec Merged-In: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 27a9a27e59a2..2573d9857671 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 53d493b0e5a093ff4f4fad4b8c127d6299fc1513 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 12 Oct 2022 14:27:46 +0000 Subject: [DO NOT MERGE] Fix conditionId string trimming in AutomaticZenRule This change only applies to S branches and earlier. Bug: 253085433 Bug: 242703460 Bug: 242703505 Bug: 242703780 Bug: 242704043 Bug: 243794204 Test: AutomaticZenRuleTest Change-Id: Iae423d93b777df8946ecf1c3baf640fcf74990ec --- core/java/android/app/AutomaticZenRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 27a9a27e59a2..2573d9857671 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -125,7 +125,7 @@ public final class AutomaticZenRule implements Parcelable { name = getTrimmedString(source.readString()); } interruptionFilter = source.readInt(); - conditionId = source.readParcelable(null); + conditionId = getTrimmedUri(source.readParcelable(null)); owner = getTrimmedComponentName(source.readParcelable(null)); configurationActivity = getTrimmedComponentName(source.readParcelable(null)); creationTime = source.readLong(); -- cgit v1.2.3 From 966b597383d1f5cbbc943affeb24b9b225b2ddae Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f04acd09ae14..227fa9d0bdc4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -375,9 +375,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -410,6 +412,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -430,8 +438,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -552,13 +559,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -579,16 +587,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -696,38 +706,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 69eb7133f46f..66b809aeae30 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -20,6 +20,8 @@ import android.test.AndroidTestCase; import android.util.TypedXmlSerializer; import android.util.Xml; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -276,4 +278,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From f22267f8b2f92b68bf3b9d92d6ec7cff7ed0f93d Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 6678cf6f1033..f7ca8b039633 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -384,9 +384,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -419,6 +421,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -439,8 +447,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -558,13 +565,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -585,16 +593,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -702,38 +712,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 9f448af7f344..bf000cd8a22a 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -21,6 +21,8 @@ import android.util.Xml; import org.xmlpull.v1.XmlSerializer; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -280,4 +282,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From 3c2723ffaf2dd4ddee9a1bd5a563d296f553afea Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 6678cf6f1033..f7ca8b039633 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -384,9 +384,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -419,6 +421,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -439,8 +447,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -558,13 +565,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -585,16 +593,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -702,38 +712,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 9f448af7f344..bf000cd8a22a 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -21,6 +21,8 @@ import android.util.Xml; import org.xmlpull.v1.XmlSerializer; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -280,4 +282,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From a8f756f989a640868c241c575742a80c1c71599f Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f04acd09ae14..227fa9d0bdc4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -375,9 +375,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -410,6 +412,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -430,8 +438,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -552,13 +559,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -579,16 +587,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -696,38 +706,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 69eb7133f46f..66b809aeae30 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -20,6 +20,8 @@ import android.test.AndroidTestCase; import android.util.TypedXmlSerializer; import android.util.Xml; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -276,4 +278,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From a1e8e64e07622005807b560c13e746167a4db6b2 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f04acd09ae14..227fa9d0bdc4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -375,9 +375,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -410,6 +412,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -430,8 +438,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -552,13 +559,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -579,16 +587,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -696,38 +706,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 69eb7133f46f..66b809aeae30 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -20,6 +20,8 @@ import android.test.AndroidTestCase; import android.util.TypedXmlSerializer; import android.util.Xml; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -276,4 +278,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From de2ba563d737ad3e8dae97fb488afdc7967e827e Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [RESTRICT AUTOMERGE] [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 38 +++++++++++ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index fd7554f11873..528af2ec2528 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -376,9 +376,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -410,6 +412,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -430,8 +438,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -552,13 +559,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), FrameworkStatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -579,16 +587,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -696,38 +706,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 69eb7133f46f..66b809aeae30 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -20,6 +20,8 @@ import android.test.AndroidTestCase; import android.util.TypedXmlSerializer; import android.util.Xml; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -276,4 +278,40 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.setVersionLocked(SettingsState.SETTINGS_VERSION_NEW_ENCODING); return settingsState; } + + public void testInsertSetting_memoryUsage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + + settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, SYSTEM_PACKAGE); + settingsState.deleteSettingLocked(SETTING_NAME); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(SETTING_NAME); + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + } } -- cgit v1.2.3 From 5e80fcf8c423f288a87d727f48ae38112177d716 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 23 Sep 2022 12:04:57 -0700 Subject: RESTRICT AUTOMERGE Revoke SYSTEM_ALERT_WINDOW on upgrade past api 23 Bug: 221040577 Test: atest PermissionTest23#testPre23AppsWithSystemAlertWindowGetDeniedOnUpgrade Change-Id: I4b4605aaae107875811070dea6d031c5d9f25c96 --- .../pm/permission/PermissionManagerService.java | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) 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 2662f620cbd4..4071b0341447 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2248,6 +2248,46 @@ public class PermissionManagerService extends IPermissionManager.Stub { } + /** + * If the package was below api 23, got the SYSTEM_ALERT_WINDOW permission automatically, and + * then updated past api 23, and the app does not satisfy any of the other SAW permission flags, + * the permission should be revoked. + * + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeSystemAlertWindowIfUpgradedPast23( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage) { + if (oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.M + || newPackage.getTargetSdkVersion() < Build.VERSION_CODES.M + || !newPackage.getRequestedPermissions() + .contains(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + return; + } + + Permission saw; + synchronized (mLock) { + saw = mRegistry.getPermission(Manifest.permission.SYSTEM_ALERT_WINDOW); + } + final PackageSetting ps = (PackageSetting) + mPackageManagerInt.getPackageSetting(newPackage.getPackageName()); + if (shouldGrantPermissionByProtectionFlags(newPackage, ps, saw, new ArraySet<>()) + || shouldGrantPermissionBySignature(newPackage, saw)) { + return; + } + for (int userId : getAllUserIds()) { + try { + revokePermissionFromPackageForUser(newPackage.getPackageName(), + Manifest.permission.SYSTEM_ALERT_WINDOW, false, userId, + mDefaultPermissionCallback); + } catch (IllegalStateException | SecurityException e) { + Log.e(TAG, "unable to revoke SYSTEM_ALERT_WINDOW for " + + newPackage.getPackageName() + " user " + userId, e); + } + } + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4814,6 +4854,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { if (hasOldPkg) { revokeRuntimePermissionsIfGroupChangedInternal(pkg, oldPkg); revokeStoragePermissionsIfScopeExpandedInternal(pkg, oldPkg); + revokeSystemAlertWindowIfUpgradedPast23(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { revokeRuntimePermissionsIfPermissionDefinitionChangedInternal( -- cgit v1.2.3 From 2509b12e6fc921c855e16471a8b6648535626f1d Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 23 Sep 2022 12:04:57 -0700 Subject: RESTRICT AUTOMERGE Revoke SYSTEM_ALERT_WINDOW on upgrade past api 23 Bug: 221040577 Test: atest PermissionTest23#testPre23AppsWithSystemAlertWindowGetDeniedOnUpgrade Change-Id: I4b4605aaae107875811070dea6d031c5d9f25c96 --- .../pm/permission/PermissionManagerService.java | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) 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 2662f620cbd4..4071b0341447 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2248,6 +2248,46 @@ public class PermissionManagerService extends IPermissionManager.Stub { } + /** + * If the package was below api 23, got the SYSTEM_ALERT_WINDOW permission automatically, and + * then updated past api 23, and the app does not satisfy any of the other SAW permission flags, + * the permission should be revoked. + * + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeSystemAlertWindowIfUpgradedPast23( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage) { + if (oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.M + || newPackage.getTargetSdkVersion() < Build.VERSION_CODES.M + || !newPackage.getRequestedPermissions() + .contains(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + return; + } + + Permission saw; + synchronized (mLock) { + saw = mRegistry.getPermission(Manifest.permission.SYSTEM_ALERT_WINDOW); + } + final PackageSetting ps = (PackageSetting) + mPackageManagerInt.getPackageSetting(newPackage.getPackageName()); + if (shouldGrantPermissionByProtectionFlags(newPackage, ps, saw, new ArraySet<>()) + || shouldGrantPermissionBySignature(newPackage, saw)) { + return; + } + for (int userId : getAllUserIds()) { + try { + revokePermissionFromPackageForUser(newPackage.getPackageName(), + Manifest.permission.SYSTEM_ALERT_WINDOW, false, userId, + mDefaultPermissionCallback); + } catch (IllegalStateException | SecurityException e) { + Log.e(TAG, "unable to revoke SYSTEM_ALERT_WINDOW for " + + newPackage.getPackageName() + " user " + userId, e); + } + } + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4814,6 +4854,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { if (hasOldPkg) { revokeRuntimePermissionsIfGroupChangedInternal(pkg, oldPkg); revokeStoragePermissionsIfScopeExpandedInternal(pkg, oldPkg); + revokeSystemAlertWindowIfUpgradedPast23(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { revokeRuntimePermissionsIfPermissionDefinitionChangedInternal( -- cgit v1.2.3 From fba194b998cf22d073a36cb5c6f9397c2dc1a50e Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 23 Sep 2022 12:04:57 -0700 Subject: RESTRICT AUTOMERGE Revoke SYSTEM_ALERT_WINDOW on upgrade past api 23 Bug: 221040577 Test: atest PermissionTest23#testPre23AppsWithSystemAlertWindowGetDeniedOnUpgrade Change-Id: I4b4605aaae107875811070dea6d031c5d9f25c96 --- .../permission/PermissionManagerServiceImpl.java | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 1e13333c1ce0..00fbe8395b54 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -2134,6 +2134,46 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt } + /** + * If the package was below api 23, got the SYSTEM_ALERT_WINDOW permission automatically, and + * then updated past api 23, and the app does not satisfy any of the other SAW permission flags, + * the permission should be revoked. + * + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeSystemAlertWindowIfUpgradedPast23( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage) { + if (oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.M + || newPackage.getTargetSdkVersion() < Build.VERSION_CODES.M + || !newPackage.getRequestedPermissions() + .contains(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + return; + } + + Permission saw; + synchronized (mLock) { + saw = mRegistry.getPermission(Manifest.permission.SYSTEM_ALERT_WINDOW); + } + final PackageStateInternal ps = + mPackageManagerInt.getPackageStateInternal(newPackage.getPackageName()); + if (shouldGrantPermissionByProtectionFlags(newPackage, ps, saw, new ArraySet<>()) + || shouldGrantPermissionBySignature(newPackage, saw)) { + return; + } + for (int userId : getAllUserIds()) { + try { + revokePermissionFromPackageForUser(newPackage.getPackageName(), + Manifest.permission.SYSTEM_ALERT_WINDOW, false, userId, + mDefaultPermissionCallback); + } catch (IllegalStateException | SecurityException e) { + Log.e(TAG, "unable to revoke SYSTEM_ALERT_WINDOW for " + + newPackage.getPackageName() + " user " + userId, e); + } + } + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4660,6 +4700,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt if (hasOldPkg) { revokeRuntimePermissionsIfGroupChangedInternal(pkg, oldPkg); revokeStoragePermissionsIfScopeExpandedInternal(pkg, oldPkg); + revokeSystemAlertWindowIfUpgradedPast23(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { revokeRuntimePermissionsIfPermissionDefinitionChangedInternal( -- cgit v1.2.3 From f6ba142a84a38014e56c3178f0aa322a377b77cd Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 23 Sep 2022 12:04:57 -0700 Subject: RESTRICT AUTOMERGE Revoke SYSTEM_ALERT_WINDOW on upgrade past api 23 Bug: 221040577 Test: atest PermissionTest23#testPre23AppsWithSystemAlertWindowGetDeniedOnUpgrade Change-Id: I4b4605aaae107875811070dea6d031c5d9f25c96 --- .../android/server/pm/PackageManagerService.java | 4 +- .../pm/permission/PermissionManagerService.java | 58 ++++++++++++++++++---- .../PermissionManagerServiceInternal.java | 31 ++++-------- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6b06de3da929..99b64274f85c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12322,9 +12322,7 @@ public class PackageManagerService extends IPackageManager.Stub AsyncTask.execute(() -> { if (hasOldPkg) { - mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg, - allPackageNames, mPermissionCallback); - mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg, + mPermissionManager.onPackageUpdated(pkg, oldPkg, allPackageNames, mPermissionCallback); } if (hasPermissionDefinitionChanges) { 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 c7fca39de562..b7eb589cc868 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -646,6 +646,45 @@ public class PermissionManagerService { } + /** + * If the package was below api 23, got the SYSTEM_ALERT_WINDOW permission automatically, and + * then updated past api 23, and the app does not satisfy any of the other SAW permission flags, + * the permission should be revoked. + * + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeSystemAlertWindowIfUpgradedPast23( + @NonNull PackageParser.Package newPackage, + @NonNull PackageParser.Package oldPackage, + @NonNull PermissionCallback permissionCallback) { + if (oldPackage.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M + || newPackage.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M + || !newPackage.requestedPermissions + .contains(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + return; + } + + BasePermission saw; + synchronized (mLock) { + saw = mSettings.getPermissionLocked(Manifest.permission.SYSTEM_ALERT_WINDOW); + } + final PackageSetting ps = (PackageSetting) newPackage.mExtras; + if (grantSignaturePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, newPackage, saw, + ps.getPermissionsState())) { + return; + } + for (int userId: mUserManagerInt.getUserIds()) { + try { + revokeRuntimePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, + newPackage.packageName, false, userId, permissionCallback); + } catch (IllegalStateException | SecurityException e) { + Log.e(TAG, "unable to revoke SYSTEM_ALERT_WINDOW for " + + newPackage.packageName + " user " + userId, e); + } + } + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -3170,25 +3209,22 @@ public class PermissionManagerService { } /** - * If the app is updated, and has scoped storage permissions, then it is possible that the - * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * If the app is updated, then some checks need to be performed to ensure the + * package is not attempting to expoit permission changes across API boundaries. * @param newPackage The new package that was installed * @param oldPackage The old package that was updated + * @param allPackageNames The current packages in the system + * @param permissionCallback Callback for permission changed */ - public void revokeStoragePermissionsIfScopeExpanded( + public void onPackageUpdated( @NonNull PackageParser.Package newPackage, @NonNull PackageParser.Package oldPackage, + @NonNull ArrayList allPackageNames, @NonNull PermissionCallback permissionCallback) { PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, oldPackage, permissionCallback); - } - - @Override - public void revokeRuntimePermissionsIfGroupChanged( - @NonNull PackageParser.Package newPackage, - @NonNull PackageParser.Package oldPackage, - @NonNull ArrayList allPackageNames, - @NonNull PermissionCallback permissionCallback) { + PermissionManagerService.this.revokeSystemAlertWindowIfUpgradedPast23(newPackage, + oldPackage, permissionCallback); PermissionManagerService.this.revokeRuntimePermissionsIfGroupChanged(newPackage, oldPackage, allPackageNames, permissionCallback); } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 46fa4ffdbd45..a2f64eafe151 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -97,17 +97,15 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdate, @NonNull Collection allPacakges, PermissionCallback callback); - /** - * We might auto-grant permissions if any permission of the group is already granted. Hence if - * the group of a granted permission changes we need to revoke it to avoid having permissions of - * the new group auto-granted. - * - * @param newPackage The new package that was installed - * @param oldPackage The old package that was updated - * @param allPackageNames All packages - * @param permissionCallback Callback for permission changed - */ - public abstract void revokeRuntimePermissionsIfGroupChanged( + /** + * If the app is updated, then some checks need to be performed to ensure the package is not + * attempting to expoit permission changes across API boundaries. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + * @param allPackageNames The current packages in the system + * @param permissionCallback Callback for permission changed + */ + public abstract void onPackageUpdated( @NonNull PackageParser.Package newPackage, @NonNull PackageParser.Package oldPackage, @NonNull ArrayList allPackageNames, @@ -126,17 +124,6 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager @NonNull ArrayList allPackageNames, @NonNull PermissionCallback permissionCallback); - /** - * If the app is updated, and has scoped storage permissions, then it is possible that the - * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. - * @param newPackage The new package that was installed - * @param oldPackage The old package that was updated - */ - public abstract void revokeStoragePermissionsIfScopeExpanded( - @NonNull PackageParser.Package newPackage, - @NonNull PackageParser.Package oldPackage, - @NonNull PermissionCallback permissionCallback); - /** * Add all permissions in the given package. *

    -- cgit v1.2.3 From 14551ab6d2c754d83d6b504549aabb40018d9c6a Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 23 Sep 2022 12:04:57 -0700 Subject: RESTRICT AUTOMERGE Revoke SYSTEM_ALERT_WINDOW on upgrade past api 23 Bug: 221040577 Test: atest PermissionTest23#testPre23AppsWithSystemAlertWindowGetDeniedOnUpgrade Change-Id: I4b4605aaae107875811070dea6d031c5d9f25c96 --- .../android/server/pm/PackageManagerService.java | 4 +- .../pm/permission/PermissionManagerService.java | 60 +++++++++++++++++----- .../PermissionManagerServiceInternal.java | 29 +++-------- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 12961584b740..5f6ef9903124 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12494,9 +12494,7 @@ public class PackageManagerService extends IPackageManager.Stub AsyncTask.execute(() -> { if (hasOldPkg) { - mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg, - allPackageNames); - mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg); + mPermissionManager.onPackageUpdated(pkg, oldPkg, allPackageNames); } if (hasPermissionDefinitionChanges) { mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged( 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 8bab4d3eae4c..fc760fd6b48f 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2321,6 +2321,46 @@ public class PermissionManagerService extends IPermissionManager.Stub { } + /** + * If the package was below api 23, got the SYSTEM_ALERT_WINDOW permission automatically, and + * then updated past api 23, and the app does not satisfy any of the other SAW permission flags, + * the permission should be revoked. + * + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeSystemAlertWindowIfUpgradedPast23( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage, + @NonNull PermissionCallback permissionCallback) { + if (oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.M + || newPackage.getTargetSdkVersion() < Build.VERSION_CODES.M + || !newPackage.getRequestedPermissions() + .contains(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + return; + } + + BasePermission saw; + synchronized (mLock) { + saw = mSettings.getPermissionLocked(Manifest.permission.SYSTEM_ALERT_WINDOW); + } + final PackageSetting ps = (PackageSetting) + mPackageManagerInt.getPackageSetting(newPackage.getPackageName()); + if (grantSignaturePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, newPackage, ps, saw, + ps.getPermissionsState())) { + return; + } + for (int userId : mUserManagerInt.getUserIds()) { + try { + revokePermissionFromPackageForUser(newPackage.getPackageName(), + Manifest.permission.SYSTEM_ALERT_WINDOW, false, userId, permissionCallback); + } catch (IllegalStateException | SecurityException e) { + Log.e(TAG, "unable to revoke SYSTEM_ALERT_WINDOW for " + + newPackage.getPackageName() + " user " + userId, e); + } + } + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4789,24 +4829,20 @@ public class PermissionManagerService extends IPermissionManager.Stub { return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId); } /** - * If the app is updated, and has scoped storage permissions, then it is possible that the - * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * If the app is updated, then some checks need to be performed to ensure the + * package is not attempting to expoit permission changes across API boundaries. * @param newPackage The new package that was installed * @param oldPackage The old package that was updated + * @param allPackageNames The current packages in the system */ - public void revokeStoragePermissionsIfScopeExpanded( - @NonNull AndroidPackage newPackage, - @NonNull AndroidPackage oldPackage - ) { - PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, - oldPackage, mDefaultPermissionCallback); - } - - @Override - public void revokeRuntimePermissionsIfGroupChanged( + public void onPackageUpdated( @NonNull AndroidPackage newPackage, @NonNull AndroidPackage oldPackage, @NonNull ArrayList allPackageNames) { + PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, + oldPackage, mDefaultPermissionCallback); + PermissionManagerService.this.revokeSystemAlertWindowIfUpgradedPast23(newPackage, + oldPackage, mDefaultPermissionCallback); PermissionManagerService.this.revokeRuntimePermissionsIfGroupChanged(newPackage, oldPackage, allPackageNames, mDefaultPermissionCallback); } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index df0edfa16924..7003c7a2027e 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -239,16 +239,14 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void resetRuntimePermissions(@NonNull AndroidPackage pkg, @UserIdInt int userId); - /** - * We might auto-grant permissions if any permission of the group is already granted. Hence if - * the group of a granted permission changes we need to revoke it to avoid having permissions of - * the new group auto-granted. - * - * @param newPackage The new package that was installed - * @param oldPackage The old package that was updated - * @param allPackageNames All packages - */ - public abstract void revokeRuntimePermissionsIfGroupChanged( + /** + * If the app is updated, then some checks need to be performed to ensure the package is not + * attempting to expoit permission changes across API boundaries. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + * @param allPackageNames The current packages in the system + */ + public abstract void onPackageUpdated( @NonNull AndroidPackage newPackage, @NonNull AndroidPackage oldPackage, @NonNull ArrayList allPackageNames); @@ -265,17 +263,6 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager @NonNull List permissionsToRevoke, @NonNull ArrayList allPackageNames); - /** - * If the app is updated, and has scoped storage permissions, then it is possible that the - * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. - * @param newPackage The new package that was installed - * @param oldPackage The old package that was updated - */ - public abstract void revokeStoragePermissionsIfScopeExpanded( - @NonNull AndroidPackage newPackage, - @NonNull AndroidPackage oldPackage - ); - /** * Add all permissions in the given package. *

    -- cgit v1.2.3 From 1691b54b1fda4239249a3871d2c17ed1ec753061 Mon Sep 17 00:00:00 2001 From: Khoa Hong Date: Fri, 23 Sep 2022 17:05:39 +0800 Subject: Add protections against queueing a UsbRequest when the underlying UsbDeviceConnection is closed. Bug: 204584366 Test: CTS Verifier: USB Accessory Test & USB Device Test Test: No HWASan use-after-free reports with a test app Change-Id: Ia3a9b10349efc0236b1539c81465f479cb32e02b --- .../android/hardware/usb/UsbDeviceConnection.java | 28 +++++++++ core/java/android/hardware/usb/UsbRequest.java | 68 ++++++++++++++++++---- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java index 53a5785f7c76..23f4c6301ec1 100644 --- a/core/java/android/hardware/usb/UsbDeviceConnection.java +++ b/core/java/android/hardware/usb/UsbDeviceConnection.java @@ -107,6 +107,34 @@ public class UsbDeviceConnection { } } + /** + * This is meant to be called by UsbRequest's queue() in order to synchronize on + * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. + */ + /* package */ boolean queueRequest(UsbRequest request, ByteBuffer buffer, int length) { + synchronized (mLock) { + if (!isOpen()) { + return false; + } + + return request.queueIfConnectionOpen(buffer, length); + } + } + + /** + * This is meant to be called by UsbRequest's queue() in order to synchronize on + * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. + */ + /* package */ boolean queueRequest(UsbRequest request, @Nullable ByteBuffer buffer) { + synchronized (mLock) { + if (!isOpen()) { + return false; + } + + return request.queueIfConnectionOpen(buffer); + } + } + /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. diff --git a/core/java/android/hardware/usb/UsbRequest.java b/core/java/android/hardware/usb/UsbRequest.java index 473df712e3f9..c5573214048c 100644 --- a/core/java/android/hardware/usb/UsbRequest.java +++ b/core/java/android/hardware/usb/UsbRequest.java @@ -113,11 +113,13 @@ public class UsbRequest { * Releases all resources related to this request. */ public void close() { - if (mNativeContext != 0) { - mEndpoint = null; - mConnection = null; - native_close(); - mCloseGuard.close(); + synchronized (mLock) { + if (mNativeContext != 0) { + mEndpoint = null; + mConnection = null; + native_close(); + mCloseGuard.close(); + } } } @@ -191,10 +193,32 @@ public class UsbRequest { */ @Deprecated public boolean queue(ByteBuffer buffer, int length) { + UsbDeviceConnection connection = mConnection; + if (connection == null) { + // The expected exception by CTS Verifier - USB Device test + throw new NullPointerException("invalid connection"); + } + + // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent + // the connection being closed while queueing. + return connection.queueRequest(this, buffer, length); + } + + /** + * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over + * there, to prevent the connection being closed while queueing. + */ + /* package */ boolean queueIfConnectionOpen(ByteBuffer buffer, int length) { + UsbDeviceConnection connection = mConnection; + if (connection == null || !connection.isOpen()) { + // The expected exception by CTS Verifier - USB Device test + throw new NullPointerException("invalid connection"); + } + boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); boolean result; - if (mConnection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P + if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P && length > MAX_USBFS_BUFFER_SIZE) { length = MAX_USBFS_BUFFER_SIZE; } @@ -243,6 +267,28 @@ public class UsbRequest { * @return true if the queueing operation succeeded */ public boolean queue(@Nullable ByteBuffer buffer) { + UsbDeviceConnection connection = mConnection; + if (connection == null) { + // The expected exception by CTS Verifier - USB Device test + throw new IllegalStateException("invalid connection"); + } + + // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent + // the connection being closed while queueing. + return connection.queueRequest(this, buffer); + } + + /** + * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over + * there, to prevent the connection being closed while queueing. + */ + /* package */ boolean queueIfConnectionOpen(@Nullable ByteBuffer buffer) { + UsbDeviceConnection connection = mConnection; + if (connection == null || !connection.isOpen()) { + // The expected exception by CTS Verifier - USB Device test + throw new IllegalStateException("invalid connection"); + } + // Request need to be initialized Preconditions.checkState(mNativeContext != 0, "request is not initialized"); @@ -260,7 +306,7 @@ public class UsbRequest { mIsUsingNewQueue = true; wasQueued = native_queue(null, 0, 0); } else { - if (mConnection.getContext().getApplicationInfo().targetSdkVersion + if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P) { // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE, @@ -363,11 +409,12 @@ public class UsbRequest { * @return true if cancelling succeeded */ public boolean cancel() { - if (mConnection == null) { + UsbDeviceConnection connection = mConnection; + if (connection == null) { return false; } - return mConnection.cancelRequest(this); + return connection.cancelRequest(this); } /** @@ -382,7 +429,8 @@ public class UsbRequest { * @return true if cancelling succeeded. */ /* package */ boolean cancelIfOpen() { - if (mNativeContext == 0 || (mConnection != null && !mConnection.isOpen())) { + UsbDeviceConnection connection = mConnection; + if (mNativeContext == 0 || (connection != null && !connection.isOpen())) { Log.w(TAG, "Detected attempt to cancel a request on a connection which isn't open"); return false; -- cgit v1.2.3 From 7a8d56b2fe3496f7717ad1afe45d2ef523b7e252 Mon Sep 17 00:00:00 2001 From: Khoa Hong Date: Wed, 19 Oct 2022 16:29:18 +0800 Subject: [RESTRICT AUTOMERGE] Add protections agains use-after-free issues if cancel() or queue() is called after a device connection has been closed. This is a backport of ag/7528082 and ag/20033068. Bug: 132319116 Bug: 130571162 Bug: 204584366 Test: CTS Verifier: USB Accessory Test & USB Device Test Change-Id: I952ab566e26a808997e362dc85ebd1d8eb4574b9 --- .../android/hardware/usb/UsbDeviceConnection.java | 71 ++++++++++++++++-- core/java/android/hardware/usb/UsbRequest.java | 86 ++++++++++++++++++++-- 2 files changed, 143 insertions(+), 14 deletions(-) diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java index 71297c187e5c..5c7a1b0aea3b 100644 --- a/core/java/android/hardware/usb/UsbDeviceConnection.java +++ b/core/java/android/hardware/usb/UsbDeviceConnection.java @@ -52,6 +52,8 @@ public class UsbDeviceConnection { private final CloseGuard mCloseGuard = CloseGuard.get(); + private final Object mLock = new Object(); + /** * UsbDevice should only be instantiated by UsbService implementation * @hide @@ -62,13 +64,23 @@ public class UsbDeviceConnection { /* package */ boolean open(String name, ParcelFileDescriptor pfd, @NonNull Context context) { mContext = context.getApplicationContext(); - boolean wasOpened = native_open(name, pfd.getFileDescriptor()); - if (wasOpened) { - mCloseGuard.open("close"); + synchronized (mLock) { + boolean wasOpened = native_open(name, pfd.getFileDescriptor()); + + if (wasOpened) { + mCloseGuard.open("close"); + } + + return wasOpened; } + } - return wasOpened; + /*** + * @return If this connection is currently open and usable. + */ + boolean isOpen() { + return mNativeContext != 0; } /** @@ -80,6 +92,49 @@ public class UsbDeviceConnection { return mContext; } + /** + * Cancel a request which relates to this connection. + * + * @return true if the request was successfully cancelled. + */ + /* package */ boolean cancelRequest(UsbRequest request) { + synchronized (mLock) { + if (!isOpen()) { + return false; + } + + return request.cancelIfOpen(); + } + } + + /** + * This is meant to be called by UsbRequest's queue() in order to synchronize on + * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. + */ + /* package */ boolean queueRequest(UsbRequest request, ByteBuffer buffer, int length) { + synchronized (mLock) { + if (!isOpen()) { + return false; + } + + return request.queueIfConnectionOpen(buffer, length); + } + } + + /** + * This is meant to be called by UsbRequest's queue() in order to synchronize on + * UsbDeviceConnection's mLock to prevent the connection being closed while queueing. + */ + /* package */ boolean queueRequest(UsbRequest request, @Nullable ByteBuffer buffer) { + synchronized (mLock) { + if (!isOpen()) { + return false; + } + + return request.queueIfConnectionOpen(buffer); + } + } + /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. @@ -87,9 +142,11 @@ public class UsbDeviceConnection { * to retrieve a new instance to reestablish communication with the device. */ public void close() { - if (mNativeContext != 0) { - native_close(); - mCloseGuard.close(); + synchronized (mLock) { + if (isOpen()) { + native_close(); + mCloseGuard.close(); + } } } diff --git a/core/java/android/hardware/usb/UsbRequest.java b/core/java/android/hardware/usb/UsbRequest.java index 7abf3e9bcc7a..11c9d06cd7fe 100644 --- a/core/java/android/hardware/usb/UsbRequest.java +++ b/core/java/android/hardware/usb/UsbRequest.java @@ -112,11 +112,13 @@ public class UsbRequest { * Releases all resources related to this request. */ public void close() { - if (mNativeContext != 0) { - mEndpoint = null; - mConnection = null; - native_close(); - mCloseGuard.close(); + synchronized (mLock) { + if (mNativeContext != 0) { + mEndpoint = null; + mConnection = null; + native_close(); + mCloseGuard.close(); + } } } @@ -190,10 +192,32 @@ public class UsbRequest { */ @Deprecated public boolean queue(ByteBuffer buffer, int length) { + UsbDeviceConnection connection = mConnection; + if (connection == null) { + // The expected exception by CTS Verifier - USB Device test + throw new NullPointerException("invalid connection"); + } + + // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent + // the connection being closed while queueing. + return connection.queueRequest(this, buffer, length); + } + + /** + * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over + * there, to prevent the connection being closed while queueing. + */ + /* package */ boolean queueIfConnectionOpen(ByteBuffer buffer, int length) { + UsbDeviceConnection connection = mConnection; + if (connection == null || !connection.isOpen()) { + // The expected exception by CTS Verifier - USB Device test + throw new NullPointerException("invalid connection"); + } + boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); boolean result; - if (mConnection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P + if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P && length > MAX_USBFS_BUFFER_SIZE) { length = MAX_USBFS_BUFFER_SIZE; } @@ -242,6 +266,28 @@ public class UsbRequest { * @return true if the queueing operation succeeded */ public boolean queue(@Nullable ByteBuffer buffer) { + UsbDeviceConnection connection = mConnection; + if (connection == null) { + // The expected exception by CTS Verifier - USB Device test + throw new IllegalStateException("invalid connection"); + } + + // Calling into the underlying UsbDeviceConnection to synchronize on its lock, to prevent + // the connection being closed while queueing. + return connection.queueRequest(this, buffer); + } + + /** + * This is meant to be called from UsbDeviceConnection after synchronizing using the lock over + * there, to prevent the connection being closed while queueing. + */ + /* package */ boolean queueIfConnectionOpen(@Nullable ByteBuffer buffer) { + UsbDeviceConnection connection = mConnection; + if (connection == null || !connection.isOpen()) { + // The expected exception by CTS Verifier - USB Device test + throw new IllegalStateException("invalid connection"); + } + // Request need to be initialized Preconditions.checkState(mNativeContext != 0, "request is not initialized"); @@ -259,7 +305,7 @@ public class UsbRequest { mIsUsingNewQueue = true; wasQueued = native_queue(null, 0, 0); } else { - if (mConnection.getContext().getApplicationInfo().targetSdkVersion + if (connection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P) { // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE, @@ -362,6 +408,32 @@ public class UsbRequest { * @return true if cancelling succeeded */ public boolean cancel() { + UsbDeviceConnection connection = mConnection; + if (connection == null) { + return false; + } + + return connection.cancelRequest(this); + } + + /** + * Cancels a pending queue operation (for use when the UsbDeviceConnection associated + * with this request is synchronized). This ensures we don't have a race where the + * device is closed and then the request is canceled which would lead to a + * use-after-free because the cancel operation uses the device connection + * information freed in the when UsbDeviceConnection is closed.
    + * + * This method assumes the connected is not closed while this method is executed. + * + * @return true if cancelling succeeded. + */ + /* package */ boolean cancelIfOpen() { + UsbDeviceConnection connection = mConnection; + if (mNativeContext == 0 || (connection != null && !connection.isOpen())) { + Log.w(TAG, + "Detected attempt to cancel a request on a connection which isn't open"); + return false; + } return native_cancel(); } -- cgit v1.2.3 From d85a42821075ad80b931d904bdc9c1d4c3129456 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 17 Aug 2022 09:37:18 -0700 Subject: [SettingsProvider] mem limit should be checked before settings are updated Previously, a setting is updated before the memory usage limit check, which can be exploited by malicious apps and cause OoM DoS. This CL changes the logic to checkMemLimit -> update -> updateMemUsage. BUG: 239415861 Test: atest com.android.providers.settings.SettingsStateTest (cherry picked from commit 8eeb92950f4a7012d4cf282106a1418fd211f475) Merged-In: I20551a2dba9aa79efa0c064824f349f551c2c2e4 Change-Id: I20551a2dba9aa79efa0c064824f349f551c2c2e4 --- packages/SettingsProvider/Android.bp | 5 +- .../android/providers/settings/SettingsState.java | 75 ++++++++++++++-------- .../providers/settings/SettingsStateTest.java | 43 ++++++++++++- 3 files changed, 94 insertions(+), 29 deletions(-) diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp index 1c97fc37cf50..825a0bd98aff 100644 --- a/packages/SettingsProvider/Android.bp +++ b/packages/SettingsProvider/Android.bp @@ -24,7 +24,10 @@ android_test { "src/com/android/providers/settings/SettingsState.java", "src/com/android/providers/settings/SettingsHelper.java", ], - static_libs: ["androidx.test.rules"], + static_libs: [ + "androidx.test.rules", + "truth-prebuilt", + ], libs: ["android.test.base"], resource_dirs: ["res"], aaptflags: [ diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index c05c4cdf72d7..6b7d559be435 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -367,9 +367,11 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - mSettings.put(name, newSetting); - updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); scheduleWriteIfNeededLocked(); } } @@ -392,6 +394,12 @@ final class SettingsState { Setting oldState = mSettings.get(name); String oldValue = (oldState != null) ? oldState.value : null; String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; + String newDefaultValue = makeDefault ? value : oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, + oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(packageName, newSize); + Setting newState; if (oldState != null) { @@ -409,8 +417,7 @@ final class SettingsState { addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState); - updateMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newState.getDefaultValue()); + updateMemoryUsagePerPackageLocked(packageName, newSize); scheduleWriteIfNeededLocked(); @@ -431,13 +438,14 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, + null, oldState.defaultValue, null); StatsLog.write(StatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), StatsLog.SETTING_CHANGED__REASON__DELETED); - updateMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + updateMemoryUsagePerPackageLocked(oldState.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_DELETE, oldState); @@ -458,16 +466,18 @@ final class SettingsState { Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); + String newValue = oldDefaultValue; + String newDefaultValue = oldDefaultValue; + + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, + newValue, oldDefaultValue, newDefaultValue); + checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { return false; } - String newValue = setting.getValue(); - String newDefaultValue = setting.getDefaultValue(); - - updateMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + updateMemoryUsagePerPackageLocked(setting.packageName, newSize); addHistoricalOperationLocked(HISTORICAL_OPERATION_RESET, oldSetting); @@ -575,38 +585,49 @@ final class SettingsState { } @GuardedBy("mLock") - private void updateMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { - if (mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED) { - return; - } + private boolean isExemptFromMemoryUsageCap(String packageName) { + return mMaxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_UNLIMITED + || SYSTEM_PACKAGE_NAME.equals(packageName); + } - if (SYSTEM_PACKAGE_NAME.equals(packageName)) { + @GuardedBy("mLock") + private void checkNewMemoryUsagePerPackageLocked(String packageName, int newSize) + throws IllegalStateException { + if (isExemptFromMemoryUsageCap(packageName)) { return; } + if (newSize > mMaxBytesPerAppPackage) { + throw new IllegalStateException("You are adding too many system settings. " + + "You should stop using system settings for app specific data" + + " package: " + packageName); + } + } + @GuardedBy("mLock") + private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, + String newValue, String oldDefaultValue, String newDefaultValue) { + if (isExemptFromMemoryUsageCap(packageName)) { + return 0; + } + final Integer currentSize = mPackageToMemoryUsage.get(packageName); final int oldValueSize = (oldValue != null) ? oldValue.length() : 0; final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; final int deltaSize = newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; + return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); + } - Integer currentSize = mPackageToMemoryUsage.get(packageName); - final int newSize = Math.max((currentSize != null) - ? currentSize + deltaSize : deltaSize, 0); - - if (newSize > mMaxBytesPerAppPackage) { - throw new IllegalStateException("You are adding too many system settings. " - + "You should stop using system settings for app specific data" - + " package: " + packageName); + @GuardedBy("mLock") + private void updateMemoryUsagePerPackageLocked(String packageName, int newSize) { + if (isExemptFromMemoryUsageCap(packageName)) { + return; } - if (DEBUG) { Slog.i(LOG_TAG, "Settings for package: " + packageName + " size: " + newSize + " bytes."); } - mPackageToMemoryUsage.put(packageName, newSize); } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 3f68554ffe87..6f45adef91f7 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -21,6 +21,8 @@ import android.util.Xml; import org.xmlpull.v1.XmlSerializer; +import com.google.common.base.Strings; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -46,7 +48,6 @@ public class SettingsStateTest extends AndroidTestCase { "\uD800ab\uDC00 " + // broken surrogate pairs "日本語"; - public void testIsBinary() { assertFalse(SettingsState.isBinary(" abc 日本語")); @@ -182,4 +183,44 @@ public class SettingsStateTest extends AndroidTestCase { assertEquals("p2", s.getPackageName()); } } + + public void testInsertSetting_memoryUsage() { + final Object lock = new Object(); + final File file = new File(getContext().getCacheDir(), "setting.xml"); + final String settingName = "test_setting"; + + SettingsState settingsState = new SettingsState(getContext(), lock, file, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); + // No exception should be thrown when there is no cap + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 20001), + null, false, "p1"); + settingsState.deleteSettingLocked(settingName); + + settingsState = new SettingsState(getContext(), lock, file, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + // System package doesn't have memory usage limit + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 20001), + null, false, "android"); + settingsState.deleteSettingLocked(settingName); + + // Should not throw if usage is under the cap + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 19999), + null, false, "p1"); + settingsState.deleteSettingLocked(settingName); + try { + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + try { + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 20001), + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("p1")); + } + assertTrue(settingsState.getSettingLocked(settingName).isNull()); + } } -- cgit v1.2.3 From 1d86c8b29922525972559e00e26c1fcd6f496353 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 22 Sep 2022 15:23:24 -0700 Subject: RESTRICT AUTOMERGE Validate permission tree size on permission update Bug: 242537498 Test: manual Change-Id: I15343e84c1802d6b89249106263319a6539fa73b --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2662f620cbd4..d867adb961e6 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -657,8 +657,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { Permission bp = mRegistry.getPermission(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new Permission(info.name, tree.getPackageName(), Permission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { throw new SecurityException("Not allowed to modify non-dynamic permission " -- cgit v1.2.3 From 90e7b4cc40a51bad7d26809fc4c0662e5a129ec7 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 22 Sep 2022 15:23:24 -0700 Subject: RESTRICT AUTOMERGE Validate permission tree size on permission update Bug: 242537498 Test: manual Change-Id: I15343e84c1802d6b89249106263319a6539fa73b --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2662f620cbd4..d867adb961e6 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -657,8 +657,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { Permission bp = mRegistry.getPermission(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new Permission(info.name, tree.getPackageName(), Permission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { throw new SecurityException("Not allowed to modify non-dynamic permission " -- cgit v1.2.3 From 973c67f7fc5d1321ff38e861dfe256a2877af5f0 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 22 Sep 2022 15:23:24 -0700 Subject: RESTRICT AUTOMERGE Validate permission tree size on permission update Bug: 242537498 Test: atest PermissionMemoryFootprintTest Change-Id: I15343e84c1802d6b89249106263319a6539fa73b --- .../com/android/server/pm/permission/PermissionManagerServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 1e13333c1ce0..443002df2b02 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -644,8 +644,8 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt Permission bp = mRegistry.getPermission(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new Permission(info.name, tree.getPackageName(), Permission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { throw new SecurityException("Not allowed to modify non-dynamic permission " -- cgit v1.2.3 From 17df433a3d96fb6c00dc7078fd0f8048645ace6a Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 28 Sep 2022 06:46:29 +0000 Subject: [RESTRICT AUTOMERGE] Trim the activity info of another uid if no privilege The activity info could be from another uid which is different from the app that hosts the task. The information should be trimmed if the caller app doesn't have the privilege. Bug: 243130512 Test: verified locally Test: atest RecentTasksTest Change-Id: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 (cherry picked from commit 401e782b244bf84fd5aab371f60c2e52d6226fb3) --- .../java/com/android/server/wm/AppTaskImpl.java | 2 +- .../java/com/android/server/wm/RecentTasks.java | 8 ++++++-- .../java/com/android/server/wm/RunningTasks.java | 4 ++++ services/core/java/com/android/server/wm/Task.java | 21 +++++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index dd1d55b2d54d..2fd5963d653b 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -84,7 +84,7 @@ class AppTaskImpl extends IAppTask.Stub { throw new IllegalArgumentException("Unable to find task ID " + mTaskId); } return mService.getRecentTasks().createRecentTaskInfo(task, - false /* stripExtras */); + false /* stripExtras */, true /* getTasksAllowed */); } finally { Binder.restoreCallingIdentity(origId); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 851b533a550d..3a963e750b1c 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -961,7 +961,7 @@ class RecentTasks { continue; } - res.add(createRecentTaskInfo(task, true /* stripExtras */)); + res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed)); } return res; } @@ -1833,12 +1833,16 @@ class RecentTasks { /** * Creates a new RecentTaskInfo from a Task. */ - ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras) { + ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras, + boolean getTasksAllowed) { ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); tr.fillTaskInfo(rti, stripExtras); // Fill in some deprecated values rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; rti.persistentId = rti.taskId; + if (!getTasksAllowed) { + Task.trimIneffectiveInfo(tr, rti); + } return rti; } diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 3509ba72d058..3c7917bb05d1 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -129,6 +129,10 @@ class RunningTasks { final RunningTaskInfo rti = task.getTaskInfo(); // Fill in some deprecated values rti.id = rti.taskId; + + if (!mAllowed) { + Task.trimIneffectiveInfo(task, rti); + } return rti; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 4b4e936c73c1..d4c4c76c9b62 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3631,6 +3631,27 @@ class Task extends WindowContainer { : null; } + /** + * Removes the activity info if the activity belongs to a different uid, which is + * different from the app that hosts the task. + */ + static void trimIneffectiveInfo(Task task, TaskInfo info) { + final ActivityRecord baseActivity = task.getActivity(r -> !r.finishing, + false /* traverseTopToBottom */); + final int baseActivityUid = + baseActivity != null ? baseActivity.getUid() : task.effectiveUid; + + if (info.topActivityInfo != null + && task.effectiveUid != info.topActivityInfo.applicationInfo.uid) { + info.topActivity = null; + info.topActivityInfo = null; + } + + if (task.effectiveUid != baseActivityUid) { + info.baseActivity = null; + } + } + /** * Returns a {@link TaskInfo} with information from this task. */ -- cgit v1.2.3 From 9c19841384859da7c67a192c3412b82f7f8e0881 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 28 Sep 2022 06:46:29 +0000 Subject: [RESTRICT AUTOMERGE] Trim the activity info of another uid if no privilege The activity info could be from another uid which is different from the app that hosts the task. The information should be trimmed if the caller app doesn't have the privilege. Bug: 243130512 Test: verified locally Test: atest RecentTasksTest Change-Id: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 (cherry picked from commit 401e782b244bf84fd5aab371f60c2e52d6226fb3) --- .../java/com/android/server/wm/AppTaskImpl.java | 3 +- .../java/com/android/server/wm/RecentTasks.java | 7 +++-- .../java/com/android/server/wm/RunningTasks.java | 8 +++-- .../java/com/android/server/wm/TaskRecord.java | 34 ++++++++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index 1eb7455135c7..900b59e0a8a2 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -84,7 +84,8 @@ class AppTaskImpl extends IAppTask.Stub { if (tr == null) { throw new IllegalArgumentException("Unable to find task ID " + mTaskId); } - return mService.getRecentTasks().createRecentTaskInfo(tr); + return mService.getRecentTasks().createRecentTaskInfo(tr, + true /* getTasksAllowed */); } finally { Binder.restoreCallingIdentity(origId); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 541a8bbc8865..56367f42886d 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -944,7 +944,7 @@ class RecentTasks { continue; } - final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr); + final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr, getTasksAllowed); if (!getDetailedTasks) { rti.baseIntent.replaceExtras((Bundle) null); } @@ -1715,12 +1715,15 @@ class RecentTasks { /** * Creates a new RecentTaskInfo from a TaskRecord. */ - ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr) { + ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr, boolean getTasksAllowed) { ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); tr.fillTaskInfo(rti); // Fill in some deprecated values rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; rti.persistentId = rti.taskId; + if (!getTasksAllowed) { + TaskRecord.trimIneffectiveInfo(tr, rti); + } return rti; } diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 3bf437d38bcc..20cb336a3030 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -68,7 +68,7 @@ class RunningTasks { } final TaskRecord task = iter.next(); - list.add(createRunningTaskInfo(task)); + list.add(createRunningTaskInfo(task, allowed)); maxNum--; } } @@ -76,11 +76,15 @@ class RunningTasks { /** * Constructs a {@link RunningTaskInfo} from a given {@param task}. */ - private RunningTaskInfo createRunningTaskInfo(TaskRecord task) { + private RunningTaskInfo createRunningTaskInfo(TaskRecord task, boolean allowed) { final RunningTaskInfo rti = new RunningTaskInfo(); task.fillTaskInfo(rti); // Fill in some deprecated values rti.id = rti.taskId; + + if (!allowed) { + TaskRecord.trimIneffectiveInfo(task, rti); + } return rti; } } diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 361f66e3106a..9de4c8121e4d 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -2436,6 +2436,40 @@ class TaskRecord extends ConfigurationContainer { info.configuration.setTo(getConfiguration()); } + /** + * Removes the activity info if the activity belongs to a different uid, which is + * different from the app that hosts the task. + */ + static void trimIneffectiveInfo(TaskRecord task, TaskInfo info) { + int topActivityUid = task.effectiveUid; + for (int i = task.mActivities.size() - 1; i >= 0; --i) { + final ActivityRecord r = task.mActivities.get(i); + if (r.finishing || r.isState(ActivityState.INITIALIZING)) { + continue; + } + topActivityUid = r.info.applicationInfo.uid; + break; + } + + if (task.effectiveUid != topActivityUid) { + info.topActivity = null; + } + + int baseActivityUid = task.effectiveUid; + for (int i = 0; i < task.mActivities.size(); ++i) { + final ActivityRecord r = task.mActivities.get(i); + if (r.finishing) { + continue; + } + baseActivityUid = r.info.applicationInfo.uid; + break; + } + + if (task.effectiveUid != baseActivityUid) { + info.baseActivity = null; + } + } + /** * Returns a {@link TaskInfo} with information from this task. */ -- cgit v1.2.3 From 963e45f0f596b5ae00bbf9954750bde9a7e23c2f Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Fri, 7 Oct 2022 19:54:52 +0000 Subject: docs: Update WRITE_EXTERNAL_STORAGE explanation Clarify that this permission has no effect when an app's target SDK version is 29 or higher. Bug: 251860134 Change-Id: I8adbc86976273d07b0698e4810bae59ddcbbbb6d Test: built docs using go/abtd --- core/res/AndroidManifest.xml | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index bc29e1995714..4ca481b64e45 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1134,7 +1134,28 @@ android:protectionLevel="dangerous" /> Date: Thu, 20 Oct 2022 16:18:19 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Icbe6830ccfefeb63ab12efea6d667b468e007f0e --- core/res/res/values-es-rUS/strings.xml | 4 ++-- core/res/res/values-hi/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5c0ef1303260..1dba09497a9c 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1960,8 +1960,8 @@ "Presiona para ver archivos" "Fijar" "Fijar %1$s" - "No fijar" - "No fijar %1$s" + "Dejar de fijar" + "Dejar de fijar %1$s" "Información de apps" "−%1$s" "Iniciando demostración…" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index e315f548b402..c77b8390fa35 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1130,7 +1130,7 @@ "कॉपी करें" "क्लिपबोर्ड पर कॉपी नहीं हो सका" "चिपकाएं" - "सादे पाठ के रूप में चिपकाएं" + "सादे टेक्स्ट के रूप में चिपकाएं" "बदलें•" "मिटाएं" "यूआरएल को कॉपी करें" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8a3ef03361a8..536359f56bbd 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -252,7 +252,7 @@ "현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다." "대화형 보고서" "대부분의 경우 이 옵션을 사용합니다. 신고 진행 상황을 추적하고 문제에 대한 세부정보를 입력하고 스크린샷을 찍을 수 있습니다. 신고하기에 시간이 너무 오래 걸리고 사용 빈도가 낮은 일부 섹션을 생략할 수 있습니다." - "전체 보고서" + "전체 신고" "기기가 응답하지 않거나 너무 느리거나 모든 보고서 섹션이 필요한 경우 이 옵션을 사용하여 시스템 방해를 최소화합니다. 세부정보를 추가하거나 스크린샷을 추가로 찍을 수 없습니다." "{count,plural, =1{버그 신고 스크린샷을 #초 후에 찍습니다.}other{버그 신고 스크린샷을 #초 후에 찍습니다.}}" "버그 신고용 스크린샷 촬영 완료" -- cgit v1.2.3 From b01460d5d3d241b54adad94b83248f8326a70f8a Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 28 Sep 2022 06:46:29 +0000 Subject: Trim the activity info of another uid if no privilege The activity info could be from another uid which is different from the app that hosts the task. The information should be trimmed if the caller app doesn't have the privilege. Bug: 243130512 Test: verified locally Test: atest RecentTasksTest Change-Id: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 Merged-In: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 --- .../java/com/android/server/wm/AppTaskImpl.java | 2 +- .../java/com/android/server/wm/RecentTasks.java | 8 +++++-- .../java/com/android/server/wm/RunningTasks.java | 4 ++++ services/core/java/com/android/server/wm/Task.java | 21 +++++++++++++++++ .../src/com/android/server/wm/RecentTasksTest.java | 27 ++++++++++++++++++---- 5 files changed, 54 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index e80c2607a0ad..0bfc48b4b54c 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -98,7 +98,7 @@ class AppTaskImpl extends IAppTask.Stub { throw new IllegalArgumentException("Unable to find task ID " + mTaskId); } return mService.getRecentTasks().createRecentTaskInfo(task, - false /* stripExtras */); + false /* stripExtras */, true /* getTasksAllowed */); } finally { Binder.restoreCallingIdentity(origId); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 4860762a5f7f..1fc061b2ca78 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -976,7 +976,7 @@ class RecentTasks { continue; } - res.add(createRecentTaskInfo(task, true /* stripExtras */)); + res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed)); } return res; } @@ -1895,7 +1895,8 @@ class RecentTasks { /** * Creates a new RecentTaskInfo from a Task. */ - ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras) { + ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras, + boolean getTasksAllowed) { final ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); // If the recent Task is detached, we consider it will be re-attached to the default // TaskDisplayArea because we currently only support recent overview in the default TDA. @@ -1907,6 +1908,9 @@ class RecentTasks { rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; rti.persistentId = rti.taskId; rti.lastSnapshotData.set(tr.mLastTaskSnapshotData); + if (!getTasksAllowed) { + Task.trimIneffectiveInfo(tr, rti); + } // Fill in organized child task info for the task created by organizer. if (tr.mCreatedByOrganizer) { diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 1ec191ed7c05..6cc36abaa6cd 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -142,6 +142,10 @@ class RunningTasks { task.fillTaskInfo(rti, !mKeepIntentExtra); // Fill in some deprecated values rti.id = rti.taskId; + + if (!mAllowed) { + Task.trimIneffectiveInfo(task, rti); + } return rti; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 888dc3aee86a..78fe6e293525 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3476,6 +3476,27 @@ class Task extends TaskFragment { info.mTopActivityLocusId = topRecord != null ? topRecord.getLocusId() : null; } + /** + * Removes the activity info if the activity belongs to a different uid, which is + * different from the app that hosts the task. + */ + static void trimIneffectiveInfo(Task task, TaskInfo info) { + final ActivityRecord baseActivity = task.getActivity(r -> !r.finishing, + false /* traverseTopToBottom */); + final int baseActivityUid = + baseActivity != null ? baseActivity.getUid() : task.effectiveUid; + + if (info.topActivityInfo != null + && task.effectiveUid != info.topActivityInfo.applicationInfo.uid) { + info.topActivity = null; + info.topActivityInfo = null; + } + + if (task.effectiveUid != baseActivityUid) { + info.baseActivity = null; + } + } + @Nullable PictureInPictureParams getPictureInPictureParams() { return getPictureInPictureParams(getTopMostTask()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index feb1c6fa6b5c..4f00817ca44d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -30,6 +30,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static android.os.Process.NOBODY_UID; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -1220,21 +1221,35 @@ public class RecentTasksTest extends WindowTestsBase { @Test public void testCreateRecentTaskInfo_detachedTask() { - final Task task = createTaskBuilder(".Task").setCreateActivity(true).build(); + final Task task = createTaskBuilder(".Task").build(); + new ActivityBuilder(mSupervisor.mService) + .setTask(task) + .setUid(NOBODY_UID) + .setComponent(new ComponentName("com.foo", ".BarActivity")) + .build(); final TaskDisplayArea tda = task.getDisplayArea(); assertTrue(task.isAttached()); assertTrue(task.supportsMultiWindow()); - RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true); + RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + false /* getTasksAllowed */); + + assertTrue(info.topActivity == null); + assertTrue(info.topActivityInfo == null); + assertTrue(info.baseActivity == null); + // The task can be put in split screen even if it is not attached now. task.removeImmediately(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); @@ -1244,7 +1259,8 @@ public class RecentTasksTest extends WindowTestsBase { doReturn(false).when(tda).supportsNonResizableMultiWindow(); doReturn(false).when(task).isResizeable(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertFalse(info.supportsMultiWindow); assertFalse(info.supportsSplitScreenMultiWindow); @@ -1253,7 +1269,8 @@ public class RecentTasksTest extends WindowTestsBase { // the device supports it. doReturn(true).when(tda).supportsNonResizableMultiWindow(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); -- cgit v1.2.3 From fa8d6362348738284b3f33a13e1fa5cdd0af67b2 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 28 Sep 2022 06:46:29 +0000 Subject: [RESTRICT AUTOMERGE] Trim the activity info of another uid if no privilege The activity info could be from another uid which is different from the app that hosts the task. The information should be trimmed if the caller app doesn't have the privilege. Bug: 243130512 Test: verified locally Test: atest RecentTasksTest Change-Id: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 Merged-In: Ia343ac70e5bb9aeae718fca6674e1ca491a14512 --- .../java/com/android/server/wm/AppTaskImpl.java | 2 +- .../java/com/android/server/wm/RecentTasks.java | 8 +++++-- .../java/com/android/server/wm/RunningTasks.java | 4 ++++ services/core/java/com/android/server/wm/Task.java | 21 +++++++++++++++++ .../src/com/android/server/wm/RecentTasksTest.java | 27 ++++++++++++++++++---- 5 files changed, 54 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index 7f0adcacc951..8195d4e88030 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -84,7 +84,7 @@ class AppTaskImpl extends IAppTask.Stub { throw new IllegalArgumentException("Unable to find task ID " + mTaskId); } return mService.getRecentTasks().createRecentTaskInfo(task, - false /* stripExtras */); + false /* stripExtras */, true /* getTasksAllowed */); } finally { Binder.restoreCallingIdentity(origId); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 455f568d7523..9726c2c838c6 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -974,7 +974,7 @@ class RecentTasks { continue; } - res.add(createRecentTaskInfo(task, true /* stripExtras */)); + res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed)); } return res; } @@ -1886,7 +1886,8 @@ class RecentTasks { /** * Creates a new RecentTaskInfo from a Task. */ - ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras) { + ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras, + boolean getTasksAllowed) { final ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); // If the recent Task is detached, we consider it will be re-attached to the default // TaskDisplayArea because we currently only support recent overview in the default TDA. @@ -1898,6 +1899,9 @@ class RecentTasks { rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; rti.persistentId = rti.taskId; rti.lastSnapshotData.set(tr.mLastTaskSnapshotData); + if (!getTasksAllowed) { + Task.trimIneffectiveInfo(tr, rti); + } // Fill in organized child task info for the task created by organizer. if (tr.mCreatedByOrganizer) { diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 7ba772c18455..bd201557e75f 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -137,6 +137,10 @@ class RunningTasks { task.fillTaskInfo(rti, !mKeepIntentExtra); // Fill in some deprecated values rti.id = rti.taskId; + + if (!mAllowed) { + Task.trimIneffectiveInfo(task, rti); + } return rti; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a88894e1da99..8da81cea9c22 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4156,6 +4156,27 @@ class Task extends WindowContainer { info.mTopActivityLocusId = topRecord != null ? topRecord.getLocusId() : null; } + /** + * Removes the activity info if the activity belongs to a different uid, which is + * different from the app that hosts the task. + */ + static void trimIneffectiveInfo(Task task, TaskInfo info) { + final ActivityRecord baseActivity = task.getActivity(r -> !r.finishing, + false /* traverseTopToBottom */); + final int baseActivityUid = + baseActivity != null ? baseActivity.getUid() : task.effectiveUid; + + if (info.topActivityInfo != null + && task.effectiveUid != info.topActivityInfo.applicationInfo.uid) { + info.topActivity = null; + info.topActivityInfo = null; + } + + if (task.effectiveUid != baseActivityUid) { + info.baseActivity = null; + } + } + @Nullable PictureInPictureParams getPictureInPictureParams() { return getPictureInPictureParams(getTopMostTask()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 5af68021b201..c40883bb69fc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -30,6 +30,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static android.os.Process.NOBODY_UID; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -1145,21 +1146,35 @@ public class RecentTasksTest extends WindowTestsBase { @Test public void testCreateRecentTaskInfo_detachedTask() { - final Task task = createTaskBuilder(".Task").setCreateActivity(true).build(); + final Task task = createTaskBuilder(".Task").build(); + new ActivityBuilder(mSupervisor.mService) + .setTask(task) + .setUid(NOBODY_UID) + .setComponent(new ComponentName("com.foo", ".BarActivity")) + .build(); final TaskDisplayArea tda = task.getDisplayArea(); assertTrue(task.isAttached()); assertTrue(task.supportsMultiWindow()); - RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true); + RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + false /* getTasksAllowed */); + + assertTrue(info.topActivity == null); + assertTrue(info.topActivityInfo == null); + assertTrue(info.baseActivity == null); + // The task can be put in split screen even if it is not attached now. task.removeImmediately(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); @@ -1169,7 +1184,8 @@ public class RecentTasksTest extends WindowTestsBase { doReturn(false).when(tda).supportsNonResizableMultiWindow(); doReturn(false).when(task).isResizeable(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertFalse(info.supportsMultiWindow); assertFalse(info.supportsSplitScreenMultiWindow); @@ -1178,7 +1194,8 @@ public class RecentTasksTest extends WindowTestsBase { // the device supports it. doReturn(true).when(tda).supportsNonResizableMultiWindow(); - info = mRecentTasks.createRecentTaskInfo(task, true); + info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, + true /* getTasksAllowed */); assertTrue(info.supportsMultiWindow); assertTrue(info.supportsSplitScreenMultiWindow); -- cgit v1.2.3 From 0123e873d2e5f4c88aaa6bdf2e287461903fa6e5 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 227fa9d0bdc4..e2beef0139bf 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -47,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FrameworkStatsLog; import libcore.io.IoUtils; @@ -375,8 +376,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -414,8 +415,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -559,8 +561,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -583,15 +589,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -725,8 +732,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -735,7 +742,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1556,4 +1563,11 @@ final class SettingsState { } return false; } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 66b809aeae30..f6d43292eafe 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -295,7 +295,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -313,5 +313,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From 15f6e85ab4ee8997d80ecd3d16bb60012ee493a1 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f7ca8b039633..c252db11eaf2 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -47,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; @@ -384,8 +385,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -423,8 +424,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -565,8 +567,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -589,15 +595,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -731,8 +738,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -741,7 +748,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1570,4 +1577,11 @@ final class SettingsState { return false; } } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index bf000cd8a22a..36b892def814 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -299,7 +299,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -317,5 +317,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From e5eac1c958d729fcd9d4c7cd77d5830091843e52 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f7ca8b039633..c252db11eaf2 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -47,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; @@ -384,8 +385,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -423,8 +424,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -565,8 +567,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -589,15 +595,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -731,8 +738,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -741,7 +748,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1570,4 +1577,11 @@ final class SettingsState { return false; } } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index bf000cd8a22a..36b892def814 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -299,7 +299,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -317,5 +317,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From bff32495de9e3452d6e2dc573136c5aa6f02743a Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 227fa9d0bdc4..e2beef0139bf 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -47,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FrameworkStatsLog; import libcore.io.IoUtils; @@ -375,8 +376,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -414,8 +415,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -559,8 +561,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -583,15 +589,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -725,8 +732,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -735,7 +742,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1556,4 +1563,11 @@ final class SettingsState { } return false; } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 66b809aeae30..f6d43292eafe 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -295,7 +295,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -313,5 +313,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From 75c1d6096c162fc37e6eca36f4e653072e463263 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 227fa9d0bdc4..e2beef0139bf 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -47,6 +47,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FrameworkStatsLog; import libcore.io.IoUtils; @@ -375,8 +376,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -414,8 +415,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -559,8 +561,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -583,15 +589,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -725,8 +732,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -735,7 +742,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1556,4 +1563,11 @@ final class SettingsState { } return false; } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 66b809aeae30..f6d43292eafe 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -295,7 +295,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -313,5 +313,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From 0bb3a6222adcfb5288a679871decd087cc75ff61 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 ++++++--- .../providers/settings/SettingsStateTest.java | 94 +++++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 528af2ec2528..cd667ca05f61 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -48,6 +48,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; @@ -376,8 +377,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -414,8 +415,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -559,8 +561,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -583,15 +589,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -725,8 +732,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -735,7 +742,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1577,4 +1584,11 @@ final class SettingsState { } return false; } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 66b809aeae30..f6d43292eafe 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -295,7 +295,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(SETTING_NAME); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(SETTING_NAME); try { @@ -313,5 +313,97 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String testKey1 = SETTING_NAME; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test inserting another key + final String testKey2 = SETTING_NAME + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test another package with a different key + final String testPackage2 = TEST_PACKAGE + "2"; + final String testKey3 = SETTING_NAME + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + TEST_PACKAGE); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); } } -- cgit v1.2.3 From 5f47170c9493ed59e335b1c65ca8863d981401e8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 20 Oct 2022 18:28:57 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2711dee2c7634db19fd90b92424706b9a4d71517 --- packages/SystemUI/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index c1bb69a7b68a..60d247b5bf8a 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -660,7 +660,7 @@ "沒有網際網路連線" "開啟「%s」設定。" "編輯設定順序。" - "電源按鈕選單" + "電源鍵選單" "第 %1$d 頁,共 %2$d 頁" "鎖定畫面" "手機先前過熱,因此關閉電源" -- cgit v1.2.3 From 84b3aebcd3b3cfd48505cf69191a706803ba5385 Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Fri, 21 Oct 2022 14:34:45 +0000 Subject: Revert "Enforce ComponentName belongs to caller app" This reverts commit 7319e40b37aba598e081b56095b7ed4e0a04396c. This revert was manually created from the patch in ag/19748522, but is not a revert created using the gerrit UI because of b/251778962. Reason for revert: b/241798893. Note: this fix is not the root cause of the breakage. It just exposes a previously unknown bug. See linked bug. Bug: 251778962 Bug: 241798893 Bug: 238177121 Test: atest CtsMediaBetterTogetherTestCases Change-Id: I01bda0f5bf343d73c480ad64b562dd0a2ee46e30 Merged-In: I01bda0f5bf343d73c480ad64b562dd0a2ee46e30 Merged-In: I2ec5fd036af1d35c6d3fe000ee41f3347f9aea41 --- .../server/media/MediaButtonReceiverHolder.java | 7 ------- .../com/android/server/media/MediaSessionRecord.java | 18 ------------------ 2 files changed, 25 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java index 6759d79eedca..9a190316f4eb 100644 --- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java +++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java @@ -32,7 +32,6 @@ import android.os.Handler; import android.os.PowerWhitelistManager; import android.os.UserHandle; import android.text.TextUtils; -import android.util.EventLog; import android.util.Log; import android.view.KeyEvent; @@ -118,12 +117,6 @@ final class MediaButtonReceiverHolder { int componentType = getComponentType(pendingIntent); ComponentName componentName = getComponentName(pendingIntent, componentType); if (componentName != null) { - if (!TextUtils.equals(componentName.getPackageName(), sessionPackageName)) { - EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging - throw new IllegalArgumentException("ComponentName does not belong to " - + "sessionPackageName. sessionPackageName = " + sessionPackageName - + ", ComponentName pkg = " + componentName.getPackageName()); - } return new MediaButtonReceiverHolder(userId, pendingIntent, componentName, componentType); } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index ca5e97c8aabe..4822d6a62ac7 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -53,7 +53,6 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.SystemClock; import android.text.TextUtils; -import android.util.EventLog; import android.util.Log; import android.view.KeyEvent; @@ -935,14 +934,6 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR @Override public void setMediaButtonReceiver(PendingIntent pi, String sessionPackageName) throws RemoteException { - //mPackageName has been verified in MediaSessionService.enforcePackageName(). - if (!TextUtils.equals(sessionPackageName, mPackageName)) { - EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging - throw new IllegalArgumentException("sessionPackageName name does not match " - + "package name provided to MediaSessionRecord. sessionPackageName = " - + sessionPackageName + ", pkg = " - + mPackageName); - } final long token = Binder.clearCallingIdentity(); try { if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) @@ -961,15 +952,6 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR public void setMediaButtonBroadcastReceiver(ComponentName receiver) throws RemoteException { final long token = Binder.clearCallingIdentity(); try { - //mPackageName has been verified in MediaSessionService.enforcePackageName(). - if (receiver != null && !TextUtils.equals( - mPackageName, receiver.getPackageName())) { - EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging - throw new IllegalArgumentException("receiver does not belong to " - + "package name provided to MediaSessionRecord. Pkg = " + mPackageName - + ", Receiver Pkg = " + receiver.getPackageName()); - } - if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) != 0) { return; -- cgit v1.2.3 From 19dc5ff6341884eee6297c76e62ece5231be8fbc Mon Sep 17 00:00:00 2001 From: Sergey Nikolaienkov Date: Thu, 20 Oct 2022 15:50:43 +0200 Subject: Update core/java/android/os/storage/OWNERS Bug: - Test: not really... Merged-In: I71ef824d0f1bbc80ece29fc1915ba327f2436752 Change-Id: I71ef824d0f1bbc80ece29fc1915ba327f2436752 --- core/java/android/os/storage/OWNERS | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/storage/OWNERS b/core/java/android/os/storage/OWNERS index ff126e12cf61..c80c57ce917a 100644 --- a/core/java/android/os/storage/OWNERS +++ b/core/java/android/os/storage/OWNERS @@ -1,10 +1,15 @@ # Bug component: 95221 +# Android Storage Team +abkaur@google.com corinac@google.com -nandana@google.com -zezeozue@google.com -maco@google.com +dipankarb@google.com +krishang@google.com sahanas@google.com -abkaur@google.com -chiangi@google.com +sergeynv@google.com +shubhisaxena@google.com +tylersaunders@google.com + +maco@google.com +nandana@google.com narayan@google.com -- cgit v1.2.3 From 4da492c4ef5039b01c7cd6828dfd7d410f54bd0b Mon Sep 17 00:00:00 2001 From: Liahav Eitan Date: Tue, 11 Oct 2022 13:20:52 +0000 Subject: Fix sharing to another profile where an app has multiple targets Moves the fixUris call from onTargetSelected directly to the intent launch to ensure the intent which is actually started is updated with userId specific URIs. This is a backport of ag/19657256 and ag/20063949. Bug:242165528 Bug:244876518 Bug:242605257 Test: manually share image from personal profile to work gmail, first with chat target then backing up and selecting the main target Test: manually share image from work Photos app to personal WhatsApp's frequent contact target. Change-Id: Id815984e691bf962e19e30a54f7247d16060b3b8 Merged-In: Ib41c8a3c46afcc2d62a4c1a924212bcd98bcfbe4 Merged-In: Iabf5dcf2612fe718f2f0886e2e5e9b76f37af1e1 --- core/java/com/android/internal/app/ResolverActivity.java | 15 --------------- .../android/internal/app/chooser/DisplayResolveInfo.java | 2 ++ .../internal/app/chooser/SelectableTargetInfo.java | 1 + .../java/com/android/internal/app/chooser/TargetInfo.java | 11 +++++++++++ 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 40429c609150..2dd879cb6bf4 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1283,9 +1283,6 @@ public class ResolverActivity extends Activity implements } if (target != null) { - if (intent != null && isLaunchingTargetInOtherProfile()) { - prepareIntentForCrossProfileLaunch(intent); - } safelyStartActivity(target); // Rely on the ActivityManager to pop up a dialog regarding app suspension @@ -1298,15 +1295,6 @@ public class ResolverActivity extends Activity implements return true; } - private void prepareIntentForCrossProfileLaunch(Intent intent) { - intent.fixUris(UserHandle.myUserId()); - } - - private boolean isLaunchingTargetInOtherProfile() { - return mMultiProfilePagerAdapter.getCurrentUserHandle().getIdentifier() - != UserHandle.myUserId(); - } - @VisibleForTesting public void safelyStartActivity(TargetInfo cti) { // We're dispatching intents that might be coming from legacy apps, so @@ -1508,9 +1496,6 @@ public class ResolverActivity extends Activity implements findViewById(R.id.button_open).setOnClickListener(v -> { Intent intent = otherProfileResolveInfo.getResolvedIntent(); - if (intent != null) { - prepareIntentForCrossProfileLaunch(intent); - } safelyStartActivityAsUser(otherProfileResolveInfo, inactiveAdapter.mResolverListController.getUserHandle()); finish(); diff --git a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java index 96cc5e1bd7d2..473134ea46f3 100644 --- a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +++ b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java @@ -172,12 +172,14 @@ public class DisplayResolveInfo implements TargetInfo, Parcelable { @Override public boolean startAsCaller(ResolverActivity activity, Bundle options, int userId) { + TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); activity.startActivityAsCaller(mResolvedIntent, options, false, userId); return true; } @Override public boolean startAsUser(Activity activity, Bundle options, UserHandle user) { + TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); activity.startActivityAsUser(mResolvedIntent, options, user); return false; } diff --git a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java index 264e4f76d35d..4b9b7cb98dac 100644 --- a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java +++ b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java @@ -232,6 +232,7 @@ public final class SelectableTargetInfo implements ChooserTargetInfo { } intent.setComponent(mChooserTarget.getComponentName()); intent.putExtras(mChooserTarget.getIntentExtras()); + TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId); // Important: we will ignore the target security checks in ActivityManager // if and only if the ChooserTarget's target package is the same package diff --git a/core/java/com/android/internal/app/chooser/TargetInfo.java b/core/java/com/android/internal/app/chooser/TargetInfo.java index f56ab17cb059..7bb7ddc65c6d 100644 --- a/core/java/com/android/internal/app/chooser/TargetInfo.java +++ b/core/java/com/android/internal/app/chooser/TargetInfo.java @@ -130,4 +130,15 @@ public interface TargetInfo { * @return true if this target should be pinned to the front by the request of the user */ boolean isPinned(); + + /** + * Fix the URIs in {@code intent} if cross-profile sharing is required. This should be called + * before launching the intent as another user. + */ + static void prepareIntentForCrossProfileLaunch(Intent intent, int targetUserId) { + final int currentUserId = UserHandle.myUserId(); + if (targetUserId != currentUserId) { + intent.fixUris(currentUserId); + } + } } -- cgit v1.2.3 From f1831c87122e56951c04e1f62f647ab156ca71e3 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 11 Oct 2022 18:08:11 -0700 Subject: [RESTRICT AUTOMERGE][SettingsProvider] key size limit for mutating settings Prior to targetSdk 22, apps could add random system settings keys which opens an opportunity for OOM attacks. This CL adds a key size limit. BUG: 239415997 Test: manual; will add cts test Merged-In: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc Change-Id: Ic9e88c0cc3d7206c64ba5b5c7d15b50d1ffc9adc (cherry picked from commit 783bcba343c480f6ccedaaff41ba7171a1082e0c) --- .../android/providers/settings/SettingsState.java | 40 +++++--- .../providers/settings/SettingsStateTest.java | 102 ++++++++++++++++++++- 2 files changed, 126 insertions(+), 16 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 6b7d559be435..451b37391a9d 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -48,6 +48,7 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.LocalServices; @@ -367,8 +368,8 @@ final class SettingsState { Setting newSetting = new Setting(name, oldSetting.getValue(), null, oldSetting.getPackageName(), oldSetting.getTag(), false, oldSetting.getId()); - int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, - newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, + oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); mSettings.put(name, newSetting); updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -396,8 +397,9 @@ final class SettingsState { String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null; String newDefaultValue = makeDefault ? value : oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, - oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(packageName, + oldValue == null ? name.length() : 0 /* deltaKeySize */, + oldValue, value, oldDefaultValue, newDefaultValue); checkNewMemoryUsagePerPackageLocked(packageName, newSize); Setting newState; @@ -438,8 +440,12 @@ final class SettingsState { } Setting oldState = mSettings.remove(name); - int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, - null, oldState.defaultValue, null); + if (oldState == null) { + return false; + } + int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, + -name.length() /* deltaKeySize */, + oldState.value, null, oldState.defaultValue, null); StatsLog.write(StatsLog.SETTING_CHANGED, name, /* value= */ "", /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -462,15 +468,16 @@ final class SettingsState { } Setting setting = mSettings.get(name); + if (setting == null) { + return false; + } Setting oldSetting = new Setting(setting); String oldValue = setting.getValue(); String oldDefaultValue = setting.getDefaultValue(); - String newValue = oldDefaultValue; - String newDefaultValue = oldDefaultValue; - int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, - newValue, oldDefaultValue, newDefaultValue); + int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, + oldDefaultValue, oldDefaultValue, oldDefaultValue); checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize); if (!setting.reset()) { @@ -604,8 +611,8 @@ final class SettingsState { } @GuardedBy("mLock") - private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, - String newValue, String oldDefaultValue, String newDefaultValue) { + private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, + String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { if (isExemptFromMemoryUsageCap(packageName)) { return 0; } @@ -614,7 +621,7 @@ final class SettingsState { final int newValueSize = (newValue != null) ? newValue.length() : 0; final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0; final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; - final int deltaSize = newValueSize + newDefaultValueSize + final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize - oldValueSize - oldDefaultValueSize; return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0); } @@ -1241,4 +1248,11 @@ final class SettingsState { return false; } } + + @VisibleForTesting + public int getMemoryUsage(String packageName) { + synchronized (mLock) { + return mPackageToMemoryUsage.getOrDefault(packageName, 0); + } + } } diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 6f45adef91f7..adb356726eec 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -186,8 +186,8 @@ public class SettingsStateTest extends AndroidTestCase { public void testInsertSetting_memoryUsage() { final Object lock = new Object(); - final File file = new File(getContext().getCacheDir(), "setting.xml"); - final String settingName = "test_setting"; + final File file = new File(getContext().getCacheDir(), "setting.xml"); + final String settingName = "test_setting"; SettingsState settingsState = new SettingsState(getContext(), lock, file, 1, SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper()); @@ -204,7 +204,7 @@ public class SettingsStateTest extends AndroidTestCase { settingsState.deleteSettingLocked(settingName); // Should not throw if usage is under the cap - settingsState.insertSettingLocked(settingName, Strings.repeat("A", 19999), + settingsState.insertSettingLocked(settingName, Strings.repeat("A", 19975), null, false, "p1"); settingsState.deleteSettingLocked(settingName); try { @@ -222,5 +222,101 @@ public class SettingsStateTest extends AndroidTestCase { assertTrue(ex.getMessage().contains("p1")); } assertTrue(settingsState.getSettingLocked(settingName).isNull()); + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", + null, false, "p1"); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + } + + public void testMemoryUsagePerPackage() { + final Object lock = new Object(); + final File file = new File(getContext().getCacheDir(), "setting.xml"); + final String testPackage = "package"; + SettingsState settingsState = new SettingsState(getContext(), lock, file, 1, + SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); + + // Test inserting one key with default + final String settingName = "test_setting"; + final String testKey1 = settingName; + final String testValue1 = Strings.repeat("A", 100); + settingsState.insertSettingLocked(testKey1, testValue1, null, true, testPackage); + int expectedMemUsage = testKey1.length() + testValue1.length() + + testValue1.length() /* size for default */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test inserting another key + final String testKey2 = settingName + "2"; + settingsState.insertSettingLocked(testKey2, testValue1, null, false, testPackage); + expectedMemUsage += testKey2.length() + testValue1.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test updating first key with new default + final String testValue2 = Strings.repeat("A", 300); + settingsState.insertSettingLocked(testKey1, testValue2, null, true, testPackage); + expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test updating first key without new default + final String testValue3 = Strings.repeat("A", 50); + settingsState.insertSettingLocked(testKey1, testValue3, null, false, testPackage); + expectedMemUsage -= testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test updating second key + settingsState.insertSettingLocked(testKey2, testValue2, null, false, testPackage); + expectedMemUsage -= testValue1.length() - testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test resetting key + settingsState.resetSettingLocked(testKey1); + expectedMemUsage += testValue2.length() - testValue3.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test resetting default value + settingsState.resetSettingDefaultValueLocked(testKey1); + expectedMemUsage -= testValue2.length(); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test deletion + settingsState.deleteSettingLocked(testKey2); + expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test another package with a different key + final String testPackage2 = testPackage + "2"; + final String testKey3 = settingName + "3"; + settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + + // Test system package + settingsState.insertSettingLocked(testKey1, testValue1, null, true, "android"); + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); + assertEquals(0, settingsState.getMemoryUsage("android")); + + // Test invalid value + try { + settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, + testPackage); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); + + // Test invalid key + try { + settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, + testPackage); + fail("Should throw because it exceeded per package memory usage"); + } catch (IllegalStateException ex) { + assertTrue(ex.getMessage().contains("You are adding too many system settings")); + } + assertEquals(expectedMemUsage, settingsState.getMemoryUsage(testPackage)); } } -- cgit v1.2.3 From b23782141bee643779a5922c1f2d8e32b7f5d855 Mon Sep 17 00:00:00 2001 From: David Saff Date: Tue, 25 Oct 2022 16:16:20 +0000 Subject: Disable broken NotificationStackScrollLayoutTest on qt-dev Test: presubmit & abtd Bug: 255552856 Bug: 255368934 Change-Id: Ibc2edc99f99e02edc5dd75486dda64b945223569 --- .../statusbar/notification/stack/NotificationStackScrollLayoutTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index c0fa09794d65..7f7e0e1cffac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -83,6 +83,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -97,6 +98,7 @@ import java.util.ArrayList; /** * Tests for {@link NotificationStackScrollLayout}. */ +@Ignore("b/255552856") @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper -- cgit v1.2.3 From 8fdf4530aac096d87c8d6afe64036f972a3835be Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 22 Sep 2022 15:23:24 -0700 Subject: RESTRICT AUTOMERGE Validate permission tree size on permission update Bug: 242537498 Test: manual Change-Id: I15343e84c1802d6b89249106263319a6539fa73b Merged-In: I15343e84c1802d6b89249106263319a6539fa73b --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8bab4d3eae4c..75c1b059a954 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -610,8 +610,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { BasePermission bp = mSettings.getPermissionLocked(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new BasePermission(info.name, tree.getSourcePackageName(), BasePermission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { -- cgit v1.2.3 From ce6ae95066aaf453b271fad810f9b8b412e72e71 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 22 Sep 2022 15:23:24 -0700 Subject: RESTRICT AUTOMERGE Validate permission tree size on permission update Bug: 242537498 Test: manual Change-Id: I15343e84c1802d6b89249106263319a6539fa73b Merged-In: I15343e84c1802d6b89249106263319a6539fa73b --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c7fca39de562..8e0652f750c1 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -942,8 +942,8 @@ public class PermissionManagerService { BasePermission bp = mSettings.getPermissionLocked(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new BasePermission(info.name, tree.getSourcePackageName(), BasePermission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { -- cgit v1.2.3 From b3fea7d1a8ea8710ccf669562441cfdeb4147ca6 Mon Sep 17 00:00:00 2001 From: Chris Sabotta Date: Wed, 26 Oct 2022 00:49:58 +0000 Subject: Revert "RESTRICT AUTOMERGE Validate permission tree size on perm..." Revert submission 20103164-permTree-qt-dev Reason for revert: build breakage b/255661858 Reverted Changes: I15343e84c:RESTRICT AUTOMERGE Validate permission tree size o... If16ecb7be:RESTRICT AUTOMERGE Add PermissionMemoryFootprintTe... Change-Id: I4e8ec8b1a609d0e7a6bb379579014c82a9825101 --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8e0652f750c1..c7fca39de562 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -942,8 +942,8 @@ public class PermissionManagerService { BasePermission bp = mSettings.getPermissionLocked(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); - enforcePermissionCapLocked(info, tree); if (added) { + enforcePermissionCapLocked(info, tree); bp = new BasePermission(info.name, tree.getSourcePackageName(), BasePermission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { -- cgit v1.2.3 From f50ced5f1e619d7fa7858748d6a9dbe861354f04 Mon Sep 17 00:00:00 2001 From: Liahav Eitan Date: Tue, 11 Oct 2022 13:20:52 +0000 Subject: Fix sharing to another profile where an app has multiple targets Moves the fixUris call from onTargetSelected directly to the intent launch to ensure the intent which is actually started is updated with userId specific URIs. This is a backport of ag/19657256 and ag/20063949. Bug:242165528 Bug:244876518 Bug:242605257 Test: manually share image from personal profile to work gmail, first with chat target then backing up and selecting the main target Test: manually share image from work Photos app to personal WhatsApp's frequent contact target. Change-Id: Id815984e691bf962e19e30a54f7247d16060b3b8 Merged-In: Id815984e691bf962e19e30a54f7247d16060b3b8 Merged-In: Ib41c8a3c46afcc2d62a4c1a924212bcd98bcfbe4 Merged-In: Iabf5dcf2612fe718f2f0886e2e5e9b76f37af1e1 --- core/java/com/android/internal/app/ResolverActivity.java | 12 ------------ .../com/android/internal/app/chooser/DisplayResolveInfo.java | 2 ++ .../android/internal/app/chooser/SelectableTargetInfo.java | 1 + core/java/com/android/internal/app/chooser/TargetInfo.java | 11 +++++++++++ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 24bbe749aaef..5ef6f16c1a2d 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1233,9 +1233,6 @@ public class ResolverActivity extends Activity implements } if (target != null) { - if (intent != null && isLaunchingTargetInOtherProfile()) { - prepareIntentForCrossProfileLaunch(intent); - } safelyStartActivity(target); // Rely on the ActivityManager to pop up a dialog regarding app suspension @@ -1248,15 +1245,6 @@ public class ResolverActivity extends Activity implements return true; } - private void prepareIntentForCrossProfileLaunch(Intent intent) { - intent.fixUris(UserHandle.myUserId()); - } - - private boolean isLaunchingTargetInOtherProfile() { - return mMultiProfilePagerAdapter.getCurrentUserHandle().getIdentifier() - != UserHandle.myUserId(); - } - @VisibleForTesting public void safelyStartActivity(TargetInfo cti) { // We're dispatching intents that might be coming from legacy apps, so diff --git a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java index fe0e7d012262..cbbfbdd88a6c 100644 --- a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +++ b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java @@ -178,6 +178,7 @@ public class DisplayResolveInfo implements TargetInfo { if (ENABLE_CHOOSER_DELEGATE) { return activity.startAsCallerImpl(mResolvedIntent, options, false, userId); } else { + TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); activity.startActivityAsCaller(mResolvedIntent, options, null, false, userId); return true; } @@ -185,6 +186,7 @@ public class DisplayResolveInfo implements TargetInfo { @Override public boolean startAsUser(Activity activity, Bundle options, UserHandle user) { + TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); activity.startActivityAsUser(mResolvedIntent, options, user); return false; } diff --git a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java index 900e18d468bb..9d057b34363e 100644 --- a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java +++ b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java @@ -230,6 +230,7 @@ public final class SelectableTargetInfo implements ChooserTargetInfo { } intent.setComponent(mChooserTarget.getComponentName()); intent.putExtras(mChooserTarget.getIntentExtras()); + TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId); // Important: we will ignore the target security checks in ActivityManager // if and only if the ChooserTarget's target package is the same package diff --git a/core/java/com/android/internal/app/chooser/TargetInfo.java b/core/java/com/android/internal/app/chooser/TargetInfo.java index f56ab17cb059..7bb7ddc65c6d 100644 --- a/core/java/com/android/internal/app/chooser/TargetInfo.java +++ b/core/java/com/android/internal/app/chooser/TargetInfo.java @@ -130,4 +130,15 @@ public interface TargetInfo { * @return true if this target should be pinned to the front by the request of the user */ boolean isPinned(); + + /** + * Fix the URIs in {@code intent} if cross-profile sharing is required. This should be called + * before launching the intent as another user. + */ + static void prepareIntentForCrossProfileLaunch(Intent intent, int targetUserId) { + final int currentUserId = UserHandle.myUserId(); + if (targetUserId != currentUserId) { + intent.fixUris(currentUserId); + } + } } -- cgit v1.2.3 From 4e83e59b27f7d6232ee9fe96f789e32debc19772 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Wed, 26 Oct 2022 17:37:26 +0000 Subject: RESTRICT AUTOMERGE Revert "Revert "RESTRICT AUTOMERGE Validate permission tree size..." Revert submission 20285709-revert-20103164-permTree-qt-dev-QWIEBZIWEA Reason for revert: resubmission Reverted Changes: I0a3b68aff:Revert "RESTRICT AUTOMERGE Add PermissionMemoryFoo... I4e8ec8b1a:Revert "RESTRICT AUTOMERGE Validate permission tre... Change-Id: I3cd1aa270373bb32f95dfbe8422faa783ee49dca --- .../java/com/android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c7fca39de562..8e0652f750c1 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -942,8 +942,8 @@ public class PermissionManagerService { BasePermission bp = mSettings.getPermissionLocked(info.name); added = bp == null; int fixedLevel = PermissionInfo.fixProtectionLevel(info.protectionLevel); + enforcePermissionCapLocked(info, tree); if (added) { - enforcePermissionCapLocked(info, tree); bp = new BasePermission(info.name, tree.getSourcePackageName(), BasePermission.TYPE_DYNAMIC); } else if (!bp.isDynamic()) { -- cgit v1.2.3 From e1a80210f3f0391c989a2a86fd4aef739bf2574c Mon Sep 17 00:00:00 2001 From: "Nate(Qiang) Jiang" Date: Wed, 26 Oct 2022 21:52:34 +0000 Subject: [RESTRICT AUTOMERGE] Passpoint Add more check to limit the config size Bug: 245299920 Test: atest con.android.server.wifi Merged-In: I97522ce3607547c10025caa107cd1a40455a9c5d Change-Id: I97522ce3607547c10025caa107cd1a40455a9c5d --- .../net/wifi/hotspot2/PasspointConfiguration.java | 59 +++++++++++++++- .../android/net/wifi/hotspot2/pps/Credential.java | 10 ++- .../java/android/net/wifi/hotspot2/pps/HomeSp.java | 79 +++++++++++++++++++++- .../wifi/hotspot2/PasspointConfigurationTest.java | 2 +- 4 files changed, 146 insertions(+), 4 deletions(-) diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java index d1d1780a25fd..09f91d688f7b 100644 --- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java +++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java @@ -60,8 +60,42 @@ public final class PasspointConfiguration implements Parcelable { /** * Maximum bytes for URL string. + * @hide + */ + public static final int MAX_URL_BYTES = 2048; + + /** + * Maximum size for match entry, just to limit the size of the Passpoint config. + * @hide + */ + public static final int MAX_NUMBER_OF_ENTRIES = 16; + + /** + * Maximum size for OI entry. + * The spec allows a string of up to 255 characters, with comma delimited numbers like + * 001122,334455. So with minimum OI size of 7, the maximum amount of OIs is 36. + * @hide + */ + public static final int MAX_NUMBER_OF_OI = 36; + + + /** + * Maximum bytes for a string entry like FQDN and friendly name. + * @hide + */ + public static final int MAX_STRING_LENGTH = 255; + + /** + * HESSID is 48 bit. + * @hide */ - private static final int MAX_URL_BYTES = 1023; + public static final long MAX_HESSID_VALUE = ((long) 1 << 48) - 1; + + /** + * Organization Identifiers is 3 or 5 Octets. 24 or 36 bit. + * @hide + */ + public static final long MAX_OI_VALUE = ((long) 1 << 40) - 1; /** * Integer value used for indicating null value in the Parcel. @@ -760,7 +794,30 @@ public final class PasspointConfiguration implements Parcelable { return false; } + if (mAaaServerTrustedNames != null) { + if (mAaaServerTrustedNames.length > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "Too many AaaServerTrustedNames"); + return false; + } + for (String fqdn : mAaaServerTrustedNames) { + if (fqdn.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "AaaServerTrustedNames is too long"); + return false; + } + } + } + if (mSubscriptionType != null) { + if (mSubscriptionType.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "SubscriptionType is too long"); + return false; + } + } + if (mTrustRootCertList != null) { + if (mTrustRootCertList.size() > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "Too many TrustRootCert"); + return false; + } for (Map.Entry entry : mTrustRootCertList.entrySet()) { String url = entry.getKey(); byte[] certFingerprint = entry.getValue(); diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java index fa806e7797cd..179fcac1790f 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java @@ -16,6 +16,8 @@ package android.net.wifi.hotspot2.pps; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_STRING_LENGTH; + import android.net.wifi.EAPConstants; import android.net.wifi.ParcelUtil; import android.os.Parcel; @@ -413,7 +415,13 @@ public final class Credential implements Parcelable { + mPassword.getBytes(StandardCharsets.UTF_8).length); return false; } - + if (mSoftTokenApp != null) { + if (mSoftTokenApp.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "app name exceeding maximum length: " + + mSoftTokenApp.getBytes(StandardCharsets.UTF_8).length); + return false; + } + } // Only supports EAP-TTLS for user credential. if (mEapType != EAPConstants.EAP_TTLS) { Log.d(TAG, "Invalid EAP Type for user credential: " + mEapType); diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java index 224c4bed9d5b..d649de6cd373 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java @@ -16,6 +16,13 @@ package android.net.wifi.hotspot2.pps; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_HESSID_VALUE; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_NUMBER_OF_ENTRIES; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_NUMBER_OF_OI; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_OI_VALUE; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_STRING_LENGTH; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_URL_BYTES; + import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -344,16 +351,86 @@ public final class HomeSp implements Parcelable { Log.d(TAG, "Missing FQDN"); return false; } + if (mFqdn.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "FQDN is too long"); + return false; + } if (TextUtils.isEmpty(mFriendlyName)) { Log.d(TAG, "Missing friendly name"); return false; } + if (mFriendlyName.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "Friendly name is too long"); + return false; + } // Verify SSIDs specified in the NetworkID if (mHomeNetworkIds != null) { + if (mHomeNetworkIds.size() > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "too many SSID in HomeNetworkIDs"); + return false; + } for (Map.Entry entry : mHomeNetworkIds.entrySet()) { if (entry.getKey() == null || entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) { - Log.d(TAG, "Invalid SSID in HomeNetworkIDs"); + Log.d(TAG, "SSID is too long in HomeNetworkIDs"); + return false; + } + if (entry.getValue() != null + && (entry.getValue() > MAX_HESSID_VALUE || entry.getValue() < 0)) { + Log.d(TAG, "HESSID is out of range"); + return false; + } + } + } + if (mIconUrl != null && mIconUrl.getBytes(StandardCharsets.UTF_8).length > MAX_URL_BYTES) { + Log.d(TAG, "Icon URL is too long"); + return false; + } + if (mMatchAllOis != null) { + if (mMatchAllOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many match all Organization Identifiers in the profile"); + return false; + } + for (long oi : mMatchAllOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mMatchAnyOis != null) { + if (mMatchAnyOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many match any Organization Identifiers in the profile"); + return false; + } + for (long oi : mMatchAnyOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mRoamingConsortiumOis != null) { + if (mRoamingConsortiumOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many Roaming Consortium Organization Identifiers in the " + + "profile"); + return false; + } + for (long oi : mRoamingConsortiumOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mOtherHomePartners != null) { + if (mOtherHomePartners.length > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "too many other home partners in the profile"); + return false; + } + for (String fqdn : mOtherHomePartners) { + if (fqdn.length() > MAX_STRING_LENGTH) { + Log.d(TAG, "FQDN is too long in OtherHomePartners"); return false; } } diff --git a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java index 638efb9f14ee..59ffcd5ed169 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java @@ -41,7 +41,7 @@ import java.util.Map; */ @SmallTest public class PasspointConfigurationTest { - private static final int MAX_URL_BYTES = 1023; + private static final int MAX_URL_BYTES = 2048; private static final int CERTIFICATE_FINGERPRINT_BYTES = 32; /** -- cgit v1.2.3 From b6d7849df2ad3317bdc8829277219ec9fab13e97 Mon Sep 17 00:00:00 2001 From: "Nate(Qiang) Jiang" Date: Wed, 26 Oct 2022 21:52:34 +0000 Subject: [RESTRICT AUTOMERGE] Passpoint Add more check to limit the config size Bug: 245299920 Test: atest con.android.server.wifi Merged-In: I97522ce3607547c10025caa107cd1a40455a9c5d Change-Id: I97522ce3607547c10025caa107cd1a40455a9c5d --- .../net/wifi/hotspot2/PasspointConfiguration.java | 59 +++++++++++++++- .../android/net/wifi/hotspot2/pps/Credential.java | 10 ++- .../java/android/net/wifi/hotspot2/pps/HomeSp.java | 79 +++++++++++++++++++++- .../wifi/hotspot2/PasspointConfigurationTest.java | 2 +- 4 files changed, 146 insertions(+), 4 deletions(-) diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java index d1d1780a25fd..09f91d688f7b 100644 --- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java +++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java @@ -60,8 +60,42 @@ public final class PasspointConfiguration implements Parcelable { /** * Maximum bytes for URL string. + * @hide + */ + public static final int MAX_URL_BYTES = 2048; + + /** + * Maximum size for match entry, just to limit the size of the Passpoint config. + * @hide + */ + public static final int MAX_NUMBER_OF_ENTRIES = 16; + + /** + * Maximum size for OI entry. + * The spec allows a string of up to 255 characters, with comma delimited numbers like + * 001122,334455. So with minimum OI size of 7, the maximum amount of OIs is 36. + * @hide + */ + public static final int MAX_NUMBER_OF_OI = 36; + + + /** + * Maximum bytes for a string entry like FQDN and friendly name. + * @hide + */ + public static final int MAX_STRING_LENGTH = 255; + + /** + * HESSID is 48 bit. + * @hide */ - private static final int MAX_URL_BYTES = 1023; + public static final long MAX_HESSID_VALUE = ((long) 1 << 48) - 1; + + /** + * Organization Identifiers is 3 or 5 Octets. 24 or 36 bit. + * @hide + */ + public static final long MAX_OI_VALUE = ((long) 1 << 40) - 1; /** * Integer value used for indicating null value in the Parcel. @@ -760,7 +794,30 @@ public final class PasspointConfiguration implements Parcelable { return false; } + if (mAaaServerTrustedNames != null) { + if (mAaaServerTrustedNames.length > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "Too many AaaServerTrustedNames"); + return false; + } + for (String fqdn : mAaaServerTrustedNames) { + if (fqdn.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "AaaServerTrustedNames is too long"); + return false; + } + } + } + if (mSubscriptionType != null) { + if (mSubscriptionType.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "SubscriptionType is too long"); + return false; + } + } + if (mTrustRootCertList != null) { + if (mTrustRootCertList.size() > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "Too many TrustRootCert"); + return false; + } for (Map.Entry entry : mTrustRootCertList.entrySet()) { String url = entry.getKey(); byte[] certFingerprint = entry.getValue(); diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java index 282757ac5a14..82ab29e6691b 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java @@ -16,6 +16,8 @@ package android.net.wifi.hotspot2.pps; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_STRING_LENGTH; + import android.net.wifi.EAPConstants; import android.net.wifi.ParcelUtil; import android.os.Parcel; @@ -413,7 +415,13 @@ public final class Credential implements Parcelable { + mPassword.getBytes(StandardCharsets.UTF_8).length); return false; } - + if (mSoftTokenApp != null) { + if (mSoftTokenApp.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "app name exceeding maximum length: " + + mSoftTokenApp.getBytes(StandardCharsets.UTF_8).length); + return false; + } + } // Only supports EAP-TTLS for user credential. if (mEapType != EAPConstants.EAP_TTLS) { Log.d(TAG, "Invalid EAP Type for user credential: " + mEapType); diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java index 8f34579f6a5d..05a0ec913066 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java @@ -16,6 +16,13 @@ package android.net.wifi.hotspot2.pps; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_HESSID_VALUE; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_NUMBER_OF_ENTRIES; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_NUMBER_OF_OI; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_OI_VALUE; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_STRING_LENGTH; +import static android.net.wifi.hotspot2.PasspointConfiguration.MAX_URL_BYTES; + import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -342,16 +349,86 @@ public final class HomeSp implements Parcelable { Log.d(TAG, "Missing FQDN"); return false; } + if (mFqdn.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "FQDN is too long"); + return false; + } if (TextUtils.isEmpty(mFriendlyName)) { Log.d(TAG, "Missing friendly name"); return false; } + if (mFriendlyName.getBytes(StandardCharsets.UTF_8).length > MAX_STRING_LENGTH) { + Log.d(TAG, "Friendly name is too long"); + return false; + } // Verify SSIDs specified in the NetworkID if (mHomeNetworkIds != null) { + if (mHomeNetworkIds.size() > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "too many SSID in HomeNetworkIDs"); + return false; + } for (Map.Entry entry : mHomeNetworkIds.entrySet()) { if (entry.getKey() == null || entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) { - Log.d(TAG, "Invalid SSID in HomeNetworkIDs"); + Log.d(TAG, "SSID is too long in HomeNetworkIDs"); + return false; + } + if (entry.getValue() != null + && (entry.getValue() > MAX_HESSID_VALUE || entry.getValue() < 0)) { + Log.d(TAG, "HESSID is out of range"); + return false; + } + } + } + if (mIconUrl != null && mIconUrl.getBytes(StandardCharsets.UTF_8).length > MAX_URL_BYTES) { + Log.d(TAG, "Icon URL is too long"); + return false; + } + if (mMatchAllOis != null) { + if (mMatchAllOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many match all Organization Identifiers in the profile"); + return false; + } + for (long oi : mMatchAllOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mMatchAnyOis != null) { + if (mMatchAnyOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many match any Organization Identifiers in the profile"); + return false; + } + for (long oi : mMatchAnyOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mRoamingConsortiumOis != null) { + if (mRoamingConsortiumOis.length > MAX_NUMBER_OF_OI) { + Log.d(TAG, "too many Roaming Consortium Organization Identifiers in the " + + "profile"); + return false; + } + for (long oi : mRoamingConsortiumOis) { + if (oi > MAX_OI_VALUE || oi < 0) { + Log.d(TAG, "Organization Identifiers is out of range"); + return false; + } + } + } + if (mOtherHomePartners != null) { + if (mOtherHomePartners.length > MAX_NUMBER_OF_ENTRIES) { + Log.d(TAG, "too many other home partners in the profile"); + return false; + } + for (String fqdn : mOtherHomePartners) { + if (fqdn.length() > MAX_STRING_LENGTH) { + Log.d(TAG, "FQDN is too long in OtherHomePartners"); return false; } } diff --git a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java index 638efb9f14ee..59ffcd5ed169 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java @@ -41,7 +41,7 @@ import java.util.Map; */ @SmallTest public class PasspointConfigurationTest { - private static final int MAX_URL_BYTES = 1023; + private static final int MAX_URL_BYTES = 2048; private static final int CERTIFICATE_FINGERPRINT_BYTES = 32; /** -- cgit v1.2.3 From c79346286e9cb03df8bf8417c15059aed0f0b41a Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Tue, 31 May 2022 23:49:50 +0000 Subject: [DO NOT MERGE] fpService#authWithPrompt uses correct user handle. CTS > BYOD Managed Provisioning > Authentication Bound Keys Verified Fingerprint-bound key test works as expected. Test: Manually verified CTS Bug: 231932206 Change-Id: I473c9c28cd0fbb01f4dd48447ddea8aa32834131 (cherry picked from commit f3650a6dee1ebe5f681699e4170c244e7bd7f9fc) --- .../server/biometrics/sensors/fingerprint/FingerprintService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 2b2e0a0601f9..77f1333e1c15 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -298,8 +298,8 @@ public class FingerprintService extends SystemService { if (!isKeyguard && !Utils.isSettings(getContext(), opPackageName) && sensorProps != null && sensorProps.isAnyUdfpsType()) { try { - authenticateWithPrompt(operationId, sensorProps, userId, receiver, - opPackageName); + authenticateWithPrompt(operationId, sensorProps, callingUid, + callingUserId, receiver, opPackageName); } catch (PackageManager.NameNotFoundException e) { Slog.e(TAG, "Invalid package", e); } @@ -313,13 +313,14 @@ public class FingerprintService extends SystemService { private void authenticateWithPrompt( final long operationId, @NonNull final FingerprintSensorPropertiesInternal props, + final int uId, final int userId, final IFingerprintServiceReceiver receiver, final String opPackageName) throws PackageManager.NameNotFoundException { final Context context = getUiContext(); final Context promptContext = context.createPackageContextAsUser( - opPackageName, 0 /* flags */, UserHandle.getUserHandleForUid(userId)); + opPackageName, 0 /* flags */, UserHandle.getUserHandleForUid(uId)); final Executor executor = context.getMainExecutor(); final BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(promptContext) -- cgit v1.2.3 From 117890ccf2b80b4e472b5fb1d80523c42e494d5c Mon Sep 17 00:00:00 2001 From: Erik Han Date: Thu, 27 Oct 2022 00:08:17 +0000 Subject: docs: Cherrypicking GetPhoneNumber docs fix to tm-dev CPing the fix to tm-dev (where the docs builds come from) so it'll go live. Merge "Update documentation to GetPhoneNumber with the security/privacy concerns" am: d1450e4e61 am: ce9e379a8a am: 9d1eb6ac7b Bug: 235143721 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2241332 Change-Id: I1ada77b875c64901cc02a1e42712ae3f1ee19499 (cherry picked from commit 6bf945d20f7804013d956eb63fd2993e2bc67bc0) Test: [go/abtd docs build] Change-Id: Ida22e156c380cdd8f1d88a2ac22fc014517fdb5f --- telephony/java/android/telephony/SubscriptionManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index d07d8097bce4..214fb5994ba3 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -3953,6 +3953,10 @@ public class SubscriptionManager { * may provide one. Or, a carrier may decide to provide the phone number via source * {@link #PHONE_NUMBER_SOURCE_CARRIER carrier} if neither source UICC nor IMS is available. * + *

    The availability and correctness of the phone number depends on the underlying source + * and the network etc. Additional verification is needed to use this number for + * security-related or other sensitive scenarios. + * * @param subscriptionId the subscription ID, or {@link #DEFAULT_SUBSCRIPTION_ID} * for the default one. * @param source the source of the phone number, one of the PHONE_NUMBER_SOURCE_* constants. -- cgit v1.2.3 From 76db1db57e911ed3651e75815fcb66723d6677ae Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 26 Oct 2022 17:03:33 -0700 Subject: [SettingsProvider] workaround for DevicePolicyResourcesManager DevicePolicyResourcesManager.getString() was added in T and called in many places inside system server. However, it uses DeviceConfig.getBoolean to determine if a feature is enabled or not. In the places where it is called from inside system server, `clearCallingIdentity` was not always called, which can result in DeviceConfig.getBoolean throwing SecurityException due to mismatched AttributionSource (calling uid is the caller from the binder client, while the context is "android" which should have calling uid 0). Context is "android" because it is inside the system server where the DevicePolicyManager instance is created. This bug might lead to unexpected behavior such as packages failing to be uninstalled by admin. The easiest fix is to place a bypass in SettingsProvider and manually clear the calling uid there. This fix also allows for the cleanest backporting as it can be cherry-picked into T without touching all the places where DevicePolicyResourcesManager.getString() is called in the system server. BUG: 252663068 Test: manual Merged-In: I37a6ceb29575593018b93093562c85d49770a43c Change-Id: I37a6ceb29575593018b93093562c85d49770a43c (cherry picked from commit b127850fda23698be0247e5b2110cdd01fff8fd7) --- core/java/android/provider/Settings.java | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 805fdc44b256..96cc1f892551 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3344,9 +3344,26 @@ public final class Settings { } } - // Fetch all flags for the namespace at once for caching purposes - Bundle b = cp.call(cr.getAttributionSource(), - mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); + Bundle b; + // b/252663068: if we're in system server and the caller did not call + // clearCallingIdentity, the read would fail due to mismatched AttributionSources. + // TODO(b/256013480): remove this bypass after fixing the callers in system server. + if (namespace.equals(DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER) + && Settings.isInSystemServer() + && Binder.getCallingUid() != Process.myUid()) { + final long token = Binder.clearCallingIdentity(); + try { + // Fetch all flags for the namespace at once for caching purposes + b = cp.call(cr.getAttributionSource(), + mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); + } finally { + Binder.restoreCallingIdentity(token); + } + } else { + // Fetch all flags for the namespace at once for caching purposes + b = cp.call(cr.getAttributionSource(), + mProviderHolder.mUri.getAuthority(), mCallListCommand, null, args); + } if (b == null) { // Invalid response, return an empty map return keyValues; -- cgit v1.2.3 From fe35955285ff3a068a78b190459352ee3531d2b8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 27 Oct 2022 19:12:13 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I282f66845261fd03eb18b237892176c5e482f00e --- packages/SettingsLib/res/values-uz/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 22251c3c186d..2824fbb848f7 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -556,7 +556,7 @@ "Bu foydalanuvchining umumiy maʼlumotlari topilmadi." "Umumiy maʼlumotlarni yuklashda xatolik yuz berdi. Qayta urining." "Umumiy maʼlumotlar identifikatori: %d" - "Amal qilish muddati: %s" + "Muddati: %s" "Umumiy maʼlumotlarni oʻchirishda xatolik yuz berdi." "Bu umumiy maʼlumotlar yuzasidan kelgan soʻrov topilmadi. Oʻchirib tashlansinmi?" "Umumiy maʼlumotlar bor ilovalar" -- cgit v1.2.3 From 3907bb6eebc53c3108fbea6270af50c598ed7a58 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 27 Oct 2022 22:13:13 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iee68236f1511e0c481b3f9177792135a138cf335 --- core/res/res/values-te/strings.xml | 2 +- core/res/res/values-uz/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b594bbcbc9a2..de2b265e705b 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -2061,7 +2061,7 @@ "కెమెరా" "మైక్రోఫోన్" "మీ స్క్రీన్‌పై ఇతర యాప్‌ల ద్వారా ప్రదర్శించబడుతోంది" - "ఫీడ్‌బ్యాక్‌ను అందించండి" + "ఫీడ్‌బ్యాక్ ఇవ్వండి" "ఈ నోటిఫికేషన్, ఆటోమేటిక్ సెట్టింగ్‌కు ప్రమోట్ చేయబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి." "ఈ నోటిఫికేషన్ స్థాయి నిశ్శబ్దంగా ఉండేలా తగ్గించబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి." "ఈ నోటిఫికేషన్‌కు ఎక్కువ ర్యాంక్ ఇవ్వబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి." diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index f3dcadd12730..a07252bc26d6 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1587,7 +1587,7 @@ "Tegishli:" "Yaroqliligi:" "Chiqarilgan sanasi:" - "Amal qilish muddati:" + "Muddati:" "Serial raqam:" "Barmoq izlari:" "SHA-256 barmoq izi:" -- cgit v1.2.3 From bbd38cd8a10c3d6a9d43e74ac40a93f58853bdea Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 28 Oct 2022 00:22:05 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8b5ffdcc79a0260fb02dfff78ce7a8581c60a8ac --- packages/SystemUI/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 1d0bdd29f0cb..0ae0b067f405 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -819,7 +819,7 @@ "%1$s de %2$s" "Reproducir" "Pausar" - "Pista anterior" + "Canción anterior" "Siguiente pista" "Conectando" "Reproducir" -- cgit v1.2.3 From f83cd419e50ad91e26c2100a487cae7ef36c9212 Mon Sep 17 00:00:00 2001 From: David Saff Date: Wed, 26 Oct 2022 18:32:43 +0000 Subject: DO NOT MERGE: Ignore flaky setup failures in qt-dev Bug: 255797461 Test: See forrest run in bug Change-Id: Ie0b15636edb2210b44a9b96edc267ea7271cc939 --- .../com/android/systemui/statusbar/policy/SmartReplyViewTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java index 8c5fac47885f..6a1c5f99f61d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java @@ -58,6 +58,7 @@ import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.phone.ShadeController; import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -111,7 +112,12 @@ public class SmartReplyViewTest extends SysuiTestCase { mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION)); mDependency.get(KeyguardDismissUtil.class).setDismissHandler(action -> action.onDismiss()); mDependency.injectMockDependency(ShadeController.class); - mDependency.injectTestDependency(ActivityStarter.class, mActivityStarter); + try { + mDependency.injectTestDependency(ActivityStarter.class, mActivityStarter); + } catch (IllegalStateException e) { + // If we have a flaky leak, just ignore this method run (should fix in fresher branches) + Assume.assumeNoException("Ignored flaky setup failure: b/255797461" , e); + } mDependency.injectTestDependency(SmartReplyConstants.class, mConstants); mContainer = new View(mContext, null); -- cgit v1.2.3 From 97e99a76a8fdd9a5f837379846d80c7e42e24489 Mon Sep 17 00:00:00 2001 From: Andrew Solovay Date: Fri, 28 Oct 2022 22:58:49 +0000 Subject: docs: Adding note to getPhoneNumber(int) We'd already added this note to getPhoneNumber(int, int) in aosp/2241332 (which is being cherrypicked to tm-dev in ag/20304540), but we need to add the same note to getPhoneNumber(int). Change-Id: Ieb7df2337c8123e1dc3ca18c85642f0aaba4dda1 Test: go/abtd docs build Bug: 235143721 --- telephony/java/android/telephony/SubscriptionManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 214fb5994ba3..932d00ad6788 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -4013,6 +4013,10 @@ public class SubscriptionManager { * cautiously, for example, after formatting the number to a consistent format with * {@link android.telephony.PhoneNumberUtils#formatNumberToE164(String, String)}. * + *

    The availability and correctness of the phone number depends on the underlying source + * and the network etc. Additional verification is needed to use this number for + * security-related or other sensitive scenarios. + * * @param subscriptionId the subscription ID, or {@link #DEFAULT_SUBSCRIPTION_ID} * for the default one. * @return the phone number, or an empty string if not available. -- cgit v1.2.3