From dcc1fb8e8be12324e1a8277023955d9f92cd5626 Mon Sep 17 00:00:00 2001 From: Orion Hodson Date: Thu, 7 Apr 2022 21:42:04 +0100 Subject: Uri: check authority and scheme as part of determining URI path The interpretation of the path depends on whether the scheme or authority are specified and should be observed when unparcelling URIs. Bug: 171966843 Test: atest FrameworksCoreTests:android.net.UriTest Test: atest com.android.devicehealthchecks.SystemAppCheck Change-Id: I06981d1c6e387b16df792494523994518848db37 Merged-In: I06981d1c6e387b16df792494523994518848db37 (cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) --- core/java/android/net/Uri.java | 22 ++++++--- core/tests/coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 815e4f0c9071..d71faee4cc8d 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1205,13 +1205,16 @@ public abstract class Uri implements Parcelable, Comparable { } static Uri readFrom(Parcel parcel) { - return new HierarchicalUri( - parcel.readString8(), - Part.readFrom(parcel), - PathPart.readFrom(parcel), - Part.readFrom(parcel), - Part.readFrom(parcel) - ); + final String scheme = parcel.readString8(); + final Part authority = Part.readFrom(parcel); + // In RFC3986 the path should be determined based on whether there is a scheme or + // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). + final boolean hasSchemeOrAuthority = + (scheme != null && scheme.length() > 0) || !authority.isEmpty(); + final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); + final Part query = Part.readFrom(parcel); + final Part fragment = Part.readFrom(parcel); + return new HierarchicalUri(scheme, authority, path, query, fragment); } public int describeContents() { @@ -2270,6 +2273,11 @@ public abstract class Uri implements Parcelable, Comparable { } } + static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { + final PathPart path = readFrom(parcel); + return hasSchemeOrAuthority ? makeAbsolute(path) : path; + } + /** * Creates a path from the encoded string. * diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index e083b0d460a2..3733bfa586d1 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -48,6 +48,7 @@ public class UriTest extends TestCase { public void testParcelling() { parcelAndUnparcel(Uri.parse("foo:bob%20lee")); parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); + parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); parcelAndUnparcel(new Uri.Builder() .scheme("http") .authority("crazybob.org") @@ -890,9 +891,62 @@ public class UriTest extends TestCase { Throwable targetException = expected.getTargetException(); // Check that the exception was thrown for the correct reason. assertEquals("Unknown representation: 0", targetException.getMessage()); + } finally { + parcel.recycle(); } } + private Uri buildUriFromRawParcel(boolean argumentsEncoded, + String scheme, + String authority, + String path, + String query, + String fragment) { + // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). + final int representation = argumentsEncoded ? 1 : 2; + Parcel parcel = Parcel.obtain(); + try { + parcel.writeInt(3); // hierarchical + parcel.writeString8(scheme); + parcel.writeInt(representation); + parcel.writeString8(authority); + parcel.writeInt(representation); + parcel.writeString8(path); + parcel.writeInt(representation); + parcel.writeString8(query); + parcel.writeInt(representation); + parcel.writeString8(fragment); + parcel.setDataPosition(0); + return Uri.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + + public void testUnparcelMalformedPath() { + // Regression tests for b/171966843. + + // Test cases with arguments encoded (covering testing `scheme` * `authority` options). + Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/@evil.com", uri0.toString()); + Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); + assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); + Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); + assertEquals("http::/@evil.com", uri2.toString()); + Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); + assertEquals("@evil.com", uri3.toString()); + + // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). + Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/%40evil.com", uriA.toString()); + Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); + assertEquals("//google.com/%40evil.com", uriB.toString()); + Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); + assertEquals("http::/%40evil.com", uriC.toString()); + Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); + assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); + } + public void testToSafeString() { checkToSafeString("tel:xxxxxx", "tel:Google"); checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); -- cgit v1.2.3 From c87f0623be4042c39a9b73f7a6e02aa116925e50 Mon Sep 17 00:00:00 2001 From: Orion Hodson Date: Thu, 7 Apr 2022 21:42:04 +0100 Subject: Uri: check authority and scheme as part of determining URI path The interpretation of the path depends on whether the scheme or authority are specified and should be observed when unparcelling URIs. Bug: 171966843 Test: atest FrameworksCoreTests:android.net.UriTest Test: atest com.android.devicehealthchecks.SystemAppCheck Change-Id: I06981d1c6e387b16df792494523994518848db37 Merged-In: I06981d1c6e387b16df792494523994518848db37 (cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) --- core/java/android/net/Uri.java | 22 ++++++--- core/tests/coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 1cb4fe8cf4e7..84fc4f78edc4 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1194,13 +1194,16 @@ public abstract class Uri implements Parcelable, Comparable { } static Uri readFrom(Parcel parcel) { - return new HierarchicalUri( - parcel.readString8(), - Part.readFrom(parcel), - PathPart.readFrom(parcel), - Part.readFrom(parcel), - Part.readFrom(parcel) - ); + final String scheme = parcel.readString8(); + final Part authority = Part.readFrom(parcel); + // In RFC3986 the path should be determined based on whether there is a scheme or + // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). + final boolean hasSchemeOrAuthority = + (scheme != null && scheme.length() > 0) || !authority.isEmpty(); + final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); + final Part query = Part.readFrom(parcel); + final Part fragment = Part.readFrom(parcel); + return new HierarchicalUri(scheme, authority, path, query, fragment); } public int describeContents() { @@ -2259,6 +2262,11 @@ public abstract class Uri implements Parcelable, Comparable { } } + static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { + final PathPart path = readFrom(parcel); + return hasSchemeOrAuthority ? makeAbsolute(path) : path; + } + /** * Creates a path from the encoded string. * diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index f20220c4ab9b..670aefd21d36 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -48,6 +48,7 @@ public class UriTest extends TestCase { public void testParcelling() { parcelAndUnparcel(Uri.parse("foo:bob%20lee")); parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); + parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); parcelAndUnparcel(new Uri.Builder() .scheme("http") .authority("crazybob.org") @@ -873,9 +874,62 @@ public class UriTest extends TestCase { Throwable targetException = expected.getTargetException(); // Check that the exception was thrown for the correct reason. assertEquals("Unknown representation: 0", targetException.getMessage()); + } finally { + parcel.recycle(); } } + private Uri buildUriFromRawParcel(boolean argumentsEncoded, + String scheme, + String authority, + String path, + String query, + String fragment) { + // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). + final int representation = argumentsEncoded ? 1 : 2; + Parcel parcel = Parcel.obtain(); + try { + parcel.writeInt(3); // hierarchical + parcel.writeString8(scheme); + parcel.writeInt(representation); + parcel.writeString8(authority); + parcel.writeInt(representation); + parcel.writeString8(path); + parcel.writeInt(representation); + parcel.writeString8(query); + parcel.writeInt(representation); + parcel.writeString8(fragment); + parcel.setDataPosition(0); + return Uri.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + + public void testUnparcelMalformedPath() { + // Regression tests for b/171966843. + + // Test cases with arguments encoded (covering testing `scheme` * `authority` options). + Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/@evil.com", uri0.toString()); + Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); + assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); + Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); + assertEquals("http::/@evil.com", uri2.toString()); + Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); + assertEquals("@evil.com", uri3.toString()); + + // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). + Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/%40evil.com", uriA.toString()); + Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); + assertEquals("//google.com/%40evil.com", uriB.toString()); + Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); + assertEquals("http::/%40evil.com", uriC.toString()); + Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); + assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); + } + public void testToSafeString() { checkToSafeString("tel:xxxxxx", "tel:Google"); checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); -- cgit v1.2.3 From 9219ddf807ce98a9e115c2e0483a19413915cb85 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Aug 2022 08:11:11 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie09241bb7b8523b5bfbd59ec8fa6345bae9e6bdc --- packages/SettingsLib/res/values-am/strings.xml | 10 +- packages/SettingsLib/res/values-ar/strings.xml | 2 +- packages/SettingsLib/res/values-bn/strings.xml | 6 +- packages/SettingsLib/res/values-bs/strings.xml | 4 +- packages/SettingsLib/res/values-es-rUS/arrays.xml | 2 +- packages/SettingsLib/res/values-es/strings.xml | 2 +- packages/SettingsLib/res/values-eu/strings.xml | 4 +- packages/SettingsLib/res/values-fa/strings.xml | 4 +- packages/SettingsLib/res/values-fi/strings.xml | 2 +- packages/SettingsLib/res/values-fr-rCA/arrays.xml | 2 +- packages/SettingsLib/res/values-fr-rCA/strings.xml | 6 +- packages/SettingsLib/res/values-gl/arrays.xml | 2 +- packages/SettingsLib/res/values-gl/strings.xml | 8 +- packages/SettingsLib/res/values-hi/strings.xml | 8 +- packages/SettingsLib/res/values-hr/strings.xml | 2 +- packages/SettingsLib/res/values-in/strings.xml | 2 +- packages/SettingsLib/res/values-ja/strings.xml | 4 +- packages/SettingsLib/res/values-ko/strings.xml | 6 +- packages/SettingsLib/res/values-ky/strings.xml | 2 +- packages/SettingsLib/res/values-my/strings.xml | 2 +- packages/SettingsLib/res/values-nl/strings.xml | 2 +- packages/SettingsLib/res/values-or/strings.xml | 16 +- packages/SettingsLib/res/values-pa/strings.xml | 2 +- packages/SettingsLib/res/values-pt-rPT/strings.xml | 4 +- packages/SettingsLib/res/values-ro/arrays.xml | 12 +- packages/SettingsLib/res/values-ro/strings.xml | 184 ++++++++++----------- packages/SettingsLib/res/values-sq/strings.xml | 6 +- packages/SettingsLib/res/values-sw/arrays.xml | 2 +- packages/SettingsLib/res/values-sw/strings.xml | 6 +- packages/SettingsLib/res/values-ta/arrays.xml | 2 +- packages/SettingsLib/res/values-ta/strings.xml | 4 +- packages/SettingsLib/res/values-te/strings.xml | 6 +- packages/SettingsLib/res/values-th/strings.xml | 4 +- packages/SettingsLib/res/values-ur/strings.xml | 4 +- packages/SettingsLib/res/values-zh-rCN/strings.xml | 2 +- packages/SettingsLib/res/values-zh-rTW/strings.xml | 2 +- 36 files changed, 169 insertions(+), 169 deletions(-) diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 6d314ce77718..178ae4c2bfaa 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -155,21 +155,21 @@ "ተጠቃሚ፦ %1$s" "አንዳንድ ነባሪዎ ተዘጋጅተዋል" "ምንም ነባሪዎች አልተዘጋጁም" - "ፅሁፍ-ወደ-ንግግር ቅንብሮች" + "ጽሁፍ-ወደ-ንግግር ቅንብሮች" "የፅሁፍ- ወደ- ንግግር ውፅዓት" " የንግግር ደረጃ" - "የተነገረበትን ፅሁፍ አፍጥን" + "የተነገረበትን ጽሁፍ አፍጥን" "ቅላፄ" "በሲንተሲስ በተሠራው ድምፅ ላይ ተፅዕኖ ያሳድራል" "ቋንቋ" "የስርዓት ቋንቋ ተጠቀም" "ቋንቋ አልተመረጠም" - "ለሚነገረው ፅሁፍ ቋንቋ-ተኮር ድምፅ አዘጋጅ" + "ለሚነገረው ጽሁፍ ቋንቋ-ተኮር ድምፅ አዘጋጅ" "ምሳሌውን አዳምጥ" "አጭር የንግግር ልምምድ ማሳያ አጫውት" "የድምፅ ውሂብ ጫን" "ለንግግር ልምምድ የሚጠየቀውን የድምፅ ውሂብ ጫን" - "ይህ የንግግር ልምምድ አንቀሳቃሽ የሚነገረውን ፅሁፍ ሁሉ እንደ ይለፍ ቃል እና የዱቤ ካርድ ቁጥሮች፣ የግል ውሂብ ጨምሮ ለመሰብሰብ ይችል ይሆናል። ከ %s አንቀሳቃሽ ይመጣል። የዚህን የንግግር ልምምድ አንቀሳቃሽ አጠቃቀም ይንቃ?" + "ይህ የንግግር ልምምድ አንቀሳቃሽ የሚነገረውን ጽሁፍ ሁሉ እንደ ይለፍ ቃል እና የዱቤ ካርድ ቁጥሮች፣ የግል ውሂብ ጨምሮ ለመሰብሰብ ይችል ይሆናል። ከ %s አንቀሳቃሽ ይመጣል። የዚህን የንግግር ልምምድ አንቀሳቃሽ አጠቃቀም ይንቃ?" "ይህ ቋንቋ የጽሑፍ-ወደ-ንግግር ውጽዓት እንዲኖረው የሚሰራ የአውታረ መረብ ግንኙነት ያስፈልገዋል።" "ይህ የተሰራ ንግግር ምሳሌ ነው" "የነባሪ ቋንቋ ሁኔታ" @@ -489,7 +489,7 @@ "የገባሪ ግቤት ዘዴ" "የሥርዓት ቋንቋዎችን ይጠቀሙ" "የ%1$s ቅንብሮች መክፈት አልተሳካም" - "ይህ ግቤት ስልት የሚትተይበውን ፅሁፍ ሁሉ፣ እንደይለፍ ቃል እና የብድር ካርድ ጨምሮ የግል ውሂብ ምናልባት መሰብሰብ ይችላል። ከትግበራው ይመጣል። %1$s ይህን ግቤት ስልትይጠቀም?" + "ይህ ግቤት ስልት የሚትተይበውን ጽሁፍ ሁሉ፣ እንደይለፍ ቃል እና የብድር ካርድ ጨምሮ የግል ውሂብ ምናልባት መሰብሰብ ይችላል። ከትግበራው ይመጣል። %1$s ይህን ግቤት ስልትይጠቀም?" "ማስታወሻ፦ እንደገና ከማስነሳት በኋላ ይህ መተግበሪያ ስልክዎን እስከሚከፍቱት ድረስ ሊጀምር አይችልም" "የIMS ምዝገባ ቀን" "የተመዘገበ" diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 1ac2a16e72f1..f8eab0c1dbc3 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -156,7 +156,7 @@ "تم ضبط بعض الإعدادات التلقائية" "لم يتم ضبط إعدادات تلقائية" "إعدادات تحويل النص إلى كلام" - "تحويل النص إلى كلام" + "إخراج النص إلى كلام" "معدل سرعة الكلام" "سرعة قول الكلام" "درجة الصوت" diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 22ec2be191dd..ca5a1644f7d4 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -246,7 +246,7 @@ "OEM আনলক করার অনুমতি দিতে চান?" "সতর্কতা: এই ডিভাইসে সেটিংটি চালু থাকা অবস্থায় ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি কাজ করবে না৷" "অনুরূপ লোকেশন অ্যাপ বেছে নিন" - "কোনো অনুরূপ লোকেশন অ্যাপ্লিকেশান সেট করা নেই" + "কোনও অনুরূপ লোকেশন অ্যাপ সেট করা নেই" "অনুরূপ লোকেশন অ্যাপ্লিকেশান: %1$s" "নেটওয়ার্কিং" "ওয়্যারলেস ডিসপ্লে সার্টিফিকেশন" @@ -256,7 +256,7 @@ "মোবাইল ডেটা সব সময় সক্রিয় থাক" "টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন" "নামহীন ব্লুটুথ ডিভাইসগুলি দেখুন" - "চূড়ান্ত ভলিউম অক্ষম করুন" + "চূড়ান্ত ভলিউম বন্ধ করুন" "Gabeldorsche ফিচার চালু করুন" "ব্লুটুথ AVRCP ভার্সন" "ব্লুটুথ AVRCP ভার্সন বেছে নিন" @@ -310,7 +310,7 @@ "USB এর অ্যাপ্লিকেশনগুলি যাচাই করুন" "ক্ষতিকারক ক্রিয়াকলাপ করছে কিনা তার জন্য ADB/ADT মারফত ইনস্টল করা অ্যাপ্লিকেশানগুলি চেক করুন।" "নামহীন ব্লুটুথ ডিভাইসগুলি দেখানো হবে (শুধুমাত্র MAC অ্যাড্রেস)" - "অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷" + "অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য বন্ধ করে৷" "ব্লুটুথ Gabeldorche ফিচার স্ট্যাক চালু করে।" "কানেক্টিভিটি ফিচার উন্নত করার বিষয়টি চালু করা হয়েছে।" "স্থানীয় টার্মিনাল" diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index ba45f44bb06b..e234c951a5bc 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -205,10 +205,10 @@ "Postavke dijeljenja internetske veze nisu dostupne za ovog korisnika" "Postavke za ime pristupne tačke nisu dostupne za ovog korisnika" "Otklanjanje grešaka putem USB-a" - "Način rada za uklanjanje grešaka kada je povezan USB" + "Način rada za otklanjanje grešaka kada je povezan USB" "Ukinite odobrenja otklanjanja grešaka putem USB-a" "Bežično otklanjanje grešaka" - "Način rada otklanjanja grešaka kada je WiFi mreža povezana" + "Način rada za otklanjanje grešaka kada je povezan WiFi" "Greška" "Bežično otklanjanje grešaka" "Da vidite i koristite dostupne uređaje, uključite bežično otklanjanje grešaka" diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index d187f268aa95..a5013b8d48aa 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -224,7 +224,7 @@ "720 píxeles (seguro)" "1080 píxeles" "1080 píxeles (seguro)" - "4 K" + "4K" "4 K (seguro)" "4 K (mejorado)" "4 K (mejorado, seguro)" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 1a3e9637d734..d4cdc4b628cc 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -206,7 +206,7 @@ "Los ajustes del nombre del punto de acceso no están disponibles para este usuario" "Depuración por USB" "Activa el modo de depuración cuando el dispositivo esté conectado por USB" - "Revocar autorizaciones de depuración USB" + "Revocar autorizaciones de depuración por USB" "Depuración inalámbrica" "Activa el modo de depuración cuando haya conexión Wi‑Fi" "Error" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 8552c528646f..54ed9c82d760 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -529,7 +529,7 @@ "Laguntza eta iritziak" "Biltegiratzea" "Datu partekatuak" - "Ikusi eta aldatu partekatutako datuak" + "Ikusi eta aldatu datu partekatuak" "Ez dago erabiltzaile honen datu partekaturik." "Errore bat gertatu da datu partekatuak eskuratzean. Saiatu berriro." "Partekatutako datuen IDa: %d" @@ -560,7 +560,7 @@ "Profileko informazioa" "Profil murriztua sortu aurretik, aplikazioak eta datu pertsonalak babesteko, pantaila blokeatzeko metodo bat konfiguratu beharko duzu." "Ezarri blokeoa" - "Aldatu %s erabiltzailera" + "Aldatu \"%s\" erabiltzailera" "Beste erabiltzaile bat sortzen…" "Ezin izan da sortu erabiltzailea" "Goitizena" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index efc14a3ab9c9..419911fec689 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -284,7 +284,7 @@ "نمایش گزینه‌ها برای گواهینامه نمایش بی‌سیم" "‏افزایش سطح گزارش‌گیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخاب‌کننده Wi‑Fi" "تخلیه باتری راکاهش می‌دهد و عملکرد شبکه را بهبود می‌بخشد" - "اگر این حالت فعال باشد، هر بار این دستگاه به شبکه‌ای متصل شود که تصادفی‌سازی «واپایش دسترسی رسانه» در آن فعال است، ممکن است «نشانی واد» آن تغییر کند." + "اگر این حالت فعال باشد، هر بار این دستگاه به شبکه‌ای متصل شود که تصادفی‌سازی «واپایش دسترسی رسانه» در آن فعال است، ممکن است «مک آدرس» آن تغییر کند." "محدودشده" "محدودنشده" "اندازه‌های حافظه موقت ثبت‌کننده" @@ -507,7 +507,7 @@ "زنگ‌های هشدار و یادآوری‌ها" "مجاز کردن تنظیم زنگ ساعت و یادآوری" "زنگ‌های ساعت و یادآوری‌ها" - "به این برنامه اجازه می‌دهد زنگ ساعت تنظیم کند و کنش‌های حساس به زمان را زمان‌بندی کند. این تنظیم به برنامه اجازه می‌دهد در پس‌زمینه اجرا شود که ممکن است باتری بیشتری مصرف کند.\n\nاگر این اجازه خاموش باشد، زنگ‌های ساعت موجود و رویدادهای مبتنی بر زمان که این برنامه زمان‌بندی کرده است کار نخواهند کرد." + "به این برنامه اجازه می‌دهد زنگ ساعت تنظیم کند و کنش‌های حساس به زمان را زمان‌بندی کند. این تنظیم به برنامه اجازه می‌دهد در پس‌زمینه اجرا شود که ممکن است باتری بیشتری مصرف کند.\n\nاگر این اجازه خاموش باشد، زنگ‌های ساعت موجود و رویدادهای زمان‌محور که این برنامه زمان‌بندی کرده است کار نخواهند کرد." "زمان‌بندی، زنگ ساعت، یادآوری، ساعت" "روشن کردن" "روشن کردن «مزاحم نشوید»" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index d3a021f8bbe7..5308ad178c30 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -551,7 +551,7 @@ "Lisätäänkö käyttäjä nyt?" "Varmista, että käyttäjä voi ottaa laitteen nyt ja määrittää oman tilansa." "Määritetäänkö profiilin asetukset nyt?" - "Määritä nyt" + "Ota käyttöön nyt" "Ei nyt" "Lisää" "Uusi käyttäjä" diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index c566e6ec1f21..95ab5c008d59 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "MAP 1.2 (valeur par défaut)" + "MAP 1.2 (par défaut)" "MAP 1.3" "MAP 1.4" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 6032ee99ba91..1c6ee6811cbd 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -245,9 +245,9 @@ "Autoriser le déverrouillage du fichier d\'amorce" "Permettre le déverrouillage par le fabricant?" "AVERTISSEMENT : Les fonctionnalités de protection de l\'appareil ne fonctionneront pas sur cet appareil lorsque ce paramètre est activé." - "Sélectionner l\'application de localisation factice" - "Aucune application de localisation factice définie" - "Application de localisation factice : %1$s" + "Sélectionner l\'application de position fictive" + "Aucune application de position fictive définie" + "Application de position fictive : %1$s" "Réseautage" "Certification de l\'affichage sans fil" "Autoriser enreg. données Wi-Fi détaillées" diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index bd197e5014f7..cdb73f673ce5 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "MAP 1.2 (predeterminada)" + "MAP 1.2 (predeterminado)" "MAP 1.3" "MAP 1.4" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 3a3c61dde3de..d0316eb99599 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -260,8 +260,8 @@ "Activar Gabeldorsche" "Versión de Bluetooth AVRCP" "Selecciona a versión de Bluetooth AVRCP" - "Versión de MAP de Bluetooth" - "Selecciona a versión de MAP de Bluetooth" + "Versión de Bluetooth MAP" + "Selecciona a versión de Bluetooth MAP" "Códec de audio por Bluetooth" "Activar códec de audio por Bluetooth\nSelección" "Taxa de mostra de audio por Bluetooth" @@ -311,8 +311,8 @@ "Comproba as aplicacións instaladas a través de ADB/ADT para detectar comportamento perigoso" "Mostraranse dispositivos Bluetooth sen nomes (só enderezos MAC)" "Desactiva a función do volume absoluto do Bluetooth en caso de que se produzan problemas de volume cos dispositivos remotos, como volume demasiado alto ou falta de control" - "Activa o conxunto de funcións de Bluetooth Gabeldorsche." - "Activa a función de conectividade mellorada." + "Activa o conxunto de funcións de Bluetooth Gabeldorsche" + "Activa a función de conectividade mellorada" "Terminal local" "Activa a aplicación terminal que ofrece acceso ao shell local" "Comprobación HDCP" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index f25a7be9ec02..f92dbc5366d1 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -245,8 +245,8 @@ "बूटलोडर को अनलाॅक किए जाने की अनुमति दें" "OEM अनलॉक करने की अनुमति दें?" "चेतावनी: इस सेटिंग के चालू रहने पर डिवाइस सुरक्षा सुविधाएं इस डिवाइस पर काम नहीं करेंगी." - "जगह की दिखावटी जानकारी देने के लिए ऐप्लिकेशन चुनें" - "जगह की दिखावटी जानकारी देने के लिए ऐप सेट नहीं है" + "मॉक लोकेशन के लिए ऐप्लिकेशन चुनें" + "मॉक लोकेशन के लिए ऐप्लिकेशन सेट नहीं है" "जगह की दिखावटी जानकारी देने वाला ऐप: %1$s" "नेटवर्किंग" "वायरलेस डिसप्ले सर्टिफ़िकेशन" @@ -310,7 +310,7 @@ "यूएसबी पर ऐप्लिकेशन की पुष्टि करें" "नुकसान पहुंचाने वाली गतिविधियों के लिए ADB/ADT से इंस्टॉल किए गए ऐप्लिकेशन जांचें." "बिना नाम वाले ब्लूटूथ डिवाइस (सिर्फ़ MAC पते वाले) दिखाए जाएंगे" - "दूर के डिवाइस पर आवाज़ बहुत बढ़ जाने या उससे कंट्रोल हटने जैसी समस्याएं होने पर, यह ब्लूटूथ के ज़रिए आवाज़ के कंट्रोल की सुविधा रोक देता है." + "रिमोट डिवाइस पर आवाज़ बहुत बढ़ जाने या उससे कंट्रोल हटने जैसी समस्याएं होने पर, यह ब्लूटूथ के ज़रिए आवाज़ के कंट्रोल की सुविधा रोक देता है." "ब्लूटूथ सेटिंग में Gabeldorsche सुविधा को चालू करता है." "कनेक्टिविटी बेहतर बनाने की सुविधा को चालू करें" "स्थानीय टर्मिनल" @@ -467,7 +467,7 @@ "बंद किया गया" "अनुमति है" "अनुमति नहीं है" - "अनजान ऐप्लिकेशन इंस्टॉल करने का ऐक्सेस" + "अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति देना" "सेटिंग का होम पेज" "0%" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index be9e7f88d4c0..e5d6b5293ef3 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -310,7 +310,7 @@ "Potvrdi aplikacije putem USB-a" "Provjerite uzrokuju li aplikacije instalirane putem ADB-a/ADT-a poteškoće" "Prikazivat će se Bluetooth uređaji bez naziva (samo MAC adrese)" - "Onemogućuje Bluetoothovu značajku apsolutne glasnoće ako udaljeni uređaji imaju poteškoća sa zvukom, kao što su neprihvatljiva glasnoća ili nepostojanje kontrole" + "Onemogućuje Bluetoothovu značajku apsolutne glasnoće ako udaljeni uređaji imaju poteškoća sa zvukom, primjerice, zvuk je pretjerano glasan ili se ne može kontrolirati." "Omogućuje nizove značajke Bluetooth Gabeldorsche." "Omogućuje značajku Poboljšana povezivost." "Lokalni terminal" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index c5a605951f4a..d55ba179bf7a 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -204,7 +204,7 @@ "Setelan VPN tidak tersedia untuk pengguna ini" "Setelan Penambatan tidak tersedia untuk pengguna ini" "Setelan Nama Titik Akses tidak tersedia untuk pengguna ini" - "Debugging USB" + "Proses debug USB" "Mode debug ketika USB terhubung" "Cabut otorisasi debug USB" "Proses debug nirkabel" diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index d81eeab8666f..f0ff5669837a 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -205,10 +205,10 @@ "このユーザーはテザリング設定を利用できません" "このユーザーはアクセスポイント名設定を利用できません" "USB デバッグ" - "USB 接続時はデバッグモードにする" + "USB 接続時にデバッグモードにする" "USB デバッグの許可の取り消し" "ワイヤレス デバッグ" - "Wi-Fi 接続時はデバッグモードにする" + "Wi-Fi 接続時にデバッグモードにする" "エラー" "ワイヤレス デバッグ" "利用可能なデバイスを確認して使用するには、ワイヤレス デバッグを ON にしてください" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 9ebe6592a992..36691bb88e90 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -156,7 +156,7 @@ "일부 기본값이 설정됨" "기본값이 설정되지 않음" "TTS 설정" - "TTS 출력" + "텍스트 음성 변환 출력" "말하는 속도" "텍스트를 읽어주는 속도" "음조" @@ -245,8 +245,8 @@ "부트로더 잠금 해제 허용" "OEM 잠금 해제를 허용하시겠습니까?" "경고: 이 설정을 사용하는 동안에는 이 기기에서 기기 보호 기능이 작동하지 않습니다." - "모의 위치 앱 선택" - "모의 위치 앱이 설정되어 있지 않음" + "가상 위치 앱 선택" + "가상 위치 앱이 설정되어 있지 않음" "모의 위치 앱: %1$s" "네트워크" "무선 디스플레이 인증서" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 4112adbbd864..7f1d012754f5 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -368,7 +368,7 @@ "Көмөкчү экрандардын эмуляциясы" "Колдонмолор" "Аракеттер сакталбасын" - "Колдонуучу чыгып кетери менен бардык аракеттер өчүрүлөт" + "Колдонуучу чыгып кетери менен бардык аракеттер өчүп калат" "Фондогу процесстер чеги" "Фондук режимдеги ANR" "Фондогу колдонмо жооп бербей жатат деп билдирип турат" diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index a28abde4f3c6..61c45a267d65 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -564,7 +564,7 @@ "အသုံးပြုသူအသစ် ပြုလုပ်နေသည်…" "အသုံးပြုသူအသစ် ပြုလုပ်၍မရပါ" "နာမည်ပြောင်" - "ဧည့်သည့် ထည့်ရန်" + "ဧည့်သည် ထည့်ရန်" "ဧည့်သည်ကို ဖယ်ထုတ်ရန်" "ဧည့်သည်ကို ပြင်ဆင်သတ်မှတ်ရန်" "ဧည့်သည်" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 9633f2e15daa..0efd0b367742 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -156,7 +156,7 @@ "Enkele standaardwaarden ingesteld" "Geen standaardwaarden ingesteld" "Instellingen tekst-naar-spraak" - "Spraakuitvoer" + "Tekst-naar-spraakuitvoer" "Spreeksnelheid" "Snelheid waarmee de tekst wordt gesproken" "Toonhoogte" diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index e99f7e069fec..b26bb28ad230 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -205,10 +205,10 @@ "ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଟିଥରିଂ ସେଟିଂସ ଉପଲବ୍ଧ ନାହିଁ" "ଆକ୍ସେସ ପଏଣ୍ଟ ନାମର ସେଟିଂସ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନାହିଁ" "USB ଡିବଗିଂ" - "USB ସଂଯୁକ୍ତ ହେବାବେଳେ ଡିବଗ୍‌ ମୋଡ୍‌" + "USB କନେକ୍ଟ ହେବାବେଳେ ଡିବଗ ମୋଡ" "USB ଡିବଗିଂ ଅଧିକାରକୁ ବାତିଲ୍ କରନ୍ତୁ" "ୱାୟାରଲେସ୍ ଡିବଗିଂ" - "ୱାଇ-ଫାଇ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଡିବଗ୍ ମୋଡ୍" + "ୱାଇ-ଫାଇ କନେକ୍ଟ ଥିବା ବେଳେ ଡିବଗ ମୋଡ" "ତ୍ରୁଟି" "ୱାୟାରଲେସ୍ ଡିବଗିଂ" "ଉପଲବ୍ଧ ଡିଭାଇସଗୁଡ଼ିକୁ ଦେଖିବାକୁ ଏବଂ ବ୍ୟବହାର କରିବାକୁ ୱାୟାରଲେସ୍ ଡିବଗିଂ ଚାଲୁ କରନ୍ତୁ" @@ -245,8 +245,8 @@ "bootloaderକୁ ଅନ୍‌ଲକ୍‌ ହେବାର ଅନୁମତି ଦିଅନ୍ତୁ" "OEM ଅନଲକ୍‌ କରିବା ଅନୁମତି ଦେବେ?" "ଚେତାବନୀ: ଏହି ସେଟିଙ୍ଗ ଚାଲୁ ଥିବାବେଳେ ଡିଭାଇସ୍‌ର ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ କାମ କରିବ ନାହିଁ" - "ମକ୍ ଲୋକେସନ୍‌ ଆପ୍‌ର ଚୟନ କରନ୍ତୁ" - "କୌଣସି ମକ୍ ଲୋକେସନ ଆପ୍ ସେଟ୍ କରାଯାଇନାହିଁ" + "ମକ ଲୋକେସନ ଆପ ଚୟନ କରନ୍ତୁ" + "କୌଣସି ମକ ଲୋକେସନ ଆପ ସେଟ କରାଯାଇନାହିଁ" "ମକ୍ ଲୋକେସନ୍‌ ଆପ୍‌: %1$s" "ନେଟ୍‌ୱର୍କିଙ୍ଗ" "ୱାୟରଲେସ୍‌ ଡିସ୍‌ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍" @@ -255,10 +255,10 @@ "ୱାଇ-ଫାଇ ଅଣ-ଅବିରତ MAC ରେଣ୍ଡମାଇଜେସନ୍" "ମୋବାଇଲ୍‌ ଡାଟା ସର୍ବଦା ସକ୍ରିୟ" "ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର ଆକ୍ସିଲିରେସନ୍" - "ବ୍ଲୁଟୂଥ୍‍‌ ଡିଭାଇସ୍‌ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ" + "ବ୍ଲୁଟୂଥ ଡିଭାଇସଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖାନ୍ତୁ" "ପୂର୍ଣ୍ଣ ଭଲ୍ୟୁମ୍‌ ଅକ୍ଷମ କରନ୍ତୁ" "ଗାବେଲ୍‌ଡୋର୍ସ ସକ୍ରିୟ କରନ୍ତୁ" - "ବ୍ଲୁଟୂଥ୍‌ AVRCP ଭର୍ସନ୍" + "ବ୍ଲୁଟୂଥ୍‌ AVRCP ସଂସ୍କରଣ" "ବ୍ଲୁଟୂଥ୍‍‌ AVRCP ଭର୍ସନ୍‌" "ବ୍ଲୁଟୁଥ୍ MAP ସଂସ୍କରଣ" "ବ୍ଲୁଟୁଥ୍ MAP ସଂସ୍କରଣ ଚୟନ କରନ୍ତୁ" @@ -366,7 +366,7 @@ "ଟ୍ରାଞ୍ଜିସନ୍‌ ଆନିମେସନ୍‌ ସ୍କେଲ୍‌" "ଆନିମେଟର୍‌ ଅବଧି ସ୍କେଲ୍‌" "ସେକେଣ୍ଡାରୀ ଡିସ୍‌ପ୍ଲେ ସିମୁଲେଟ୍ କରନ୍ତୁ" - "ଆପ୍‌ଗୁଡ଼ିକ" + "ଆପ୍ସ" "କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ ରଖନ୍ତୁ ନାହିଁ" "ୟୁଜର୍ ଏହାକୁ ଛାଡ଼ିବା କ୍ଷଣି ସମସ୍ତ କାର୍ଯ୍ୟକଳାପ ନଷ୍ଟ କରିଦିଅନ୍ତୁ" "ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡ ପ୍ରୋସେସ୍ ସୀମା" @@ -527,7 +527,7 @@ "ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ" "ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍" "ସାହାଯ୍ୟ ଓ ମତାମତ" - "ଷ୍ଟୋରେଜ୍" + "ଷ୍ଟୋରେଜ" "ସେୟାର୍ କରାଯାଇଥିବା ଡାଟା" "ସେୟାର୍ କରାଯାଇଥିବା ଡାଟା ଦେଖନ୍ତୁ ଏବଂ ଏହାକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ" "ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ କୌଣସି ସେୟାର୍ କରାଯାଇଥିବା ଡାଟା ନାହିଁ।" diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 3f4760055028..5b0e795ef586 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -309,7 +309,7 @@ "ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।" "USB \'ਤੇ ਐਪਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ" "ADB/ADT ਰਾਹੀਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦੀ ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ਜਾਂਚ ਕਰੋ।" - "ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਈਆਂ ਜਾਣਗੀਆਂ (ਸਿਰਫ਼ MAC ਪਤੇ)" + "ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਿਖਾਏ ਜਾਣਗੇ (ਸਿਰਫ਼ MAC ਪਤੇ)" "ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਅਵਾਜ਼ੀ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਅਵਾਜ਼ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਅਵਾਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ।" "ਬਲੂਟੁੱਥ Gabeldorsche ਵਿਸ਼ੇਸ਼ਤਾ ਸਟੈਕ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।" "ਵਿਸਤ੍ਰਿਤ ਕਨੈਕਟੀਵਿਟੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 3c6aed833c8c..786e6d34f4ee 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -162,7 +162,7 @@ "Tonalidade" "Afeta o tom da voz sintetizada" "Idioma" - "Utilizar idioma do sistema" + "Usar idioma do sistema" "Idioma não selecionado" "Define a voz do idioma específico para o texto lido" "Ouvir um exemplo" @@ -245,7 +245,7 @@ "Permitir o desbloqueio do carregador de arranque" "Permitir o desbloqueio de OEM?" "AVISO: as funcionalidades de proteção do dispositivo não funcionam neste dispositivo enquanto esta definição estiver ativada." - "Selecionar aplicação de localização fictícia" + "Selecionar app de localização fictícia" "Aplicação de localização fictícia não definida" "Aplicação de localização fictícia: %1$s" "Redes" diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index 12c46f756e7a..36330abc15ac 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -86,7 +86,7 @@ "map14" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "SBC" "AAC" "Audio Qualcomm® aptX™" @@ -94,7 +94,7 @@ "LDAC" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "SBC" "AAC" "Audio Qualcomm® aptX™" @@ -102,7 +102,7 @@ "LDAC" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "44,1 kHz" "48,0 kHz" "88,2 kHz" @@ -128,7 +128,7 @@ "32 biți/eșantion" - "Folosiți selectarea sistemului (prestabilit)" + "Folosește selectarea sistemului (prestabilit)" "Mono" "Stereo" @@ -234,7 +234,7 @@ "Niciuna" "Logcat" "Systrace (imagini)" - "Apelați stiva pentru glGetError" + "Apelează stiva pentru glGetError" "Dezactivat" @@ -248,7 +248,7 @@ "Dezactivată" - "Afișați zonele cu suprapunere" + "Afișează zonele cu suprapunere" "Afișați zonele de deuteranomalie" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 522914e05848..251ff035f579 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -31,7 +31,7 @@ "Problemă la autentificare" "Nu se poate conecta" "Nu se poate conecta la „%1$s”" - "Verificați parola și încercați din nou" + "Verifică parola și încearcă din nou" "În afara ariei de acoperire" "Nu se va conecta automat" "Nu există acces la internet" @@ -42,7 +42,7 @@ "Conectată prin %1$s" "Conectat prin %1$s" "Disponibilă prin %1$s" - "Atingeți pentru a vă înscrie" + "Atinge pentru a te înscrie" "Fără conexiune la internet" "Serverul DNS privat nu poate fi accesat" "Conexiune limitată" @@ -67,7 +67,7 @@ "Deconectat" "În curs de deconectare..." "Se conectează..." - "V-ați conectat la %1$s" + "Te-ai conectat la %1$s" "Se asociază…" "Conectat (fără telefon) la %1$s" "Conectat (fără conținut media) la %1$s" @@ -105,18 +105,18 @@ "Conectat la dispozitivul de intrare" "Conectat la dispoz. pt. acces internet" "Acces la internet local" - "Utilizați pentru acces la internet" + "Folosește pentru acces la internet" "Utilizați pentru hartă" "Folosiți pentru acces la SIM" - "Utilizați pentru profilul pentru conținut media audio" - "Utilizați pentru componenta audio a telefonului" - "Utilizați pentru transferul de fișiere" + "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" "Asociați" "CONECTAȚI" "Anulați" - "Asocierea dispozitivelor vă permite accesul la persoanele de contact și la istoricul apelurilor când dispozitivul este conectat." + "Asocierea dispozitivelor îți permite accesul la persoanele de contact și la istoricul apelurilor când dispozitivul este conectat." "Nu s-a putut împerechea cu %1$s." "Nu s-a putut asocia cu %1$s din cauza unui cod PIN sau a unei chei de acces incorecte." "Nu se poate comunica cu %1$s." @@ -139,7 +139,7 @@ "Semnal Wi-Fi: trei bare." "Semnal Wi-Fi: complet." "Rețea nesecurizată" - "Securizați rețeaua" + "Securizează rețeaua" "Sistem de operare Android" "Aplicații eliminate" "Aplicații și utilizatori eliminați" @@ -162,10 +162,10 @@ "Înălțime" "Afectează tonalitatea vorbirii sintetizate" "Limbă" - "Utilizați limba sistemului" - "Nu ați selectat limba" + "Folosește limba sistemului" + "Nu ai selectat limba" "Setează vocea caracteristică limbii pentru textul vorbit" - "Ascultați un exemplu" + "Ascultă un exemplu" "Redați o demonstrație scurtă a sintetizării vorbirii" "Instalați date vocale" "Instalați datele vocale necesare pentru sintetizarea vorbirii" @@ -181,7 +181,7 @@ "Lansați setările motorului" "Motor preferat" "Preferințe generale" - "Resetați tonalitatea vorbirii" + "Resetează tonalitatea vorbirii" "Resetați tonalitatea cu care se rostește textul în mod prestabilit." "Foarte încet" @@ -194,11 +194,11 @@ "Foarte rapid" "Cel mai repede" - "Alegeți un profil" + "Alege un profil" "Personal" "Serviciu" "Opțiuni pentru dezvoltatori" - "Activați opțiunile pentru dezvoltatori" + "Activează opțiunile pentru dezvoltatori" "Setați opțiuni pentru dezvoltarea aplicației" "Opțiunile de dezvoltator nu sunt disponibile pentru acest utilizator" "Setările VPN nu sunt disponibile pentru acest utilizator" @@ -211,41 +211,41 @@ "Modul de remediere a erorilor când rețeaua Wi-Fi este conectată" "Eroare" "Remedierea erorilor wireless" - "Activați remedierea erorilor wireless pentru a vedea și a folosi dispozitivele disponibile" + "Activează remedierea erorilor wireless pentru a vedea și a folosi dispozitivele disponibile" "Asociați dispozitivul folosind codul QR" - "Asociați dispozitive noi folosind scannerul de coduri QR" - "Asociați dispozitivul folosind codul de conectare" - "Asociați dispozitive noi folosind codul din șase cifre" + "Asociază dispozitive noi folosind scannerul de coduri QR" + "Asociază dispozitivul folosind codul de conectare" + "Asociază dispozitive noi folosind codul din șase cifre" "Dispozitive asociate" "Conectat" "Detalii despre dispozitiv" "Ștergeți" "Amprenta pentru dispozitiv: %1$s" "Conectare nereușită" - "Asigurați-vă că ați conectat %1$s la rețeaua corectă" - "Asociați cu dispozitivul" + "Asigură-te că ai conectat %1$s la rețeaua corectă" + "Asociază cu dispozitivul" "Cod de conectare pentru Wi-Fi" "Asociere nereușită" - "Asigurați-vă că dispozitivul este conectat la aceeași rețea." - "Asociați dispozitivul prin Wi-Fi scanând un cod QR" + "Asigură-te că dispozitivul este conectat la aceeași rețea." + "Asociază dispozitivul prin Wi-Fi scanând un cod QR" "Se asociază dispozitivul…" "Nu s-a asociat dispozitivul. Codul QR este incorect sau dispozitivul nu este conectat la aceeași rețea." "Adresa IP și portul" - "Scanați codul QR" - "Asociați dispozitivul prin Wi-Fi scanând un cod QR" + "Scanează codul QR" + "Asociază dispozitivul prin Wi-Fi scanând un cod QR" "Conectați-vă la o rețea Wi-Fi" "adb, remedierea erorilor, dev" "Comandă rapidă pentru raportul de erori" - "Afișați un buton în meniul de pornire pentru a realiza un raport de erori" + "Afișează un buton în meniul de pornire pentru a realiza un raport de erori" "Activ permanent" "Ecranul nu va fi inactiv pe durata încărcării" - "Activați jurnalul de examinare HCI Bluetooth" + "Activează jurnalul de examinare HCI Bluetooth" "Înregistrați pachetele Bluetooth. (Comutați Bluetooth după modificarea setării)" "Deblocarea OEM" "Permiteți deblocarea bootloaderului" "Permiteți deblocarea OEM?" "AVERTISMENT: funcțiile de protecție a dispozitivului nu vor funcționa pe acest dispozitiv cât timp setarea este activată." - "Selectați aplicația pentru locația de testare" + "Selectează aplicația pentru locația de testare" "Nicio aplicație setată pentru locația de testare" "Aplicația pentru locația de testare: %1$s" "Conectare la rețele" @@ -255,22 +255,22 @@ "Randomizarea adresei MAC nepersistente pentru Wi-Fi" "Date mobile permanent active" "Accelerare hardware pentru tethering" - "Afișați dispozitivele Bluetooth fără nume" + "Afișează dispozitivele Bluetooth fără nume" "Dezactivați volumul absolut" - "Activați Gabeldorsche" + "Activează Gabeldorsche" "Versiunea AVRCP pentru Bluetooth" - "Selectați versiunea AVRCP pentru Bluetooth" + "Selectează versiunea AVRCP pentru Bluetooth" "Versiunea MAP pentru Bluetooth" "Selectați versiunea MAP pentru Bluetooth" "Codec audio Bluetooth" - "Declanșați codecul audio Bluetooth\nSelecție" + "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" "O opțiune inactivă înseamnă incompatibilitate cu telefonul sau setul căști-microfon" "Biți audio Bluetooth per eșantion" - "Declanșați codecul audio Bluetooth\nSelecție: biți per eșantion" + "Declanșează codecul audio Bluetooth\nSelecție: biți per eșantion" "Modul canal audio Bluetooth" - "Declanșați codecul audio Bluetooth\nSelecție: modul Canal" + "Declanșează codecul audio Bluetooth\nSelecție: modul Canal" "Codecul LDAC audio pentru Bluetooth: calitatea redării" "Declanșați codecul LDAC audio pentru Bluetooth\nSelecție: calitatea redării" "Transmitere în flux: %1$s" @@ -279,25 +279,25 @@ "Dezactivat" "Automat" "Nume de gazdă al furnizorului de DNS privat" - "Introduceți numele de gazdă al furnizorului de DNS" + "Introdu numele de gazdă al furnizorului de DNS" "Nu s-a putut conecta" "Afișați opțiunile pentru certificarea Ecran wireless" - "Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi" + "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." "Contorizată" "Necontorizată" "Dimensiunile memoriei temporare a jurnalului" "Dimensiuni jurnal / mem. temp. jurnal" - "Ștergeți stocarea permanentă a jurnalului?" - "Când nu mai monitorizăm folosind jurnalul permanent, trebuie să ștergem datele de jurnal aflate pe dispozitivul dvs." - "Stocați date jurnal permanent pe dispozitiv" - "Selectați zonele-tampon ale jurnalului de stocat permanent pe dispozitiv" + "Ștergi stocarea permanentă a jurnalului?" + "Când nu mai monitorizăm folosind jurnalul permanent, trebuie să ștergem datele de jurnal aflate pe dispozitivul tău." + "Stochează date jurnal permanent pe dispozitiv" + "Selectează zonele-tampon ale jurnalului de stocat permanent pe dispozitiv" "Selectați configurația USB" "Selectați configurația USB" "Permiteți locațiile fictive" - "Permiteți locațiile fictive" - "Activați inspectarea atributelor de vizualizare" + "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)." "Folosiți accelerarea hardware pentru tethering, dacă este disponibilă" "Permiteți remedierea erorilor prin USB?" @@ -305,25 +305,25 @@ "Permiteți remedierea erorilor wireless?" "Remedierea erorilor wireless are exclusiv scopuri de dezvoltare. Folosiț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." "Revocați accesul la remedierea erorilor prin USB de pe toate computerele pe care le-ați autorizat anterior?" - "Permiteți setările pentru dezvoltare?" - "Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul dvs. și aplicațiile de pe acesta să nu mai funcționeze sau să funcționeze necorespunzător." + "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" - "Verificați aplicațiile instalate utilizând ADB/ADT, pentru a detecta un comportament dăunător." + "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." "Activează setul de funcții Bluetooth Gabeldorsche." "Activează funcția Conectivitate îmbunătățită." "Aplicație terminal locală" - "Activați aplicația terminal care oferă acces la shell local" + "Activează aplicația terminal care oferă acces la shell local" "Verificare HDCP" - "Configurați verific. HDCP" + "Configurează verif. HDCP" "Depanare" - "Selectați aplicația de depanare" + "Selectează aplicația de depanare" "Nu ați setat o aplicație de depanare" "Aplicație de depanare: %1$s" "Selectați o aplicație" "Niciuna" - "Așteptați depanatorul" + "Așteaptă depanatorul" "Înaintea executării, aplicația așteaptă atașarea depanatorului" "Intrare" "Desen" @@ -342,25 +342,25 @@ "Iluminare ecrane din ferestre la desenare" "Actualiz. strat. hardware" "Straturile hardware clipesc verde la actualizare" - "Depanați suprapunerea" + "Remediază suprapunerea" "Dezactivați suprapun. HW" - "Utilizați mereu GPU pentru compunerea ecranului" - "Simulați spațiu culoare" + "Folosește mereu GPU pentru compunerea ecranului" + "Simulează spațiu culoare" "Monitorizări OpenGL" "Dezactivați rutarea audio USB" "Dezact. rutarea automată către perif. audio USB" - "Afișați limite aspect" + "Afișează limite aspect" "Afișați limitele clipului, marginile etc." "Direcție aspect dreapta - stânga" "Direcție obligatorie aspect ecran dreapta - stânga" - "Permiteți estompări la nivel de fereastră" + "Permite estompări la nivel de fereastră" "Forțați MSAA 4x" - "Activați MSAA 4x în aplicațiile OpenGL ES 2.0" - "Remediați decupări nerectangulare" + "Activează MSAA 4x în aplicațiile OpenGL ES 2.0" + "Remediezi decupări nerectangulare" "Profil redare cu HWUI" "Activați nivelurile de depanare GPU" "Permiteți încărcarea nivelurilor de depanare GPU pentru aplicațiile de depanare" - "Activați înregistrarea detaliată a furnizorilor" + "Activează înregistrarea detaliată a furnizorilor" "Includeți alte jurnale ale furnizorilor de dispozitive în rapoartele de eroare, care pot conține informații private, folosiți mai multă baterie și/sau mai mult spațiu de stocare." "Scară animație fereastră" "Scară tranziție animații" @@ -371,18 +371,18 @@ "Elimină activitățile imediat ce utilizatorul le închide" "Limită procese fundal" "Afișați ANR de fundal" - "Afișați dialogul Aplicația nu răspunde pentru aplicațiile din fundal" - "Afișați avertismentele de pe canalul de notificări" - "Afișați avertisment pe ecran când o aplicație postează o notificare fără canal valid" - "Forțați accesul aplicațiilor la stocarea externă" + "Afișează dialogul Aplicația nu răspunde pentru aplicațiile din fundal" + "Afișează avertismentele de pe canalul de notificări" + "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ți 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." - "Activați ferestrele cu formă liberă" + "Activează ferestrele cu formă liberă" "Activați compatibilitatea pentru ferestrele experimentale cu formă liberă." "Parolă backup computer" "În prezent, backupurile complete pe computer nu sunt protejate" - "Atingeți ca să modificați sau să eliminați parola pentru backupurile complete pe desktop" + "Atinge ca să modifici sau să elimini parola pentru backupurile complete pe desktop" "A fost setată o parolă de rezervă nouă" "Parola nouă și confirmarea acesteia nu se potrivesc." "Setarea parolei de rezervă a eșuat" @@ -398,25 +398,25 @@ "Culori optimizate pentru conținutul digital" "Aplicații în standby" - "Inactivă. Atingeți pentru a comuta." + "Inactivă. Atinge pentru a comuta." "Activă. Atingeți pentru a comuta." "Stare Standby aplicații: %s" "Setări pentru transcodarea conținutului media" - "Modificați setările prestabilite de transcodare" - "Activați transcodarea" - "Presupuneți că aplicațiile acceptă formatele moderne" + "Modifică setările prestabilite de transcodare" + "Activează transcodarea" + "Presupune că aplicațiile acceptă formatele moderne" "Vedeți notificările privind transcodarea" - "Dezactivați memoria cache pentru transcodare" + "Dezactivează memoria cache pentru transcodare" "Servicii în curs de funcționare" - "Vedeți și controlați serviciile care funcționează în prezent" + "Vezi și controlează serviciile care funcționează în prezent" "Implementare WebView" - "Setați implementarea WebView" - "Această opțiune nu mai este validă. Încercați din nou." - "Faceți conversia la criptarea bazată pe sistemul de fișiere" + "Setează implementarea WebView" + "Această opțiune nu mai este validă. Încearcă din nou." + "Fă conversia la criptarea bazată pe sistemul de fișiere" "Convertiți…" "Criptarea bazată pe sistemul de fișiere este finalizată" "Se face conversia la criptarea bazată pe sistemul de fișiere" - "Faceți conversia partiției de date la criptarea bazată pe sistemul de fișiere. \n AVERTISMENT! Astfel, toate datele dvs. vor fi șterse.\n Aceasta este o funcție în versiune alpha și este posibil să nu funcționeze corect.\n Apăsați pe „Ștergeți și convertiți…” pentru a continua." + "Fă conversia partiției de date la criptarea bazată pe sistemul de fișiere. \n AVERTISMENT! Astfel, toate datele tale vor fi șterse.\n Aceasta este o funcție în versiune alpha și este posibil să nu funcționeze corect.\n Apasă pe „Șterge și convertește…” pentru a continua." "Ștergeți și convertiți…" "Modul de culori pentru imagini" "Folosiți sRGB" @@ -426,7 +426,7 @@ "Protanomalie (roșu-verde)" "Tritanomalie (albastru-galben)" "Corecția culorii" - "Ajustați modul în care se afișează culorile pe dispozitiv. Acest lucru poate fi util când doriți să:<br/><br/> <ol> <li>&nbsp;vedeți culorile mai bine;</li> <li>&nbsp; eliminați culorile pentru a vă ajuta să vă concentrați.</li> </ol>" + "Ajustează modul în care se afișează culorile pe dispozitiv. Acest lucru poate fi util când vrei:<br/><br/> <ol> <li>&nbsp;să vezi culorile mai bine;</li> <li>&nbsp;să elimini culorile pentru a te ajuta să te concentrezi.</li> </ol>" "Valoare înlocuită de %1$s" "%1$s - %2$s" "Timp aproximativ rămas: %1$s" @@ -483,14 +483,14 @@ "Cel mai mare" "Personalizat (%d)" "Meniu" - "Introduceți parola pentru a reveni la setările din fabrică în modul demo" + "Introdu parola pentru a reveni la setările din fabrică în modul demo" "Înainte" - "Trebuie să introduceți o parolă" + "Trebuie să introduci o parolă" "Metode active de introducere de text" "Folosește limbile sistemului" "Deschiderea setărilor pentru %1$s a eșuat" "Această metodă de introducere de text poate culege în întregime textul introdus, inclusiv datele personale, cum ar fi parolele și numerele cardurilor de credit. Metoda provine de la aplicația %1$s. Utilizați această metodă de introducere de text?" - "Notă: după repornire, această aplicație nu poate porni până nu deblocați telefonul" + "Notă: după repornire, această aplicație nu poate porni până nu deblochezi telefonul" "Situația înregistrării IMS" "Înregistrat" "Neînregistrat" @@ -506,17 +506,17 @@ "Anulați" "OK" "Alarme și mementouri" - "Permiteți setarea pentru alarme și mementouri" + "Permite setarea pentru alarme și mementouri" "Alarme și mementouri" - "Permiteți acestei aplicații să stabilească alarme și să planifice acțiuni dependente de timp. Astfel, aplicația poate să ruleze în fundal, fapt care ar putea consuma mai multă baterie.\n\nDacă permisiunea este dezactivată, alarmele și evenimentele dependente de timp planificate de aplicație nu vor funcționa." + "Permite acestei aplicații să stabilească alarme și să planifice acțiuni dependente de timp. Astfel, aplicația poate să ruleze în fundal, fapt care ar putea consuma mai multă baterie.\n\nDacă permisiunea este dezactivată, alarmele și evenimentele dependente de timp planificate de aplicație nu vor funcționa." "programare, alarmă, memento, ceas" - "Activați" - "Activați Nu deranja" + "Activează" + "Activează Nu deranja" "Niciodată" "Numai cu prioritate" "%1$s. %2$s" "Dacă nu dezactivați această opțiune înainte, nu veți auzi următoarea alarmă %1$s" - "Nu veți auzi următoarea alarmă %1$s" + "Nu vei auzi următoarea alarmă %1$s" "la %1$s" "%1$s" "Durată" @@ -525,23 +525,23 @@ "Chiar acum" "Difuzorul telefonului" "Acest telefon" - "Problemă la conectare. Opriți și reporniți dispozitivul." + "Problemă la conectare. Oprește și repornește dispozitivul." "Dispozitiv audio cu fir" "Ajutor și feedback" "Stocare" "Date la care se permite accesul" "Vedeți și modificați datele la care se permite accesul" "Nu există date la care se permite accesul pentru acest utilizator." - "A apărut o eroare la preluarea datelor la care se permite accesul. Încercați din nou." + "A apărut o eroare la preluarea datelor la care se permite accesul. Încearcă din nou." "ID-ul datelor la care se permite accesul: %d" "Expiră pe %s" "A apărut o eroare la ștergerea datelor la care se permite accesul." - "Nu există închirieri pentru datele la care se permite accesul. Doriți să le ștergeți?" + "Nu există închirieri pentru datele la care se permite accesul. Vrei să le ștergi?" "Aplicații care permit accesul la date" "Aplicația nu oferă nicio descriere." "Închirierea expiră pe %s" - "Ștergeți datele la care se permite accesul" - "Sigur ștergeți aceste date la care se permite accesul?" + "Șterge datele la care se permite accesul" + "Sigur ștergi aceste date la care se permite accesul?" "Utilizatorii dețin aplicații și materiale proprii" "Puteți restricționa accesul la aplicații și la conținut din contul dvs." "Utilizator" @@ -554,25 +554,25 @@ "Configurați profilul acum?" "Configurați acum" "Nu acum" - "Adăugați" + "Adaugă" "Utilizator nou" "Profil nou" "Info. utilizator" "Informații de profil" "Înainte de a putea crea un profil cu permisiuni limitate, va trebui să configurați blocarea ecranului pentru a vă proteja aplicațiile și datele personale." "Configurați blocarea" - "Treceți la %s" + "Treci la %s" "Se creează un utilizator nou…" "Nu s-a creat noul utilizator" "Pseudonim" "Adăugați un invitat" "Ștergeți invitatul" - "Resetați sesiunea pentru invitați" + "Resetezi sesiunea pentru invitați" "Invitat" - "Resetați invitatul?" + "Resetezi invitatul?" "Resetați" "Se resetează invitatul…" - "Faceți o fotografie" + "Fă o fotografie" "Alegeți o imagine" "Selectați fotografia" "Prestabilit pentru dispozitiv" diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index e713bee7f1b4..c0a9a424198a 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -155,8 +155,8 @@ "Përdoruesi: %1$s" "Disa caktime me parazgjedhje" "Nuk janë caktuar parazgjedhje" - "Cilësimet \"tekst-në-ligjërim\"" - "Dalja \"tekst-në-ligjërim\"" + "Cilësimet \"Tekst në ligjërim\"" + "Dalja \"Tekst në ligjërim\"" "Shpejtësia e të folurit" "Shpejtësia me të cilën thuhet teksti" "Tonaliteti" @@ -170,7 +170,7 @@ "Instalo të dhënat e zërit" "Instalo të dhënat e zërit që kërkohen për sintezën e të folurit" "Ky motor i sintezës së të folurit mund të mbledhë të gjithë tekstin që do të flitet, duke përfshirë të dhëna personale si fjalëkalime dhe numra kartash krediti. Ai vjen nga motori %s. Të aktivizohet përdorimi i këtij motori të sintezës së të folurit?" - "Kjo gjuhë kërkon një lidhje funksionale interneti për daljen \"tekst-në-ligjërim\"." + "Kjo gjuhë kërkon një lidhje funksionale interneti për daljen \"Tekst në ligjërim\"." "Ky është një shembull i sintezës së të folurit" "Statusi i gjuhës së parazgjedhur" "%1$s mbështetet plotësisht" diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index b95d69c95fc7..f82eec5c1bfc 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "RAMANI YA 1.2 (Chaguomsingi)" + "MAP 1.2 (Chaguomsingi)" "RAMANI YA 1.3" "RAMANI YA 1.4" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 6cbf8e876aaa..6b461db9b131 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -260,8 +260,8 @@ "Washa Gabeldorsche" "Toleo la Bluetooth AVRCP" "Chagua Toleo la Bluetooth AVRCP" - "Toleo la Ramani ya Bluetooth" - "Chagua Toleo la Ramani ya Bluetooth" + "Toleo la Bluetooth MAP" + "Chagua Toleo la Bluetooth MAP" "Kodeki ya Sauti ya Bluetooth" "Weka Kodeki ya Sauti ya Bluetooth\nUteuzi" "Kiwango cha Sampuli ya Sauti ya Bluetooth" @@ -569,7 +569,7 @@ "Badilisha kipindi cha mgeni" "Mgeni" "Ungependa kubadilisha kipindi cha mgeni?" - "Badilisha" + "Weka upya" "Inabadilisha kipindi cha mgeni…" "Piga picha" "Chagua picha" diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml index 79d7c575e7fd..92258b0f56dd 100644 --- a/packages/SettingsLib/res/values-ta/arrays.xml +++ b/packages/SettingsLib/res/values-ta/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "MAP 1.2 (இயல்பாக)" + "MAP 1.2 (இயல்பு)" "MAP 1.3" "MAP 1.4" diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 50c90c0708c3..01613e3b6165 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -255,7 +255,7 @@ "வைஃபையில், மாறுபடும் MAC முகவரியைக் காண்பித்தல்" "மொபைல் டேட்டாவை எப்போதும் இயக்கத்திலேயே வை" "வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை" - "பெயர்கள் இல்லாத புளூடூத் சாதனங்களைக் காட்டு" + "பெயர்கள் இல்லாமல் புளூடூத் சாதனங்களைக் காட்டு" "அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கு" "Gabeldorscheவை இயக்கு" "புளூடூத் AVRCP பதிப்பு" @@ -309,7 +309,7 @@ "இந்த அமைப்பு மேம்பட்டப் பயன்பாட்டிற்காக மட்டுமே. உங்கள் சாதனம் மற்றும் அதில் உள்ள பயன்பாடுகளைச் சிதைக்கும் அல்லது தவறாகச் செயல்படும் வகையில் பாதிப்பை ஏற்படுத்தும்." "USB ஆப்ஸைச் சரிபார்" "தீங்கு விளைவிக்கும் செயல்பாட்டை அறிய ADB/ADT மூலம் நிறுவப்பட்ட ஆப்ஸைச் சரிபார்." - "பெயர்கள் இல்லாத புளூடூத் சாதனங்கள் (MAC முகவரிகள் மட்டும்) காட்டப்படும்" + "பெயர்கள் இல்லாமல் புளூடூத் சாதனங்கள் (MAC முகவரிகள் மட்டும்) காட்டப்படும்" "மிகவும் அதிகமான ஒலியளவு அல்லது கட்டுப்பாடு இழப்பு போன்ற தொலைநிலைச் சாதனங்களில் ஏற்படும் ஒலி தொடர்பான சிக்கல்கள் இருக்கும் சமயங்களில், புளூடூத் அப்சல்யூட் ஒலியளவு அம்சத்தை முடக்கும்." "புளூடூத்தின் Gabeldorsche அம்சங்களை இயக்கும்." "மேம்படுத்தப்பட்ட இணைப்புநிலை அம்சத்தை இயக்கும்." diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 6bf85f5a11d4..8ec88236c7ae 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -206,7 +206,7 @@ "యాక్సెస్ స్థానం పేరు సెట్టింగ్‌లు ఈ వినియోగదారుకి అందుబాటులో లేవు" "USB డీబగ్గింగ్" "USB కనెక్ట్ చేయబడినప్పుడు డీబగ్ మోడ్" - "USB డీబగ్ ప్రామాణీకరణలను ఉపసంహరించు" + "USB డీబగ్ ప్రామాణీకరణలు ఉపసంహరించండి" "వైర్‌లెస్ డీబగ్గింగ్" "Wi-Fi కనెక్ట్ అయి ఉన్నప్పుడు, డీబగ్ మోడ్‌లో ఉంచు" "ఎర్రర్" @@ -255,8 +255,8 @@ "Wi‑Fi నిరంతరం కాని MAC ర్యాండమైజేషన్" "మొబైల్ డేటాను ఎల్లప్పుడూ యాక్టివ్‌గా ఉంచు" "టెథెరింగ్ హార్డ్‌వేర్ యాగ్జిలరేషన్" - "పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించు" - "సంపూర్ణ వాల్యూమ్‌‍ను డిజేబుల్ చేయి" + "పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించండి" + "సంపూర్ణ వాల్యూమ్‌‍ను డిజేబుల్ చేయండి" "Gabeldorscheను ఎనేబుల్ చేయి" "బ్లూటూత్ AVRCP వెర్షన్" "బ్లూటూత్ AVRCP వెర్షన్‌ను ఎంచుకోండి" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index c6ac6ccb48f0..4106ddebc3c6 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -260,8 +260,8 @@ "เปิดใช้ Gabeldorsche" "เวอร์ชันของบลูทูธ AVRCP" "เลือกเวอร์ชันของบลูทูธ AVRCP" - "เวอร์ชัน MAP ของบลูทูธ" - "เลือกเวอร์ชัน MAP ของบลูทูธ" + "เวอร์ชันของบลูทูธ MAP" + "เลือกเวอร์ชันของบลูทูธ MAP" "ตัวแปลงสัญญาณเสียงบลูทูธ" "ทริกเกอร์การเลือกตัวแปลงรหัส\nเสียงบลูทูธ" "อัตราตัวอย่างเสียงบลูทูธ" diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index b95472d8789e..0c01d6471c12 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -204,9 +204,9 @@ "‏VPN ترتیبات اس صارف کیلئے دستیاب نہیں ہیں" "ٹیدرنگ ترتیبات اس صارف کیلئے دستیاب نہیں ہیں" "رسائی کی جگہ کے نام کی ترتیبات اس صارف کیلئے دستیاب نہیں ہیں" - "‏USB ڈیبگ کرنا" + "‏USB ڈیبگنگ" "‏USB مربوط ہونے پر ڈيبگ کرنے کی وضع" - "‏USB ڈیبگ کرنے کی اجازت دہندگیوں کو منسوخ کریں" + "‏USB ڈیبگنگ کی اجازت دہندگیوں کو منسوخ کریں" "وائرلیس ڈیبگنگ" "‏Wi-Fi سے منسلک ہونے پر ڈیبگ موڈ" "خرابی" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 17197caa8c2f..3e4297623b7e 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -310,7 +310,7 @@ "通过 USB 验证应用" "检查通过 ADB/ADT 安装的应用是否存在有害行为。" "系统将显示没有名称(只有 MAC 地址)的蓝牙设备" - "停用蓝牙绝对音量功能,即可避免在连接到远程设备时出现音量问题(例如音量高得让人无法接受或无法控制音量等)。" + "停用蓝牙绝对音量功能,以防在连接到远程设备时出现音量问题(例如音量高得让人无法接受或无法控制音量等)。" "启用“蓝牙 Gabeldorsche”功能堆栈。" "启用增强连接性功能。" "本地终端" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index ed23498f408b..8c4fff134e13 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -213,7 +213,7 @@ "無線偵錯" "如要查看並使用可用的裝置,請開啟無線偵錯功能" "使用 QR 圖碼配對裝置" - "使用 QR 圖碼掃描器配對新裝置" + "使用 QR code 掃描器配對新裝置" "使用配對碼配對裝置" "使用六位數的配對碼配對新裝置" "已配對的裝置" -- cgit v1.2.3 From 03b77aee350696781b4d7a61768a172bedc3ac73 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 11 Jan 2023 16:02:27 +0800 Subject: [RESTRICT AUTOMERGE] Fix bypass BG-FGS and BAL via package manager APIs Opt-in for BAL of PendingIntent for following APIs: * PackageInstaller.uninstall() * PackageInstaller.installExistingPackage() * PackageInstaller.uninstallExistingPackage() * PackageInstaller.Session.commit() * PackageInstaller.Session.commitTransferred() * PackageManager.freeStorage() Bug: 230492955 Bug: 243377226 Test: atest android.security.cts.PackageInstallerTest Test: atest CtsStagedInstallHostTestCases Change-Id: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf --- core/java/android/content/IntentSender.java | 41 ++++++++++++++++++++-- .../android/server/pm/InstallPackageHelper.java | 6 +++- .../android/server/pm/PackageInstallerService.java | 11 ++++-- .../android/server/pm/PackageInstallerSession.java | 16 +++++++-- .../android/server/pm/PackageManagerService.java | 7 +++- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index b1252fd0b21f..49d3cac63124 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -19,6 +19,7 @@ package android.content; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManager.PendingIntentInfo; +import android.app.ActivityOptions; import android.compat.annotation.UnsupportedAppUsage; import android.os.Bundle; import android.os.Handler; @@ -158,7 +159,7 @@ public class IntentSender implements Parcelable { */ public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler) throws SendIntentException { - sendIntent(context, code, intent, onFinished, handler, null); + sendIntent(context, code, intent, onFinished, handler, null, null /* options */); } /** @@ -190,6 +191,42 @@ public class IntentSender implements Parcelable { public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler, String requiredPermission) throws SendIntentException { + sendIntent(context, code, intent, onFinished, handler, requiredPermission, + null /* options */); + } + + /** + * Perform the operation associated with this IntentSender, allowing the + * caller to specify information about the Intent to use and be notified + * when the send has completed. + * + * @param context The Context of the caller. This may be null if + * intent is also null. + * @param code Result code to supply back to the IntentSender's target. + * @param intent Additional Intent data. See {@link Intent#fillIn + * Intent.fillIn()} for information on how this is applied to the + * original Intent. Use null to not modify the original Intent. + * @param onFinished The object to call back on when the send has + * completed, or null for no callback. + * @param handler Handler identifying the thread on which the callback + * should happen. If null, the callback will happen from the thread + * pool of the process. + * @param requiredPermission Name of permission that a recipient of the PendingIntent + * is required to hold. This is only valid for broadcast intents, and + * corresponds to the permission argument in + * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. + * If null, no permission is required. + * @param options Additional options the caller would like to provide to modify the sending + * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. + * + * @throws SendIntentException Throws CanceledIntentException if the IntentSender + * is no longer allowing more intents to be sent through it. + * @hide + */ + public void sendIntent(Context context, int code, Intent intent, + OnFinished onFinished, Handler handler, String requiredPermission, + @Nullable Bundle options) + throws SendIntentException { try { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) @@ -199,7 +236,7 @@ public class IntentSender implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission, null); + requiredPermission, options); if (res < 0) { throw new SendIntentException(); } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 7da5f51bcbc2..64a9a563e4a2 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -94,6 +94,7 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.AppOpsManager; import android.app.ApplicationPackageManager; +import android.app.BroadcastOptions; import android.app.backup.IBackupManager; import android.content.ContentResolver; import android.content.Context; @@ -641,7 +642,10 @@ final class InstallPackageHelper { fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index bb23d89d218f..02cf4336b277 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -27,6 +27,7 @@ import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PackageDeleteObserver; @@ -1360,7 +1361,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } @@ -1385,7 +1389,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageManager.deleteStatusToString(returnCode, msg)); fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 37bfbb11948a..74d9e56d8450 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -54,6 +54,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.WorkerThread; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.admin.DevicePolicyEventLogger; @@ -4260,7 +4261,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4301,7 +4305,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4335,7 +4342,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); } try { - target.sendIntent(context, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, intent, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ce5984786654..9c901e885fc8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -53,6 +53,7 @@ import android.annotation.WorkerThread; import android.app.ActivityManager; import android.app.AppOpsManager; import android.app.ApplicationPackageManager; +import android.app.BroadcastOptions; import android.app.IActivityManager; import android.app.admin.IDevicePolicyManager; import android.app.admin.SecurityLog; @@ -4770,7 +4771,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } if (pi != null) { try { - pi.sendIntent(null, success ? 1 : 0, null, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + pi.sendIntent(null, success ? 1 : 0, null /* intent */, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (SendIntentException e) { Slog.w(TAG, e); } -- cgit v1.2.3 From 5f00e89989392c9ae00b360e1388d0179dfb36d7 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 11 Jan 2023 16:02:27 +0800 Subject: [RESTRICT AUTOMERGE] Fix bypass BG-FGS and BAL via package manager APIs Opt-in for BAL of PendingIntent for following APIs: * PackageInstaller.uninstall() * PackageInstaller.installExistingPackage() * PackageInstaller.uninstallExistingPackage() * PackageInstaller.Session.commit() * PackageInstaller.Session.commitTransferred() * PackageManager.freeStorage() Bug: 230492955 Bug: 243377226 Test: atest android.security.cts.PackageInstallerTest Test: atest CtsStagedInstallHostTestCases Change-Id: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf --- core/java/android/content/IntentSender.java | 41 ++++++++++++++++++++-- .../android/server/pm/PackageInstallerService.java | 11 ++++-- .../android/server/pm/PackageInstallerSession.java | 22 +++++++++--- .../android/server/pm/PackageManagerService.java | 10 ++++-- 4 files changed, 74 insertions(+), 10 deletions(-) diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index b1252fd0b21f..49d3cac63124 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -19,6 +19,7 @@ package android.content; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManager.PendingIntentInfo; +import android.app.ActivityOptions; import android.compat.annotation.UnsupportedAppUsage; import android.os.Bundle; import android.os.Handler; @@ -158,7 +159,7 @@ public class IntentSender implements Parcelable { */ public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler) throws SendIntentException { - sendIntent(context, code, intent, onFinished, handler, null); + sendIntent(context, code, intent, onFinished, handler, null, null /* options */); } /** @@ -190,6 +191,42 @@ public class IntentSender implements Parcelable { public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler, String requiredPermission) throws SendIntentException { + sendIntent(context, code, intent, onFinished, handler, requiredPermission, + null /* options */); + } + + /** + * Perform the operation associated with this IntentSender, allowing the + * caller to specify information about the Intent to use and be notified + * when the send has completed. + * + * @param context The Context of the caller. This may be null if + * intent is also null. + * @param code Result code to supply back to the IntentSender's target. + * @param intent Additional Intent data. See {@link Intent#fillIn + * Intent.fillIn()} for information on how this is applied to the + * original Intent. Use null to not modify the original Intent. + * @param onFinished The object to call back on when the send has + * completed, or null for no callback. + * @param handler Handler identifying the thread on which the callback + * should happen. If null, the callback will happen from the thread + * pool of the process. + * @param requiredPermission Name of permission that a recipient of the PendingIntent + * is required to hold. This is only valid for broadcast intents, and + * corresponds to the permission argument in + * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. + * If null, no permission is required. + * @param options Additional options the caller would like to provide to modify the sending + * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. + * + * @throws SendIntentException Throws CanceledIntentException if the IntentSender + * is no longer allowing more intents to be sent through it. + * @hide + */ + public void sendIntent(Context context, int code, Intent intent, + OnFinished onFinished, Handler handler, String requiredPermission, + @Nullable Bundle options) + throws SendIntentException { try { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) @@ -199,7 +236,7 @@ public class IntentSender implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission, null); + requiredPermission, options); if (res < 0) { throw new SendIntentException(); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 708b2129ad29..2ca3e8f1bc1b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -25,6 +25,7 @@ import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PackageDeleteObserver; @@ -1243,7 +1244,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } @@ -1268,7 +1272,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageManager.deleteStatusToString(returnCode, msg)); fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 3ddcf17d0a47..1137fc5b5a86 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -50,6 +50,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.admin.DevicePolicyEventLogger; @@ -1872,7 +1873,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } else if (PackageInstaller.STATUS_PENDING_USER_ACTION == status) { try { - mStatusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mStatusReceiver.sendIntent(mContext, 0, intent, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignore) { } } else { // failure, let's forward and clean up this session. @@ -4375,7 +4380,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4418,7 +4426,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4443,7 +4454,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); } try { - target.sendIntent(context, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, intent, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 139d44928d91..508a23a35548 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8871,7 +8871,10 @@ public class PackageManagerService extends IPackageManager.Stub } if (pi != null) { try { - pi.sendIntent(null, success ? 1 : 0, null, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + pi.sendIntent(null, success ? 1 : 0, null /* intent */, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException e) { Slog.w(TAG, e); } @@ -16259,7 +16262,10 @@ public class PackageManagerService extends IPackageManager.Stub fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } -- cgit v1.2.3 From 8ec981d0e7ac9066984401a24569d284aa4a4beb Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 11 Jan 2023 16:02:27 +0800 Subject: [RESTRICT AUTOMERGE] Fix bypass BG-FGS and BAL via package manager APIs Opt-in for BAL of PendingIntent for following APIs: * PackageInstaller.uninstall() * PackageInstaller.installExistingPackage() * PackageInstaller.uninstallExistingPackage() * PackageInstaller.Session.commit() * PackageInstaller.Session.commitTransferred() * PackageManager.freeStorage() Bug: 230492955 Bug: 243377226 Test: atest android.security.cts.PackageInstallerTest Test: atest CtsStagedInstallHostTestCases Change-Id: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf --- core/java/android/content/IntentSender.java | 41 ++++++++++++++++++++-- .../android/server/pm/PackageInstallerService.java | 11 ++++-- .../android/server/pm/PackageInstallerSession.java | 22 +++++++++--- .../android/server/pm/PackageManagerService.java | 10 ++++-- 4 files changed, 74 insertions(+), 10 deletions(-) diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index b1252fd0b21f..49d3cac63124 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -19,6 +19,7 @@ package android.content; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManager.PendingIntentInfo; +import android.app.ActivityOptions; import android.compat.annotation.UnsupportedAppUsage; import android.os.Bundle; import android.os.Handler; @@ -158,7 +159,7 @@ public class IntentSender implements Parcelable { */ public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler) throws SendIntentException { - sendIntent(context, code, intent, onFinished, handler, null); + sendIntent(context, code, intent, onFinished, handler, null, null /* options */); } /** @@ -190,6 +191,42 @@ public class IntentSender implements Parcelable { public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler, String requiredPermission) throws SendIntentException { + sendIntent(context, code, intent, onFinished, handler, requiredPermission, + null /* options */); + } + + /** + * Perform the operation associated with this IntentSender, allowing the + * caller to specify information about the Intent to use and be notified + * when the send has completed. + * + * @param context The Context of the caller. This may be null if + * intent is also null. + * @param code Result code to supply back to the IntentSender's target. + * @param intent Additional Intent data. See {@link Intent#fillIn + * Intent.fillIn()} for information on how this is applied to the + * original Intent. Use null to not modify the original Intent. + * @param onFinished The object to call back on when the send has + * completed, or null for no callback. + * @param handler Handler identifying the thread on which the callback + * should happen. If null, the callback will happen from the thread + * pool of the process. + * @param requiredPermission Name of permission that a recipient of the PendingIntent + * is required to hold. This is only valid for broadcast intents, and + * corresponds to the permission argument in + * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. + * If null, no permission is required. + * @param options Additional options the caller would like to provide to modify the sending + * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. + * + * @throws SendIntentException Throws CanceledIntentException if the IntentSender + * is no longer allowing more intents to be sent through it. + * @hide + */ + public void sendIntent(Context context, int code, Intent intent, + OnFinished onFinished, Handler handler, String requiredPermission, + @Nullable Bundle options) + throws SendIntentException { try { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) @@ -199,7 +236,7 @@ public class IntentSender implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission, null); + requiredPermission, options); if (res < 0) { throw new SendIntentException(); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 708b2129ad29..2ca3e8f1bc1b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -25,6 +25,7 @@ import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PackageDeleteObserver; @@ -1243,7 +1244,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } @@ -1268,7 +1272,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageManager.deleteStatusToString(returnCode, msg)); fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 3ddcf17d0a47..1137fc5b5a86 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -50,6 +50,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.admin.DevicePolicyEventLogger; @@ -1872,7 +1873,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } else if (PackageInstaller.STATUS_PENDING_USER_ACTION == status) { try { - mStatusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mStatusReceiver.sendIntent(mContext, 0, intent, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignore) { } } else { // failure, let's forward and clean up this session. @@ -4375,7 +4380,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4418,7 +4426,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -4443,7 +4454,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); } try { - target.sendIntent(context, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, intent, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 12e594716410..ac806e1e9c27 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9204,7 +9204,10 @@ public class PackageManagerService extends IPackageManager.Stub } if (pi != null) { try { - pi.sendIntent(null, success ? 1 : 0, null, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + pi.sendIntent(null, success ? 1 : 0, null /* intent */, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException e) { Slog.w(TAG, e); } @@ -16369,7 +16372,10 @@ public class PackageManagerService extends IPackageManager.Stub fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } -- cgit v1.2.3 From b0b1ddb4b4ba5db27f5616b02ae2cdca8b63496f Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 11 Jan 2023 16:02:27 +0800 Subject: [RESTRICT AUTOMERGE] Fix bypass BG-FGS and BAL via package manager APIs Opt-in for BAL of PendingIntent for following APIs: * PackageInstaller.uninstall() * PackageInstaller.installExistingPackage() * PackageInstaller.uninstallExistingPackage() * PackageInstaller.Session.commit() * PackageInstaller.Session.commitTransferred() * PackageManager.freeStorage() Bug: 230492955 Bug: 243377226 Test: atest android.security.cts.PackageInstallerTest Test: atest CtsStagedInstallHostTestCases Change-Id: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf --- core/java/android/content/IntentSender.java | 42 ++++++++++++++++++++-- .../android/server/pm/PackageInstallerService.java | 11 ++++-- .../android/server/pm/PackageInstallerSession.java | 34 ++++++++++++++---- .../android/server/pm/PackageManagerService.java | 10 ++++-- 4 files changed, 85 insertions(+), 12 deletions(-) diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index f40dc298d560..b34b72254743 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -16,7 +16,9 @@ package android.content; +import android.annotation.Nullable; import android.app.ActivityManager; +import android.app.ActivityOptions; import android.compat.annotation.UnsupportedAppUsage; import android.os.Bundle; import android.os.Handler; @@ -154,7 +156,7 @@ public class IntentSender implements Parcelable { */ public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler) throws SendIntentException { - sendIntent(context, code, intent, onFinished, handler, null); + sendIntent(context, code, intent, onFinished, handler, null, null /* options */); } /** @@ -186,6 +188,42 @@ public class IntentSender implements Parcelable { public void sendIntent(Context context, int code, Intent intent, OnFinished onFinished, Handler handler, String requiredPermission) throws SendIntentException { + sendIntent(context, code, intent, onFinished, handler, requiredPermission, + null /* options */); + } + + /** + * Perform the operation associated with this IntentSender, allowing the + * caller to specify information about the Intent to use and be notified + * when the send has completed. + * + * @param context The Context of the caller. This may be null if + * intent is also null. + * @param code Result code to supply back to the IntentSender's target. + * @param intent Additional Intent data. See {@link Intent#fillIn + * Intent.fillIn()} for information on how this is applied to the + * original Intent. Use null to not modify the original Intent. + * @param onFinished The object to call back on when the send has + * completed, or null for no callback. + * @param handler Handler identifying the thread on which the callback + * should happen. If null, the callback will happen from the thread + * pool of the process. + * @param requiredPermission Name of permission that a recipient of the PendingIntent + * is required to hold. This is only valid for broadcast intents, and + * corresponds to the permission argument in + * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. + * If null, no permission is required. + * @param options Additional options the caller would like to provide to modify the sending + * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. + * + * @throws SendIntentException Throws CanceledIntentException if the IntentSender + * is no longer allowing more intents to be sent through it. + * @hide + */ + public void sendIntent(Context context, int code, Intent intent, + OnFinished onFinished, Handler handler, String requiredPermission, + @Nullable Bundle options) + throws SendIntentException { try { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) @@ -195,7 +233,7 @@ public class IntentSender implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission, null); + requiredPermission, options); if (res < 0) { throw new SendIntentException(); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index da1e0231a8b2..743922bc36a1 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -23,6 +23,7 @@ import android.Manifest; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PackageDeleteObserver; @@ -1140,7 +1141,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } @@ -1165,7 +1169,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements PackageManager.deleteStatusToString(returnCode, msg)); fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); try { - mTarget.sendIntent(mContext, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 5cf9a4a77290..594bd1321271 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -51,6 +51,7 @@ import static com.android.server.pm.PackageInstallerService.prepareStageDir; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.admin.DevicePolicyEventLogger; @@ -1280,13 +1281,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, PackageInstallerSession.this.sessionId); - mStatusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mStatusReceiver.sendIntent(mContext, 0, intent, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignore) { } } } else if (PackageInstaller.STATUS_PENDING_USER_ACTION == status) { try { - mStatusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mStatusReceiver.sendIntent(mContext, 0, intent, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignore) { } } else { // failure, let's forward and clean up this session. @@ -1294,7 +1303,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { PackageInstallerSession.this.sessionId); mChildSessionsRemaining.clear(); // we're done. Don't send any more. try { - mStatusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + mStatusReceiver.sendIntent(mContext, 0, intent, + null /* onFinished*/, null /* handler */, + null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignore) { } } @@ -3231,7 +3244,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); fillIn.putExtra(Intent.EXTRA_INTENT, intent); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -3271,7 +3287,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished */, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } @@ -3297,7 +3316,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); } try { - statusReceiver.sendIntent(mContext, 0, intent, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + statusReceiver.sendIntent(mContext, 0, intent, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (IntentSender.SendIntentException ignored) { } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5f6ef9903124..9f5e5106a6e5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5050,7 +5050,10 @@ public class PackageManagerService extends IPackageManager.Stub } if (pi != null) { try { - pi.sendIntent(null, success ? 1 : 0, null, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + pi.sendIntent(null, success ? 1 : 0, null /* intent */, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException e) { Slog.w(TAG, e); } @@ -13309,7 +13312,10 @@ public class PackageManagerService extends IPackageManager.Stub fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); try { - target.sendIntent(context, 0, fillIn, null, null); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); + target.sendIntent(context, 0, fillIn, null /* onFinished*/, + null /* handler */, null /* requiredPermission */, options.toBundle()); } catch (SendIntentException ignored) { } } -- cgit v1.2.3 From 0c94ea393926869f8f620854b58548d7a139ac1f Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Tue, 10 Jan 2023 10:51:21 +0000 Subject: Lower per-app NotificationChannelGroup limit. A higher limit can be abused to cause PDoS. For the rationale behind choosing 6000 as the max value, see http://b/261723753#comment20. Test: atest PreferencesHelperTest Bug: 261723753 Change-Id: I3f3a99765c161369e1b026686a0e5f0c83ed839e (cherry picked from commit 86441bd5c07c65021728748472fa6a28eaf162d0) --- .../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 d8aa469bcd81..5507158f34da 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -108,7 +108,7 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; @VisibleForTesting - static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 50000; + static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; -- cgit v1.2.3 From 44440649c42cdbea351003dbc1fec98991e00a8b Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 18 Jan 2022 11:59:54 -0500 Subject: Add a limit on channel group creation Same as exists for channels This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). Test: PreferencesHelperTest Bug: 210114537 Bug: 261723753 Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b (cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e --- .../server/notification/PreferencesHelper.java | 14 +++++++ .../server/notification/PreferencesHelperTest.java | 47 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 72b75f3e80d1..1a0fa602ea48 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -98,6 +98,8 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; + @VisibleForTesting + static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; @@ -239,6 +241,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; + boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( @@ -289,6 +292,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + if (!skipGroupWarningLogged) { + Slog.w(TAG, "Skipping further groups for " + r.pkg + + "; app has too many"); + skipGroupWarningLogged = true; + } + continue; + } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); @@ -798,6 +809,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + throw new IllegalStateException("Limit exceed; cannot create more groups"); + } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index 77612b9d8cef..ceacdb37d946 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -42,6 +42,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; +import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; @@ -3165,6 +3166,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } + @Test + public void testTooManyGroups() { + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + try { + NotificationChannelGroup group = new NotificationChannelGroup( + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + fail("Allowed to create too many notification channel groups"); + } catch (IllegalStateException e) { + // great + } + } + + @Test + public void testTooManyGroups_xml() throws Exception { + String extraGroup = "EXTRA"; + String extraGroup1 = "EXTRA1"; + + // create first... many... directly so we don't need a big xml blob in this test + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + + final String xml = "\n" + + "\n" + + "" + + "" + + "" + + ""; + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), + null); + parser.nextTag(); + mHelper.readXml(parser, false, UserHandle.USER_ALL); + + assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); + assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); + } + @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; -- cgit v1.2.3 From fe11569ab66337f68d45090ccd1546abdc410ab2 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 18 Jan 2022 11:59:54 -0500 Subject: Add a limit on channel group creation Same as exists for channels This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). Test: PreferencesHelperTest Bug: 210114537 Bug: 261723753 Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b (cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e --- .../server/notification/PreferencesHelper.java | 14 +++++++ .../server/notification/PreferencesHelperTest.java | 47 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 72b75f3e80d1..1a0fa602ea48 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -98,6 +98,8 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; + @VisibleForTesting + static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; @@ -239,6 +241,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; + boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( @@ -289,6 +292,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + if (!skipGroupWarningLogged) { + Slog.w(TAG, "Skipping further groups for " + r.pkg + + "; app has too many"); + skipGroupWarningLogged = true; + } + continue; + } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); @@ -798,6 +809,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + throw new IllegalStateException("Limit exceed; cannot create more groups"); + } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index 77612b9d8cef..ceacdb37d946 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -42,6 +42,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; +import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; @@ -3165,6 +3166,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } + @Test + public void testTooManyGroups() { + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + try { + NotificationChannelGroup group = new NotificationChannelGroup( + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + fail("Allowed to create too many notification channel groups"); + } catch (IllegalStateException e) { + // great + } + } + + @Test + public void testTooManyGroups_xml() throws Exception { + String extraGroup = "EXTRA"; + String extraGroup1 = "EXTRA1"; + + // create first... many... directly so we don't need a big xml blob in this test + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + + final String xml = "\n" + + "\n" + + "" + + "" + + "" + + ""; + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), + null); + parser.nextTag(); + mHelper.readXml(parser, false, UserHandle.USER_ALL); + + assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); + assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); + } + @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; -- cgit v1.2.3 From 38257af19e18d19075483dfa351c7e5cbb9cbf75 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 18 Jan 2022 11:59:54 -0500 Subject: Add a limit on channel group creation Same as exists for channels This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). Test: PreferencesHelperTest Bug: 210114537 Bug: 261723753 Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b (cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e --- .../server/notification/PreferencesHelper.java | 14 +++++++ .../server/notification/PreferencesHelperTest.java | 47 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index c6cb3c0d2ab7..da8b1f4130ac 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -98,6 +98,8 @@ public class PreferencesHelper implements RankingConfig { @VisibleForTesting static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; + @VisibleForTesting + static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; @@ -239,6 +241,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; + boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( @@ -289,6 +292,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + if (!skipGroupWarningLogged) { + Slog.w(TAG, "Skipping further groups for " + r.pkg + + "; app has too many"); + skipGroupWarningLogged = true; + } + continue; + } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); @@ -799,6 +810,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + throw new IllegalStateException("Limit exceed; cannot create more groups"); + } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index cc1483594a41..6deb7af4fca8 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -42,6 +42,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; +import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; @@ -3173,6 +3174,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } + @Test + public void testTooManyGroups() { + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + try { + NotificationChannelGroup group = new NotificationChannelGroup( + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + fail("Allowed to create too many notification channel groups"); + } catch (IllegalStateException e) { + // great + } + } + + @Test + public void testTooManyGroups_xml() throws Exception { + String extraGroup = "EXTRA"; + String extraGroup1 = "EXTRA1"; + + // create first... many... directly so we don't need a big xml blob in this test + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + + final String xml = "\n" + + "\n" + + "" + + "" + + "" + + ""; + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), + null); + parser.nextTag(); + mHelper.readXml(parser, false, UserHandle.USER_ALL); + + assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); + assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); + } + @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; -- cgit v1.2.3 From 750af79d5ccb282bb79ef40932858fbae801a48b Mon Sep 17 00:00:00 2001 From: Kate Montgomery Date: Thu, 26 Jan 2023 18:31:45 +0000 Subject: Fix bypass BAL via LocationManager.requestFlush Bug: 235823542 Test: atest LocationProviderManagerTest and manual tests Change-Id: I2a0fa7b99c3ad5ae839d8018ec70cb5c26e33240 --- .../com/android/server/location/provider/LocationProviderManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 8955c288391f..f29c737e60dc 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -258,6 +258,7 @@ public class LocationProviderManager extends public void deliverOnFlushComplete(int requestCode) throws PendingIntent.CanceledException { BroadcastOptions options = BroadcastOptions.makeBasic(); options.setDontSendToRestrictedApps(true); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_FLUSH_COMPLETE, requestCode), null, null, null, options.toBundle()); -- cgit v1.2.3 From 560301e945026a6c1b88559633f913003c68eab3 Mon Sep 17 00:00:00 2001 From: Kate Montgomery Date: Thu, 26 Jan 2023 18:31:45 +0000 Subject: Fix bypass BAL via LocationManager.requestFlush Bug: 235823542 Test: atest LocationProviderManagerTest and manual tests Change-Id: I2a0fa7b99c3ad5ae839d8018ec70cb5c26e33240 --- .../com/android/server/location/provider/LocationProviderManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 345dc217110b..b3865440250e 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -267,6 +267,7 @@ public class LocationProviderManager extends public void deliverOnFlushComplete(int requestCode) throws PendingIntent.CanceledException { BroadcastOptions options = BroadcastOptions.makeBasic(); options.setDontSendToRestrictedApps(true); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_FLUSH_COMPLETE, requestCode), null, null, null, options.toBundle()); -- cgit v1.2.3 From 80bc46c48cb693ede724fac070a87df30d813efc Mon Sep 17 00:00:00 2001 From: Kate Montgomery Date: Thu, 26 Jan 2023 18:31:45 +0000 Subject: Fix bypass BAL via LocationManager.requestFlush Bug: 235823542 Test: atest LocationProviderManagerTest and manual tests Change-Id: I2a0fa7b99c3ad5ae839d8018ec70cb5c26e33240 --- .../com/android/server/location/provider/LocationProviderManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 1235352b0590..f0aff2a503b0 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -300,6 +300,7 @@ public class LocationProviderManager extends public void deliverOnFlushComplete(int requestCode) throws PendingIntent.CanceledException { BroadcastOptions options = BroadcastOptions.makeBasic(); options.setDontSendToRestrictedApps(true); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_FLUSH_COMPLETE, requestCode), null, null, null, options.toBundle()); -- cgit v1.2.3 From 11a9a5a08e6068fcc20bb3195cb179da0b6fc8c4 Mon Sep 17 00:00:00 2001 From: Kate Montgomery Date: Thu, 26 Jan 2023 18:31:45 +0000 Subject: Fix bypass BAL via LocationManager.requestFlush Bug: 235823542 Test: atest LocationProviderManagerTest and manual tests Change-Id: I2a0fa7b99c3ad5ae839d8018ec70cb5c26e33240 --- .../com/android/server/location/provider/LocationProviderManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 9ed63b5ce2da..eda5a94258c2 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -281,6 +281,7 @@ public class LocationProviderManager extends public void deliverOnFlushComplete(int requestCode) throws PendingIntent.CanceledException { BroadcastOptions options = BroadcastOptions.makeBasic(); options.setDontSendToRestrictedApps(true); + options.setPendingIntentBackgroundActivityLaunchAllowed(false); mPendingIntent.send(mContext, 0, new Intent().putExtra(KEY_FLUSH_COMPLETE, requestCode), null, null, null, options.toBundle()); -- cgit v1.2.3 From c1b836562c9cf198ad1e3db355f99484f8ba4348 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 18 Jan 2022 11:59:54 -0500 Subject: Add a limit on channel group creation Same as exists for channels This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). Test: PreferencesHelperTest Bug: 210114537 Bug: 261723753 Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b (cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e Merged-In: Ic27efba4c54e22eebca16fc948879e652df4467b --- .../server/notification/PreferencesHelper.java | 16 +++++++- .../server/notification/PreferencesHelperTest.java | 47 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 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 98d9e9a7468f..5c9bb689ba89 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -92,7 +92,9 @@ 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 = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; @@ -234,6 +236,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; + boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( @@ -284,6 +287,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + if (!skipGroupWarningLogged) { + Slog.w(TAG, "Skipping further groups for " + r.pkg + + "; app has too many"); + skipGroupWarningLogged = true; + } + continue; + } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); @@ -779,6 +790,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + throw new IllegalStateException("Limit exceed; cannot create more groups"); + } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index 06cfbea72a82..ffc12c94871e 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -41,6 +41,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; +import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; @@ -3074,6 +3075,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } + @Test + public void testTooManyGroups() { + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + try { + NotificationChannelGroup group = new NotificationChannelGroup( + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + fail("Allowed to create too many notification channel groups"); + } catch (IllegalStateException e) { + // great + } + } + + @Test + public void testTooManyGroups_xml() throws Exception { + String extraGroup = "EXTRA"; + String extraGroup1 = "EXTRA1"; + + // create first... many... directly so we don't need a big xml blob in this test + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + + final String xml = "\n" + + "\n" + + "" + + "" + + "" + + ""; + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), + null); + parser.nextTag(); + mHelper.readXml(parser, false, UserHandle.USER_ALL); + + assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); + assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); + } + @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; -- cgit v1.2.3 From 0f29716ab6fbf236e5d8f688bcdfdadf32429545 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 18 Jan 2022 11:59:54 -0500 Subject: Add a limit on channel group creation Same as exists for channels This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). Test: PreferencesHelperTest Bug: 210114537 Bug: 261723753 Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b (cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e Merged-In: Ic27efba4c54e22eebca16fc948879e652df4467b --- .../server/notification/PreferencesHelper.java | 16 +++++++- .../server/notification/PreferencesHelperTest.java | 47 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 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 fba4f1a34121..ab63285a2f2f 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -90,7 +90,9 @@ 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 = 6000; private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000; private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000; @@ -230,6 +232,7 @@ public class PreferencesHelper implements RankingConfig { } } boolean skipWarningLogged = false; + boolean skipGroupWarningLogged = false; boolean hasSAWPermission = false; if (upgradeForBubbles && uid != UNKNOWN_UID) { hasSAWPermission = mAppOps.noteOpNoThrow( @@ -280,6 +283,14 @@ public class PreferencesHelper implements RankingConfig { String tagName = parser.getName(); // Channel groups if (TAG_GROUP.equals(tagName)) { + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + if (!skipGroupWarningLogged) { + Slog.w(TAG, "Skipping further groups for " + r.pkg + + "; app has too many"); + skipGroupWarningLogged = true; + } + continue; + } String id = parser.getAttributeValue(null, ATT_ID); CharSequence groupName = parser.getAttributeValue(null, ATT_NAME); @@ -761,6 +772,9 @@ public class PreferencesHelper implements RankingConfig { } if (fromTargetApp) { group.setBlocked(false); + if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { + throw new IllegalStateException("Limit exceed; cannot create more groups"); + } } final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); if (oldGroup != null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index 439f059e97b5..b9eb73f9dba5 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -41,6 +41,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER; import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE; import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; +import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID; import static com.google.common.truth.Truth.assertThat; @@ -2983,6 +2984,52 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); } + @Test + public void testTooManyGroups() { + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + try { + NotificationChannelGroup group = new NotificationChannelGroup( + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), + String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + fail("Allowed to create too many notification channel groups"); + } catch (IllegalStateException e) { + // great + } + } + + @Test + public void testTooManyGroups_xml() throws Exception { + String extraGroup = "EXTRA"; + String extraGroup1 = "EXTRA1"; + + // create first... many... directly so we don't need a big xml blob in this test + for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { + NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), + String.valueOf(i)); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); + } + + final String xml = "\n" + + "\n" + + "" + + "" + + "" + + ""; + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), + null); + parser.nextTag(); + mHelper.readXml(parser, false, UserHandle.USER_ALL); + + assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); + assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); + } + @Test public void testRestoreMultiUser() throws Exception { String pkg = "restore_pkg"; -- cgit v1.2.3 From 14a91d2bc85a633de67584b27f4cef58c1645637 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../android/server/pm/InstallPackageHelper.java | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 844c22bb2091..29d684a2267a 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2473,15 +2473,19 @@ final class InstallPackageHelper { if (disabledPs != null) { dataOwnerPkg = disabledPs.getPkg(); } - try { - PackageManagerServiceUtils.checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return Pair.create( - PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE, errorMsg); + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of the app + try { + PackageManagerServiceUtils.checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = + "System app: " + packageName + " cannot be downgraded to" + + " older than its preloaded version on the system" + + " image. " + e.getMessage(); + Slog.w(TAG, errorMsg); + return Pair.create( + PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE, errorMsg); + } } } } -- cgit v1.2.3 From 8e804c13abb3773e417638251490fce369766592 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../com/android/server/pm/PackageManagerService.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a1a996b5a296..b784b13a40ee 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26886,14 +26886,18 @@ public class PackageManagerService extends IPackageManager.Stub if (disabledPs != null) { dataOwnerPkg = disabledPs.getPkg(); } - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of the app + try { + checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = "System app: " + packageName + + " cannot be downgraded to" + + " older than its preloaded version on the system image. " + + e.getMessage(); + Slog.w(TAG, errorMsg); + return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + } } } } -- cgit v1.2.3 From 62e086ad0e34e180dee40babb5d1ad7e76818dd2 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../com/android/server/pm/PackageManagerService.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index adbbdd36844f..31b72d208caf 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26891,14 +26891,18 @@ public class PackageManagerService extends IPackageManager.Stub if (disabledPs != null) { dataOwnerPkg = disabledPs.getPkg(); } - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of the app + try { + checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = "System app: " + packageName + + " cannot be downgraded to" + + " older than its preloaded version on the system image. " + + e.getMessage(); + Slog.w(TAG, errorMsg); + return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + } } } } -- cgit v1.2.3 From 636cdf22b90ccb4866f380c307b7e1b92da03ed9 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../com/android/server/pm/PackageManagerService.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76792afd61eb..6a39ac18fd81 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26757,14 +26757,18 @@ public class PackageManagerService extends IPackageManager.Stub if (disabledPs != null) { dataOwnerPkg = disabledPs.getPkg(); } - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of the app + try { + checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = "System app: " + packageName + + " cannot be downgraded to" + + " older than its preloaded version on the system image. " + + e.getMessage(); + Slog.w(TAG, errorMsg); + return PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; + } } } } -- cgit v1.2.3 From b050c4ba02e6ae69a3b232c53ded081a305434cd Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../android/server/pm/PackageManagerService.java | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5faf1366e908..d5da70176031 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -15029,15 +15029,19 @@ public class PackageManagerService extends IPackageManager.Stub if (disabledPs != null) { dataOwnerPkg = disabledPs.pkg; } - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName - + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of + // the app + try { + checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = "System app: " + packageName + + " cannot be downgraded to" + + " older than its preloaded version on the system image. " + + e.getMessage(); + Slog.w(TAG, errorMsg); + return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; + } } } } -- cgit v1.2.3 From 341669af524058dd4c64a176ddc54ada589591e1 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 2 Feb 2023 10:35:56 -0800 Subject: [RESTRICT AUTOMERGE][pm] still allow debuggable for system app downgrades Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. BUG: 267232653 BUG: 256202273 Test: manual Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e (cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) --- .../android/server/pm/PackageManagerService.java | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 3f6087b681cb..4655d09a8b98 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -15003,15 +15003,19 @@ public class PackageManagerService extends IPackageManager.Stub if (disabledPs != null) { dataOwnerPkg = disabledPs.pkg; } - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - String errorMsg = "System app: " + packageName - + " cannot be downgraded to" - + " older than its preloaded version on the system image. " - + e.getMessage(); - Slog.w(TAG, errorMsg); - return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; + if (!Build.IS_DEBUGGABLE && !dataOwnerPkg.isDebuggable()) { + // Only restrict non-debuggable builds and non-debuggable version of + // the app + try { + checkDowngrade(dataOwnerPkg, pkgLite); + } catch (PackageManagerException e) { + String errorMsg = "System app: " + packageName + + " cannot be downgraded to" + + " older than its preloaded version on the system image. " + + e.getMessage(); + Slog.w(TAG, errorMsg); + return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; + } } } } -- cgit v1.2.3 From 0f54692ba4cb965ab03be0822832266109733556 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 5 Feb 2023 19:01:43 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ieba1ba4f7c369b8fba328f41f7088f0bb1dae8e7 --- packages/SettingsLib/res/values-fa/strings.xml | 2 +- packages/SettingsLib/res/values-gl/strings.xml | 2 +- packages/SettingsLib/res/values-vi/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index faf977b5ccc4..0e0915f71ec5 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -193,7 +193,7 @@ "استفاده از زبان سیستم" "زبان انتخاب نشده است" "صدای خاص یک زبان را برای متن گفتاری تنظیم می‌کند" - "به نمونه‌ای گوش کنید" + "شنیدن نمونه" "قسمت کوتاهی از ترکیب گفتار پخش شود" "نصب داده‌های صوتی" "نصب داده‌های صوتی مورد نیاز برای ترکیب گفتار" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index ada0f47f428f..631c88b3edf5 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -190,7 +190,7 @@ "Ton" "Afecta ao ton da voz sintetizada" "Idioma" - "Utiliza o idioma do sistema" + "Utilizar o idioma do sistema" "Idioma non seleccionado" "Define a voz específica do idioma para o texto falado" "Escoitar un exemplo" diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index b18d83d88b89..c565bc2e55c6 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -325,7 +325,7 @@ "Chọn cấu hình USB" "Cho phép vị trí mô phỏng" "Cho phép vị trí mô phỏng" - "Cho phép kiểm tra thuộc tính của chế độ xem" + "Cho phép kiểm tra thuộc tính khung hiển thị" "Luôn bật dữ liệu di động ngay cả khi Wi-Fi đang hoạt động (để chuyển đổi mạng nhanh)." "Sử dụng tính năng tăng tốc phần cứng khi chia sẻ Internet nếu có" "Cho phép gỡ lỗi qua USB?" -- cgit v1.2.3 From 815ccd613ca380eafd297677933a7f2006ac3c09 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 5 Feb 2023 22:37:35 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1ab386c457eb490e0d8b9de3267a3d146119e01d --- core/res/res/values-el/strings.xml | 8 ++++---- core/res/res/values-it/strings.xml | 2 +- core/res/res/values-ka/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-lv/strings.xml | 2 +- core/res/res/values-mn/strings.xml | 2 +- core/res/res/values-or/strings.xml | 12 ++++++------ 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 22ae6007526a..dc69a2b4cdeb 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -304,7 +304,7 @@ "Ημερολόγιο" "έχει πρόσβαση στο ημερολόγιό σας" "SMS" - "στέλνει και να διαβάζει μηνύματα SMS" + "στέλνει και διαβάζει μηνύματα SMS" "Αρχεία" "πρόσβαση στα αρχεία της συσκευής σας" "Μουσική και ήχος" @@ -312,7 +312,7 @@ "Φωτογραφίες και βίντεο" "πρόσβαση στις φωτογραφίες και τα βίντεο στη συσκευή σας" "Μικρόφωνο" - "ηχογραφεί" + "ηχογράφηση" "Σωματική δραστ/τητα" "πρόσβαση στη σωματική σας δραστηριότητα" "Κάμερα" @@ -322,7 +322,7 @@ "Αρχεία καταγρ. κλήσ." "ανάγνωση και εγγραφή αρχείου καταγραφής τηλεφωνικών κλήσεων" "Τηλέφωνο" - "πραγματοποιεί και να διαχειρίζεται τηλ/κές κλήσεις" + "πραγματοποιεί και διαχειρίζεται τηλ/κές κλήσεις" "Αισθητήρες σώματος" "πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας" "Ειδοποιήσεις" @@ -369,7 +369,7 @@ "Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου και έχουν ληφθεί από τη συσκευή σας. Ειδοποιήσεις που μεταδίδονται μέσω κινητού παραδίδονται σε ορισμένες τοποθεσίες για να σας προειδοποιήσουν για καταστάσεις έκτακτης ανάγκης. Κακόβουλες εφαρμογές ενδέχεται να παρεμποδίσουν την απόδοση ή τη λειτουργία της συσκευής σας κατά τη λήψη μετάδοσης μέσω κινητού σχετικά με μια επείγουσα κατάσταση." "διαβάζει ροές δεδομένων στις οποίες έχετε εγγραφεί" "Επιτρέπει στην εφαρμογή τη λήψη λεπτομερειών σχετικά με τις τρέχουσες συγχρονισμένες ροές δεδομένων." - "στέλνει και να διαβάζει μηνύματα SMS" + "στέλνει και διαβάζει μηνύματα SMS" "Επιτρέπει στην εφαρμογή των αποστολή μηνυμάτων SMS. Αυτό μπορεί να προκαλέσει μη αναμενόμενες χρεώσεις. Οι κακόβουλες εφαρμογές ενδέχεται να σας κοστίσουν χρήματα, αποστέλλοντας μηνύματα χωρίς την έγκρισή σας." "διαβάζει τα μηνύματα κειμένου (SMS ή MMS)" "Αυτή η εφαρμογή μπορεί να διαβάσει όλα τα μηνύματα SMS (κειμένου) που είναι αποθηκευμένα στο tablet που χρησιμοποιείτε." diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index af96a0a786f9..2c1e7833c29b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -984,7 +984,7 @@ "Selettore utente" "Stato" "Fotocamera" - "Controlli media" + "Controlli multimediali" "Riordino dei widget iniziato." "Riordino dei widget terminato." "Widget %1$s eliminato." diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 23d2f3062178..763ce680b932 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -314,7 +314,7 @@ "მიკროფონი" "აუდიოს ჩაწერა" "ფიზიკური აქტივობა" - "ფიზიკური აქტივობაზე წვდომა" + "ფიზიკურ აქტივობაზე წვდომა" "კამერა" "ფოტოებისა და ვიდეოების გადაღება" "ახლომახლო მოწყობილობები" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index dad576bed9e8..1b2309347c96 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -594,7 +594,7 @@ "다른 지문으로 시도" "너무 밝음" "조정 시도" - "지문을 등록할 때마다 손가락을 조금씩 이동하세요" + "지문이 인식될 때마다 손가락을 조금씩 이동하세요" "지문이 인식되지 않았습니다." diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index a35494271d94..3a8896d2594b 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1977,7 +1977,7 @@ "Социалдык жана коммуникация" "Жаңылыктар жана журналдар" "Карталар жана чабыттоо" - "Өндүрүш категориясы" + "Майнаптуулук" "Атайын мүмкүнчүлүктөр" "Түзмөктүн сактагычы" "USB аркылуу мүчүлүштүктөрдү аныктоо" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index f5372e75f928..7d6da539c6b5 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -242,7 +242,7 @@ "Android TV opcijas" "Tālruņa opcijas" "Ekrāna bloķētājs" - "Izslēgt strāvas padevi" + "Izslēgt" "Barošana" "Restartēt" "Ārkārtas situācija" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 5b371364d112..715aa95ae8bc 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -302,7 +302,7 @@ "Байршил" "энэ төхөөрөмжийн байршилд хандалт хийх" "Календарь" - "Календарь руу хандах" + "Календарьд хандах" "Мессеж" "SMS мессежийг илгээх, харах" "Файлууд" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 796acdf9cb7f..fbc4024e4e23 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1069,13 +1069,13 @@ "ସ୍ପେସ୍‍" "ଏଣ୍ଟର୍" "ଡିଲିଟ୍‌ କରନ୍ତୁ" - "ସନ୍ଧାନ କରନ୍ତୁ" - "ସନ୍ଧାନ…" - "ସନ୍ଧାନ କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ…" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" "କ୍ୱେରୀ ସର୍ଚ୍ଚ କରନ୍ତୁ" "କ୍ୱେରୀ ଖାଲି କରନ୍ତୁ" "କ୍ୱେରୀ ଦାଖଲ କରନ୍ତୁ" - "ଭଏସ୍‍ ସର୍ଚ୍ଚ" + "ଭଏସ ସର୍ଚ୍ଚ" "’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍‍ କରନ୍ତୁ’ ସକ୍ଷମ କରିବେ?" "%1$s ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ସକ୍ଷମ କରିବାକୁ ଚାହେଁ। ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ଅନ୍‌ ଥିବାବେଳେ, ଆପଣଙ୍କ ଆଙ୍ଗୁଠି ତଳେ କ’ଣ ଅଛି, ତାହାର ବ୍ୟାଖ୍ୟା ଦେଖିପାରିବେ କିମ୍ବା ଟାବ୍‍ଲେଟ୍‍ ସହ କଥାବାର୍ତ୍ତା କରିବାକୁ ଜେଶ୍ଚର୍‌ କରିପାରିବେ।" "%1$s ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ସକ୍ଷମ କରିବାକୁ ଚାହେଁ। ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ଅନ୍‌ ଥିବାବେଳେ, ଆପଣଙ୍କ ଆଙ୍ଗୁଠି ତଳେ କ’ଣ ଅଛି, ତାହାର ବ୍ୟାଖ୍ୟା ଦେଖିପାରିବେ କିମ୍ବା ଫୋନ୍‍ ସହ କଥାବାର୍ତ୍ତା କରିବାକୁ ଜେଶ୍ଚର୍‌ କରିପାରିବେ।" @@ -1456,7 +1456,7 @@ "ଜୁମ୍ ନିୟନ୍ତ୍ରଣ ପାଇଁ ଦୁଇଥର ଟାପ୍‌ କରନ୍ତୁ" "ୱିଜେଟ୍‍ ଯୋଡ଼ିପାରିବ ନାହିଁ।" "ଯାଆନ୍ତୁ" - "ସନ୍ଧାନ କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" "ପଠାନ୍ତୁ" "ପରବର୍ତ୍ତୀ" "ହୋଇଗଲା" @@ -1923,7 +1923,7 @@ "ପ୍ରସ୍ତାବିତ" "ସମସ୍ତ ଭାଷା" "ସମସ୍ତ ଅଞ୍ଚଳ" - "ସନ୍ଧାନ କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" "ଆପ୍‌ ଉପଲବ୍ଧ ନାହିଁ" "ବର୍ତ୍ତମାନ %1$s ଉପଲବ୍ଧ ନାହିଁ। ଏହା %2$s ଦ୍ଵାରା ପରିଚାଳିତ ହେଉଛି।" "ଅଧିକ ଜାଣନ୍ତୁ" -- cgit v1.2.3 From f5aa18234a5d72715fb37f7fba542cf0f2e7757f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 6 Feb 2023 00:31:08 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id569c95e61e1420bfd7f051fb0fb9a7296fbf15d --- packages/PrintSpooler/res/values-or/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 6f215d3af18b..dd29700f812b 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -47,7 +47,7 @@ "PDFରେ ସେଭ୍‍ କରନ୍ତୁ" "ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ବଡ଼ କରାଯାଇଛି" "ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ଛୋଟ କରାଯାଇଛି" - "ସନ୍ଧାନ କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" "ସମସ୍ତ ପ୍ରିଣ୍ଟର୍‌" "ସେବା ଯୋଗ କରନ୍ତୁ" "ସର୍ଚ୍ଚ ବକ୍ସ ଦେଖାଯାଇଛି" -- cgit v1.2.3 From bd029e6ea63f3d44c28dc59badeac3ba78877f47 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 6 Feb 2023 00:46:22 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I076e312f261d4a948933499d7008dfa52da4b83f --- packages/SystemUI/res/values-az/strings.xml | 2 +- packages/SystemUI/res/values-fa/strings.xml | 2 +- packages/SystemUI/res/values-gu/strings.xml | 2 +- packages/SystemUI/res/values-pt-rBR/strings.xml | 2 +- packages/SystemUI/res/values-pt/strings.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index f1a3c69eed5d..7c40682a8774 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -607,7 +607,7 @@ "Mübadilə buferi" "Açar kodu" "Çevirin, klaviatura dəyişdirici" - "Heç bir" + "Heç biri" "Normal" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index fb3a29b711d0..270954ed3a6f 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -908,7 +908,7 @@ "%1$s / %2$s" "متصل است" "داده تلفن همراه به‌طور خودکار متصل نخواهد شد" - "اتصال برقرار نیست" + "اتصال اینترنت موجود نیست" "شبکه دیگری وجود ندارد" "شبکه‌ای در دسترس نیست" "Wi-Fi" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index ecdccde5ca3f..56f004b81ea9 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -787,7 +787,7 @@ "અન્ય" "ડિવાઇસનાં નિયંત્રણોમાં ઉમેરો" "ઉમેરો" - "%s દ્વારા સૂચન કરેલા" + "%s દ્વારા સૂચવેલા" "ડિવાઇસ લૉક કરેલું છે" "લૉક સ્ક્રીનમાંથી ડિવાઇસ બતાવીએ અને નિયંત્રિત કરીએ?" "તમે તમારા બાહ્ય ડિવાઇસ માટેના નિયંત્રણો લૉક સ્ક્રીન પર ઉમેરી શકો છો.\n\nતમારી ડિવાઇસ ઍપ કદાચ તમને તમારો ફોન કે ટૅબ્લેટ અનલૉક કર્યા વિના અમુક ડિવાઇસ નિયંત્રિત કરવાની મંજૂરી આપી શકે.\n\nતમે ગમે ત્યારે સેટિંગમાં જઈને ફેરફાર કરી શકો છો." diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 03539ff64d42..20216915acdf 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -460,7 +460,7 @@ "Chamadas e notificações farão o smartphone tocar (%1$s)" "Sintonizador System UI" "Barra de status" - "Modo de demonstração da IU do sistema" + "Modo de demonstração da interface do sistema" "Ativar modo de demonstração" "Mostrar modo de demonstração" "Ethernet" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 03539ff64d42..20216915acdf 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -460,7 +460,7 @@ "Chamadas e notificações farão o smartphone tocar (%1$s)" "Sintonizador System UI" "Barra de status" - "Modo de demonstração da IU do sistema" + "Modo de demonstração da interface do sistema" "Ativar modo de demonstração" "Mostrar modo de demonstração" "Ethernet" -- cgit v1.2.3 From 81fdd93963e7b2fb930a58104fedc69d14589101 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Feb 2023 19:35:14 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8365ba6500d10311bff71ec9eb105e4ab504bb68 --- packages/SettingsLib/res/values-ca/arrays.xml | 2 +- packages/SettingsLib/res/values-es/strings.xml | 2 +- packages/SettingsLib/res/values-nb/strings.xml | 2 +- packages/SettingsLib/res/values-nl/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index a267af862daf..06896730546f 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -228,7 +228,7 @@ "4K (segur)" "4K (ampliat)" "4K (ampliat, segur)" - "720p, 1080p (pantalla doble)" + "720p, 1080p (pantalla dual)" "Cap" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 8f3e2d37cd11..82108e26d48b 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -584,7 +584,7 @@ "Para poder crear un perfil restringido, debes configurar una pantalla de bloqueo que proteja tus aplicaciones y datos personales." "Establecer bloqueo" "Cambiar a %s" - "Creando usuario…" + "Creando usuario nuevo…" "Creando nuevo invitado…" "No se ha podido crear el usuario" "No se ha podido crear un nuevo invitado" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 6dcfb1200a82..4f8c76c5652f 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -571,7 +571,7 @@ "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 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å?" + "Vil du konfigurere brukeren?" "Sørg for at brukeren er tilgjengelig for å konfigurere området sitt på enheten" "Vil du konfigurere profilen nå?" "Konfigurer nå" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 5878c3f5d12a..ac4baa742537 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -570,7 +570,7 @@ "Beperkt profiel" "Nieuwe gebruiker toevoegen?" "Je kunt dit apparaat met anderen delen door extra gebruikers te maken. Elke gebruiker heeft een eigen profiel met zelf gekozen apps, achtergrond, enzovoort. Gebruikers kunnen ook apparaatinstellingen aanpassen die van invloed zijn op alle gebruikers, zoals wifi.\n\nWanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers. Toegankelijkheidsinstellingen en -services worden mogelijk niet overgezet naar de nieuwe gebruiker." - "Wanneer je een nieuwe gebruiker toevoegt, moet die persoon diens eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers." + "Wanneer je een nieuwe gebruiker toevoegt, moet die persoon hun eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers." "Gebruiker nu instellen?" "Zorg ervoor dat de persoon het apparaat kan overnemen om een profiel in te stellen" "Profiel nu instellen?" -- cgit v1.2.3 From 553c704456ec84366d0a72a3e9d7500267705476 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Feb 2023 21:13:36 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3d31f9b9ec7c1215ad785008cc4ca833698c8d09 --- core/res/res/values-ca/strings.xml | 46 +++++++++++++++++----------------- core/res/res/values-da/strings.xml | 4 +-- core/res/res/values-es-rUS/strings.xml | 2 +- core/res/res/values-es/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 26 +++++++++---------- core/res/res/values-fr-rCA/strings.xml | 2 +- core/res/res/values-fr/strings.xml | 2 +- core/res/res/values-it/strings.xml | 2 +- core/res/res/values-pt-rBR/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 2 +- core/res/res/values-pt/strings.xml | 2 +- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-zh-rCN/strings.xml | 2 +- 13 files changed, 48 insertions(+), 48 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 34dd6d8da63b..8ea725a94f82 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -51,7 +51,7 @@ "Escriviu el PUK2 per desbloquejar la targeta SIM." "No és correcte; activa el bloqueig de RUIM/SIM." - You have %d remaining attempts before SIM is locked. + Et queden %d intents; si no l\'encertes, la SIM es bloquejarà. Et queden %d intents; si no l\'encertes, la SIM es bloquejarà. Et queda %d intent; si no l\'encertes, la SIM es bloquejarà. @@ -181,7 +181,7 @@ "L\'emmagatzematge del rellotge està ple. Suprimeix uns quants fitxers per alliberar espai." "L\'espai d\'emmagatzematge del dispositiu Android TV és ple. Suprimeix alguns fitxers per alliberar espai." "L\'emmagatzematge del telèfon és ple. Suprimeix uns quants fitxers per alliberar espai." - "{count,plural, =1{L\'autoritat de certificació s\'ha instal·lat}many{Certificate authorities installed}other{Les autoritats de certificació s\'han instal·lat}}" + "{count,plural, =1{L\'autoritat de certificació s\'ha instal·lat}many{Les autoritats de certificació s\'han instal·lat}other{Les autoritats de certificació s\'han instal·lat}}" "Per un tercer desconegut" "Per l\'administrador del teu perfil de treball" "Per %s" @@ -255,7 +255,7 @@ "Utilitza aquesta opció en la majoria de circumstàncies. Et permet fer un seguiment del progrés de l\'informe, introduir més dades sobre el problema i fer captures de pantalla. És possible que ometi seccions poc utilitzades que requereixen molt de temps." "Informe complet" "Utilitza aquesta opció perquè la interferència en el sistema sigui mínima si el dispositiu no respon o va massa lent, o bé si necessites totes les seccions de l\'informe. No et permet introduir més dades ni fer més captures de pantalla." - "{count,plural, =1{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segon.}many{Taking screenshot for bug report in # seconds.}other{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segons.}}" + "{count,plural, =1{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segon.}many{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segons.}other{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segons.}}" "S\'ha fet la captura de pantalla amb l\'informe d\'errors" "No s\'ha pogut fer la captura de pantalla amb l\'informe d\'errors" "Mode silenciós" @@ -1082,7 +1082,7 @@ "%1$s vol activar l\'exploració tàctil. Quan l\'exploració per tàctil està activada, pots escoltar o veure les descripcions del contingut seleccionat o utilitzar gestos per interaccionar amb el telèfon." "Fa 1 mes" "Fa més d\'1 mes" - "{count,plural, =1{Darrer dia (#)}many{Last # days}other{# darrers dies}}" + "{count,plural, =1{Darrer dia (#)}many{# darrers dies}other{# darrers dies}}" "Darrer mes" "Més antigues" "el %s" @@ -1109,14 +1109,14 @@ "d\'aquí a %d h" "d\'aquí a %d d" "d\'aquí a %d a" - "{count,plural, =1{Fa # minut}many{# minutes ago}other{Fa # minuts}}" - "{count,plural, =1{Fa # hora}many{# hours ago}other{Fa # hores}}" - "{count,plural, =1{Fa # dia}many{# days ago}other{Fa # dies}}" - "{count,plural, =1{Fa # any}many{# years ago}other{Fa # anys}}" - "{count,plural, =1{# minut}many{# minutes}other{# minuts}}" - "{count,plural, =1{# hora}many{# hours}other{# hores}}" - "{count,plural, =1{# dia}many{# days}other{# dies}}" - "{count,plural, =1{# any}many{# years}other{# anys}}" + "{count,plural, =1{Fa # minut}many{Fa # minuts}other{Fa # minuts}}" + "{count,plural, =1{Fa # hora}many{Fa # hores}other{Fa # hores}}" + "{count,plural, =1{Fa # dia}many{Fa # dies}other{Fa # dies}}" + "{count,plural, =1{Fa # any}many{Fa # anys}other{Fa # anys}}" + "{count,plural, =1{# minut}many{# minuts}other{# minuts}}" + "{count,plural, =1{# hora}many{# hores}other{# hores}}" + "{count,plural, =1{# dia}many{# dies}other{# dies}}" + "{count,plural, =1{# any}many{# anys}other{# anys}}" "Problema amb el vídeo" "Aquest vídeo no és vàlid per a la reproducció en aquest dispositiu." "No es pot reproduir aquest vídeo." @@ -1504,7 +1504,7 @@ "Omet" "No s\'ha trobat cap coincidència" "Troba-ho a la pàgina" - "{count,plural, =1{# coincidència}many{# of {total}}other{# de {total}}}" + "{count,plural, =1{# coincidència}many{# de {total}}other{# de {total}}}" "Fet" "S\'està esborrant l\'emmagatzematge compartit…" "Comparteix" @@ -1857,14 +1857,14 @@ "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})}many{For # minutes (until {formattedTime})}other{Durant # minuts (fins a les {formattedTime})}}" - "{count,plural, =1{Durant 1 min (fins a les {formattedTime})}many{For # min (until {formattedTime})}other{Durant # min (fins a les {formattedTime})}}" - "{count,plural, =1{Durant 1 hora (fins a les {formattedTime})}many{For # hours (until {formattedTime})}other{Durant # hores (fins a les {formattedTime})}}" - "{count,plural, =1{Durant 1 h (fins a les {formattedTime})}many{For # hr (until {formattedTime})}other{Durant # h (fins a les {formattedTime})}}" - "{count,plural, =1{Durant 1 minut}many{For # minutes}other{Durant # minuts}}" - "{count,plural, =1{Durant 1 min}many{For # min}other{Durant # min}}" - "{count,plural, =1{Durant 1 hora}many{For # hours}other{Durant # hores}}" - "{count,plural, =1{Durant 1 h}many{For # hr}other{Durant # h}}" + "{count,plural, =1{Durant 1 minut (fins a les {formattedTime})}many{Durant # minuts (fins a les {formattedTime})}other{Durant # minuts (fins a les {formattedTime})}}" + "{count,plural, =1{Durant 1 min (fins a les {formattedTime})}many{Durant # min (fins a les {formattedTime})}other{Durant # min (fins a les {formattedTime})}}" + "{count,plural, =1{Durant 1 hora (fins a les {formattedTime})}many{Durant # hores (fins a les {formattedTime})}other{Durant # hores (fins a les {formattedTime})}}" + "{count,plural, =1{Durant 1 h (fins a les {formattedTime})}many{Durant # h (fins a les {formattedTime})}other{Durant # h (fins a les {formattedTime})}}" + "{count,plural, =1{Durant 1 minut}many{Durant # minuts}other{Durant # minuts}}" + "{count,plural, =1{Durant 1 min}many{Durant # min}other{Durant # min}}" + "{count,plural, =1{Durant 1 hora}many{Durant # hores}other{Durant # hores}}" + "{count,plural, =1{Durant 1 h}many{Durant # h}other{Durant # h}}" "Finalitza: %1$s" "Fins a les %1$s" "Fins a les %1$s (propera alarma)" @@ -1993,7 +1993,7 @@ "Desa per a emplenament automàtic" "El contingut no es pot emplenar automàticament" "Cap suggeriment d\'emplenament automàtic" - "{count,plural, =1{1 suggeriment d\'emplenament automàtic}many{# autofill suggestions}other{# suggeriments d\'emplenament automàtic}}" + "{count,plural, =1{1 suggeriment d\'emplenament automàtic}many{# suggeriments d\'emplenament automàtic}other{# suggeriments d\'emplenament automàtic}}" "Vols desar-ho a ""%1$s""?" "Vols desar %1$s a ""%2$s""?" "Vols desar %1$s i %2$s a ""%3$s""?" @@ -2103,7 +2103,7 @@ "Presentació %1$s" "El Bluetooth es mantindrà activat durant el mode d\'avió" "S\'està carregant" - "{count,plural, =1{{file_name} i # fitxer}many{{file_name} + # files}other{{file_name} i # fitxers}}" + "{count,plural, =1{{file_name} i # fitxer}many{{file_name} i # fitxers}other{{file_name} i # fitxers}}" "No hi ha cap suggeriment de persones amb qui compartir" "Llista d\'aplicacions" "Aquesta aplicació no té permís de gravació, però pot capturar àudio a través d\'aquest dispositiu USB." diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 53ad38c7f2b8..537072ca0a22 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -216,7 +216,7 @@ "Lydløs" "Slå trådløs til" "Slå trådløs fra" - "Skærmlås" + "Skærm­lås" "Sluk" "Ringeren er deaktiveret" "Ringervibrering" @@ -240,7 +240,7 @@ "Valgmuligheder for tabletcomputeren" "Valgmuligheder for Android TV" "Indstillinger for telefon" - "Skærmlås" + "Skærm­lås" "Sluk" "Afbryderknap" "Genstart" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 7af454793c69..1ba0eac19127 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -51,7 +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 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. diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 413313ac302e..bc516d50fe60 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -51,7 +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 quedan %d intentos para bloquear la tarjeta SIM. Te queda %d intento para bloquear la tarjeta SIM. diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index b11f295df341..3632f2d8e76d 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -426,9 +426,9 @@ "Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke asmo txarreko aplikazioek deien erregistroa ezabatzea edo aldatzea." "Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete." "Atzitu gorputz-sentsoreen datuak (esaterako, bihotz-maiztasuna) aplikazioa erabili bitartean" - "Aplikazioak erabiltzen diren bitartean, gorputz-sentsoreen datuak (besteak beste, bihotz-maiztasuna, tenperatura eta odolean dagoen oxigenoaren ehunekoa) atzitzeko baimena ematen die aplikazio horiei." + "Aplikazioak erabiltzen diren bitartean, gorputz-sentsoreen datuak (besteak beste, bihotz-maiztasuna, tenperatura eta odolean dagoen oxigenoaren ehunekoa) erabiltzeko baimena ematen die aplikazio horiei." "Atzitu gorputz-sentsoreen datuak (adib., bihotz-maiztasunarenak) atzeko planoan" - "Aplikazioak atzeko planoan egon bitartean, gorputz-sentsoreen datuak (besteak beste, bihotz-maiztasuna, tenperatura eta odolean dagoen oxigenoaren ehunekoa) atzitzeko baimena ematen die aplikazio horiei." + "Aplikazioak atzeko planoan egon bitartean, gorputz-sentsoreen datuak (besteak beste, bihotz-maiztasuna, tenperatura eta odolean dagoen oxigenoaren ehunekoa) erabiltzeko baimena ematen die aplikazio horiei." "irakurri egutegiko gertaerak eta xehetasunak" "Aplikazioak tabletan gordetako egutegiko gertaerak irakur ditzake eta egutegiko datuak parteka eta gorde ditzake." "Aplikazioak Android TV gailuan gordeta dituzun egutegiko gertaerak irakur ditzake, baita egutegiko datuak partekatu eta gorde ere." @@ -438,7 +438,7 @@ "Android TV gailuan egutegiko gertaerak gehitzeko eta gehitutakoak kentzeko edo aldatzeko aukera dute aplikazioek. Gainera, egutegien jabeenak diruditen mezuak bidal ditzakete, edo gertaerak aldatu jabeei ezer esan gabe." "Telefonoko gertaerak gehitzeko, kentzeko edo aldatzeko aukera du aplikazioak. Gainera, egutegien jabeenak diruditen mezuak bidal ditzake, eta gertaerak alda ditzake jabeei beraiei jakinarazi gabe." "atzitu kokapen-hornitzaileen komando gehigarriak" - "Kokapen-hornitzailearen agindu gehigarriak atzitzeko baimena ematen die aplikazioei. Horrela, agian aplikazioek GPSaren edo bestelako kokapenaren iturburuen funtzionamenduan eragina izan dezakete." + "Kokapen-hornitzailearen agindu gehigarriak erabiltzeko baimena ematen die aplikazioei. Horrela, agian aplikazioek GPSaren edo bestelako kokapenaren iturburuen funtzionamenduan eragina izan dezakete." "lortu kokapen zehatza aurreko planoan bakarrik" "Abian denean, aplikazioak kokapen zehatza lor dezake kokapen-zerbitzuen bidez. Aplikazioak kokapena lortu ahal izateko, kokapen-zerbitzuek aktibatuta egon behar dute gailuan. Bateria-erabilera areagotzen du horrek." "atzitu gutxi gorabeherako kokapena aurreko planoan bakarrik" @@ -459,21 +459,21 @@ "Aplikazioak abian den bitartean erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko." "Argazkiak atera eta bideoak grabatu atzeko planoan." "Aplikazioak edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko." - "eman sistemako kamerak atzitzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko" + "eman sistemako kamerak erabiltzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko" "Pribilegioa duen edo sistemakoa den aplikazio honek edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko. Halaber, android.permission.CAMERA baimena izan behar du aplikazioak." "eman jakinarazpenak jasotzeko baimena aplikazioari edo zerbitzuari kamerak ireki edo ixten direnean." "Kamera ireki edo itxi dela (eta zer aplikaziorekin) dioten jakinarazpenak jaso ditzake aplikazio honek." "kontrolatu dardara" "Bibragailua kontrolatzeko baimena ematen die aplikazioei." - "Dardara-egoera atzitzeko baimena ematen die aplikazioei." + "Dardara-egoera erabiltzeko baimena ematen die aplikazioei." "deitu zuzenean telefono-zenbakietara" "Telefono-zenbakietara zuk esku hartu gabe deitzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak edo deiak eragin daitezke. Asmo txarreko aplikazioek erabil dezakete zuk berretsi gabeko deiak eginda gastuak eragiteko." "atzitu IMS dei-zerbitzua" "Zuk ezer egin beharrik gabe deiak egiteko IMS zerbitzua erabiltzeko baimena ematen die aplikazioei." "irakurri telefonoaren egoera eta identitatea" - "Gailuaren telefono-eginbideak atzitzeko baimena ematen die aplikazioei. Baimen horrek aplikazioari telefono-zenbakia eta gailu IDak zein diren, deirik aktibo dagoen eta deia zer zenbakirekin konektatuta dagoen zehazteko baimena ematen die aplikazioei." + "Gailuaren telefono-eginbideak erabiltzeko baimena ematen die aplikazioei. Baimen horrek aplikazioari telefono-zenbakia eta gailu IDak zein diren, deirik aktibo dagoen eta deia zer zenbakirekin konektatuta dagoen zehazteko baimena ematen die aplikazioei." "irakurri oinarrizko egoera telefonikoa eta identitatea" - "Gailuaren oinarrizko eginbide telefonikoak atzitzeko baimena ematen dio aplikazioari." + "Gailuaren oinarrizko eginbide telefonikoak erabiltzeko baimena ematen dio aplikazioari." "bideratu deiak sistemaren bidez" "Deiak sistemaren bidez bideratzea baimentzen die aplikazioei, deien zerbitzua ahal bezain ona izan dadin." "ikusi eta kontrolatu deiak sistemaren bidez." @@ -483,7 +483,7 @@ "jarraitu beste aplikazio batean hasitako deia" "Beste aplikazio batean hasitako dei batekin jarraitzeko baimena ematen die aplikazioei." "irakurri telefono-zenbakiak" - "Gailuaren telefono-zenbakiak atzitzeko baimena ematen die aplikazioei." + "Gailuaren telefono-zenbakiak erabiltzeko baimena ematen die aplikazioei." "mantendu piztuta autoko pantaila" "eragotzi tableta inaktibo ezartzea" "Android TV gailua inaktibo ezar dadin eragotzi" @@ -628,7 +628,7 @@ "Sakatu hau aurpegi-eredua ezabatzeko eta, gero, gehitu aurpegia berriro" "Konfiguratu aurpegi bidez desblokeatzeko eginbidea" "Telefonoa desblokeatzeko, begira iezaiozu" - "Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu ""kamera atzitzeko baimena"" Ezarpenak > Pribatutasuna atalean" + "Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu ""kamera erabiltzeko baimena"" Ezarpenak > Pribatutasuna atalean" "Konfiguratu telefonoa desblokeatzeko modu gehiago" "Sakatu hau hatz-marka bat gehitzeko" "Hatz-marka bidez desblokeatzea" @@ -1464,14 +1464,14 @@ "Abiarazi" "Markatu zenbakia \n%s erabilita" "Sortu kontaktu bat\n%s erabilita" - "Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira." + "Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean erabiltzeko baimena eskatzen ari dira." "Eskaera onartu nahi duzu?" "Sarbide-eskaera" "Eman baimena" "Ukatu" "Baimena eskatu da" "Baimena eskatu da \n%s konturako." - "%1$s aplikazioak %2$s kontua atzitzeko baimena\neskatu du." + "%1$s aplikazioak %2$s kontua erabiltzeko baimena\neskatu du." "Laneko profiletik kanpo ari zara aplikazioa erabiltzen" "Laneko profilean ari zara aplikazioa erabiltzen" "Idazketa-metodoa" @@ -2039,10 +2039,10 @@ "DESINSTALATU" "IREKI, HALA ERE" "Aplikazio kaltegarri bat hauteman da" - "Gailuko erregistro guztiak atzitzeko baimena eman nahi diozu %s aplikazioari?" + "Gailuko erregistro guztiak erabiltzeko baimena eman nahi diozu %s aplikazioari?" "Eman behin erabiltzeko baimena" "Ez eman baimenik" - "Gailuko erregistroetan gailuan gertatzen den guztia gordetzen da. Arazoak bilatu eta konpontzeko erabil ditzakete aplikazioek erregistro horiek.\n\nBaliteke erregistro batzuek kontuzko informazioa edukitzea. Beraz, eman gailuko erregistro guztiak atzitzeko baimena fidagarritzat jotzen dituzun aplikazioei bakarrik. \n\nNahiz eta gailuko erregistro guztiak atzitzeko baimena ez eman aplikazio honi, aplikazioak hari dagozkion erregistroak atzitu ahalko ditu. Gainera, baliteke gailuaren fabrikatzaileak gailuko erregistro edo datu batzuk atzitu ahal izatea. Lortu informazio gehiago" + "Gailuko erregistroetan gailuan gertatzen den guztia gordetzen da. Arazoak bilatu eta konpontzeko erabil ditzakete aplikazioek erregistro horiek.\n\nBaliteke erregistro batzuek kontuzko informazioa edukitzea. Beraz, eman gailuko erregistro guztiak erabiltzeko baimena fidagarritzat jotzen dituzun aplikazioei bakarrik. \n\nNahiz eta gailuko erregistro guztiak erabiltzeko baimena ez eman aplikazio honi, aplikazioak hari dagozkion erregistroak atzitu ahalko ditu. Gainera, baliteke gailuaren fabrikatzaileak gailuko erregistro edo datu batzuk atzitu ahal izatea. Lortu informazio gehiago" "Ez erakutsi berriro" "%1$s aplikazioak %2$s aplikazioaren zatiak erakutsi nahi ditu" "Editatu" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 08dc52a49f8a..371214938bf6 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -52,7 +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. Il vous reste %d tentatives avant que votre carte SIM soit verrouillée. "Code IIEM" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 444f82de0d72..7655099e8a88 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -52,7 +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. Il vous reste %d tentatives avant que votre carte SIM ne soit verrouillée. "Code IMEI" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 2c1e7833c29b..6a59b1e8f79c 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -51,7 +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 tentativi a disposizione prima che la SIM venga bloccata. Hai ancora %d tentativo a disposizione prima che la SIM venga bloccata. diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 6a93466b76ed..b9c8e503a681 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -52,7 +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. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index f4691533af07..14fcc6d7cf6e 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -51,7 +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 tentativas antes de o cartão SIM ficar bloqueado. Tem mais %d tentativa antes de o cartão SIM ficar bloqueado. diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 6a93466b76ed..b9c8e503a681 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -52,7 +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. Tentativas restantes: %d. Caso o código correto não seja digitado, o chip será bloqueado. "IMEI" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index b6660004cdd2..d2244692105b 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -596,7 +596,7 @@ "Попробуйте сохранить отпечаток другого пальца." "Слишком светло." "Попробуйте изменить положение пальца." - "Каждый раз немного меняйте положение пальца." + "Каждый раз немного меняйте положение пальца" "Отпечаток не распознан." diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index df3c94802585..37d685d351b5 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -594,7 +594,7 @@ "请试试其他指纹" "光线太亮" "请尝试调整指纹" - "请在每次放手指时略微更改手指的位置" + "每次放手指时,请略微变换手指的位置" "未能识别指纹" -- cgit v1.2.3 From 4b8541903002fcee8db57b5b1059f766e3e71387 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Feb 2023 23:06:32 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1d0f3525ce95a68b92c080501ec19c92faa79e18 --- packages/PrintSpooler/res/values-ca/strings.xml | 4 ++-- packages/PrintSpooler/res/values-es-rUS/strings.xml | 4 ++-- packages/PrintSpooler/res/values-es/strings.xml | 4 ++-- packages/PrintSpooler/res/values-fr-rCA/strings.xml | 4 ++-- packages/PrintSpooler/res/values-fr/strings.xml | 4 ++-- packages/PrintSpooler/res/values-it/strings.xml | 4 ++-- packages/PrintSpooler/res/values-pt-rBR/strings.xml | 4 ++-- packages/PrintSpooler/res/values-pt-rPT/strings.xml | 4 ++-- packages/PrintSpooler/res/values-pt/strings.xml | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index 4ee4323daebd..483a5224b999 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -56,7 +56,7 @@ "Selecciona una impressora" "Oblida la impressora" - %1$s printers found + S\'han trobat %1$s impressores S\'han trobat %1$s impressores S\'ha trobat %1$s impressora @@ -77,7 +77,7 @@ "Serveis desactivats" "Tots els serveis" - Install to discover %1$s printers + Instal·la\'l per detectar %1$s impressores Instal·la\'l per detectar %1$s impressores Instal·la\'l per detectar %1$s impressora diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 90c1937a2891..476614b1a60d 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -56,7 +56,7 @@ "Seleccionar impresora" "No recordar impresora" - %1$s printers found + Se encontraron %1$s impresoras. Se encontraron %1$s impresoras. Se encontró %1$s impresora. @@ -77,7 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" - Install to discover %1$s printers + Instala para ver %1$s impresoras 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 18e56dbcd6fc..507b2a7a8f25 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -56,7 +56,7 @@ "Seleccionar impresora" "Olvidar impresora" - %1$s printers found + Se han encontrado %1$s impresoras Se han encontrado %1$s impresoras Se ha encontrado %1$s impresora @@ -77,7 +77,7 @@ "Servicios inhabilitados" "Todos los servicios" - Install to discover %1$s printers + Instalar para descubrir %1$s impresoras 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 082c148746a3..5298f8b329ba 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -57,7 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée - %1$s printers found + %1$s imprimante trouvées %1$s imprimante trouvées "%1$s - %2$s" @@ -78,7 +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 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 560c5dcfe924..4b7e83c85953 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -57,7 +57,7 @@ "Supprimer l\'imprimante" %1$s imprimante trouvée - %1$s printers found + %1$s imprimantes trouvées %1$s imprimantes trouvées "%1$s%2$s" @@ -78,7 +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 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 569bbc2ef045..2a64d3debf58 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -56,7 +56,7 @@ "Seleziona stampante" "Elimina stampante" - %1$s printers found + %1$s stampanti trovate %1$s stampanti trovate %1$s stampante trovata @@ -77,7 +77,7 @@ "Servizi disattivati" "Tutti i servizi" - Install to discover %1$s printers + Installa per rilevare %1$s stampanti 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 3b460a1fe6dd..855701bca9fc 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -57,7 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas - %1$s printers found + %1$s impressoras encontradas %1$s impressoras encontradas "%1$s - %2$s" @@ -78,7 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras - Install to discover %1$s printers + Instale para encontrar %1$s impressoras 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 8c1087e463a0..c9a52a87f9a6 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -56,7 +56,7 @@ "Selecionar impressora" "Esquecer impressora" - %1$s printers found + %1$s impressoras encontradas %1$s impressoras encontradas %1$s impressora encontrada @@ -77,7 +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 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 3b460a1fe6dd..855701bca9fc 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -57,7 +57,7 @@ "Esquecer impressora" %1$s impressoras encontradas - %1$s printers found + %1$s impressoras encontradas %1$s impressoras encontradas "%1$s - %2$s" @@ -78,7 +78,7 @@ "Todos os serviços" Instale para encontrar %1$s impressoras - Install to discover %1$s printers + Instale para encontrar %1$s impressoras Instale para encontrar %1$s impressoras "Imprimindo %1$s" -- cgit v1.2.3 From dd9ce17fc9d59e016cd2a4eef25bd341ac1f4fe1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Feb 2023 23:19:09 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3d7a5e6b7ba63d29b77dfe3a8e9effa3996833e8 --- packages/SystemUI/res/values-ar/strings.xml | 10 +++++----- packages/SystemUI/res/values-az/strings.xml | 2 +- packages/SystemUI/res/values-ca/strings.xml | 16 ++++++++-------- packages/SystemUI/res/values-es-rUS/strings.xml | 12 ++++++------ packages/SystemUI/res/values-es/strings.xml | 12 ++++++------ packages/SystemUI/res/values-eu/strings.xml | 12 ++++++------ packages/SystemUI/res/values-fr-rCA/strings.xml | 12 ++++++------ packages/SystemUI/res/values-fr/strings.xml | 12 ++++++------ packages/SystemUI/res/values-it/strings.xml | 12 ++++++------ packages/SystemUI/res/values-pt-rBR/strings.xml | 14 +++++++------- packages/SystemUI/res/values-pt-rPT/strings.xml | 12 ++++++------ packages/SystemUI/res/values-pt/strings.xml | 14 +++++++------- packages/SystemUI/res/values-zh-rCN/strings.xml | 20 ++++++++++---------- 13 files changed, 80 insertions(+), 80 deletions(-) diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 16df39bba97a..f0d0554ec75e 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -776,11 +776,11 @@ "تبديل" "انقر لفتح ميزات تسهيل الاستخدام. يمكنك تخصيص هذا الزر أو استبداله من الإعدادات.\n\n""عرض الإعدادات" "يمكنك نقل الزر إلى الحافة لإخفائه مؤقتًا." - "نقل إلى أعلى يمين الشاشة" - "نقل إلى أعلى يسار الشاشة" - "نقل إلى أسفل يمين الشاشة" - "نقل إلى أسفل يسار الشاشة" - "نقله إلى الحافة وإخفاؤه" + "النقل إلى أعلى يمين الشاشة" + "النقل إلى أعلى يسار الشاشة" + "النقل إلى أسفل يمين الشاشة" + "النقل إلى أسفل يسار الشاشة" + "النقل إلى الحافة والإخفاء" "نقله إلى خارج الحافة وإظهاره" "إيقاف/تفعيل" "التحكم بالجهاز" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 7c40682a8774..3c1410fd3511 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -166,7 +166,7 @@ "%s üzərindən qoşuldu." "%s cihazına qoşulub." "Qoşulu deyil." - "Rominq" + "Rouminq" "Deaktiv" "Uçuş rejimi" "VPN aktivdir." diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 73b8d584e849..89f6a1a194b1 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -203,7 +203,7 @@ "Esborra totes les notificacions." "+ %s" - %s more notifications inside. + %s notificacions més a l\'interior. %s notificacions més a l\'interior. %s notificació més a l\'interior. @@ -254,7 +254,7 @@ "S\'està activant…" "Estalvi dades activat" - %d devices + %d dispositius %d dispositius %d dispositiu @@ -349,7 +349,7 @@ "Sí, continua" "S\'ha assolit el límit d\'usuaris" - You can add up to %d users. + Pots afegir fins a %d usuaris. Pots afegir fins a %d usuaris. Només es pot crear un usuari. @@ -539,12 +539,12 @@ "Desfés" "S\'ha posposat %1$s" - %d hours + %d hores %d hores %d hora - %d minutes + %d minuts %d minuts %d minut @@ -771,7 +771,7 @@ "Controls de dispositius" "Selecciona l\'aplicació per afegir controls" - %s controls added. + S\'han afegit %s controls. S\'han afegit %s controls. S\'ha afegit %s control. @@ -932,7 +932,7 @@ "No afegeixis la icona" "Selecciona un usuari" - %s apps are active + %s aplicacions estan actives %s aplicacions estan actives %s aplicació està activa @@ -963,5 +963,5 @@ "Mode Prioritat" "Alarma definida" "Càmera i micròfon desactivats" - "{count,plural, =1{# notificació}many{# notifications}other{# notificacions}}" + "{count,plural, =1{# notificació}many{# notificacions}other{# notificacions}}" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index e49fec01bc6f..832293f6d0e1 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -203,7 +203,7 @@ "Eliminar todas las notificaciones" "%s más" - %s more notifications inside. + %s notificaciones más en el grupo. %s notificaciones más en el grupo. %s notificación más en el grupo. @@ -254,7 +254,7 @@ "Activando…" "Ahorro de datos act." - %d devices + %d dispositivos %d dispositivos %d dispositivo @@ -349,7 +349,7 @@ "Sí, continuar" "Alcanzaste el límite de usuarios" - You can add up to %d users. + Puedes agregar hasta %d usuarios. Puedes agregar hasta %d usuarios. Solo se puede crear un usuario. @@ -539,12 +539,12 @@ "Deshacer" "Posponer %1$s" - %d hours + %d horas %d horas %d hora - %d minutes + %d minutos %d minutos %d minuto @@ -771,7 +771,7 @@ "Controles de dispositivos" "Elige la app para agregar los controles" - %s controls added. + Se agregaron %s controles. Se agregaron %s controles. Se agregó %s control. diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 47c888189b16..9e77bd05f24f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -203,7 +203,7 @@ "Borrar todas las notificaciones" "%s más" - %s more notifications inside. + %s notificaciones más dentro. %s notificaciones más dentro. %s notificación más dentro. @@ -254,7 +254,7 @@ "Activando…" "Ahorro de datos activado" - %d devices + %d dispositivos %d dispositivos %d dispositivo @@ -349,7 +349,7 @@ "Sí, continuar" "Has alcanzado el límite de usuarios" - You can add up to %d users. + Puedes añadir hasta %d usuarios. Puedes añadir hasta %d usuarios. Solo se puede crear un usuario. @@ -539,12 +539,12 @@ "Deshacer" "Volverá a mostrarse en %1$s" - %d hours + %d horas %d horas %d hora - %d minutes + %d minutos %d minutos %d minuto @@ -771,7 +771,7 @@ "Control de dispositivos" "Elige una aplicación para añadir controles" - %s controls added. + Se han añadido %s controles. Se han añadido %s controles. Se ha añadido %s control. diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index ff8969b726cb..e2a6afdf6561 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -32,13 +32,13 @@ "Aktibatu" "Ez, eskerrik asko" "Biratu pantaila automatikoki" - "%2$s atzitzeko baimena eman nahi diozu %1$s aplikazioari?" + "%2$s erabiltzeko baimena eman nahi diozu %1$s aplikazioari?" "%2$s erabiltzeko baimena eman nahi diozu %1$s aplikazioari?\nAplikazioak ez du grabatzeko baimenik, baina baliteke USB bidezko gailu horren bidez audioa grabatzea." - "%2$s atzitzeko baimena eman nahi diozu %1$s aplikazioari?" + "%2$s erabiltzeko baimena eman nahi diozu %1$s aplikazioari?" "%1$s ireki nahi duzu %2$s kudeatzeko?" "Aplikazioak ez du grabatzeko baimenik, baina baliteke USB bidezko gailu honen bidez audioa grabatzea. %1$s gailu honekin erabiliz gero, baliteke deiak, jakinarazpenak eta alarmak ez entzutea." "%1$s gailu honekin erabiliz gero, baliteke deiak, jakinarazpenak eta alarmak ez entzutea." - "%2$s atzitzeko baimena eman nahi diozu %1$s aplikazioari?" + "%2$s erabiltzeko baimena eman nahi diozu %1$s aplikazioari?" "%1$s ireki nahi duzu %2$s kudeatzeko?" "%1$s ireki nahi duzu %2$s erabiltzeko?\nAplikazioak ez du grabatzeko baimenik, baina baliteke audioa grabatzea USB bidezko gailu horren bidez." "%1$s ireki nahi duzu %2$s kudeatzeko?" @@ -289,9 +289,9 @@ "Gailuaren mikrofonoa desblokeatu nahi duzu?" "Gailuaren kamera desblokeatu nahi duzu?" "Gailuaren kamera eta mikrofonoa desblokeatu nahi dituzu?" - "Mikrofonoa atzitzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dute." - "Kamera atzitzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dute." - "Kamera edo mikrofonoa atzitzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dituzte." + "Mikrofonoa erabiltzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dute." + "Kamera erabiltzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dute." + "Kamera edo mikrofonoa erabiltzeko baimena duten aplikazio eta zerbitzu guztiek erabili ahalko dituzte." "Blokeatuta dago mikrofonoa" "Blokeatuta dago kamera" "Blokeatuta daude mikrofonoa eta kamera" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 27f3f7301309..eb0eac822bf3 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -204,7 +204,7 @@ "+ %s" %s autre notification à l\'intérieur. - %s more notifications inside. + %s autres notifications à l\'intérieur. %s autres notifications à l\'intérieur. "L\'écran est verrouillé en mode paysage." @@ -255,7 +255,7 @@ "Écon. données activé" %d appareil - %d devices + %d appareils %d appareils "Lampe de poche" @@ -350,7 +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. Vous pouvez ajouter jusqu\'à %d utilisateurs. "Supprimer l\'utilisateur?" @@ -540,12 +540,12 @@ "Reporté pour %1$s" %d heure - %d hours + %d heures %d heures %d minute - %d minutes + %d minutes %d minutes "Économiseur de pile" @@ -772,7 +772,7 @@ "Sélectionnez l\'application pour laquelle ajouter des commandes" %s commande ajoutée. - %s controls added. + %s commandes ajoutées. %s commandes ajoutées. "Supprimé" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 1d7d308217b5..d86888fe5771 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -204,7 +204,7 @@ "%s autres" %s autre notification à l\'intérieur. - %s more notifications inside. + %s autres notifications à l\'intérieur. %s autres notifications à l\'intérieur. "L\'écran est verrouillé en mode paysage." @@ -255,7 +255,7 @@ "Écon. données activé" %d appareil - %d devices + %d appareils %d appareils "Lampe de poche" @@ -350,7 +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. Vous pouvez ajouter jusqu\'à %d profils utilisateur. "Supprimer l\'utilisateur ?" @@ -540,12 +540,12 @@ "Répétée après %1$s" %d heure - %d hours + %d heures %d heures %d minute - %d minutes + %d minutes %d minutes "Économiseur de batterie" @@ -772,7 +772,7 @@ "Sélectionnez l\'appli pour laquelle ajouter des commandes" %s commande ajoutée. - %s controls added. + %s commandes ajoutées. %s commandes ajoutées. "Supprimé" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 1d87916753b8..03ea51f43065 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -203,7 +203,7 @@ "Cancella tutte le notifiche." "+ %s" - %s more notifications inside. + Altre %s notifiche nel gruppo. Altre %s notifiche nel gruppo. %s altra notifica nel gruppo. @@ -254,7 +254,7 @@ "Attivazione…" "Risp. dati attivo" - %d devices + %d dispositivi %d dispositivi %d dispositivo @@ -349,7 +349,7 @@ "Sì, continua" "Limite di utenti raggiunto" - You can add up to %d users. + Puoi aggiungere fino a %d utenti. Puoi aggiungere fino a %d utenti. È possibile creare un solo utente. @@ -539,12 +539,12 @@ "Annulla" "Posticipato di %1$s" - %d hours + %d ore %d ore %d ora - %d minutes + %d minuti %d minuti %d minuto @@ -771,7 +771,7 @@ "Controllo dispositivi" "Scegli un\'app per aggiungere controlli" - %s controls added. + %s controlli aggiunti. %s controlli aggiunti. %s controllo aggiunto. diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 20216915acdf..a7d13115dea0 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -204,7 +204,7 @@ "Mais %s" Mais %s notificações no grupo. - %s more notifications inside. + Mais %s notificações no grupo. Mais %s notificações no grupo. "A tela está bloqueada na orientação paisagem." @@ -255,7 +255,7 @@ "Economia de dados ativada" %d dispositivo - %d devices + %d dispositivos %d dispositivos "Lanterna" @@ -350,7 +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. É possível adicionar até %d usuários. "Remover usuário?" @@ -540,12 +540,12 @@ "Adiada para %1$s" %d hora - %d hours + %d horas %d horas %d minuto - %d minutes + %d minutos %d minutos "Economia de bateria" @@ -772,7 +772,7 @@ "Escolha um app para adicionar controles" %s controle adicionado. - %s controls added. + %s controles adicionados. %s controles adicionados. "Removido" @@ -933,7 +933,7 @@ "Selecionar usuário" %s app está ativo - %s apps are active + %s apps estão ativos %s apps estão ativos "Nova informação" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 14783ea35e59..80cde7501ca5 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -203,7 +203,7 @@ "Limpar todas as notificações." "+ %s" - %s more notifications inside. + Mais %s notificações no grupo. Mais %s notificações no grupo. Mais %s notificação no grupo. @@ -254,7 +254,7 @@ "A ativar..." "Poup. dados ativada" - %d devices + %d dispositivos %d dispositivos %d dispositivo @@ -349,7 +349,7 @@ "Sim, continuar" "Limite de utilizadores alcançado" - You can add up to %d users. + Pode adicionar até %d utilizadores. Pode adicionar até %d utilizadores. Apenas é possível criar um utilizador. @@ -539,12 +539,12 @@ "Anular" "Suspensa por %1$s" - %d hours + %d horas %d horas %d hora - %d minutes + %d minutos %d minutos %d minuto @@ -771,7 +771,7 @@ "Controlos de dispositivos" "Escolha uma app para adicionar controlos" - %s controls added. + %s controlos adicionados. %s controlos adicionados. %s controlo adicionado. diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 20216915acdf..a7d13115dea0 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -204,7 +204,7 @@ "Mais %s" Mais %s notificações no grupo. - %s more notifications inside. + Mais %s notificações no grupo. Mais %s notificações no grupo. "A tela está bloqueada na orientação paisagem." @@ -255,7 +255,7 @@ "Economia de dados ativada" %d dispositivo - %d devices + %d dispositivos %d dispositivos "Lanterna" @@ -350,7 +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. É possível adicionar até %d usuários. "Remover usuário?" @@ -540,12 +540,12 @@ "Adiada para %1$s" %d hora - %d hours + %d horas %d horas %d minuto - %d minutes + %d minutos %d minutos "Economia de bateria" @@ -772,7 +772,7 @@ "Escolha um app para adicionar controles" %s controle adicionado. - %s controls added. + %s controles adicionados. %s controles adicionados. "Removido" @@ -933,7 +933,7 @@ "Selecionar usuário" %s app está ativo - %s apps are active + %s apps estão ativos %s apps estão ativos "Nova informação" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index e57ccef4a7b4..2b25e7252a47 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -623,7 +623,7 @@ "向右键码" "向左图标" "向右图标" - "按住并拖动即可添加图块" + "按住并拖动即可添加功能块" "按住并拖动即可重新排列图块" "拖动到此处即可移除" "您至少需要 %1$d 个卡片" @@ -641,15 +641,15 @@ "显示低优先级的通知图标" "其他" - "移除图块" - "将图块添加到末尾" - "移动图块" - "添加图块" + "移除功能块" + "将功能块添加到末尾" + "移动功能块" + "添加功能块" "移至 %1$d" "添加到位置 %1$d" "位置 %1$d" - "已添加卡片" - "已移除卡片" + "已添加功能块" + "已移除功能块" "快捷设置编辑器。" "%1$s通知:%2$s" "打开设置。" @@ -921,9 +921,9 @@ "如要切换网络,请断开以太网连接" "为了提升设备的使用体验,即使 WLAN 已关闭,应用和服务仍可以随时扫描 WLAN 网络。您可以在 WLAN 扫描设置中更改此设置。""更改" "关闭飞行模式" - "“%1$s”希望将以下图块添加到“快捷设置”" - "添加图块" - "不添加图块" + "“%1$s”希望将以下功能块添加到“快捷设置”" + "添加功能块" + "不添加功能块" "选择用户" %s 个应用正在运行 -- cgit v1.2.3 From a9f42c2f528b02f4b3361a34b9d88cfde4379fc6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Feb 2023 23:24:01 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaa14184f105b120d666f7b3215c02097baf0165a --- packages/SystemUI/res-keyguard/values-ca/strings.xml | 10 +++++----- packages/SystemUI/res-keyguard/values-es-rUS/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-es/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-eu/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-fr/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-it/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml | 8 ++++---- packages/SystemUI/res-keyguard/values-pt/strings.xml | 8 ++++---- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 079e6b3e4c08..44dbb41d9469 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -53,7 +53,7 @@ "Patró incorrecte" "Contrasenya incorrecta" "El PIN no és correcte" - "{count,plural, =1{Torna-ho a provar d\'aquí a # segon.}many{Try again in # seconds.}other{Torna-ho a provar d\'aquí a # segons.}}" + "{count,plural, =1{Torna-ho a provar d\'aquí a # segon.}many{Torna-ho a provar d\'aquí a # segons.}other{Torna-ho a provar d\'aquí a # segons.}}" "Introdueix el PIN de la SIM." "Introdueix el PIN de la SIM de: %1$s." "%1$s Desactiva l\'eSIM per utilitzar el dispositiu sense servei mòbil." @@ -69,13 +69,13 @@ "Has dibuixat el patró de desbloqueig %1$d vegades de manera incorrecta. \n\nTorna-ho a provar d\'aquí a %2$d segons." "El codi PIN de la SIM no és correcte. Contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu." - Incorrect SIM PIN code, you have %d remaining attempts. + El codi PIN de la SIM no és correcte. Et queden %d intents. El codi PIN de la SIM no és correcte. Et queden %d intents. El codi PIN de la SIM no és correcte. Et queda %d intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu. "La SIM no es pot fer servir. Contacta amb l\'operador de telefonia mòbil." - Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. + El codi PUK de la SIM no és correcte. Et queden %d intents; si els esgotes tots, la SIM no es podrà tornar a fer servir. El codi PUK de la SIM no és correcte. Et queden %d intents; si els esgotes tots, la SIM no es podrà tornar a fer servir. El codi PUK de la SIM no és correcte. Et queda %d intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. @@ -94,12 +94,12 @@ "No s\'ha reconegut" "Per utilitzar Desbloqueig facial, activa ""Accés a la càmera"" a Configuració > Privadesa" - Enter SIM PIN. You have %d remaining attempts. + Introdueix el PIN de la SIM. Et queden %d intents. Introdueix el PIN de la SIM. Et queden %d intents. Introdueix el PIN de la SIM. Et queda %d intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu. - SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. + La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden %d intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden %d intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda %d intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 1246b430ae66..ea8369ee1c80 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -69,13 +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 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 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. @@ -94,12 +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. 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 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 4f61f3f1a6d2..f11c53276832 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -69,13 +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. 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. 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. @@ -94,12 +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 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 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-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 41d467a8341b..6f9d920dceec 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -90,7 +90,7 @@ "Administratzaileak blokeatu egin du gailua" "Eskuz blokeatu da gailua" "Ez da ezagutu" - "Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu ""kamera atzitzeko baimena"" Ezarpenak > Pribatutasuna atalean" + "Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu ""kamera erabiltzeko baimena"" Ezarpenak > Pribatutasuna atalean" Idatzi SIMaren PINa. %d saiakera geratzen zaizkizu. Idatzi SIMaren PINa. %d saiakera geratzen zaizu; oker idatziz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko. diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index bfc8991ea6fb..fb107a4c6c41 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -70,13 +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. 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 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é." @@ -95,12 +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. 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. 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 750e2bd25f7a..0198f1766493 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -70,13 +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. 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. 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." @@ -95,12 +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. 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. 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 bbfb0b51294e..667a6e7c237a 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -69,13 +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 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 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. @@ -94,12 +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 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 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 6bf242e6a813..d404008ed60b 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -70,13 +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. 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. 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." @@ -95,12 +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. 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. 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 8851067b946b..b6327e2a48fc 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -69,13 +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 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 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. @@ -94,12 +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 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 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 6bf242e6a813..d404008ed60b 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -70,13 +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. 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. 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." @@ -95,12 +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. 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. 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 ad80758027a8939c3ec4a17d8885c6dda11c126c Mon Sep 17 00:00:00 2001 From: Orion Hodson Date: Thu, 7 Apr 2022 21:42:04 +0100 Subject: Uri: check authority and scheme as part of determining URI path The interpretation of the path depends on whether the scheme or authority are specified and should be observed when unparcelling URIs. Bug: 171966843 Test: atest FrameworksCoreTests:android.net.UriTest Test: atest com.android.devicehealthchecks.SystemAppCheck Change-Id: I06981d1c6e387b16df792494523994518848db37 (cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) --- core/java/android/net/Uri.java | 22 ++++++--- core/tests/coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 815e4f0c9071..d71faee4cc8d 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1205,13 +1205,16 @@ public abstract class Uri implements Parcelable, Comparable { } static Uri readFrom(Parcel parcel) { - return new HierarchicalUri( - parcel.readString8(), - Part.readFrom(parcel), - PathPart.readFrom(parcel), - Part.readFrom(parcel), - Part.readFrom(parcel) - ); + final String scheme = parcel.readString8(); + final Part authority = Part.readFrom(parcel); + // In RFC3986 the path should be determined based on whether there is a scheme or + // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). + final boolean hasSchemeOrAuthority = + (scheme != null && scheme.length() > 0) || !authority.isEmpty(); + final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); + final Part query = Part.readFrom(parcel); + final Part fragment = Part.readFrom(parcel); + return new HierarchicalUri(scheme, authority, path, query, fragment); } public int describeContents() { @@ -2270,6 +2273,11 @@ public abstract class Uri implements Parcelable, Comparable { } } + static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { + final PathPart path = readFrom(parcel); + return hasSchemeOrAuthority ? makeAbsolute(path) : path; + } + /** * Creates a path from the encoded string. * diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index e083b0d460a2..3733bfa586d1 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -48,6 +48,7 @@ public class UriTest extends TestCase { public void testParcelling() { parcelAndUnparcel(Uri.parse("foo:bob%20lee")); parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); + parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); parcelAndUnparcel(new Uri.Builder() .scheme("http") .authority("crazybob.org") @@ -890,9 +891,62 @@ public class UriTest extends TestCase { Throwable targetException = expected.getTargetException(); // Check that the exception was thrown for the correct reason. assertEquals("Unknown representation: 0", targetException.getMessage()); + } finally { + parcel.recycle(); } } + private Uri buildUriFromRawParcel(boolean argumentsEncoded, + String scheme, + String authority, + String path, + String query, + String fragment) { + // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). + final int representation = argumentsEncoded ? 1 : 2; + Parcel parcel = Parcel.obtain(); + try { + parcel.writeInt(3); // hierarchical + parcel.writeString8(scheme); + parcel.writeInt(representation); + parcel.writeString8(authority); + parcel.writeInt(representation); + parcel.writeString8(path); + parcel.writeInt(representation); + parcel.writeString8(query); + parcel.writeInt(representation); + parcel.writeString8(fragment); + parcel.setDataPosition(0); + return Uri.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + + public void testUnparcelMalformedPath() { + // Regression tests for b/171966843. + + // Test cases with arguments encoded (covering testing `scheme` * `authority` options). + Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/@evil.com", uri0.toString()); + Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); + assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); + Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); + assertEquals("http::/@evil.com", uri2.toString()); + Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); + assertEquals("@evil.com", uri3.toString()); + + // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). + Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/%40evil.com", uriA.toString()); + Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); + assertEquals("//google.com/%40evil.com", uriB.toString()); + Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); + assertEquals("http::/%40evil.com", uriC.toString()); + Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); + assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); + } + public void testToSafeString() { checkToSafeString("tel:xxxxxx", "tel:Google"); checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); -- cgit v1.2.3 From d83281c73070f2428754912ede95ecb0e3d69cd5 Mon Sep 17 00:00:00 2001 From: Orion Hodson Date: Thu, 7 Apr 2022 21:42:04 +0100 Subject: Uri: check authority and scheme as part of determining URI path The interpretation of the path depends on whether the scheme or authority are specified and should be observed when unparcelling URIs. Bug: 171966843 Test: atest FrameworksCoreTests:android.net.UriTest Test: atest com.android.devicehealthchecks.SystemAppCheck Change-Id: I06981d1c6e387b16df792494523994518848db37 (cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) --- core/java/android/net/Uri.java | 22 ++++++--- core/tests/coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 815e4f0c9071..d71faee4cc8d 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1205,13 +1205,16 @@ public abstract class Uri implements Parcelable, Comparable { } static Uri readFrom(Parcel parcel) { - return new HierarchicalUri( - parcel.readString8(), - Part.readFrom(parcel), - PathPart.readFrom(parcel), - Part.readFrom(parcel), - Part.readFrom(parcel) - ); + final String scheme = parcel.readString8(); + final Part authority = Part.readFrom(parcel); + // In RFC3986 the path should be determined based on whether there is a scheme or + // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). + final boolean hasSchemeOrAuthority = + (scheme != null && scheme.length() > 0) || !authority.isEmpty(); + final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); + final Part query = Part.readFrom(parcel); + final Part fragment = Part.readFrom(parcel); + return new HierarchicalUri(scheme, authority, path, query, fragment); } public int describeContents() { @@ -2270,6 +2273,11 @@ public abstract class Uri implements Parcelable, Comparable { } } + static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { + final PathPart path = readFrom(parcel); + return hasSchemeOrAuthority ? makeAbsolute(path) : path; + } + /** * Creates a path from the encoded string. * diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index e083b0d460a2..3733bfa586d1 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -48,6 +48,7 @@ public class UriTest extends TestCase { public void testParcelling() { parcelAndUnparcel(Uri.parse("foo:bob%20lee")); parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); + parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); parcelAndUnparcel(new Uri.Builder() .scheme("http") .authority("crazybob.org") @@ -890,9 +891,62 @@ public class UriTest extends TestCase { Throwable targetException = expected.getTargetException(); // Check that the exception was thrown for the correct reason. assertEquals("Unknown representation: 0", targetException.getMessage()); + } finally { + parcel.recycle(); } } + private Uri buildUriFromRawParcel(boolean argumentsEncoded, + String scheme, + String authority, + String path, + String query, + String fragment) { + // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). + final int representation = argumentsEncoded ? 1 : 2; + Parcel parcel = Parcel.obtain(); + try { + parcel.writeInt(3); // hierarchical + parcel.writeString8(scheme); + parcel.writeInt(representation); + parcel.writeString8(authority); + parcel.writeInt(representation); + parcel.writeString8(path); + parcel.writeInt(representation); + parcel.writeString8(query); + parcel.writeInt(representation); + parcel.writeString8(fragment); + parcel.setDataPosition(0); + return Uri.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + + public void testUnparcelMalformedPath() { + // Regression tests for b/171966843. + + // Test cases with arguments encoded (covering testing `scheme` * `authority` options). + Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/@evil.com", uri0.toString()); + Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); + assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); + Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); + assertEquals("http::/@evil.com", uri2.toString()); + Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); + assertEquals("@evil.com", uri3.toString()); + + // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). + Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/%40evil.com", uriA.toString()); + Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); + assertEquals("//google.com/%40evil.com", uriB.toString()); + Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); + assertEquals("http::/%40evil.com", uriC.toString()); + Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); + assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); + } + public void testToSafeString() { checkToSafeString("tel:xxxxxx", "tel:Google"); checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); -- cgit v1.2.3 From 0fd6c8b9c9739909a547e6c1ee0e7dddcaf69e68 Mon Sep 17 00:00:00 2001 From: Orion Hodson Date: Thu, 7 Apr 2022 21:42:04 +0100 Subject: Uri: check authority and scheme as part of determining URI path The interpretation of the path depends on whether the scheme or authority are specified and should be observed when unparcelling URIs. Bug: 171966843 Test: atest FrameworksCoreTests:android.net.UriTest Test: atest com.android.devicehealthchecks.SystemAppCheck Change-Id: I06981d1c6e387b16df792494523994518848db37 (cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) --- core/java/android/net/Uri.java | 22 ++++++--- core/tests/coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++++++ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 1cb4fe8cf4e7..84fc4f78edc4 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1194,13 +1194,16 @@ public abstract class Uri implements Parcelable, Comparable { } static Uri readFrom(Parcel parcel) { - return new HierarchicalUri( - parcel.readString8(), - Part.readFrom(parcel), - PathPart.readFrom(parcel), - Part.readFrom(parcel), - Part.readFrom(parcel) - ); + final String scheme = parcel.readString8(); + final Part authority = Part.readFrom(parcel); + // In RFC3986 the path should be determined based on whether there is a scheme or + // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). + final boolean hasSchemeOrAuthority = + (scheme != null && scheme.length() > 0) || !authority.isEmpty(); + final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); + final Part query = Part.readFrom(parcel); + final Part fragment = Part.readFrom(parcel); + return new HierarchicalUri(scheme, authority, path, query, fragment); } public int describeContents() { @@ -2259,6 +2262,11 @@ public abstract class Uri implements Parcelable, Comparable { } } + static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { + final PathPart path = readFrom(parcel); + return hasSchemeOrAuthority ? makeAbsolute(path) : path; + } + /** * Creates a path from the encoded string. * diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index f20220c4ab9b..670aefd21d36 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -48,6 +48,7 @@ public class UriTest extends TestCase { public void testParcelling() { parcelAndUnparcel(Uri.parse("foo:bob%20lee")); parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); + parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); parcelAndUnparcel(new Uri.Builder() .scheme("http") .authority("crazybob.org") @@ -873,9 +874,62 @@ public class UriTest extends TestCase { Throwable targetException = expected.getTargetException(); // Check that the exception was thrown for the correct reason. assertEquals("Unknown representation: 0", targetException.getMessage()); + } finally { + parcel.recycle(); } } + private Uri buildUriFromRawParcel(boolean argumentsEncoded, + String scheme, + String authority, + String path, + String query, + String fragment) { + // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). + final int representation = argumentsEncoded ? 1 : 2; + Parcel parcel = Parcel.obtain(); + try { + parcel.writeInt(3); // hierarchical + parcel.writeString8(scheme); + parcel.writeInt(representation); + parcel.writeString8(authority); + parcel.writeInt(representation); + parcel.writeString8(path); + parcel.writeInt(representation); + parcel.writeString8(query); + parcel.writeInt(representation); + parcel.writeString8(fragment); + parcel.setDataPosition(0); + return Uri.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + + public void testUnparcelMalformedPath() { + // Regression tests for b/171966843. + + // Test cases with arguments encoded (covering testing `scheme` * `authority` options). + Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/@evil.com", uri0.toString()); + Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); + assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); + Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); + assertEquals("http::/@evil.com", uri2.toString()); + Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); + assertEquals("@evil.com", uri3.toString()); + + // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). + Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); + assertEquals("https://google.com/%40evil.com", uriA.toString()); + Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); + assertEquals("//google.com/%40evil.com", uriB.toString()); + Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); + assertEquals("http::/%40evil.com", uriC.toString()); + Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); + assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); + } + public void testToSafeString() { checkToSafeString("tel:xxxxxx", "tel:Google"); checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); -- cgit v1.2.3 From 553232c29079fbeab28f95307d025c1426aa7142 Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Thu, 9 Feb 2023 12:28:26 -0800 Subject: Checks if AccessibilityServiceInfo is within parcelable size. - If too large when parsing service XMLs then skip this service. - If too large when a service attempts to update its own info then throw an error. Bug: 261589597 Test: atest AccessibilityServiceInfoTest Change-Id: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 Merged-In: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 --- .../android/accessibilityservice/AccessibilityService.java | 4 ++++ .../android/accessibilityservice/AccessibilityServiceInfo.java | 10 ++++++++++ .../server/accessibility/AccessibilityManagerService.java | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index ac00a042b79e..e52b9c177dc1 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -1982,6 +1982,10 @@ public abstract class AccessibilityService extends Service { IAccessibilityServiceConnection connection = AccessibilityInteractionClient.getInstance().getConnection(mConnectionId); if (mInfo != null && connection != null) { + if (!mInfo.isWithinParcelableSize()) { + throw new IllegalStateException( + "Cannot update service info: size is larger than safe parcelable limits."); + } try { connection.setServiceInfo(mInfo); mInfo = null; diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index ca22bf4a62dc..6446ce22baab 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -39,6 +39,7 @@ import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; +import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; @@ -1016,6 +1017,15 @@ public class AccessibilityServiceInfo implements Parcelable { return 0; } + /** @hide */ + public final boolean isWithinParcelableSize() { + final Parcel parcel = Parcel.obtain(); + writeToParcel(parcel, 0); + final boolean result = parcel.dataSize() <= IBinder.MAX_IPC_SIZE; + parcel.recycle(); + return result; + } + public void writeToParcel(Parcel parcel, int flagz) { parcel.writeInt(eventTypes); parcel.writeStringArray(packageNames); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 697d2f0c7659..b1e5f5cfe2de 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1353,6 +1353,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub AccessibilityServiceInfo accessibilityServiceInfo; try { accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); + if (!accessibilityServiceInfo.isWithinParcelableSize()) { + Slog.e(LOG_TAG, "Skipping service " + + accessibilityServiceInfo.getResolveInfo().getComponentInfo() + + " because service info size is larger than safe parcelable limits."); + continue; + } if (userState.mCrashedServices.contains(serviceInfo.getComponentName())) { // Restore the crashed attribute. accessibilityServiceInfo.crashed = true; -- cgit v1.2.3 From 9a91f75d298a7fd81367ee89aef4bc2b7d27d80d Mon Sep 17 00:00:00 2001 From: Chris Li Date: Mon, 13 Feb 2023 14:56:14 +0800 Subject: Re-enforce MANAGE_ACTIVITY_TASKS for applySyncTransaction The conditional permission was introduced for TaskFragmentOrganizer, but not really needed. Remove the conditional check. Bug: 259938771 Test: pass existing tests Merged-In: I666b9ee6b6076766513b97e675fdbaa002428601 Change-Id: I666b9ee6b6076766513b97e675fdbaa002428601 --- core/api/test-current.txt | 2 +- core/java/android/window/TaskFragmentOrganizer.java | 9 --------- core/java/android/window/WindowOrganizer.java | 7 ++----- .../com/android/server/wm/WindowOrganizerController.java | 2 +- .../server/wm/TaskFragmentOrganizerControllerTest.java | 14 -------------- 5 files changed, 4 insertions(+), 30 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index a80468b6d980..14a6b1a25bcc 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3324,7 +3324,7 @@ package android.window { public class WindowOrganizer { ctor public WindowOrganizer(); - method @RequiresPermission(value=android.Manifest.permission.MANAGE_ACTIVITY_TASKS, conditional=true) public int applySyncTransaction(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.WindowContainerTransactionCallback); + method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public int applySyncTransaction(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.WindowContainerTransactionCallback); method @RequiresPermission(value=android.Manifest.permission.MANAGE_ACTIVITY_TASKS, conditional=true) public void applyTransaction(@NonNull android.window.WindowContainerTransaction); } diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index 9c2fde04e4d2..7711ebe525b3 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -157,15 +157,6 @@ public class TaskFragmentOrganizer extends WindowOrganizer { super.applyTransaction(t); } - // Suppress the lint because it is not a registration method. - @SuppressWarnings("ExecutorRegistration") - @Override - public int applySyncTransaction(@NonNull WindowContainerTransaction t, - @NonNull WindowContainerTransactionCallback callback) { - t.setTaskFragmentOrganizer(mInterface); - return super.applySyncTransaction(t, callback); - } - private final ITaskFragmentOrganizer mInterface = new ITaskFragmentOrganizer.Stub() { @Override public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java index 4ea5ea5694fa..a902003f66dc 100644 --- a/core/java/android/window/WindowOrganizer.java +++ b/core/java/android/window/WindowOrganizer.java @@ -61,9 +61,7 @@ public class WindowOrganizer { * Apply multiple WindowContainer operations at once. * * Note that using this API requires the caller to hold - * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS}, unless the caller is using - * {@link TaskFragmentOrganizer}, in which case it is allowed to change TaskFragment that is - * created by itself. + * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS}. * * @param t The transaction to apply. * @param callback This transaction will use the synchronization scheme described in @@ -72,8 +70,7 @@ public class WindowOrganizer { * @return An ID for the sync operation which will later be passed to transactionReady callback. * This lets the caller differentiate overlapping sync operations. */ - @RequiresPermission(value = android.Manifest.permission.MANAGE_ACTIVITY_TASKS, - conditional = true) + @RequiresPermission(value = android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public int applySyncTransaction(@NonNull WindowContainerTransaction t, @NonNull WindowContainerTransactionCallback callback) { try { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 6970c7942a50..a6b9ba016793 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -177,7 +177,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (t == null) { throw new IllegalArgumentException("Null transaction passed to applySyncTransaction"); } - enforceTaskPermission("applySyncTransaction()", t); + enforceTaskPermission("applySyncTransaction()"); final CallerInfo caller = new CallerInfo(); final long ident = Binder.clearCallingIdentity(); try { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index f8c7207cefa7..318da074dc6f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -50,7 +50,6 @@ import android.window.TaskFragmentOrganizer; import android.window.TaskFragmentOrganizerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import android.window.WindowContainerTransactionCallback; import androidx.test.filters.SmallTest; @@ -227,19 +226,6 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { assertNull(mController.getRemoteAnimationDefinition(mIOrganizer)); } - @Test - public void testWindowContainerTransaction_setTaskFragmentOrganizer() { - mOrganizer.applyTransaction(mTransaction); - - assertEquals(mIOrganizer, mTransaction.getTaskFragmentOrganizer()); - - mTransaction = new WindowContainerTransaction(); - mOrganizer.applySyncTransaction( - mTransaction, mock(WindowContainerTransactionCallback.class)); - - assertEquals(mIOrganizer, mTransaction.getTaskFragmentOrganizer()); - } - @Test public void testApplyTransaction_enforceConfigurationChangeOnOrganizedTaskFragment() throws RemoteException { -- cgit v1.2.3 From 6d848929eab6249b0ba1b8bd6d454744850b1718 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Mon, 13 Feb 2023 14:56:14 +0800 Subject: Re-enforce MANAGE_ACTIVITY_TASKS for applySyncTransaction The conditional permission was introduced for TaskFragmentOrganizer, but not really needed. Remove the conditional check. Bug: 259938771 Test: pass existing tests Merged-In: I666b9ee6b6076766513b97e675fdbaa002428601 Change-Id: I666b9ee6b6076766513b97e675fdbaa002428601 --- core/api/test-current.txt | 2 +- core/java/android/window/TaskFragmentOrganizer.java | 9 --------- core/java/android/window/WindowOrganizer.java | 7 ++----- .../com/android/server/wm/WindowOrganizerController.java | 2 +- .../server/wm/TaskFragmentOrganizerControllerTest.java | 14 -------------- 5 files changed, 4 insertions(+), 30 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 1796c7b971a9..1ca46428d708 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3436,7 +3436,7 @@ package android.window { public class WindowOrganizer { ctor public WindowOrganizer(); - method @RequiresPermission(value=android.Manifest.permission.MANAGE_ACTIVITY_TASKS, conditional=true) public int applySyncTransaction(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.WindowContainerTransactionCallback); + method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public int applySyncTransaction(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.WindowContainerTransactionCallback); method @RequiresPermission(value=android.Manifest.permission.MANAGE_ACTIVITY_TASKS, conditional=true) public void applyTransaction(@NonNull android.window.WindowContainerTransaction); } diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index 2ef49c3e2aac..7745ff7c31d7 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -179,15 +179,6 @@ public class TaskFragmentOrganizer extends WindowOrganizer { super.applyTransaction(t); } - // Suppress the lint because it is not a registration method. - @SuppressWarnings("ExecutorRegistration") - @Override - public int applySyncTransaction(@NonNull WindowContainerTransaction t, - @NonNull WindowContainerTransactionCallback callback) { - t.setTaskFragmentOrganizer(mInterface); - return super.applySyncTransaction(t, callback); - } - private final ITaskFragmentOrganizer mInterface = new ITaskFragmentOrganizer.Stub() { @Override public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java index 4ea5ea5694fa..a902003f66dc 100644 --- a/core/java/android/window/WindowOrganizer.java +++ b/core/java/android/window/WindowOrganizer.java @@ -61,9 +61,7 @@ public class WindowOrganizer { * Apply multiple WindowContainer operations at once. * * Note that using this API requires the caller to hold - * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS}, unless the caller is using - * {@link TaskFragmentOrganizer}, in which case it is allowed to change TaskFragment that is - * created by itself. + * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS}. * * @param t The transaction to apply. * @param callback This transaction will use the synchronization scheme described in @@ -72,8 +70,7 @@ public class WindowOrganizer { * @return An ID for the sync operation which will later be passed to transactionReady callback. * This lets the caller differentiate overlapping sync operations. */ - @RequiresPermission(value = android.Manifest.permission.MANAGE_ACTIVITY_TASKS, - conditional = true) + @RequiresPermission(value = android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public int applySyncTransaction(@NonNull WindowContainerTransaction t, @NonNull WindowContainerTransactionCallback callback) { try { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index aee66faa8faa..4f4d5967365c 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -189,7 +189,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (t == null) { throw new IllegalArgumentException("Null transaction passed to applySyncTransaction"); } - enforceTaskPermission("applySyncTransaction()", t); + enforceTaskPermission("applySyncTransaction()"); final CallerInfo caller = new CallerInfo(); final long ident = Binder.clearCallingIdentity(); try { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index ed8440027bdc..c07e3d74b820 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -62,7 +62,6 @@ import android.window.TaskFragmentOrganizer; import android.window.TaskFragmentOrganizerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import android.window.WindowContainerTransactionCallback; import androidx.test.filters.SmallTest; @@ -335,19 +334,6 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { assertNull(mController.getRemoteAnimationDefinition(mIOrganizer, TASK_ID)); } - @Test - public void testWindowContainerTransaction_setTaskFragmentOrganizer() { - mOrganizer.applyTransaction(mTransaction); - - assertEquals(mIOrganizer, mTransaction.getTaskFragmentOrganizer()); - - mTransaction = new WindowContainerTransaction(); - mOrganizer.applySyncTransaction( - mTransaction, mock(WindowContainerTransactionCallback.class)); - - assertEquals(mIOrganizer, mTransaction.getTaskFragmentOrganizer()); - } - @Test public void testApplyTransaction_enforceConfigurationChangeOnOrganizedTaskFragment() throws RemoteException { -- cgit v1.2.3 From 9857c9b6d4933f37040b1bea556f40f452ed6c2c Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Mon, 13 Feb 2023 21:06:00 -0800 Subject: NetdEventListenerService extends BaseNetdEventListener Extending the newly created BaseNetdEventListener which has default implementations so adding new methods doesn't break NetdEventListenerService on branches where those implementations aren't available. Implementation can be provided in BaseNetdEventListener which is in the same project as INetdEventListener. Test: atest FrameworksNetTests:NetdEventListenerServiceTest Bug: 265742148 Change-Id: Ifed011441624cc9075111819effd93cdb3e33239 Merged-In: Ifed011441624cc9075111819effd93cdb3e33239 --- .../connectivity/NetdEventListenerService.java | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index ee5bda3abc91..3a4aaa76d633 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -28,7 +28,6 @@ import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.net.metrics.ConnectStats; import android.net.metrics.DnsEvent; -import android.net.metrics.INetdEventListener; import android.net.metrics.NetworkMetrics; import android.net.metrics.WakeupEvent; import android.net.metrics.WakeupStats; @@ -44,6 +43,7 @@ import com.android.internal.util.BitUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.RingBuffer; import com.android.internal.util.TokenBucket; +import com.android.net.module.util.BaseNetdEventListener; import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent; import java.io.PrintWriter; @@ -54,7 +54,7 @@ import java.util.StringJoiner; /** * Implementation of the INetdEventListener interface. */ -public class NetdEventListenerService extends INetdEventListener.Stub { +public class NetdEventListenerService extends BaseNetdEventListener { public static final String SERVICE_NAME = "netd_listener"; @@ -208,15 +208,18 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs, - String hostname, String[] ipAddresses, int ipAddressesCount, int uid) - throws RemoteException { + String hostname, String[] ipAddresses, int ipAddressesCount, int uid) { long timestamp = System.currentTimeMillis(); getMetricsForNetwork(timestamp, netId).addDnsResult(eventType, returnCode, latencyMs); for (INetdEventCallback callback : mNetdEventCallbackList) { if (callback != null) { - callback.onDnsEvent(netId, eventType, returnCode, hostname, ipAddresses, - ipAddressesCount, timestamp, uid); + try { + callback.onDnsEvent(netId, eventType, returnCode, hostname, ipAddresses, + ipAddressesCount, timestamp, uid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } } @@ -225,11 +228,14 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. public synchronized void onNat64PrefixEvent(int netId, - boolean added, String prefixString, int prefixLength) - throws RemoteException { + boolean added, String prefixString, int prefixLength) { for (INetdEventCallback callback : mNetdEventCallbackList) { if (callback != null) { - callback.onNat64PrefixEvent(netId, added, prefixString, prefixLength); + try { + callback.onNat64PrefixEvent(netId, added, prefixString, prefixLength); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } } @@ -238,11 +244,14 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. public synchronized void onPrivateDnsValidationEvent(int netId, - String ipAddress, String hostname, boolean validated) - throws RemoteException { + String ipAddress, String hostname, boolean validated) { for (INetdEventCallback callback : mNetdEventCallbackList) { if (callback != null) { - callback.onPrivateDnsValidationEvent(netId, ipAddress, hostname, validated); + try { + callback.onPrivateDnsValidationEvent(netId, ipAddress, hostname, validated); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } } @@ -251,13 +260,17 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // Called concurrently by multiple binder threads. // This method must not block or perform long-running operations. public synchronized void onConnectEvent(int netId, int error, int latencyMs, String ipAddr, - int port, int uid) throws RemoteException { + int port, int uid) { long timestamp = System.currentTimeMillis(); getMetricsForNetwork(timestamp, netId).addConnectResult(error, latencyMs, ipAddr); for (INetdEventCallback callback : mNetdEventCallbackList) { if (callback != null) { - callback.onConnectEvent(ipAddr, port, timestamp, uid); + try { + callback.onConnectEvent(ipAddr, port, timestamp, uid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } } @@ -315,7 +328,7 @@ public class NetdEventListenerService extends INetdEventListener.Stub { } @Override - public int getInterfaceVersion() throws RemoteException { + public int getInterfaceVersion() { return this.VERSION; } -- cgit v1.2.3 From 6c1469ab71bba788e92b20077a611993b91130f1 Mon Sep 17 00:00:00 2001 From: Neha Pattan Date: Tue, 27 Dec 2022 21:58:07 +0000 Subject: (TM-MP) Rb back compat: Base changes Bug: 263816046 Test: manual Change-Id: I282cceadded830d98fefe5f7d46e7f7ad640c4fe --- packages/SettingsLib/ActionBarShadow/Android.bp | 1 + packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp | 1 + packages/SettingsLib/MainSwitchPreference/Android.bp | 1 + packages/SettingsLib/SettingsTheme/Android.bp | 5 ++--- packages/SettingsLib/SettingsTransition/Android.bp | 1 + packages/SettingsLib/Utils/Android.bp | 3 ++- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/SettingsLib/ActionBarShadow/Android.bp b/packages/SettingsLib/ActionBarShadow/Android.bp index 4e147385bcda..bf4c8587722a 100644 --- a/packages/SettingsLib/ActionBarShadow/Android.bp +++ b/packages/SettingsLib/ActionBarShadow/Android.bp @@ -23,6 +23,7 @@ android_library { apex_available: [ "//apex_available:platform", "com.android.adservices", + "com.android.extservices", "com.android.permission", ], } diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp index 7968e96009b5..b82d191fa292 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp @@ -27,6 +27,7 @@ android_library { "//apex_available:platform", "com.android.adservices", "com.android.cellbroadcast", + "com.android.extservices", "com.android.permission", ], } diff --git a/packages/SettingsLib/MainSwitchPreference/Android.bp b/packages/SettingsLib/MainSwitchPreference/Android.bp index dd29827917da..415ae8748d60 100644 --- a/packages/SettingsLib/MainSwitchPreference/Android.bp +++ b/packages/SettingsLib/MainSwitchPreference/Android.bp @@ -25,5 +25,6 @@ android_library { "//apex_available:platform", "com.android.adservices", "com.android.cellbroadcast", + "com.android.extservices", ], } diff --git a/packages/SettingsLib/SettingsTheme/Android.bp b/packages/SettingsLib/SettingsTheme/Android.bp index b1eabe5b866b..d8270c4c5239 100644 --- a/packages/SettingsLib/SettingsTheme/Android.bp +++ b/packages/SettingsLib/SettingsTheme/Android.bp @@ -12,9 +12,7 @@ android_library { resource_dirs: ["res"], - static_libs: [ - "androidx.preference_preference", - ], + static_libs: ["androidx.preference_preference"], sdk_version: "system_current", min_sdk_version: "21", @@ -22,6 +20,7 @@ android_library { "//apex_available:platform", "com.android.adservices", "com.android.cellbroadcast", + "com.android.extservices", "com.android.permission", "com.android.mediaprovider", ], diff --git a/packages/SettingsLib/SettingsTransition/Android.bp b/packages/SettingsLib/SettingsTransition/Android.bp index 708141b7090c..fe9dd52611ee 100644 --- a/packages/SettingsLib/SettingsTransition/Android.bp +++ b/packages/SettingsLib/SettingsTransition/Android.bp @@ -22,6 +22,7 @@ android_library { "//apex_available:platform", "com.android.adservices", "com.android.cellbroadcast", + "com.android.extservices", "com.android.permission", ], } diff --git a/packages/SettingsLib/Utils/Android.bp b/packages/SettingsLib/Utils/Android.bp index 1b002613f90a..cc0f42d15145 100644 --- a/packages/SettingsLib/Utils/Android.bp +++ b/packages/SettingsLib/Utils/Android.bp @@ -24,7 +24,8 @@ android_library { "//apex_available:platform", "com.android.adservices", - "com.android.permission", "com.android.cellbroadcast", + "com.android.extservices", + "com.android.permission", ], } -- cgit v1.2.3 From e422b7da01a56766996ed5b8f4e9b78d8edd7951 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 13 Apr 2022 12:14:53 -0700 Subject: Add UpsideDownCake to aapt2 codenames and android.os.Build Bug: 219519679# Bug: 269470863 Test: m checkbuild Change-Id: I2b668d1cd875657b27a1d52bda21f238d7020862 (cherry picked from commit d27566da4cc7e0de8efe00140fe28db1536bef43) Merged-In: I2b668d1cd875657b27a1d52bda21f238d7020862 --- core/api/current.txt | 1 + core/java/android/os/Build.java | 5 +++++ tools/aapt2/SdkConstants.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/api/current.txt b/core/api/current.txt index c8a43db2f9c2..8fb0d676822a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -30978,6 +30978,7 @@ package android.os { field public static final int S = 31; // 0x1f field public static final int S_V2 = 32; // 0x20 field public static final int TIRAMISU = 33; // 0x21 + field public static final int UPSIDE_DOWN_CAKE = 10000; // 0x2710 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 0b956f8bf9e0..dbd602f27c11 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -1167,6 +1167,11 @@ public class Build { * Tiramisu. */ public static final int TIRAMISU = 33; + + /** + * Upside Down Cake. + */ + public static final int UPSIDE_DOWN_CAKE = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index 8ea43abff895..34e8edb0a47f 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -27,7 +27,7 @@ namespace aapt { static ApiVersion sDevelopmentSdkLevel = 10000; static const auto sDevelopmentSdkCodeNames = - std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu"}); + std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); static const std::vector> sAttrIdMap = { {0x021c, 1}, -- cgit v1.2.3 From 15d3382030fb7c352f7fcd278226e64910b1c198 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 20 Feb 2023 23:06:50 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8827e307ee08fec1404698825fa9e2edd40c258f --- packages/SettingsLib/res/values-es-rUS/strings.xml | 2 +- packages/SettingsLib/res/values-es/strings.xml | 2 +- packages/SettingsLib/res/values-in/strings.xml | 2 +- packages/SettingsLib/res/values-pt-rPT/arrays.xml | 4 ++-- packages/SettingsLib/res/values-pt-rPT/strings.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 66099710f44a..739affe785bd 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -579,7 +579,7 @@ "Agregar" "Usuario nuevo" "Perfil nuevo" - "Datos de usuario" + "Datos del usuario" "Datos del perfil" "Para poder crear un perfil restringido, debes configurar un bloqueo de pantalla que proteja tus aplicaciones y datos personales." "Configurar bloqueo" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 82108e26d48b..eecfe2b5fb66 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -182,7 +182,7 @@ "Desconocido" "Usuario: %1$s" "Se han establecido algunos valores predeterminados" - "No se han establecido valores predeterminados" + "No hay valores predeterminados" "Ajustes de conversión de texto a voz" "Salida de conversión de texto a voz" "Velocidad de la voz" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 290f1a5f9cc0..8db3f3dd70be 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -345,7 +345,7 @@ "Aktifkan aplikasi terminal yang menawarkan akses kerangka lokal" "Pemeriksaan HDCP" "Setel perilaku pemeriksaan HDCP" - "Debugging" + "Proses debug" "Pilih aplikasi debug" "Tidak ada aplikasi debug yang disetel" "Aplikasi debug: %1$s" diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 3e7ee052ba1c..e1623e38eaa6 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -50,8 +50,8 @@ "Nunca verificar" - "Verificar apenas conteúdo DRM" - "Verificar sempre" + "Rever apenas conteúdo DRM" + "Rever sempre" "Nunca utilizar a verificação HDCP" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 8587fb3f8039..3365ade8cac4 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -151,7 +151,7 @@ "Cancelar" "A sincronização concede acesso aos seus contactos e ao histórico de chamadas quando tem uma ligação estabelecida." "Não foi possível sincronizar com %1$s." - "Não foi possível sincronizar com %1$s devido a PIN ou chave de acesso incorreto." + "Não foi possível sincronizar com %1$s devido a PIN ou token de acesso incorreto." "Não é possível comunicar com %1$s." "Emparelhamento rejeitado por %1$s." "Computador" @@ -335,8 +335,8 @@ "Revogar acesso à depuração USB de todos os computadores anteriormente autorizados?" "Permitir definições de programação?" "Estas definições destinam-se apenas a programação. Podem fazer com que o seu aparelho e as aplicações nele existentes falhem ou funcionem mal." - "Verificar apps por USB" - "Verificar as aplicações instaladas via ADB/ADT para detetar comportamento perigoso" + "Rever apps por USB" + "Rever as aplicações instaladas via ADB/ADT para detetar comportamento perigoso" "São apresentados os dispositivos Bluetooth sem nomes (apenas endereços MAC)" "Desativa a funcionalidade de volume absoluto do Bluetooth caso existam problemas de volume com dispositivos remotos, como um volume insuportavelmente alto ou a ausência de controlo" "Ativa a pilha de funcionalidades Bluetooth Gabeldorche." @@ -349,7 +349,7 @@ "Selecionar a aplicação a depurar" "Nenhuma aplicação a depurar definida" "A depurar aplicação: %1$s" - "Selecionar aplicação" + "Selecionar app" "Nenhuma" "Aguarde pelo depurador" "A aplicação depurada aguarda a anexação do depurador antes da execução" -- cgit v1.2.3 From 6a75c9d48cfaa625b208cf15bb4d3650db413f12 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Feb 2023 02:04:31 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6206a84d0851ffff12c6c01aea0e63da2b1308b5 --- core/res/res/values-bs/strings.xml | 2 +- core/res/res/values-de/strings.xml | 2 +- core/res/res/values-es-rUS/strings.xml | 2 +- core/res/res/values-it/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 6 +++--- core/res/res/values-ur/strings.xml | 2 +- core/res/res/values-uz/strings.xml | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 263275d1bdfe..af36711d4dfd 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2041,7 +2041,7 @@ "IPAK OTVORI" "Otkrivena je štetna aplikacija" "Dozvoliti aplikaciji %s da pristupa svim zapisnicima uređaja?" - "Dozvoli jednokratan pristup" + "Dozvoli jednokratni pristup" "Nemoj dozvoliti" "Zapisnici uređaja bilježe šta se dešava na uređaju. Aplikacije mogu koristiti te zapisnike da pronađu i riješe probleme.\n\nNeki zapisnici mogu sadržavati osjetljive podatke. Stoga pristup svim zapisnicima uređaja dozvolite samo aplikacijama kojima vjerujete. \n\nAko ne dozvolite ovoj aplikaciji da pristupa svim zapisnicima uređaja, ona i dalje može pristupati svojim zapisnicima. Proizvođač uređaja će možda i dalje biti u stanju pristupiti nekim zapisnicima ili podacima na uređaju. Saznajte više" "Ne prikazuj ponovo" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index ca42d860c3ae..c4dd7af774e7 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -295,7 +295,7 @@ "%1$s, %2$s" "Abgesicherter Modus" "Android-System" - "Zum persönlichen Profil wechseln" + "Zum privaten Profil wechseln" "Zum Arbeitsprofil wechseln" "Kontakte" "auf deine Kontakte zugreifen" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 1ba0eac19127..c0c7ef1894d2 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -2043,7 +2043,7 @@ "¿Quieres permitir que %s acceda a todos los registros del dispositivo?" "Permitir acceso por única vez" "No permitir" - "Los registros del dispositivo permiten documentar lo que sucede en él. Las apps pueden usar estos registros para encontrar y solucionar problemas.\n\nEs posible que algunos registros del dispositivo contengan información sensible, por lo que solo debes permitir que accedan a todos los registros las apps que sean de tu confianza. \n\n Ten en cuenta que la app puede acceder a sus propios registros aun si no permites que acceda a todos los registros del dispositivo. También es posible que el fabricante del dispositivo acceda a algunos registros o información en tu dispositivo. Más información" + "Los registros del dispositivo permiten documentar lo que sucede en él. Las apps pueden usar estos registros para encontrar y solucionar problemas.\n\nEs posible que algunos registros del dispositivo contengan información sensible, por lo que solo debes permitir que accedan a ellos las apps que sean de tu confianza. \n\n Ten en cuenta que la app puede acceder a sus propios registros aun si no permites que acceda a todos los registros del dispositivo. También es posible que el fabricante del dispositivo acceda a algunos registros o información en tu dispositivo. Más información" "No volver a mostrar" "%1$s quiere mostrar fragmentos de %2$s" "Editar" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6a59b1e8f79c..a2b80cbc5b8b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -2043,7 +2043,7 @@ "Consentire all\'app %s di accedere a tutti i log del dispositivo?" "Consenti accesso una tantum" "Non consentire" - "I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe le neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo. Scopri di più" + "I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo. Scopri di più" "Non mostrare più" "L\'app %1$s vuole mostrare porzioni dell\'app %2$s" "Modifica" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 1b2309347c96..4718ee73ef80 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -2039,7 +2039,7 @@ "제거" "열기" "유해한 앱 감지됨" - "%s에서 모든 기기 로그에 액세스하도록 허용하시겠습니까?" + "%s에서 전체 기기 로그에 액세스하도록 허용하시겠습니까?" "일회성 액세스 허용" "허용 안함" "기기 로그에는 기기에서 발생한 상황이 기록됩니다. 앱은 문제를 찾고 해결하는 데 이 로그를 사용할 수 있습니다.\n\n일부 로그는 민감한 정보를 포함할 수 있으므로 신뢰할 수 있는 앱만 모든 기기 로그에 액세스하도록 허용하세요. \n\n앱에 전체 기기 로그에 대한 액세스 권한을 부여하지 않아도, 앱이 자체 로그에는 액세스할 수 있습니다. 기기 제조업체에서 일부 로그 또는 기기 내 정보에 액세스할 수도 있습니다. 자세히 알아보세요." diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 14fcc6d7cf6e..22e4ed2501e3 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1227,7 +1227,7 @@ "Mostrar sempre" "A app %1$s foi concebida para uma versão incompatível do SO Android e pode ter um comportamento inesperado. Pode estar disponível uma versão atualizada da app." "Mostrar sempre" - "Verificar atualizações" + "Rever atualizações" "A app %1$s (processo %2$s) violou a política StrictMode auto-imposta." "O processo %1$s violou a política StrictMode auto-imposta." "O telemóvel está a atualizar…" @@ -1952,7 +1952,7 @@ "Esta app está a solicitar segurança adicional. Em alternativa, experimente no tablet." "Esta app está a solicitar segurança adicional. Em alternativa, experimente no telemóvel." "Esta app foi concebida para uma versão mais antiga do Android e pode não funcionar corretamente. Experimente verificar se existem atualizações ou contacte o programador." - "Verificar atualizações" + "Rever atualizações" "Tem mensagens novas" "Abra a app de SMS para ver" "Algumas funcionalidades limitadas" @@ -2281,7 +2281,7 @@ "Uma app ainda está ativa" "A app %1$s está a ser executada em segundo plano Toque para gerir a utilização da bateria." "A app %1$s pode afetar a autonomia da bateria. Toque para rever as apps ativas." - "Verificar apps ativas" + "Rever apps ativas" "Não é possível aceder à câmara do telemóvel a partir do dispositivo %1$s" "Não é possível aceder à câmara do tablet a partir do dispositivo %1$s" "Predefinição do sistema" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 0966045bfdc7..50d2fa84abb8 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2039,7 +2039,7 @@ "اَن انسٹال کریں" "بہر صورت کھولیں" "ضرر رساں ایپ کا پتہ چلا" - "%s کو آلے کے تمام لاگز تک رسائی کی اجازت دیں؟" + "‫%s کو آلے کے تمام لاگز تک رسائی کی اجازت دیں؟" "یک وقتی رسائی کی اجازت دیں" "اجازت نہ دیں" "آپ کے آلے پر جو ہوتا ہے آلے کے لاگز اسے ریکارڈ کر لیتے ہیں۔ ایپس ان لاگز کا استعمال مسائل کو تلاش کرنے اور ان کو حل کرنے کے لیے کر سکتی ہیں۔\n\nکچھ لاگز میں حساس معلومات شامل ہو سکتی ہیں، اس لیے صرف اپنی بھروسے مند ایپس کو ہی آلے کے تمام لاگز تک رسائی کی اجازت دیں۔ \n\nاگر آپ اس ایپ کو آلے کے تمام لاگز تک رسائی کی اجازت نہیں دیتے ہیں تب بھی یہ اپنے لاگز تک رسائی حاصل کر سکتی ہے۔ آپ کے آلے کا مینوفیکچرر اب بھی آپ کے آلے پر کچھ لاگز یا معلومات تک رسائی حاصل کر سکتا ہے۔ مزید جانیں" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 855be5c38b71..32dcffef383a 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -2039,8 +2039,8 @@ "O‘CHIRIB TASHLASH" "BARIBIR OCHILSIN" "Zararli ilova aniqlandi" - "%s ilovasining qurilmadagi barcha jurnallarga kirishiga ruxsat berilsinmi?" - "Bir matalik foydalanishga ruxsat berish" + "%s uchun qurilmadagi barcha jurnallarga kirish ruxsati berilsinmi?" + "Bir martalik ruxsat berish" "Rad etish" "Qurilma jurnaliga qurilma bilan yuz bergan hodisalar qaydlari yoziladi. Ilovalar bu jurnal qaydlari yordamida muammolarni topishi va bartaraf qilishi mumkin.\n\nAyrim jurnal qaydlarida maxfiy axborotlar yozilishi mumkin, shu sababli qurilmadagi barcha jurnal qaydlariga ruxsatni faqat ishonchli ilovalarga bering. \n\nBu ilovaga qurilmadagi barcha jurnal qaydlariga ruxsat berilmasa ham, u oʻzining jurnalini ocha oladi. Qurilma ishlab chiqaruvchisi ham ayrim jurnallar yoki qurilma haqidagi axborotlarni ocha oladi. Batafsil" "Boshqa chiqmasin" -- cgit v1.2.3 From 15fd9726d0fe30bfc129db3e091c318525a95973 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Feb 2023 04:25:56 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia924af3f5e6c82f4e191bb504f73a2a09946b069 --- packages/SystemUI/res/values-fi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 538b1cb81cce..2ccb753795e6 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -28,7 +28,7 @@ "Käytä laitteesi mukana tullutta laturia" "Otetaanko virransäästö käyttöön?" "Tietoa virransäästöstä" - "Ota käyttöön" + "Laita päälle" "Laita päälle" "Ei kiitos" "Näytön automaattinen kääntö" -- cgit v1.2.3 From d376e7f88e261e4d1cd067db4a4d6e0868af1a36 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Wed, 15 Feb 2023 17:01:24 -0800 Subject: Camera: document multiResolution raw behavior Document that mutiResolution RAW can be supported for a logical camera without RAW capability. Test: Build Bug: 269221911 Change-Id: I24269dd63c6f354a53c39de513a140907a0e41d2 Merged-In: I24269dd63c6f354a53c39de513a140907a0e41d2 --- .../hardware/camera2/CameraCharacteristics.java | 6 ++-- .../android/hardware/camera2/CameraMetadata.java | 35 +++++++++++----------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 753d52e440b5..9e4bf6a0c608 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -3513,7 +3513,7 @@ public final class CameraCharacteristics extends CameraMetadataAn array of mandatory stream combinations which are applicable when device support the * 10-bit output capability * {@link android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT } - * This is an app-readable conversion of the maximum resolution mandatory stream combination + * This is an app-readable conversion of the 10 bit output mandatory stream combination * {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.

*

The array of * {@link android.hardware.camera2.params.MandatoryStreamCombination combinations} is @@ -3538,8 +3538,8 @@ public final class CameraCharacteristics extends CameraMetadataAn array of mandatory stream combinations which are applicable when device lists * {@code PREVIEW_STABILIZATION} in {@link CameraCharacteristics#CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES android.control.availableVideoStabilizationModes}. - * This is an app-readable conversion of the maximum resolution mandatory stream combination - * {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.

+ * This is an app-readable conversion of the preview stabilization mandatory stream + * combination {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.

*

The array of * {@link android.hardware.camera2.params.MandatoryStreamCombination combinations} is * generated according to the documented diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index eb8c73aced39..e1089c22f593 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1000,24 +1000,25 @@ public abstract class CameraMetadata { * camera's crop region is set to maximum size, the FOV of the physical streams for the * ultrawide lens will be the same as the logical stream, by making the crop region * smaller than its active array size to compensate for the smaller focal length.

- *

There are two ways for the application to capture RAW images from a logical camera - * with RAW capability:

+ *

For a logical camera, typically the underlying physical cameras have different RAW + * capabilities (such as resolution or CFA pattern). There are two ways for the + * application to capture RAW images from the logical camera:

*
    - *
  • Because the underlying physical cameras may have different RAW capabilities (such - * as resolution or CFA pattern), to maintain backward compatibility, when a RAW stream - * is configured, the camera device makes sure the default active physical camera remains - * active and does not switch to other physical cameras. (One exception is that, if the - * logical camera consists of identical image sensors and advertises multiple focalLength - * due to different lenses, the camera device may generate RAW images from different - * physical cameras based on the focalLength being set by the application.) This - * backward-compatible approach usually results in loss of optical zoom, to telephoto - * lens or to ultrawide lens.
  • - *
  • Alternatively, to take advantage of the full zoomRatio range of the logical camera, - * the application should use {@link android.hardware.camera2.MultiResolutionImageReader } - * to capture RAW images from the currently active physical camera. Because different - * physical camera may have different RAW characteristics, the application needs to use - * the characteristics and result metadata of the active physical camera for the - * relevant RAW metadata.
  • + *
  • If the logical camera has RAW capability, the application can create and use RAW + * streams in the same way as before. In case a RAW stream is configured, to maintain + * backward compatibility, the camera device makes sure the default active physical + * camera remains active and does not switch to other physical cameras. (One exception + * is that, if the logical camera consists of identical image sensors and advertises + * multiple focalLength due to different lenses, the camera device may generate RAW + * images from different physical cameras based on the focalLength being set by the + * application.) This backward-compatible approach usually results in loss of optical + * zoom, to telephoto lens or to ultrawide lens.
  • + *
  • Alternatively, if supported by the device, + * {@link android.hardware.camera2.MultiResolutionImageReader } + * can be used to capture RAW images from one of the underlying physical cameras ( + * depending on current zoom level). Because different physical cameras may have + * different RAW characteristics, the application needs to use the characteristics + * and result metadata of the active physical camera for the relevant RAW metadata.
  • *
*

The capture request and result metadata tags required for backward compatible camera * functionalities will be solely based on the logical camera capability. On the other -- cgit v1.2.3 From 74184991b7af9edb2c8068476dc31cd77514fc87 Mon Sep 17 00:00:00 2001 From: Manjeet Rulhania Date: Thu, 23 Feb 2023 00:03:48 +0000 Subject: Rely on Display#getRealSize when dumping XML hierarchy * Previously, the height returned by Display#getSize was used to determine visible objects. Based on the API level and the presence of system decorations (e.g. notches), this can cause objects near the bottom of the screen to be considered out of bounds (i.e. only objects within y=0 and y=partial_height are considered even if the omitted decorations are at the top of the screen). cherry pick from aosp/2384832 Bug: 236669488 Test: manual Merged-In: Iba21245c947cec0d0054f6d86e3585ba73233223 Change-Id: I50f143528d1f5a5b677eb2628efbcd658f4cc1b0 (cherry picked from commit afebeb7b43f318a3ebd856f039d74475df92db9d) --- .../uiautomator/src/com/android/commands/uiautomator/DumpCommand.java | 2 +- .../com/android/uiautomator/core/AccessibilityNodeInfoDumper.java | 2 +- .../library/core-src/com/android/uiautomator/core/UiDevice.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java b/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java index 3b14be7327f7..24727c5f2448 100644 --- a/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java +++ b/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java @@ -107,7 +107,7 @@ public class DumpCommand extends Command { DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); int rotation = display.getRotation(); Point size = new Point(); - display.getSize(size); + display.getRealSize(size); AccessibilityNodeInfoDumper.dumpWindowToFile(info, dumpFile, rotation, size.x, size.y); } diff --git a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java index ab198b319e27..488292d68620 100644 --- a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java +++ b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java @@ -139,7 +139,7 @@ public class AccessibilityNodeInfoDumper { serializer.attribute("", "id", Integer.toString(displayId)); int rotation = display.getRotation(); Point size = new Point(); - display.getSize(size); + display.getRealSize(size); for (int i = 0, n = windows.size(); i < n; ++i) { dumpWindowRec(windows.get(i), serializer, i, size.x, size.y, rotation); } diff --git a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiDevice.java b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiDevice.java index b1b432bf79ab..a31deb084575 100644 --- a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiDevice.java +++ b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiDevice.java @@ -767,7 +767,7 @@ public class UiDevice { if(root != null) { Display display = getAutomatorBridge().getDefaultDisplay(); Point size = new Point(); - display.getSize(size); + display.getRealSize(size); AccessibilityNodeInfoDumper.dumpWindowToFile(root, new File(new File(Environment.getDataDirectory(), "local/tmp"), fileName), display.getRotation(), size.x, size.y); -- cgit v1.2.3 From 20aacbf01230dee7fa8f161bba52cce46f36376f Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Tue, 21 Feb 2023 19:46:05 +0000 Subject: Revert "Add UpsideDownCake to aapt2 codenames and android.os.Build" This reverts commit e422b7da01a56766996ed5b8f4e9b78d8edd7951. Reason for revert: Test failures on tm-branches b/269588126 Change-Id: I529eba46a1c341e75b02b59432e011fada8ae648 Bug: 269470863 Fixes: 269588126 Merged-In: Icb6ad340bfea7109aac9b74c6fb5165c030df16c --- core/api/current.txt | 1 - core/java/android/os/Build.java | 5 ----- tools/aapt2/SdkConstants.cpp | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 8fb0d676822a..c8a43db2f9c2 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -30978,7 +30978,6 @@ package android.os { field public static final int S = 31; // 0x1f field public static final int S_V2 = 32; // 0x20 field public static final int TIRAMISU = 33; // 0x21 - field public static final int UPSIDE_DOWN_CAKE = 10000; // 0x2710 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index dbd602f27c11..0b956f8bf9e0 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -1167,11 +1167,6 @@ public class Build { * Tiramisu. */ public static final int TIRAMISU = 33; - - /** - * Upside Down Cake. - */ - public static final int UPSIDE_DOWN_CAKE = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index 34e8edb0a47f..8ea43abff895 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -27,7 +27,7 @@ namespace aapt { static ApiVersion sDevelopmentSdkLevel = 10000; static const auto sDevelopmentSdkCodeNames = - std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); + std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu"}); static const std::vector> sAttrIdMap = { {0x021c, 1}, -- cgit v1.2.3 From 81a9f1a69377cee796a72859e7e255557dfb0867 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Wed, 22 Feb 2023 16:22:15 +0000 Subject: Add UpsideDownCake to aapt2 codenames Bug: 269470863 Test: m checkbuild Merged-In: I2b668d1cd875657b27a1d52bda21f238d7020862 Change-Id: Ic3a624a3d2696ecbbe9c079094362b01e8953365 --- tools/aapt2/SdkConstants.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index 8ea43abff895..34e8edb0a47f 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -27,7 +27,7 @@ namespace aapt { static ApiVersion sDevelopmentSdkLevel = 10000; static const auto sDevelopmentSdkCodeNames = - std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu"}); + std::unordered_set({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); static const std::vector> sAttrIdMap = { {0x021c, 1}, -- cgit v1.2.3 From a2178650d678fafee22e8760de1d0f8e426d33f0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 26 Feb 2023 22:38:35 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5145b5ec019b10568e811764240b3519e4057b73 --- core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-it/strings.xml | 2 +- core/res/res/values-ru/strings.xml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 257ed2f64d84..c02be6b4d9a7 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -296,7 +296,7 @@ "حالت ایمن" "‏سیستم Android" "جابه‌جا شدن به نمایه شخصی" - "جابه‌جا شدن به نمایه کاری" + "رفتن به نمایه کاری" "مخاطبین" "دسترسی به مخاطبین شما" "مکان" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index f4acb07b6fba..f91b5fa69c94 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1936,7 +1936,7 @@ "%1$s՝ անհասանելի է" "Անհրաժեշտ է թույլտվություն" "Տեսախցիկն անհասանելի է" - "Շարունակեք հեռախոսով" + "Շարու­նակեք հեռախոսով" "Խոսափողն անհասանելի է" "Android TV-ի կարգավորումներն անհասանելի են" "Պլանշետի կարգավորումներն անհասանելի են" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index a2b80cbc5b8b..ecbe3c24b744 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1960,7 +1960,7 @@ "Tocca per sbloc. prof. di lav." "Connesso a %1$s" "Tocca per visualizzare i file" - "Blocca" + "Fissa" "Blocca %1$s" "Sgancia" "Sblocca %1$s" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d2244692105b..b4862a4ab8eb 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1160,8 +1160,8 @@ "Отмена" "Внимание!" "Загрузка…" - "I" - "O" + "Включено" + "Выключено" "отмечено" "не отмечено" "выбрано" -- cgit v1.2.3 From 73d5730d1e19e3b60af6ebe5483d028b800728e0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 27 Feb 2023 00:28:27 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie19c62f2ce8e713eaa27e99fa6d28fe8d6379177 --- packages/SystemUI/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index f0d0554ec75e..8d6feefd76cd 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -643,7 +643,7 @@ "رمز مفتاح اليمين" "رمز اليسار" "رمز اليمين" - "اضغط باستمرار مع السحب لإضافة الميزات." + "اضغط باستمرار مع السحب لإضافة المربّعات" "اضغط باستمرار مع السحب لإعادة ترتيب الميزات." "اسحب هنا للإزالة" "الحدّ الأدنى من عدد المربعات الذي تحتاج إليه هو %1$d" -- cgit v1.2.3 From e54d365603a3af914d18a7879432d7072c6c3ad7 Mon Sep 17 00:00:00 2001 From: Thomas Stuart Date: Mon, 21 Nov 2022 17:38:21 -0800 Subject: enforce stricter rules when registering phoneAccounts - include disable accounts when looking up accounts for a package to check if the limit is reached (10) - put a new limit of 10 supported schemes - put a new limit of 256 characters per scheme - put a new limit of 256 characters per address - ensure the Icon can write to memory w/o throwing an exception bug: 259064622 bug: 256819769 Test: cts + unit Change-Id: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 Merged-In: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 --- telecomm/java/android/telecom/PhoneAccount.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index e332d3ff2b4d..808d032f5d66 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -517,6 +517,11 @@ public final class PhoneAccount implements Parcelable { /** * Sets the address. See {@link PhoneAccount#getAddress}. + *

+ * Note: The entire URI value is limited to 256 characters. This check is + * enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} and will cause an + * {@link IllegalArgumentException} to be thrown if URI is over 256. * * @param value The address of the phone account. * @return The builder. @@ -550,6 +555,10 @@ public final class PhoneAccount implements Parcelable { /** * Sets the icon. See {@link PhoneAccount#getIcon}. + *

+ * Note: An {@link IllegalArgumentException} if the Icon cannot be written to memory. + * This check is enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} * * @param icon The icon to set. */ @@ -583,6 +592,10 @@ public final class PhoneAccount implements Parcelable { /** * Specifies an additional URI scheme supported by the {@link PhoneAccount}. * + *

+ * Each URI scheme is limited to 256 characters. Adding a scheme over 256 characters will + * cause an {@link IllegalArgumentException} to be thrown when the account is registered. + * * @param uriScheme The URI scheme. * @return The builder. */ @@ -596,6 +609,12 @@ public final class PhoneAccount implements Parcelable { /** * Specifies the URI schemes supported by the {@link PhoneAccount}. * + *

+ * A max of 10 URI schemes can be added per account. Additionally, each URI scheme is + * limited to 256 characters. Adding more than 10 URI schemes or 256 characters on any + * scheme will cause an {@link IllegalArgumentException} to be thrown when the account + * is registered. + * * @param uriSchemes The URI schemes. * @return The builder. */ -- cgit v1.2.3 From a66a3156e03fbd1c3a29015db9193d66f2709f98 Mon Sep 17 00:00:00 2001 From: Thomas Stuart Date: Mon, 21 Nov 2022 17:38:21 -0800 Subject: enforce stricter rules when registering phoneAccounts - include disable accounts when looking up accounts for a package to check if the limit is reached (10) - put a new limit of 10 supported schemes - put a new limit of 256 characters per scheme - put a new limit of 256 characters per address - ensure the Icon can write to memory w/o throwing an exception bug: 259064622 bug: 256819769 Test: cts + unit Change-Id: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 Merged-In: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 --- telecomm/java/android/telecom/PhoneAccount.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 768c8eebf067..a85c85380fb7 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -483,6 +483,11 @@ public final class PhoneAccount implements Parcelable { /** * Sets the address. See {@link PhoneAccount#getAddress}. + *

+ * Note: The entire URI value is limited to 256 characters. This check is + * enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} and will cause an + * {@link IllegalArgumentException} to be thrown if URI is over 256. * * @param value The address of the phone account. * @return The builder. @@ -516,6 +521,10 @@ public final class PhoneAccount implements Parcelable { /** * Sets the icon. See {@link PhoneAccount#getIcon}. + *

+ * Note: An {@link IllegalArgumentException} if the Icon cannot be written to memory. + * This check is enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} * * @param icon The icon to set. */ @@ -549,6 +558,10 @@ public final class PhoneAccount implements Parcelable { /** * Specifies an additional URI scheme supported by the {@link PhoneAccount}. * + *

+ * Each URI scheme is limited to 256 characters. Adding a scheme over 256 characters will + * cause an {@link IllegalArgumentException} to be thrown when the account is registered. + * * @param uriScheme The URI scheme. * @return The builder. */ @@ -562,6 +575,12 @@ public final class PhoneAccount implements Parcelable { /** * Specifies the URI schemes supported by the {@link PhoneAccount}. * + *

+ * A max of 10 URI schemes can be added per account. Additionally, each URI scheme is + * limited to 256 characters. Adding more than 10 URI schemes or 256 characters on any + * scheme will cause an {@link IllegalArgumentException} to be thrown when the account + * is registered. + * * @param uriSchemes The URI schemes. * @return The builder. */ -- cgit v1.2.3 From 6a02885f90fa64d88bac31efbcdbc2bfe0a9328f Mon Sep 17 00:00:00 2001 From: Thomas Stuart Date: Mon, 21 Nov 2022 17:38:21 -0800 Subject: enforce stricter rules when registering phoneAccounts - include disable accounts when looking up accounts for a package to check if the limit is reached (10) - put a new limit of 10 supported schemes - put a new limit of 256 characters per scheme - put a new limit of 256 characters per address - ensure the Icon can write to memory w/o throwing an exception bug: 259064622 bug: 256819769 Test: cts + unit Change-Id: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 Merged-In: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 --- telecomm/java/android/telecom/PhoneAccount.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index e332d3ff2b4d..808d032f5d66 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -517,6 +517,11 @@ public final class PhoneAccount implements Parcelable { /** * Sets the address. See {@link PhoneAccount#getAddress}. + *

+ * Note: The entire URI value is limited to 256 characters. This check is + * enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} and will cause an + * {@link IllegalArgumentException} to be thrown if URI is over 256. * * @param value The address of the phone account. * @return The builder. @@ -550,6 +555,10 @@ public final class PhoneAccount implements Parcelable { /** * Sets the icon. See {@link PhoneAccount#getIcon}. + *

+ * Note: An {@link IllegalArgumentException} if the Icon cannot be written to memory. + * This check is enforced when registering the PhoneAccount via + * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} * * @param icon The icon to set. */ @@ -583,6 +592,10 @@ public final class PhoneAccount implements Parcelable { /** * Specifies an additional URI scheme supported by the {@link PhoneAccount}. * + *

+ * Each URI scheme is limited to 256 characters. Adding a scheme over 256 characters will + * cause an {@link IllegalArgumentException} to be thrown when the account is registered. + * * @param uriScheme The URI scheme. * @return The builder. */ @@ -596,6 +609,12 @@ public final class PhoneAccount implements Parcelable { /** * Specifies the URI schemes supported by the {@link PhoneAccount}. * + *

+ * A max of 10 URI schemes can be added per account. Additionally, each URI scheme is + * limited to 256 characters. Adding more than 10 URI schemes or 256 characters on any + * scheme will cause an {@link IllegalArgumentException} to be thrown when the account + * is registered. + * * @param uriSchemes The URI schemes. * @return The builder. */ -- cgit v1.2.3 From b5095b2bc2cf192c5902ce0cbb90a9f0f70d4a7b Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 24 Feb 2023 18:45:51 +0000 Subject: Add new capability name. Rename PROCESS_CAPABILITY_NETWORK to PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK so it's clearer what the capability grants. Bug: 261999509 Test: CTS Change-Id: Ie0cc529c9154d6e3ac69d2d9e5a760a62bd7fe92 (cherry picked from commit c0f77b8cfa20b91cb5b14830bdef700ded1b661f) Merged-In: Ie0cc529c9154d6e3ac69d2d9e5a760a62bd7fe92 --- core/api/test-current.txt | 3 ++- core/java/android/app/ActivityManager.java | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 1ca46428d708..d0bb1d0c4435 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -141,8 +141,9 @@ package android.app { field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2 field public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1; // 0x1 field public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 4; // 0x4 - field public static final int PROCESS_CAPABILITY_NETWORK = 8; // 0x8 + field @Deprecated public static final int PROCESS_CAPABILITY_NETWORK = 8; // 0x8 field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0 + field public static final int PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK = 8; // 0x8 field public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4; // 0x4 field public static final int PROCESS_STATE_TOP = 2; // 0x2 field public static final int STOP_USER_ON_SWITCH_DEFAULT = -1; // 0xffffffff diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 5d1d225f4d2d..b1f23282edbb 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -642,9 +642,17 @@ public class ActivityManager { @TestApi public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2; - /** @hide Process can access network despite any power saving resrictions */ + /** @hide Process can access network despite any power saving restrictions */ @TestApi - public static final int PROCESS_CAPABILITY_NETWORK = 1 << 3; + public static final int PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK = 1 << 3; + /** + * @hide + * @deprecated Use {@link #PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK} instead. + */ + @TestApi + @Deprecated + public static final int PROCESS_CAPABILITY_NETWORK = + PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; /** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/ @TestApi -- cgit v1.2.3