From a23afa25c51e5452f561af4bc05732837fdc0813 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 11 Sep 2022 16:20:56 -0700 Subject: [PATCH 1/9] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaeca6e9d0e33b825b8d12c9290e24d55eb42f268 --- res/values-am/strings.xml | 6 +++--- res/values-ar/strings.xml | 2 +- res/values-as/strings.xml | 4 ++-- res/values-be/strings.xml | 10 +++++----- res/values-fr/strings.xml | 3 ++- res/values-gl/strings.xml | 2 +- res/values-hi/strings.xml | 16 ++++++++-------- res/values-ja/strings.xml | 2 +- res/values-kk/strings.xml | 2 +- res/values-mk/strings.xml | 2 +- res/values-my/strings.xml | 4 ++-- res/values-or/strings.xml | 4 ++-- res/values-pl/strings.xml | 4 ++-- res/values-pt-rPT/strings.xml | 4 ++-- res/values-te/strings.xml | 2 +- 15 files changed, 34 insertions(+), 33 deletions(-) diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index e58cfcc5c8d..13f8b8affc4 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -33,7 +33,7 @@ "የገመድ አልባና አውታረ መረቦች" "ስርዓት" "በአገልግሎት ውስጥ" - "ከአገልግሎት ውጪ" + "ከአገልግሎት ውጭ" "የአደጋ ጊዜ ጥሪዎች ብቻ" "ሬዲዮ ጠፍቷል" "በመንቀሳቀስ ላይ" @@ -2130,7 +2130,7 @@ "በውጪ ማህደረ መረጃ ላይ የስርዓት ማዘመኛዎች መጫን አትችልም።" "የመሣሪያ አስተዳዳሪ መተግበሪያ በውጫዊ ማህደረመረጃ ላይ መጫን አይቻልም" "በኃይል አቁም?" - "መተግበሪያን በጉልበት እንዲቆም ካደረግከው ከአደብ ውጪ ሊሆን ይችላል::" + "መተግበሪያን በጉልበት እንዲቆም ካደረግከው ከአደብ ውጭ ሊሆን ይችላል::" "የሚመረጥ ጭነት ሥፍራ" "ለአዲስ መተግበሪያዎች ተመራጭ መጫኛ ሥፍራዎችን ለውጥ።" "መተግበሪያን አሰናክል" @@ -2324,7 +2324,7 @@ "በሙሉ እና በከፊል ማያ ገጽ መካከል ይቀያይሩ" "በሁለቱም አማራጮች መካከል ለማንቀሳቀስ የመቀየሪያ አዝራርን መታ ያድርጉ" "ወደ የተደራሽነት አዝራር ይቀየር?" - "የማያ ገጽዎን ክፍል ለማጉላት ሶስት ጊዜ መታ ማድረግን መጠቀም መተየብ እና ሌሎች መዘግየቶችን ያስከትላል።\n\nየተደራሽነት አዝራር በሌሎች መተግበሪያዎች ላይ በማያ ገጽዎ ላይ ይንሳፈፋል። ለማጉላት መታ ያድርጉት።" + "የማያ ገጽዎን ክፍል ለማጉላት ሦስት ጊዜ መታ ማድረግን መጠቀም መተየብ እና ሌሎች መዘግየቶችን ያስከትላል።\n\nየተደራሽነት አዝራር በሌሎች መተግበሪያዎች ላይ በማያ ገጽዎ ላይ ይንሳፈፋል። ለማጉላት መታ ያድርጉት።" "ወደ የተደራሽነት አዝራር ይቀይሩ" "ሦስቴ መታ ማድረግን ይጠቀሙ" "ይህ የቁልፍ ሰሌዳዎን ሊያንቀራፍፍ ይችላል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 6ff38a72957..486665cca7f 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -1769,7 +1769,7 @@ "لنقل الملفات والوسائط بين الأجهزة" "وحدة تخزين محمولة" "الإعداد لاحقًا" - "هل تريد تنسيق ^1؟" + "هل تريد تهيئة ^1؟" "يجب تنسيق ^1 لتخزين التطبيقات والملفات والوسائط. \n\nسيؤدي التنسيق إلى محو المحتوى الحالي على ^2. ولتجنّب فقد المحتوى، يمكنك نسخه احتياطيًا إلى ^3 أو جهاز آخر." "تنسيق ^1" "هل تريد نقل المحتوى إلى ^1؟" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index aad5ba1b22c..6a9bc8353cd 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -192,7 +192,7 @@ "হ\'ষ্টনাম (www.google.com) IPv6 পিং কৰক:" "HTTP ক্লায়েণ্ট পৰীক্ষা:" "পিং টেষ্ট চলাওক" - "USB কেৱ\'ল পুনঃসংযোগ কৰাৰ পিছত পৰিবৰ্তনসমূহ স্থায়ী হ\'ব।" + "USB কে’বল পুনঃসংযোগ কৰাৰ পাছত পৰিৱৰ্তনসমূহ স্থায়ী হ’ব।" "বিশাল ষ্ট’ৰেজ ইউএছবি সক্ষম কৰক" "সৰ্বমুঠ বাইট:" "ইউএছবি ষ্ট’ৰেজ সংলগ্ন কৰা হোৱা নাই।" @@ -1636,7 +1636,7 @@ "ষ্ট’ৰেজৰ নতুন নাম দিয়ক" "এই ^1ক সুৰক্ষিতভাৱে গুচোৱা হৈছিল, কিন্তু ই এতিয়াও উপলব্ধ। \n\nতাক ^1 ব্যৱহাৰ কৰিবলৈ, আপুনি প্ৰথমে তাক সংলগ্ন কৰিব লাগিব।" "^1 ব্যৱহাৰযোগ্য হৈ থকা নাই। \n\nইয়াক ^1 ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমে তাক ছেট আপ কৰিব লাগিব।" - "ফৰ্মেট কৰাৰ পাছত আপুনি ^1ক অইন ডিভাইচত ব্যৱহাৰ কৰিব পাৰিব। \n\n^1ত থকা আটাইখিনি ডেটা মচা হ’ব। গতিকে, প্ৰথমে বেকআপ লোৱাৰ কথা বিবেচনা কৰক। \n\n""ফট’ আৰু অইন মিডিয়াৰ বেকআপ লওক"" \nএই ডিভাইচত থকা অইন এটা ষ্ট’ৰেজলৈ বা এডাল ইউএছবি কেবলৰ যোগেৰে এটা কম্পিউটাৰলৈ আপোনাৰ মিডিয়া স্থানান্তৰ কৰক। \n\n""এপ্বোৰৰ বেকআপ লওক"" \nএই ^1ত ষ্ট’ৰ হৈ থকা আটাইবোৰ এপ্ আনইনষ্টল কৰা হ’ব আৰু সেইবিলাকৰ ডেটাসমূহ মচা হ’ব। এই এপ্বোৰ ৰাখিবলৈ এই ডিভাইত থকা বিকল্প ষ্ট’ৰেজলৈ স্থানান্তৰ কৰক।" + "ফৰ্মেট কৰাৰ পাছত আপুনি ^1ক অইন ডিভাইচত ব্যৱহাৰ কৰিব পাৰিব। \n\n^1ত থকা আটাইখিনি ডেটা মচা হ’ব। গতিকে, প্ৰথমে বেকআপ লোৱাৰ কথা বিবেচনা কৰক। \n\n""ফট’ আৰু অইন মিডিয়াৰ বেকআপ লওক"" \nএই ডিভাইচত থকা অইন এটা ষ্ট’ৰেজলৈ বা এডাল ইউএছবি কে’বলৰ যোগেৰে এটা কম্পিউটাৰলৈ আপোনাৰ মিডিয়া স্থানান্তৰ কৰক। \n\n""এপ্বোৰৰ বেকআপ লওক"" \nএই ^1ত ষ্ট’ৰ হৈ থকা আটাইবোৰ এপ্ আনইনষ্টল কৰা হ’ব আৰু সেইবিলাকৰ ডেটাসমূহ মচা হ’ব। এই এপ্বোৰ ৰাখিবলৈ এই ডিভাইত থকা বিকল্প ষ্ট’ৰেজলৈ স্থানান্তৰ কৰক।" "আপুনি যেতিয়া ^1ক বাহিৰলৈ উলিয়াএ, ইয়াৰ ভিতৰত থকা এপবোৰে কাম কৰা বন্ধ কৰিব আৰু ইয়াক আকৌ নভৰোৱালৈকে ইয়াত থকা মিডিয়া ফাইলবোৰ উপলব্ধ নহ’ব।"" \n\nএই ^1ক এইটো ডিভাইচত মাত্ৰ কাম কৰিব পৰাকৈ আৰ্হিত লগোৱা হৈছে। ই আৰু কোনো ডিভাইচতে কাম নকৰিব।" "^1ত থকা এপ্‌সমূহ, ফট’ বা ডেটা ব্যৱহাৰ কৰিবলৈ ইয়াক পুনৰ ডিভাইচত ভৰাওক। \n\nইয়াৰ উপৰিও, যদি ডিভাইচটো উপলব্ধ নহয়, তেতিয়া আপুনি এই ষ্ট’ৰেজ ইচ্ছা কৰিলে পাহৰি যাব পাৰিব। \n\nযদি আপুনি পাহৰি যাবলৈ বিচাৰে, তেতিয়া ডিভাইচত থকা আটাইখিনি ডেটা হেৰুৱাব। \n\nআপুনি এপ্‌সমূহ পাছত আকৌ ইনষ্টল কৰিব পাৰে, কিন্তু এই ডিভাইচত জমা হৈ থকা সেই এপ্‌সমূহৰ কোনো ডেটা পুনৰ ঘূৰাই নাপাব।" "^1ক পাহৰিব বিচাৰেনে?" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index bf23aae358a..5693b9d094a 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -223,7 +223,7 @@ "Мова праграмы" "Прапанаваныя мовы" "Усе мовы" - "Сістэмная мова" + "Мова сістэмы" "Стандартная сістэмная налада" "Выбар мовы для гэтай праграмы недаступны ў Наладах." "Мова можа адрознівацца ад моў, даступных у праграме. Некаторыя праграмы могуць не падтрымліваць гэту наладу." @@ -5415,7 +5415,7 @@ "Нічога не рабіць" "Вібрацыя" "Выключыць гук" - "Каб уключыць, спачатку змяніце ў меню кнопкі сілкавання параметр \"Націск і ўтрыманне кнопкі сілкавання\"." + "Каб уключыць, спачатку змяніце ў меню кнопкі сілкавання параметр \"Доўгае націсканне кнопкі сілкавання\"." "Інфармацыя аб сетцы" "Назва вашай прылады даступная для праграм на вашым тэлефоне. Яе таксама будуць бачыць іншыя людзі, калі вы падключыцеся да прылад праз Bluetooth, падключыцеся да сеткі Wi-Fi ці наладзіце хот-спот Wi-Fi." "Прылады" @@ -5708,7 +5708,7 @@ "элементы кіравання прыладай" "Карткі і талоны" "карткі і талоны" - "Націск і ўтрыманне кнопкі сілкавання" + "Доўгае націсканне кнопкі сілкавання" "Націск і ўтрыманне для выкліку Памочніка" "Націск і ўтрыманне для выкліку меню кнопкі сілкавання" "Націск і ўтрыманне выключаны" @@ -5717,8 +5717,8 @@ "Для выкліку Памочніка ўтрымлівайце націснутай кнопку сілкавання" "Меню кнопкі сілкавання і экстранных выклікаў:\nадначасова націсніце кнопку сілкавання і павелічэння гучнасці." "Прадухіліць званок:\nярлык даступны ў меню гучнасці." - "Працягласць націску і ўтрымання" - "Наладзіць адчувальнасць, выбраўшы працягласць націску і ўтрымання кнопкі сілкавання" + "Працягласць націскання" + "Наладзіць адчувальнасць, выбраўшы працягласць націскання кнопкі сілкавання" "Коратка" "Доўга" "Паказ кашалька" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index c0f682d6f4c..717b1ee8095 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1315,7 +1315,8 @@ "En savoir plus sur la rotation automatique" "Quand vous basculez votre téléphone en mode portrait ou paysage" "Résolution d\'écran" - "Haute résolution" + + "Résolution maximale" "FHD+ 1080p" "QHD+ 1440p" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 183215d86f7..3ef9c3e7b4c 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -448,7 +448,7 @@ "Configurar a impresión dixital só leva un ou dous minutos, pero tamén podes facelo máis tarde en Configuración." "Cando vexas esta icona (ao iniciar sesión en apps, aprobar compras…), usa a túa impresión dixital para autenticarte" "Importante" - "Desbloquear o teléfono mediante impresión dixital pode ser menos seguro que facelo usando un padrón seguro ou un PIN" + "O desbloqueo do teléfono mediante impresión dixital pode ser menos fiable que o uso dun padrón ou PIN seguro" "Como funciona?" "Co desbloqueo dactilar, créase un modelo único da túa impresión dixital para verificar a túa identidade. Se queres crear este modelo durante a configuración, debes xerar imaxes da impresión dixital desde distintas posicións." "Co desbloqueo dactilar, créase un modelo único da impresión dixital do teu fillo ou filla para verificar a súa identidade. Para crear este modelo durante a configuración, a túa filla ou fillo deberá facer fotos da impresión dixital en distintas posicións." diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 573bb63f746..71827633cbf 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -2690,10 +2690,10 @@ "ऐप की बैकग्राउंड गतिविधि को सीमित करें?" "अगर आप ऐप की बैकग्राउंड गतिविधि को सीमित करते हैं, तो हो सकता है यह ठीक ढंग से काम न करे" "ऐप्लिकेशन पर रोक नहीं लगेगी क्योंकि यह बैटरी ऑप्टिमाइज़ नहीं कर सकता.\n\nबैटरी ऑप्टिमाइज़ेशन चालू करके ही ऐसा हो सकता है." - "पाबंदी के बिना" + "कोई पाबंदी नहीं" "ऑप्टिमाइज़ की गई सेटिंग" "पाबंदी लगी है" - "बैकग्राउंड में पाबंदियों के बिना बैटरी खर्च की अनुमति दें. बैटरी का ज़्यादा इस्तेमाल किया जा सकता है." + "बैकग्राउंड में, पाबंदियों के बिना बैटरी खर्च की अनुमति दें. इससे बैटरी ज़्यादा खर्च हो सकती है." "बैटरी की सेटिंग को अपने इस्तेमाल के हिसाब से ऑप्टिमाइज़ करें. ज़्यादातर ऐप्लिकेशन के लिए इसका इस्तेमाल करने का सुझाव दिया जाता है." "बैकग्राउंड में बैटरी खर्च को सीमित करें. हो सकता है कि ऐप्लिकेशन ठीक से काम न करे. सूचनाएं मिलने में देरी हो सकती है." "किसी ऐप्लिकेशन के लिए बैटरी इस्तेमाल करने का तरीका बदलने पर, ऐप की परफ़ॉर्मेंस पर असर पड़ सकता है." @@ -2836,7 +2836,7 @@ "मोबाइल नेटवर्क" "ध्‍वनि कॉल" "टैबलेट इस्तेमाल नहीं किया जा रहा" - "फ़ोन इस्तेमाल नहीं किया जा रहा" + "जब फ़ोन इस्तेमाल नहीं किया गया" "मिली-जुली सेटिंग" "अत्यधिक" "सीपीयू (CPU) का कुल इस्तेमाल" @@ -2897,7 +2897,7 @@ "पूरी तरह चार्ज होने के बाद से अब तक का विश्लेषण" "पिछली बार पूरी तरह चार्ज किया गया" "बैटरी पूरी चार्ज होने पर करीब इतनी देर चलती है" - "बैटरी खर्च से जुड़ा डेटा अनुमानित होता है. यह इस्तेमाल करने के तरीके के मुताबिक बदल सकता है." + "बैटरी खर्च से जुड़ा डेटा अनुमानित होता है. यह इस्तेमाल के आधार पर बदल सकता है." "जब इस्तेमाल में हो" "बैकग्राउंड में होने पर" "बैटरी खर्च" @@ -2960,8 +2960,8 @@ "बैटरी का प्रतिशत" "स्टेटस बार में दिखाएं कि कितने प्रतिशत बैटरी बची है" "पिछले 24 घंटों में बैटरी लेवल की जानकारी" - "पिछले 24 घंटों में, ऐप्लिकेशन में बैटरी के इस्तेमाल की जानकारी" - "पिछले 24 घंटों में सिस्टम के इस्तेमाल की जानकारी" + "पिछले 24 घंटों में, ऐप्लिकेशन ने कितनी बैटरी इस्तेमाल की" + "पिछले 24 घंटों में, सिस्टम ने कितनी बैटरी इस्तेमाल की" "%s के बीच सिस्टम के इस्तेमाल की जानकारी" "%s के बीच ऐप्लिकेशन के इस्तेमाल की जानकारी" "इस्तेमाल का कुल समय: एक मिनट से कम" @@ -4612,7 +4612,7 @@ "%2$d में से %1$d ऐप को दूसरे ऐप के ऊपर दिखाने की अनुमति है" "अनुमति वाले ऐप्‍स" "अनुमति है" - "अनुमति नहीं है" + "इन ऐप्लिकेशन के पास अनुमति नहींं है" "अनजान स्रोतों से आने वाले ऐप्लिकेशन इंस्टॉल करें" "सिस्‍टम सेटिंग बदलें" "सिस्‍टम सेटिंग में बदलाव करें लिखें" @@ -5537,7 +5537,7 @@ "पावर मेन्यू खोलने के लिए, पावर बटन को दबाकर रखें" "Assistant को शुरू करने के लिए, पावर बटन को दबाकर रखने की सुविधा बंद है" "इस्तेमाल करने के लिए, सबसे पहले स्क्रीन लॉक सेट करें" - "Assistant को चालू करने के लिए, पावर बटन को कुछ देर दबाकर रखें" + "Assistant की सुविधा चालू करने के लिए, पावर बटन दबाकर रखें" "पावर बटन को कुछ देर तक दबाकर, Assistant का इस्तेमाल करें" "पावर और आपातकालीन मेन्यू:\nपावर बटन और आवाज़ तेज़ करने वाले बटन को एक साथ दबाएं." "घंटी बजने से रोकना:\nइसका शॉर्टकट, वॉल्यूम मेन्यू में मौजूद है." diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 8119971659f..7def075ae7d 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -5542,7 +5542,7 @@ "電源ボタンと緊急通報のメニュー:\n電源ボタンと音量大ボタンを同時に押してください。" "着信音のミュート:\n音量メニューでショートカットを利用できます。" "長押しの長さ" - "長さを選択して感度を調整し、電源ボタンを長押しします。" + "電源ボタンを長押しする長さを選んで、感度を調節します" "短い" "長い" "ウォレットを表示" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 204839f6645..45ef83798c9 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -3178,7 +3178,7 @@ "%1$s, барлығы %2$s" "Барлығын таңдау" "Дерек шығыны" - "Мобильдік дерек пен Wi‑Fi" + "Мобильдік интернет пен Wi‑Fi" "Оператордың деректер есебі құрылғыңыздан басқаша болуы мүмкін." "Қолданбаны пайдалану" "ҚОЛДАНБА ТУРАЛЫ АҚПАРАТ" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index d57963bdc32..4b4249d3ba1 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -221,7 +221,7 @@ "Јазик на апликациjата" "Предложени јазици" "Сите јазици" - "Јазик на системот" + "Системски јазик" "Стандардно за системот" "Не може да се бира јазик за апликацијава од „Поставките“." "Јазикот може да се разликува од јазиците достапни во апликацијата. Некои апликации може да не ја поддржуваат оваа поставка." diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 893d2c4bf6f..df6bd9b5e61 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -2064,7 +2064,7 @@ "အသုံးပြုသူ၏ ဒေတာ" "USBသိုလှောင်မှု ဒေတာ" "SD ကတ်" - "ဖယ်ရှားရန်" + "ဖြုတ်ရန်" "သုံးစွဲသူအားလုံးအတွက် ဖြုတ်ရန်" "ထည့်သွင်းရန်" "ပိတ်ထားရန်" @@ -3337,7 +3337,7 @@ "အသုံးပြုသူ" "ပိတ်ထားရန်" "ရနိုင်သည်" - "ဖယ်ရှားရန်" + "ဖြုတ်ရန်" "ယုံကြည်ပါ" "စနစ်၏CA လက်မှတ်အား ဖွင့်ထားမလား?" "စနစ်၏CA လက်မှတ်အား ပိတ်ထားမည်" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index e8b0be1fc7d..74478d41980 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -2064,7 +2064,7 @@ "ଉପଯୋଗକର୍ତ୍ତା ଡାଟା" "USB ଷ୍ଟୋରେଜ୍‌ ଡାଟା" "SD କାର୍ଡ" - "ଅନଇନଷ୍ଟଲ" + "ଅନଇନଷ୍ଟଲ କରନ୍ତୁ" "ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଅଣସଂସ୍ଥାପନ କରନ୍ତୁ" "ଇନ୍‌ଷ୍ଟଲ୍‌ କରନ୍ତୁ" "ଅକ୍ଷମ କରନ୍ତୁ" @@ -3335,7 +3335,7 @@ "ଗୋଟିଏ ସର୍ଟିଫିକେଟ୍‌ ନାହିଁ। ପ୍ରୋଫାଇଲ୍‌ ଏଡିଟ୍‌ କରନ୍ତୁ।" "ସିଷ୍ଟମ୍‌" "ଉପଯୋଗକର୍ତ୍ତା" - "ଅକ୍ଷମ" + "ଅକ୍ଷମ କରନ୍ତୁ" "ସକ୍ଷମ" "ଅନଇନଷ୍ଟଲ କରନ୍ତୁ" "ବିଶ୍ୱାସ କରନ୍ତୁ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 1d8085cb570..a47bc9037a2 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -5715,8 +5715,8 @@ "Przytrzymaj przycisk zasilania, aby uaktywnić Asystenta" "Menu zasilania i alarmowe:\nNaciśnij jednocześnie przyciski zasilania i zwiększania głośności." "Zapobiegaj włączeniu się dzwonka:\nSkrót dostępny w menu głośności." - "Czas naciskania i przytrzymywania przycisku głośności" - "Dostosuj czułość, określając, jak długo ma być naciskany i przytrzymywany przycisk głośności" + "Długość naciśnięcia i przytrzymania" + "Dostosuj czułość, określając, jak długo ma być naciskany i przytrzymywany przycisk zasilania" "Krótko" "Długo" "Pokazuj portfel" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index bba40061d94..d88f1866a2a 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -677,7 +677,7 @@ "Desativada pelo gestor, política de encriptação ou armazenamento de credenciais" "Nenhum" "Deslizar rapidamente" - "Sequência" + "Padrão" "PIN" "Palavra-passe" "Assim que configurar um bloqueio de ecrã, também pode configurar a sua impressão digital em Definições > Segurança." @@ -1685,7 +1685,7 @@ "Para transferir ficheiros e multimédia entre dispositivos" "Armazenamento portátil" "Config. depois" - "Pretende formatar este ^1?" + "Quer formatar este ^1?" "Este ^1 tem de ser formatado para armazenar aplicações, ficheiros e conteúdos multimédia. \n\nA formatação apaga o conteúdo existente no ^2. Para evitar a perda de conteúdos, faça uma cópia de segurança para outro ^3 ou dispositivo." "Formatar ^1" "Mover o conteúdo para o ^1?" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 316d2c9509f..666467dc0f4 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -244,7 +244,7 @@ "USB నిల్వ" "SD కార్డు" "ప్రాక్సీ సెట్టింగ్‌లు" - "రద్దు చేయండి" + "రద్దు" "సరే" "విస్మరించు" "సేవ్ చేయండి" From 6924029ddc108ac4df07e512a93e3c985494c059 Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Mon, 27 Jun 2022 07:58:58 +0000 Subject: [PATCH 2/9] Update source metric category of HearingAidDialogFragment and HearingAidPairingDialogFragment Use different source metric categories to distinguish different launch sources of the BluetoothPairingDetail page. Bug: 237344016 Test: manual Change-Id: If762e87414055f3e497f99ea6885f7736b7193cd Merged-In: If762e87414055f3e497f99ea6885f7736b7193cd --- .../settings/accessibility/HearingAidDialogFragment.java | 2 +- .../settings/bluetooth/HearingAidPairingDialogFragment.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/accessibility/HearingAidDialogFragment.java b/src/com/android/settings/accessibility/HearingAidDialogFragment.java index 107c56d8a8b..7f3230fe348 100644 --- a/src/com/android/settings/accessibility/HearingAidDialogFragment.java +++ b/src/com/android/settings/accessibility/HearingAidDialogFragment.java @@ -51,7 +51,7 @@ public class HearingAidDialogFragment extends InstrumentedDialogFragment { private void launchBluetoothAddDeviceSetting() { new SubSettingLauncher(getActivity()) .setDestination(BluetoothPairingDetail.class.getName()) - .setSourceMetricsCategory(SettingsEnums.ACCESSIBILITY) + .setSourceMetricsCategory(getMetricsCategory()) .launch(); } } diff --git a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java index ac48217732a..60a100d538a 100644 --- a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java @@ -54,8 +54,7 @@ public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment @Override public int getMetricsCategory() { - // TODO(b/225117454): Need to update SettingsEnums later - return SettingsEnums.ACCESSIBILITY; + return SettingsEnums.DIALOG_ACCESSIBILITY_HEARING_AID_PAIR_ANOTHER; } @NonNull @@ -82,7 +81,7 @@ public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment private void positiveButtonListener() { new SubSettingLauncher(getActivity()) .setDestination(BluetoothPairingDetail.class.getName()) - .setSourceMetricsCategory(SettingsEnums.ACCESSIBILITY) + .setSourceMetricsCategory(getMetricsCategory()) .launch(); } } From 99d3b54a705414bcc02e355d23e7997b80603020 Mon Sep 17 00:00:00 2001 From: Tiffany Nguyen Date: Wed, 14 Sep 2022 10:00:33 +0000 Subject: [PATCH 3/9] Update App battery usage page and add tests. - Add tests - Remove duplicated "Set battery usage for apps" text - Clean up some code Screenshot: https://screenshot.googleplex.com/8LHhyxFA6X4ZFkT.png Test: make RunSettingsRoboTests -j40 Bug: 244995036 Change-Id: Iaac9b0af10f541100e91b10affacf3307bd5edca --- .../AppStateAppBatteryUsageBridge.java | 25 ++++-- .../ManageApplications.java | 7 +- .../AppStateAppBatteryUsageBridgeTest.java | 78 +++++++++++++++++++ 3 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java diff --git a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java index 3674212681e..c0f96c8c49a 100644 --- a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java +++ b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java @@ -22,6 +22,7 @@ import android.content.Context; import android.os.Build; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppFilter; @@ -37,14 +38,21 @@ public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge { private static final String TAG = AppStateAppBatteryUsageBridge.class.getSimpleName(); static final boolean DEBUG = Build.IS_DEBUGGABLE; - private final Context mContext; - private final AppOpsManager mAppOpsManager; - private final PowerAllowlistBackend mPowerAllowlistBackend; + @VisibleForTesting + Context mContext; + @VisibleForTesting + AppOpsManager mAppOpsManager; + @VisibleForTesting + PowerAllowlistBackend mPowerAllowlistBackend; - private static final int MODE_UNKNOWN = 0; - private static final int MODE_UNRESTRICTED = 1; - private static final int MODE_OPTIMIZED = 2; - private static final int MODE_RESTRICTED = 3; + @VisibleForTesting + static final int MODE_UNKNOWN = 0; + @VisibleForTesting + static final int MODE_UNRESTRICTED = 1; + @VisibleForTesting + static final int MODE_OPTIMIZED = 2; + @VisibleForTesting + static final int MODE_RESTRICTED = 3; @IntDef( prefix = {"MODE_"}, @@ -110,8 +118,9 @@ public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge { return new AppBatteryUsageDetails(mode); } + @VisibleForTesting @OptimizationMode - private static int getAppBatteryUsageDetailsMode(AppEntry entry) { + static int getAppBatteryUsageDetailsMode(AppEntry entry) { if (entry == null || entry.extraInfo == null) { return MODE_UNKNOWN; } diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 018fda51e12..9a4d13c896f 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -1196,9 +1196,12 @@ public class ManageApplications extends InstrumentedFragment rebuild(R.id.sort_order_alpha, true); } return; - } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) { + } + + if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) { logAppBatteryUsage(filterType); } + rebuild(); } @@ -1673,7 +1676,7 @@ public class ManageApplications extends InstrumentedFragment holder.setSummary(AppLocaleDetails.getSummary(mContext, entry)); break; case LIST_TYPE_BATTERY_OPTIMIZATION: - holder.setSummary(R.string.app_battery_usage_summary); + holder.setSummary(null); break; default: holder.updateSizeText(entry, mManageApplications.mInvalidSizeStr, mWhichSize); diff --git a/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java b/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java new file mode 100644 index 00000000000..c49b4cd8d2f --- /dev/null +++ b/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java @@ -0,0 +1,78 @@ +package com.android.settings.applications; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.when; + +import android.app.AppOpsManager; +import android.content.Context; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settingslib.applications.ApplicationsState.AppEntry; +import com.android.settingslib.fuelgauge.PowerAllowlistBackend; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +public final class AppStateAppBatteryUsageBridgeTest { + private static final String TEST_PACKAGE_1 = "com.example.test.pkg1"; + private static final String TEST_PACKAGE_2 = "com.example.test.pkg2"; + private static final int UID_1 = 12345; + private static final int UID_2 = 7654321; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + @Mock + private AppOpsManager mAppOpsManager; + @Mock + private PowerAllowlistBackend mPowerAllowlistBackend; + + @Before + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void updateExtraInfo_updatesRestricted() { + when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(false); + when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, + UID_1, TEST_PACKAGE_1)).thenReturn(AppOpsManager.MODE_IGNORED); + AppStateAppBatteryUsageBridge bridge = + new AppStateAppBatteryUsageBridge(mContext, null, null); + bridge.mAppOpsManager = mAppOpsManager; + bridge.mPowerAllowlistBackend = mPowerAllowlistBackend; + AppEntry entry = new AppEntry(mContext, null, 0); + + bridge.updateExtraInfo(entry, TEST_PACKAGE_1, UID_1); + + assertThat(entry.extraInfo.getClass()) + .isEqualTo(AppStateAppBatteryUsageBridge.AppBatteryUsageDetails.class); + assertThat(AppStateAppBatteryUsageBridge.getAppBatteryUsageDetailsMode(entry)) + .isEqualTo(AppStateAppBatteryUsageBridge.MODE_RESTRICTED); + } + + @Test + public void updateExtraInfo_updatesUnrestricted() { + when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(true); + when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, + UID_2, TEST_PACKAGE_2)).thenReturn(AppOpsManager.MODE_ALLOWED); + AppStateAppBatteryUsageBridge bridge = + new AppStateAppBatteryUsageBridge(mContext, null, null); + bridge.mAppOpsManager = mAppOpsManager; + bridge.mPowerAllowlistBackend = mPowerAllowlistBackend; + AppEntry entry = new AppEntry(mContext, null, 0); + + bridge.updateExtraInfo(entry, TEST_PACKAGE_2, UID_2); + + assertThat(entry.extraInfo.getClass()) + .isEqualTo(AppStateAppBatteryUsageBridge.AppBatteryUsageDetails.class); + assertThat(AppStateAppBatteryUsageBridge.getAppBatteryUsageDetailsMode(entry)) + .isEqualTo(AppStateAppBatteryUsageBridge.MODE_UNRESTRICTED); + } +} From 6cfc593cdaaaa1c06e702f4e372cb7a6125b0e4d Mon Sep 17 00:00:00 2001 From: Viesturs Zarins Date: Thu, 15 Sep 2022 16:17:47 +0000 Subject: [PATCH 4/9] Move android.settings.NFC_SETTINGS intent handler to open the Nfc settings fragment, not the generic connected devices fragment. Change-Id: I03016b36c9beff1bb271710f70e006531290952e Bug: b/246772836 --- AndroidManifest.xml | 20 ++++++++++++++----- src/com/android/settings/Settings.java | 1 + .../core/gateway/SettingsGateway.java | 4 +++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index bbb8eea9700..6c0dbff5b06 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -4179,11 +4179,6 @@ - - - - - @@ -4196,6 +4191,21 @@ android:value="true" /> + + + + + + + + + + Date: Thu, 8 Sep 2022 22:43:16 +0000 Subject: [PATCH 5/9] Fixes Talkback autoscroll for SFPS enrollment ScrollView Adds importantForAccessibility attribute to ScrollView in setup wizard layout. This enables Talkback to autoscroll when focusing on items at the edge of a container. Test: (manual) Turn on talkback, navigate to SFPS enrollment edu screen. Swipe through ScrollView elements and observe autoscroll when focus is on elements at the edge of the View. Fixes: 244595576 Change-Id: Iccc6125ac8f0993a7d8908f6c54e7307905b7cd7 --- .../biometrics/fingerprint/FingerprintEnrollIntroduction.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index 838c472fb15..2274a26cf44 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -31,6 +31,7 @@ import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.View; import android.widget.ImageView; +import android.widget.ScrollView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -123,6 +124,9 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { final TextView footerTitle2 = findViewById(R.id.footer_title_2); footerTitle1.setText(getFooterTitle1()); footerTitle2.setText(getFooterTitle2()); + + final ScrollView scrollView = findViewById(R.id.sud_scroll_view); + scrollView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); } @Override From db20bf69f600ca7ddeae10bd8f00a99aed8026ad Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Fri, 16 Sep 2022 15:02:01 +0800 Subject: [PATCH 6/9] Set switchRestrictionKeys for InstallUnknownApps To support the "Disabled by admin" feature. Bug: 235727273 Test: Manual with Settings App Change-Id: Ic76e17fd03ef13ba0249d202d132f72824fa60d3 --- .../settings/spa/app/specialaccess/InstallUnknownApps.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt index 77c0f685bd2..556ea579a83 100644 --- a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt +++ b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt @@ -22,6 +22,7 @@ import android.app.AppOpsManager.MODE_DEFAULT import android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES import android.content.Context import android.content.pm.ApplicationInfo +import android.os.UserManager import androidx.compose.runtime.Composable import androidx.compose.runtime.livedata.observeAsState import com.android.settings.R @@ -49,6 +50,10 @@ class InstallUnknownAppsListModel(private val context: Context) : override val pageTitleResId = R.string.install_other_apps override val switchTitleResId = R.string.external_source_switch_title override val footerResId = R.string.install_all_warning + override val switchRestrictionKeys = listOf( + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, + ) override fun transformItem(app: ApplicationInfo) = InstallUnknownAppsRecord( app = app, From 93f696bc99b2bf1094a1b2e446b2be5ab1c32bf2 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Thu, 15 Sep 2022 17:30:24 +0800 Subject: [PATCH 7/9] Fix display wrong information "pair left/right ear" on device detail page when disconnect one of HA Root Cause: Did not update device information in device detail page Solution: Listen to device attributes change and update information in call function refresh() Bug: 246877392 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDetailsPairOtherControllerTest Change-Id: I442445a861898258a73f37ad8f85bcee387fbf58 --- .../BluetoothDetailsPairOtherController.java | 18 ++++++++++++------ ...luetoothDetailsPairOtherControllerTest.java | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java index d14a9b1144a..d1d8b12eea0 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java @@ -56,19 +56,25 @@ public class BluetoothDetailsPairOtherController extends BluetoothDetailsControl @Override protected void init(PreferenceScreen screen) { - final int side = mCachedDevice.getDeviceSide(); - final int stringRes = (side == HearingAidProfile.DeviceSide.SIDE_LEFT) - ? R.string.bluetooth_pair_right_ear_button - : R.string.bluetooth_pair_left_ear_button; - mPreference = screen.findPreference(getPreferenceKey()); - mPreference.setTitle(stringRes); + updateButtonPreferenceTitle(mPreference); mPreference.setOnClickListener(v -> launchPairingDetail()); } @Override protected void refresh() { + updateButtonPreferenceTitle(mPreference); mPreference.setVisible(getButtonPreferenceVisibility(mCachedDevice)); + + } + + private void updateButtonPreferenceTitle(ButtonPreference preference) { + final int side = mCachedDevice.getDeviceSide(); + final int stringRes = (side == HearingAidProfile.DeviceSide.SIDE_LEFT) + ? R.string.bluetooth_pair_right_ear_button + : R.string.bluetooth_pair_left_ear_button; + + preference.setTitle(stringRes); } private boolean getButtonPreferenceVisibility(CachedBluetoothDevice cachedDevice) { diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java index cfa6d41e0d7..d01e3ac4d58 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java @@ -56,7 +56,7 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon } @Test - public void init_leftSideDevice_expectedTitle() { + public void init_leftSideDevice_rightSideButtonTitle() { when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidProfile.DeviceSide.SIDE_LEFT); mController.init(mScreen); @@ -66,7 +66,7 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon } @Test - public void init_rightSideDevice_expectedTitle() { + public void init_rightSideDevice_leftSideButtonTitle() { when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidProfile.DeviceSide.SIDE_RIGHT); mController.init(mScreen); @@ -118,4 +118,15 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon assertThat(mController.isAvailable()).isTrue(); } + + @Test + public void refresh_leftSideDevice_leftSideButtonTitle() { + when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidProfile.DeviceSide.SIDE_RIGHT); + mController.init(mScreen); + + mController.refresh(); + + assertThat(mPreference.getTitle().toString()).isEqualTo( + mContext.getString(R.string.bluetooth_pair_left_ear_button)); + } } From bdfd8531a96a74cf03f49916e3ab48793e32f0c6 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Tue, 13 Sep 2022 12:56:53 +0000 Subject: [PATCH 8/9] Add Spatial audio settings for LE Audio devices - Adds TYPE_BLE_HEADSE, TYPE_BLE_SPEAKER and TYPE_BLE_BROADCAST for display Le audio devices. - Adds TYPE_HEARING_AID for display hearing aid devices. Bug: 244528781 Test: make -j64 RunSettingsRoboTests Change-Id: I1278a5e0c93fdc5a4873df68032128ffedfe72d6 Merged-In: I1278a5e0c93fdc5a4873df68032128ffedfe72d6 (cherry picked from commit f8704add5108872fc68307eb6349008f98b228c6) --- ...luetoothDetailsSpatialAudioController.java | 57 +++++++++++-- ...oothDetailsSpatialAudioControllerTest.java | 84 ++++++++++++++++++- 2 files changed, 132 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioController.java b/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioController.java index 89d923d616a..29066b8822d 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioController.java @@ -53,6 +53,8 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont @VisibleForTesting AudioDeviceAttributes mAudioDevice; + private boolean mIsAvailable; + public BluetoothDetailsSpatialAudioController( Context context, PreferenceFragmentCompat fragment, @@ -61,16 +63,13 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont super(context, fragment, device, lifecycle); AudioManager audioManager = context.getSystemService(AudioManager.class); mSpatializer = audioManager.getSpatializer(); - mAudioDevice = new AudioDeviceAttributes( - AudioDeviceAttributes.ROLE_OUTPUT, - AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, - mCachedDevice.getAddress()); + getAvailableDevice(); } @Override public boolean isAvailable() { - return mSpatializer.isAvailableForDevice(mAudioDevice) ? true : false; + return mIsAvailable; } @Override @@ -152,4 +151,52 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont pref.setOnPreferenceClickListener(this); return pref; } + + private void getAvailableDevice() { + AudioDeviceAttributes a2dpDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, + mCachedDevice.getAddress()); + AudioDeviceAttributes bleHeadsetDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_HEADSET, + mCachedDevice.getAddress()); + AudioDeviceAttributes bleSpeakerDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_SPEAKER, + mCachedDevice.getAddress()); + AudioDeviceAttributes bleBroadcastDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_BROADCAST, + mCachedDevice.getAddress()); + AudioDeviceAttributes hearingAidDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_HEARING_AID, + mCachedDevice.getAddress()); + + mIsAvailable = true; + if (mSpatializer.isAvailableForDevice(bleHeadsetDevice)) { + mAudioDevice = bleHeadsetDevice; + } else if (mSpatializer.isAvailableForDevice(bleSpeakerDevice)) { + mAudioDevice = bleSpeakerDevice; + } else if (mSpatializer.isAvailableForDevice(bleBroadcastDevice)) { + mAudioDevice = bleBroadcastDevice; + } else if (mSpatializer.isAvailableForDevice(a2dpDevice)) { + mAudioDevice = a2dpDevice; + } else { + mIsAvailable = mSpatializer.isAvailableForDevice(hearingAidDevice); + mAudioDevice = hearingAidDevice; + } + + Log.d(TAG, "getAvailableDevice() device : " + + mCachedDevice.getDevice().getAnonymizedAddress() + + ", type : " + mAudioDevice.getType() + + ", is available : " + mIsAvailable); + } + + @VisibleForTesting + void setAvailableDevice(AudioDeviceAttributes audioDevice) { + mAudioDevice = audioDevice; + mIsAvailable = mSpatializer.isAvailableForDevice(audioDevice); + } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioControllerTest.java index ef812473565..1f0adcfca80 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsSpatialAudioControllerTest.java @@ -22,7 +22,9 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothDevice; import android.media.AudioDeviceAttributes; +import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.Spatializer; @@ -57,6 +59,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails private Lifecycle mSpatialAudioLifecycle; @Mock private PreferenceCategory mProfilesContainer; + @Mock + private BluetoothDevice mBluetoothDevice; private BluetoothDetailsSpatialAudioController mController; private SwitchPreference mSpatialAudioPref; @@ -70,6 +74,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager); when(mAudioManager.getSpatializer()).thenReturn(mSpatializer); when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS); + when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice); + when(mBluetoothDevice.getAnonymizedAddress()).thenReturn(MAC_ADDRESS); mController = new BluetoothDetailsSpatialAudioController(mContext, mFragment, mCachedDevice, mSpatialAudioLifecycle); @@ -83,15 +89,85 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails } @Test - public void isAvailable_spatialAudioIsAvailable_returnsTrue() { - when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(true); + public void isAvailable_spatialAudioSupportA2dpDevice_returnsTrue() { + AudioDeviceAttributes a2dpDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, + MAC_ADDRESS); + when(mSpatializer.isAvailableForDevice(a2dpDevice)).thenReturn(true); + + mController.setAvailableDevice(a2dpDevice); + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP); } @Test - public void isAvailable_spatialAudioIsNotAvailable_returnsFalse() { - when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(false); + public void isAvailable_spatialAudioSupportBleHeadsetDevice_returnsTrue() { + AudioDeviceAttributes bleHeadsetDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_HEADSET, + MAC_ADDRESS); + when(mSpatializer.isAvailableForDevice(bleHeadsetDevice)).thenReturn(true); + + mController.setAvailableDevice(bleHeadsetDevice); + + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_BLE_HEADSET); + } + + @Test + public void isAvailable_spatialAudioSupportBleSpeakerDevice_returnsTrue() { + AudioDeviceAttributes bleSpeakerDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_SPEAKER, + MAC_ADDRESS); + when(mSpatializer.isAvailableForDevice(bleSpeakerDevice)).thenReturn(true); + + mController.setAvailableDevice(bleSpeakerDevice); + + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_BLE_SPEAKER); + } + + @Test + public void isAvailable_spatialAudioSupportBleBroadcastDevice_returnsTrue() { + AudioDeviceAttributes bleBroadcastDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_BLE_BROADCAST, + MAC_ADDRESS); + when(mSpatializer.isAvailableForDevice(bleBroadcastDevice)).thenReturn(true); + + mController.setAvailableDevice(bleBroadcastDevice); + + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_BLE_BROADCAST); + } + + @Test + public void isAvailable_spatialAudioSupportHearingAidDevice_returnsTrue() { + AudioDeviceAttributes hearingAidDevice = new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_OUTPUT, + AudioDeviceInfo.TYPE_HEARING_AID, + MAC_ADDRESS); + when(mSpatializer.isAvailableForDevice(hearingAidDevice)).thenReturn(true); + + mController.setAvailableDevice(hearingAidDevice); + + assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_HEARING_AID); + } + + @Test + public void isAvailable_spatialAudioNotSupported_returnsFalse() { assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.mAudioDevice.getType()) + .isEqualTo(AudioDeviceInfo.TYPE_HEARING_AID); } @Test From 00b3a5cdb625c2e981f87f660eb11fd7d2bf303a Mon Sep 17 00:00:00 2001 From: Victor Truong Date: Mon, 29 Aug 2022 13:49:32 -0400 Subject: [PATCH 9/9] Add NoDreamViewHolder for a different layout for NoDreamItem. Bug: 243389115 Test: Manually tested Change-Id: Id7549d55721c474cf8baddc0b336fe3600ccb5e3 --- .../android/settings/dream/DreamAdapter.java | 55 ++++++++++++------- .../settings/dream/DreamItemViewTypes.java | 43 +++++++++++++++ .../android/settings/dream/IDreamItem.java | 7 +++ 3 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 src/com/android/settings/dream/DreamItemViewTypes.java diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java index cfee12e0f42..b81d6b6d679 100644 --- a/src/com/android/settings/dream/DreamAdapter.java +++ b/src/com/android/settings/dream/DreamAdapter.java @@ -21,6 +21,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.VectorDrawable; import android.text.TextUtils; +import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -41,10 +42,9 @@ import java.util.List; */ public class DreamAdapter extends RecyclerView.Adapter { private final List mItemList; - @LayoutRes - private final int mLayoutRes; private int mLastSelectedPos = -1; private boolean mEnabled = true; + private SparseIntArray mLayouts = new SparseIntArray(); /** * View holder for each {@link IDreamItem}. @@ -83,16 +83,6 @@ public class DreamAdapter extends RecyclerView.Adapter mSummaryView.setVisibility(View.VISIBLE); } - final Drawable previewImage = item.getPreviewImage(); - if (previewImage != null) { - mPreviewView.setImageDrawable(previewImage); - mPreviewView.setClipToOutline(true); - mPreviewPlaceholderView.setVisibility(View.GONE); - } else { - mPreviewView.setImageDrawable(null); - mPreviewPlaceholderView.setVisibility(View.VISIBLE); - } - final Drawable icon = item.isActive() ? mContext.getDrawable(R.drawable.ic_dream_check_circle) : item.getIcon().mutate(); @@ -122,12 +112,24 @@ public class DreamAdapter extends RecyclerView.Adapter itemView.setClickable(true); } - mCustomizeButton.setOnClickListener(v -> item.onCustomizeClicked()); - mCustomizeButton.setVisibility( - item.allowCustomization() && mEnabled ? View.VISIBLE : View.GONE); - // This must be called AFTER itemView.setSelected above, in order to keep the - // customize button in an unselected state. - mCustomizeButton.setSelected(false); + if (item.viewType() != DreamItemViewTypes.NO_DREAM_ITEM) { + final Drawable previewImage = item.getPreviewImage(); + if (previewImage != null) { + mPreviewView.setImageDrawable(previewImage); + mPreviewView.setClipToOutline(true); + mPreviewPlaceholderView.setVisibility(View.GONE); + } else { + mPreviewView.setImageDrawable(null); + mPreviewPlaceholderView.setVisibility(View.VISIBLE); + } + + mCustomizeButton.setOnClickListener(v -> item.onCustomizeClicked()); + mCustomizeButton.setVisibility( + item.allowCustomization() && mEnabled ? View.VISIBLE : View.GONE); + // This must be called AFTER itemView.setSelected above, in order to keep the + // customize button in an unselected state. + mCustomizeButton.setSelected(false); + } setEnabledStateOnViews(itemView, mEnabled); } @@ -149,16 +151,22 @@ public class DreamAdapter extends RecyclerView.Adapter } } + public DreamAdapter(SparseIntArray layouts, List itemList) { + mItemList = itemList; + mLayouts = layouts; + } + public DreamAdapter(@LayoutRes int layoutRes, List itemList) { mItemList = itemList; - mLayoutRes = layoutRes; + mLayouts.append(DreamItemViewTypes.DREAM_ITEM, layoutRes); } @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, + @DreamItemViewTypes.ViewType int viewType) { View view = LayoutInflater.from(viewGroup.getContext()) - .inflate(mLayoutRes, viewGroup, false); + .inflate(mLayouts.get(viewType), viewGroup, false); return new DreamViewHolder(view, viewGroup.getContext()); } @@ -167,6 +175,11 @@ public class DreamAdapter extends RecyclerView.Adapter ((DreamViewHolder) viewHolder).bindView(mItemList.get(i), i); } + @Override + public @DreamItemViewTypes.ViewType int getItemViewType(int position) { + return mItemList.get(position).viewType(); + } + @Override public int getItemCount() { return mItemList.size(); diff --git a/src/com/android/settings/dream/DreamItemViewTypes.java b/src/com/android/settings/dream/DreamItemViewTypes.java new file mode 100644 index 00000000000..b7202429769 --- /dev/null +++ b/src/com/android/settings/dream/DreamItemViewTypes.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.dream; + +import android.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Class representing a dream item view types. + */ +public final class DreamItemViewTypes { + + /** + * The default dream item layout + */ + public static final int DREAM_ITEM = 0; + + /** + * The dream item layout indicating no dream item selected. + */ + public static final int NO_DREAM_ITEM = 1; + + + @Retention(RetentionPolicy.SOURCE) + @IntDef({DreamItemViewTypes.DREAM_ITEM, DreamItemViewTypes.NO_DREAM_ITEM}) + public @interface ViewType {} +} diff --git a/src/com/android/settings/dream/IDreamItem.java b/src/com/android/settings/dream/IDreamItem.java index 49c82bec42a..911a3cf0bd2 100644 --- a/src/com/android/settings/dream/IDreamItem.java +++ b/src/com/android/settings/dream/IDreamItem.java @@ -67,4 +67,11 @@ public interface IDreamItem { default boolean allowCustomization() { return false; } + + /** + * Returns whether or not this item is the no screensaver item. + */ + default @DreamItemViewTypes.ViewType int viewType() { + return DreamItemViewTypes.DREAM_ITEM; + } }