From a0430e01e61cd3c4014254afe7ee3d9c4539fbe4 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Mon, 15 Feb 2016 05:47:59 -0800 Subject: [PATCH 001/382] Import translations. DO NOT MERGE Change-Id: Id22993261db71609ea1052ae99459709300efb3b Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 +- res/values-am/strings.xml | 2 +- res/values-ar/strings.xml | 2 +- res/values-az-rAZ/strings.xml | 2 +- res/values-bg/strings.xml | 2 +- res/values-bn-rBD/strings.xml | 2 +- res/values-ca/strings.xml | 2 +- res/values-cs/strings.xml | 2 +- res/values-da/strings.xml | 2 +- res/values-de/strings.xml | 6 +++--- res/values-el/strings.xml | 2 +- res/values-en-rAU/strings.xml | 2 +- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-es-rUS/strings.xml | 2 +- res/values-es/strings.xml | 2 +- res/values-et-rEE/strings.xml | 2 +- res/values-eu-rES/strings.xml | 2 +- res/values-fa/strings.xml | 6 +++--- res/values-fi/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 2 +- res/values-fr/strings.xml | 2 +- res/values-gl-rES/strings.xml | 2 +- res/values-gu-rIN/strings.xml | 2 +- res/values-hi/strings.xml | 2 +- res/values-hr/strings.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-hy-rAM/strings.xml | 2 +- res/values-in/strings.xml | 2 +- res/values-is-rIS/strings.xml | 2 +- res/values-it/strings.xml | 2 +- res/values-iw/strings.xml | 2 +- res/values-ja/strings.xml | 2 +- res/values-ka-rGE/strings.xml | 2 +- res/values-kk-rKZ/strings.xml | 2 +- res/values-km-rKH/strings.xml | 2 +- res/values-kn-rIN/strings.xml | 2 +- res/values-ko/strings.xml | 2 +- res/values-ky-rKG/strings.xml | 2 +- res/values-lo-rLA/strings.xml | 2 +- res/values-lt/strings.xml | 2 +- res/values-lv/strings.xml | 2 +- res/values-mk-rMK/strings.xml | 4 ++-- res/values-ml-rIN/strings.xml | 2 +- res/values-mn-rMN/strings.xml | 2 +- res/values-mr-rIN/strings.xml | 2 +- res/values-ms-rMY/strings.xml | 2 +- res/values-my-rMM/strings.xml | 2 +- res/values-nb/strings.xml | 2 +- res/values-ne-rNP/strings.xml | 2 +- res/values-nl/strings.xml | 2 +- res/values-pa-rIN/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 2 +- res/values-pt/strings.xml | 2 +- res/values-ro/strings.xml | 2 +- res/values-ru/strings.xml | 2 +- res/values-si-rLK/strings.xml | 2 +- res/values-sk/strings.xml | 2 +- res/values-sl/strings.xml | 2 +- res/values-sq-rAL/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-sv/strings.xml | 2 +- res/values-sw/strings.xml | 2 +- res/values-ta-rIN/strings.xml | 2 +- res/values-te-rIN/strings.xml | 2 +- res/values-th/strings.xml | 2 +- res/values-tl/strings.xml | 2 +- res/values-tr/strings.xml | 2 +- res/values-uk/strings.xml | 2 +- res/values-ur-rPK/strings.xml | 2 +- res/values-uz-rUZ/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- res/values-zh-rTW/strings.xml | 4 ++-- res/values-zu/strings.xml | 2 +- 77 files changed, 83 insertions(+), 83 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 2bedb604c4..d787c4908b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -29,7 +29,7 @@ "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" - "Deursoek programme" + "Deursoek programme …" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" "Gaan na %1$s" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 290099ad33..1b751aa9a9 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -29,7 +29,7 @@ "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" - "መተግበሪያዎችን ይፈልጉ" + "መተግበሪያዎችን ይፈልጉ…" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" "ወደ %1$s ሂድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index a58ed71e19..e5cfa319e6 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -29,7 +29,7 @@ "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" - "البحث في التطبيقات" + "البحث في التطبيقات…" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" "الانتقال إلى %1$s" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 29f2cf04b1..d8e0480b4c 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -29,7 +29,7 @@ "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" - "Tətbiq Axtarın" + "Tətbiqləri Axtarın..." "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" "%1$s daxil olun" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 6f1a0bc279..1a326f4810 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -29,7 +29,7 @@ "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" - "Търсене в приложенията" + "Търсене в приложенията…" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" "Отваряне на %1$s" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index a8f6496e98..72aceef9e5 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -29,7 +29,7 @@ "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" - "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" + "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" "%1$s এ যান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 503716f238..86aec04b89 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -29,7 +29,7 @@ "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" - "Cerca a les aplicacions" + "Cerca a les aplicacions…" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" "Vés a %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 4a8daaf6da..0943c62320 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -29,7 +29,7 @@ "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" - "Hledat aplikace" + "Hledat v aplikacích…" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" "Přejít na %1$s" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index a904765473..3f9f0da8c6 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -29,7 +29,7 @@ "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" - "Søg i Apps" + "Søg i Apps…" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" "Gå til %1$s" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index e201d218dd..18126078b5 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -29,7 +29,7 @@ "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" - "In Apps suchen" + "Apps suchen…" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" "Gehe zu %1$s" @@ -60,7 +60,7 @@ "Symbole kopieren" "Standardübersicht verwenden" "Hintergründe, Widgets & Einstellungen" - "Berühren und halten Sie den Hintergrund, um ihn anzupassen." + "Berühre und halte den Hintergrund, um ihn anzupassen." "OK" "Ordner geöffnet, %1$d x %2$d" "Ordner durch Berühren schließen" @@ -76,7 +76,7 @@ "Entfernen" "Suchen" "Diese App ist nicht installiert" - "Die App für dieses Symbol ist nicht installiert. Sie können das Symbol entfernen oder nach der App suchen und sie manuell installieren." + "Die App für dieses Symbol ist nicht installiert. Du kannst das Symbol entfernen oder die App lokalisieren und dann manuell installieren." "%1$s wird heruntergeladen, %2$s abgeschlossen" "Warten auf Installation von %1$s" "Zum Startbildschirm hinzufügen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index ff6ff1d628..c5e2df77d1 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -29,7 +29,7 @@ "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" - "Αναζήτηση εφαρμογών" + "Αναζήτηση εφαρμογών…" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" "Μετάβαση σε %1$s" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index f4a8639e46..17589b6d84 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps" + "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" "Go to %1$s" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index f4a8639e46..17589b6d84 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps" + "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" "Go to %1$s" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index f4a8639e46..17589b6d84 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps" + "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" "Go to %1$s" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 5246945f04..e501cf4d0c 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -29,7 +29,7 @@ "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" - "Buscar aplicaciones" + "Buscar apps…" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." "Ir a %1$s" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index c160aa3dee..a5611872ac 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -29,7 +29,7 @@ "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" - "Busca aplicaciones" + "Buscar aplicaciones…" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" "Ir a %1$s" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 0065b4ea4f..4789374384 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -29,7 +29,7 @@ "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" - "Otsige rakendustest" + "Otsimine rakendustest …" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" "Mine: %1$s" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 84653e3c5b..5d740e42fd 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -29,7 +29,7 @@ "Eduki ukituta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" - "Bilatu aplikazioetan" + "Bilatu aplikazioetan…" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" "Joan hona: %1$s" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 91fc0d3673..59ad6be75c 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -24,12 +24,12 @@ "کاری" "برنامه نصب نشده است." "برنامه در دسترس نیست" - "برنامه دانلود شده در حالت ایمن غیرفعال شد" + "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" - "جستجوی برنامه‌ها" + "جستجوی برنامه‌ها…‏‏" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" "رفتن به %1$s" @@ -77,7 +77,7 @@ "جستجو" "این برنامه نصب نشده است." "برنامه برای این نماد نصب نشده است. می‌توانید آن را حذف کنید یا سعی کنید برنامه را جستجو کنید و آن را به صورت دستی نصب کنید." - "درحال دانلود %1$s، %2$s کامل شد" + "درحال بارگیری %1$s، %2$s کامل شد" "%1$s درانتظار نصب" "افزودن به صفحه اصلی" "انتقال مورد به اینجا" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index b7578c6d47..151ea7889f 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -29,7 +29,7 @@ "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" - "Sovellushaku" + "Hae sovelluksia…" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." "Siirry: %1$s" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index ca6eccc1a6..a3b5e37400 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -29,7 +29,7 @@ "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" - "Rechercher des applications" + "Rechercher des applications..." "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" "Aller à « %1$s »" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 58a0fb7e3d..0fddd68ca0 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -29,7 +29,7 @@ "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" - "Rechercher dans les applications" + "Rechercher des applications…" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." "Accéder à %1$s" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 9e5a605943..1d10d032c2 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -29,7 +29,7 @@ "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" - "Aplicacións de busca" + "Aplicacións de busca..." "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" "Ir a %1$s" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 129d83e13c..9f2107cdfe 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -29,7 +29,7 @@ "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" - "શોધ એપ્લિકેશનો" + "ઍપ્લિકેશનોમાં શોધો…" "એપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ એપ્લિકેશનો મળી નથી" "%1$s પર જાઓ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index b209cee9ee..f4179105c4 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -29,7 +29,7 @@ "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" - "ऐप्‍स खोजें" + "ऐप्स खोजें…" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" "%1$s पर जाएं" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index ec9f892f68..4426c1808e 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -29,7 +29,7 @@ "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" - "Pretraži aplikacije" + "Pretraživanje aplikacija…" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" "Idite na %1$s" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index cfff315ac7..1382b9933c 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -29,7 +29,7 @@ "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" - "Alkalmazások keresése" + "Alkalmazások keresése…" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." "Keresse fel ezt: %1$s" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 8beff3a1a3..2538bd289a 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -29,7 +29,7 @@ "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" - "Հավելվածների որոնում" + "Հավելվածների որոնում…" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" "Գնալ %1$s" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 3de54afc79..9670ea6b86 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -29,7 +29,7 @@ "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" - "Telusuri Apps" + "Telusuri Aplikasi..." "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" "Buka %1$s" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index eb900be91f..cee6c53d6b 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -29,7 +29,7 @@ "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" - "Leita í forritum" + "Leita í forritum…" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" "Fara í %1$s" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 7a1585d7c2..95a13b74c9 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -29,7 +29,7 @@ "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" - "Cerca app" + "Ricerca app…" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" "Vai a %1$s" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 5b978af125..0cdb6967fb 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -29,7 +29,7 @@ "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" - "חפש אפליקציות" + "חיפוש אפליקציות..." "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" "עבור אל %1$s" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 662e2918e2..3df18bfeb8 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -29,7 +29,7 @@ "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" - "アプリを検索" + "アプリを検索…" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" "%1$sにアクセス" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index bf5724f6be..6970f9d6ab 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -29,7 +29,7 @@ "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" - "აპების ძიება" + "აპების ძიება…" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" "გადადი %1$s-ში" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 61a423a39c..f48c7a1aa2 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -29,7 +29,7 @@ "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" - "Қолданбаларды іздеу" + "Қолданбаларды іздеу…" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" "%1$s сұрауына өту" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 1a4469d1b7..6a9feef4f5 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -29,7 +29,7 @@ "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" - "ស្វែងរកកម្មវិធី" + "ស្វែងរកកម្មវិធី…" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" "ចូលទៅកាន់ %1$s" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index e712ba8841..c033ea1996 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -29,7 +29,7 @@ "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" - "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" + "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" "%1$s ಗೆ ಹೋಗಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index b7c1a50db9..37fef014a5 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -29,7 +29,7 @@ "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" - "앱 검색" + "앱 검색..." "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." "%1$s(으)로 이동" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 53c3f88766..e6ab0acf08 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -29,7 +29,7 @@ "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" - "Колдонмолорду издөө" + "Колдонмолорду издөө…" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" "%1$s сурамына өтүңүз" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 6d19f312db..f4294c0738 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -29,7 +29,7 @@ "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" - "ຊອກຫາແອັບ" + "ຄົ້ນຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" "ໄປ​ທີ່ %1$s" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 1336a4d064..49c90697b8 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -29,7 +29,7 @@ "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" - "Ieškoti programų" + "Ieškoti programų..." "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" "Eiti į %1$s" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 4e2f98e0e8..46b58c7fbf 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -29,7 +29,7 @@ "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" - "Meklēt lietotnes" + "Meklēt lietotnes…" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." "Doties uz: %1$s" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 834598af3f..4dbbb24c16 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -29,7 +29,7 @@ "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" - "Пребарување апликации" + "Пребарувај апликации…" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" "Оди на %1$s" @@ -70,7 +70,7 @@ "Папка: %1$s" "Виџети" "Тапети" - "Подесувања" + "Поставки" "Дозволи ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index eb48c7c671..748b367ab8 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -29,7 +29,7 @@ "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" - "ആപ്പ്‌സ് തിരയുക" + "ആപ്പ്‌സ് തിരയുക…" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" "%1$s എന്നതിലേക്ക് പോവുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 07eaf15050..b2ae00008f 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -29,7 +29,7 @@ "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" - "Апп хайх" + "Апп хайх..." "Аппликейшныг ачаалж байна..." "\"%1$s\"-тай нийцэх апп олдсонгүй" "%1$s руу очих" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index c9fa78decb..bcde7b0c37 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -29,7 +29,7 @@ "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" - "अॅप्स शोधा" + "अॅप्स शोधा..." "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" "%1$s वर जा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 55de17288b..1ebfd0889f 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -29,7 +29,7 @@ "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" - "Cari Apl" + "Cari Apl..." "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" "Pergi ke %1$s" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index c47f2e654e..7b94b71aae 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -29,7 +29,7 @@ "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" - "ရှာဖွေမှု Appများ" + "အက်ပ်များကို ရှာဖွေပါ…" "App များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" "%1$sကို သွားပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 575d591414..7d0f3f0f15 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -29,7 +29,7 @@ "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" - "Søk i apper" + "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" "Gå til %1$s" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index f197979fdc..501aa560f1 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -29,7 +29,7 @@ "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" - "अनुप्रयोगहरू खोज्नुहोस्" + "अनुप्रयोगहरू खोज्नुहोस्..." "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" "%1$s मा जानुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 0d341444eb..8325b58fca 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -29,7 +29,7 @@ "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" - "Apps zoeken" + "Apps zoeken…" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" "Ga naar %1$s" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 5647afe5bc..00e5ae34f3 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -29,7 +29,7 @@ "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" - "ਐਪਸ ਖੋਜੋ" + "ਐਪਾਂ ਖੋਜੋ…" "ਐਪਸ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀ ਕੋਈ ਵੀ ਐਪਸ ਨਹੀਂ ਲੱਭੀਆਂ" "%1$s ਤੇ ਜਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 5ebd6dc170..e39d7a7bc6 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -29,7 +29,7 @@ "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" - "Szukaj w aplikacjach" + "Szukaj w aplikacjach…" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" "Otwórz %1$s" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 004b802d7b..8bc5c0e053 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -29,7 +29,7 @@ "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" - "Pesquisar aplicações" + "Pesquisar aplicações..." "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" "Aceder a %1$s" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index a2c254e10d..b51574d7dc 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -29,7 +29,7 @@ "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" - "Pesquisar apps" + "Pesquisar apps..." "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" "Ir para %1$s" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index afa56792e4..e32e524fb3 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -29,7 +29,7 @@ "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" - "Căutați aplicații" + "Căutați aplicații…" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" "Accesați %1$s" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a4e70bbfdd..84b9948d3d 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -29,7 +29,7 @@ "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" - "Поиск приложений" + "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" "%1$s" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index e9f06fc6f5..405035a8cd 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -29,7 +29,7 @@ "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" - "යෙදුම් සෙවීම" + "යෙදුම් සොයන්න..." "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" "%1$s වෙත යන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 239af4ecf6..2c0938a981 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -29,7 +29,7 @@ "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" - "Vyhľadávanie v aplikáciách" + "Vyhľadávanie v aplikáciách…" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" "Prejsť na dopyt %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index ad33be1221..72e58ce4fa 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -29,7 +29,7 @@ "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" - "Iskanje po aplikacijah" + "Iskanje po aplikacijah …" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" "Odpri storitev %1$s" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 0648d3ce04..5d918c03f8 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -29,7 +29,7 @@ "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" - "Kërko për aplikacione" + "Kërko për aplikacione..." "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" "Shko te %1$s" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 2d6a4c0e54..7362223065 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -29,7 +29,7 @@ "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" - "Претражите апликације" + "Претражите апликације..." "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" "Иди на апликацију %1$s" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 82f8da8beb..49e9244822 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -29,7 +29,7 @@ "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" - "Sök efter appar" + "Sök efter appar …" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" "Gå till %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 2633a2f4df..11dc79e604 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -29,7 +29,7 @@ "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" - "Tafuta Programu" + "Tafuta Programu..." "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" "Nenda kwenye %1$s" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 1424cae45d..b440d56c24 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -29,7 +29,7 @@ "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" - "பயன்பாடுகளில் தேடுக" + "பயன்பாடுகளில் தேடுக…" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" "%1$sக்குச் செல்லவும்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 7c950e4aa9..4457b08a7c 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -29,7 +29,7 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" - "అనువర్తనాలను శోధించండి" + "అనువర్తనాల్లో శోధించండి…" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" "%1$sకి వెళ్లు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 3924463fcb..eb67678b88 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -29,7 +29,7 @@ "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" - "ค้นหาแอป" + "ค้นหาแอป…" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" "ไปที่ %1$s" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index a88f3d2616..f1cf879d17 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -29,7 +29,7 @@ "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" - "Mga App sa Paghahanap" + "Maghanap ng Mga App…" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" "Pumunta sa %1$s" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 39e0c6e8ba..0e7637ebfb 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -29,7 +29,7 @@ "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" - "Uygulamalarda Ara" + "Uygulamalarda Ara…" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" "%1$s uygulamasına git" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index ab5385f108..aa92b09ec9 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -29,7 +29,7 @@ "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" - "Пошук додатків" + "Пошук додатків…" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" "Перейти в додаток %1$s" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index abce1ff1bc..247465b92d 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -29,7 +29,7 @@ "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" - "ایپس تلاش کریں" + "ایپس تلاش کریں…" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" "%1$s پر جائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 70b15cb3ba..0084fc459b 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -29,7 +29,7 @@ "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" - "Ilovalarni qidirish" + "Ilovalarni qidirish…" "Ilovalar yuklanmoqda…" "“%1$s” bilan mos hech qanday ilova topilmadi" "O‘tish: %1$s" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 8ffc97f228..0df0af3719 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -29,7 +29,7 @@ "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" - "Tìm kiếm ứng dụng" + "Tìm kiếm ứng dụng..." "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" "Chuyển tới %1$s" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index b76991bcf9..41d55ddb17 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,7 +29,7 @@ "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" - "搜索应用" + "搜索应用…" "正在加载应用…" "未找到与“%1$s”相符的应用" "转到 %1$s" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 12bdfd64d0..6c8e869c69 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -29,7 +29,7 @@ "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" - "搜尋應用程式" + "搜尋應用程式…" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" "前往 %1$s" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 41d199a96b..4cc3467cb0 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -27,9 +27,9 @@ "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" "輕觸並按住小工具即可選取。" - "輕按兩下並按住小工具即可選取,您也可以使用自訂動作。" + "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" - "搜尋應用程式" + "搜尋應用程式…" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" "前往 %1$s" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 14c6819d1f..c3eb3f436b 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -29,7 +29,7 @@ "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" - "Sesha Izinhlelo Zokusebenza" + "Sesha izinhlelo zokusebenza..." "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" "Hamba ku-%1$s" From 1aea1dbc40d40c2693e8bd7088adbbf2d4939366 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Wed, 24 Feb 2016 05:33:25 -0800 Subject: [PATCH 002/382] Import translations. DO NOT MERGE Change-Id: Ia86fb0eb5263eb19fb87a3ac311eaf0416bb217f Auto-generated-cl: translation import --- res/values-af/strings.xml | 8 ++++---- res/values-am/strings.xml | 8 ++++---- res/values-ar/strings.xml | 8 ++++---- res/values-az-rAZ/strings.xml | 8 ++++---- res/values-bg/strings.xml | 12 ++++++++---- res/values-bn-rBD/strings.xml | 12 ++++++++---- res/values-ca/strings.xml | 12 ++++++++---- res/values-cs/strings.xml | 12 ++++++++---- res/values-da/strings.xml | 8 ++++---- res/values-de/strings.xml | 12 ++++++++---- res/values-el/strings.xml | 12 ++++++++---- res/values-en-rAU/strings.xml | 8 ++++---- res/values-en-rGB/strings.xml | 8 ++++---- res/values-en-rIN/strings.xml | 8 ++++---- res/values-es-rUS/strings.xml | 12 ++++++++---- res/values-es/strings.xml | 12 ++++++++---- res/values-et-rEE/strings.xml | 12 ++++++++---- res/values-eu-rES/strings.xml | 8 ++++---- res/values-fa/strings.xml | 12 ++++++++---- res/values-fi/strings.xml | 12 ++++++++---- res/values-fr-rCA/strings.xml | 12 ++++++++---- res/values-fr/strings.xml | 12 ++++++++---- res/values-gl-rES/strings.xml | 12 ++++++++---- res/values-gu-rIN/strings.xml | 8 ++++---- res/values-hi/strings.xml | 8 ++++---- res/values-hr/strings.xml | 8 ++++---- res/values-hu/strings.xml | 12 ++++++++---- res/values-hy-rAM/strings.xml | 12 ++++++++---- res/values-in/strings.xml | 8 ++++---- res/values-is-rIS/strings.xml | 12 ++++++++---- res/values-it/strings.xml | 8 ++++---- res/values-iw/strings.xml | 8 ++++---- res/values-ja/strings.xml | 8 ++++---- res/values-ka-rGE/strings.xml | 12 ++++++++---- res/values-kk-rKZ/strings.xml | 12 ++++++++---- res/values-km-rKH/strings.xml | 8 ++++---- res/values-kn-rIN/strings.xml | 8 ++++---- res/values-ko/strings.xml | 8 ++++---- res/values-ky-rKG/strings.xml | 12 ++++++++---- res/values-lo-rLA/strings.xml | 8 ++++---- res/values-lt/strings.xml | 8 ++++---- res/values-lv/strings.xml | 12 ++++++++---- res/values-mk-rMK/strings.xml | 12 ++++++++---- res/values-ml-rIN/strings.xml | 12 ++++++++---- res/values-mn-rMN/strings.xml | 8 ++++---- res/values-mr-rIN/strings.xml | 12 ++++++++---- res/values-ms-rMY/strings.xml | 12 ++++++++---- res/values-my-rMM/strings.xml | 12 ++++++++---- res/values-nb/strings.xml | 12 ++++++++---- res/values-ne-rNP/strings.xml | 12 ++++++++---- res/values-nl/strings.xml | 8 ++++---- res/values-pa-rIN/strings.xml | 12 ++++++++---- res/values-pl/strings.xml | 12 ++++++++---- res/values-pt-rPT/strings.xml | 8 ++++---- res/values-pt/strings.xml | 12 ++++++++---- res/values-ro/strings.xml | 12 ++++++++---- res/values-ru/strings.xml | 12 ++++++++---- res/values-si-rLK/strings.xml | 12 ++++++++---- res/values-sk/strings.xml | 12 ++++++++---- res/values-sl/strings.xml | 12 ++++++++---- res/values-sq-rAL/strings.xml | 12 ++++++++---- res/values-sr/strings.xml | 12 ++++++++---- res/values-sv/strings.xml | 12 ++++++++---- res/values-sw/strings.xml | 12 ++++++++---- res/values-ta-rIN/strings.xml | 12 ++++++++---- res/values-te-rIN/strings.xml | 8 ++++---- res/values-th/strings.xml | 8 ++++---- res/values-tl/strings.xml | 8 ++++---- res/values-tr/strings.xml | 12 ++++++++---- res/values-uk/strings.xml | 8 ++++---- res/values-ur-rPK/strings.xml | 12 ++++++++---- res/values-uz-rUZ/strings.xml | 12 ++++++++---- res/values-vi/strings.xml | 8 ++++---- res/values-zh-rCN/strings.xml | 12 ++++++++---- res/values-zh-rHK/strings.xml | 8 ++++---- res/values-zh-rTW/strings.xml | 8 ++++---- res/values-zu/strings.xml | 12 ++++++++---- 77 files changed, 492 insertions(+), 308 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index d787c4908b..19ed41be15 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -26,7 +26,7 @@ "Program is nie beskikbaar nie" "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" - "Raak en hou om \'n legstuk op te tel." + "Tik en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" "Deursoek programme …" @@ -60,11 +60,11 @@ "KOPIEER IKONE" "BEGIN VAN NUUTS AF" "Muurpapiere, legstukke en instellings" - "Raak en hou agtergrond om te pasmaak" + "Tik en hou agtergrond om te pasmaak" "HET DIT" "Vouer oopgemaak, %1$d by %2$d" - "Raak om vouer toe te maak" - "Raak om hernoem te stoor" + "Tik om die vouer toe te maak" + "Tik om nuwe naam te stoor" "Vouer is gesluit" "Vouer hernoem na %1$s" "Vouer: %1$s" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 1b751aa9a9..8887963ebe 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -26,7 +26,7 @@ "መተግበሪያ አይገኝም" "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" - "ፍርግም ለማንሳት ይንኩ እና ይያዙት" + "ንዑስ ፕሮግራም ለማንሳት መታ አድርገው ይያዙት።" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" "መተግበሪያዎችን ይፈልጉ…" @@ -60,11 +60,11 @@ "አዶዎችን ይቅዱ" "እንደ አዲስ ይጀምሩ" "የግድግዳ ወረቀቶች፣ ንዑስ ፕሮግራሞች እና ቅንብሮች" - "ለማበጀት ጀርባውን ነክተው ይያዙት" + "ለማበጀት ጀርባውን መታ አድርገው ይያዙት" "ገባኝ" "አቃፊ ተከፍቷል፣ %1$d%2$d" - "አቃፊን ለመዝጋት ይንኩ" - "ዳግም የተሰየመውን ለማስቀመጥ ይንኩ" + "አቃፊን ለመዝጋት መታ ያድርጉ" + "ዳግም የተሰጠውን ስም ለማስቀመጥ መታ ያድርጉ" "አቃፊ ተዘግቷል" "አቃፊ %1$s ተብሎ ዳግም ተሰይሟል" "አቃፊ፦ %1$s" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index e5cfa319e6..7c5a3b025e 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -26,7 +26,7 @@ "التطبيق ليس متاحًا" "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" - "المس مع الاستمرار لاختيار إحدى الأدوات." + "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "البحث في التطبيقات…" @@ -60,11 +60,11 @@ "نسخ الرموز" "بداية جديدة" "الخلفيات والأدوات والإعدادات" - "المس مع الاستمرار الخلفية لتخصيصها" + "المس مع الاستمرار الخلفية لتخصيصها" "حسنًا" "تم فتح المجلد، بمقاس %1$d في %2$d" - "المس لإغلاق المجلد" - "المس لحفظ إعادة التسمية" + "انقر لإغلاق المجلد" + "انقر لحفظ الاسم الجديد" "تم إغلاق المجلد" "تمت إعادة تسمية المجلد إلى %1$s" "المجلد: %1$s" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index d8e0480b4c..1e041b39cd 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -26,7 +26,7 @@ "Tətbiq əlçatmazdır" "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" - "Vidceti götürmək üçün toxunub saxlayın." + "Vidceti götürmək üçün toxunaraq saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" "Tətbiqləri Axtarın..." @@ -60,11 +60,11 @@ "İKONALARI KOPYALA" "YENİDƏN BAŞLA" "Divar kağızları, vidcetlər və ayarlar" - "Fərdiləşdirmək üçün arxa fona toxunaraq saxlayın" + "Fərdiləşdirmək üçün arxa fona toxunaraq saxlayın" "ANLADIM" "Qovluq açıldı, %2$d hündürlük ilə %1$d enində" - "Qovluğu bağlamaq üçün toxunun" - "Ad dəyişikliyini yadda saxlamaq üçün toxunun" + "Qovluq bağlamaq üçün toxunun" + "Ad dəyişikliyini yadda saxlamaq üçün toxunun" "Qovluq bağlıdır" "Qovluq adı %1$s ilə dəyişdirildi" "Qovluq: %1$s" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 1a326f4810..d54a6d4ac4 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -26,7 +26,8 @@ "Приложението не е налично" "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" - "Докоснете и задръжте за избор на приспособление." + + "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Търсене в приложенията…" @@ -60,11 +61,14 @@ "КОПИРАНЕ НА ИКОНИТЕ" "СТАРТИРАНЕ ОТНАЧАЛО" "Тапети, приспособления и настройки" - "Докоснете и задръжте фона за персонализиране" + + "РАЗБРАХ" "Папката е отворена – %1$d на %2$d" - "Докоснете, за да затворите папката" - "Докоснете, за да запазите новото име" + + + + "Папката бе затворена" "Папката е преименувана на „%1$s“" "Папка: „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 72aceef9e5..2fc1008f44 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -26,7 +26,8 @@ "অ্যাপ্লিকেশান অনুপলব্ধ" "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" - "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" + + "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." @@ -60,11 +61,14 @@ "আইকনগুলি অনুলিপি করুন" "নতুন করে শুরু করুন" "ওয়ালপেপার, উইজেট এবং সেটিংস" - "কাস্টমাইজ করার জন্য পটভূমি স্পর্শ করে ধরে থাকুন" + + "বুঝেছি" "ফোল্ডার খোলা হয়েছে, %1$d বাই %2$d" - "ফোল্ডার বন্ধ করতে স্পর্শ করুন" - "পুনঃনামকরণ সংরক্ষণ করতে স্পর্শ করুন" + + + + "ফোল্ডার বন্ধ করা হয়েছে" "ফোল্ডারের নাম পাল্টে %1$s করা হয়েছে" "ফোল্ডার: %1$s" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 86aec04b89..7d3778c483 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -26,7 +26,8 @@ "L\'aplicació no està disponible." "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." - "Mantén premut un widget per triar-lo." + + "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "Cerca a les aplicacions…" @@ -60,11 +61,14 @@ "COPIA LES ICONES." "NOU COMENÇAMENT" "Fons de pantalla, widgets i configuració" - "Mantén premut el fons per fer personalitzacions." + + "D\'ACORD" "S\'ha obert la carpeta, %1$d per %2$d" - "Toca per tancar la carpeta" - "Toca per desar el canvi de nom" + + + + "Carpeta tancada" "S\'ha canviat el nom de la carpeta a %1$s" "Carpeta: %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 0943c62320..40f18e54b6 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -26,7 +26,8 @@ "Aplikace není k dispozici." "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." - "Widget vyberete dotykem a podržením." + + "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "Hledat v aplikacích…" @@ -60,11 +61,14 @@ "ZKOPÍROVAT IKONY" "ZAČÍT S VÝCHOZÍM ROZVRŽENÍM" "Tapety, widgety a nastavení" - "Pozadí můžete přizpůsobit klepnutím a podržením" + + "ROZUMÍM" "Složka otevřena, rozměry %1$d x %2$d" - "Dotykem složku zavřete" - "Dotykem uložíte změnu názvu" + + + + "Složka je uzavřena" "Složka přejmenována na %1$s" "Složka: %1$s" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 3f9f0da8c6..704158d9bb 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -26,7 +26,7 @@ "Appen er ikke tilgængelig" "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" - "Tryk på en widget, og hold den nede for at vælge." + "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "Søg i Apps…" @@ -60,11 +60,11 @@ "KOPIÉR IKONER" "START PÅ EN FRISK" "Baggrunde, widgets og indstillinger" - "Tryk på baggrunden, og hold fingeren nede for at tilpasse den" + "Tryk på baggrunden, og hold fingeren nede for at tilpasse den" "OK, FORSTÅET" "Mappen er åben, %1$d gange %2$d" - "Tryk for at lukke mappen" - "Tryk for at gemme det nye navn" + "Tryk for at lukke mappen" + "Tryk for at gemme omdøbningen" "Mappen er lukket" "Mappen er omdøbt til %1$s" "Mappe: %1$s" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 18126078b5..c8dd114650 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -26,7 +26,8 @@ "App nicht verfügbar" "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" - "Zum Hinzufügen Widget berühren und halten" + + "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "Apps suchen…" @@ -60,11 +61,14 @@ "Symbole kopieren" "Standardübersicht verwenden" "Hintergründe, Widgets & Einstellungen" - "Berühre und halte den Hintergrund, um ihn anzupassen." + + "OK" "Ordner geöffnet, %1$d x %2$d" - "Ordner durch Berühren schließen" - "Umbenennung durch Berühren speichern" + + + + "Ordner geschlossen" "Ordner umbenannt in %1$s" "Ordner: %1$s" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index c5e2df77d1..cd6c03dda0 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,7 +26,8 @@ "Η εφαρμογή δεν είναι διαθέσιμη" "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" - "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." + + "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Αναζήτηση εφαρμογών…" @@ -60,11 +61,14 @@ "ΑΝΤΙΓΡΑΦΗ ΕΙΚΟΝΙΔΙΩΝ" "ΝΕΑ ΕΝΑΡΞΗ" "Ταπετσαρίες, γραφικά στοιχεία και ρυθμίσεις" - "Αγγίξτε παρατεταμένα το παρασκήνιο για προσαρμογή" + + "ΕΓΙΝΕ" "Άνοιγμα φακέλου, %1$d επί %2$d" - "Αγγίξτε για να κλείσετε τον φάκελο" - "Αγγίξτε για να αποθηκεύσετε το νέο όνομα" + + + + "Ο φάκελος έκλεισε" "Ο φάκελος μετονομάστηκε σε %1$s" "Φάκελος: %1$s" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 17589b6d84..873cb80c3c 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Touch & hold to pick up a widget." + "Tap & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,11 +60,11 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets, & settings" - "Touch & hold background to customise" + "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" - "Touch to close folder" - "Touch to save rename" + "Tap to close folder" + "Tap to save rename" "Folder closed" "Folder renamed to %1$s" "Folder: %1$s" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 17589b6d84..873cb80c3c 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Touch & hold to pick up a widget." + "Tap & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,11 +60,11 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets, & settings" - "Touch & hold background to customise" + "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" - "Touch to close folder" - "Touch to save rename" + "Tap to close folder" + "Tap to save rename" "Folder closed" "Folder renamed to %1$s" "Folder: %1$s" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 17589b6d84..873cb80c3c 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Touch & hold to pick up a widget." + "Tap & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,11 +60,11 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets, & settings" - "Touch & hold background to customise" + "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" - "Touch to close folder" - "Touch to save rename" + "Tap to close folder" + "Tap to save rename" "Folder closed" "Folder renamed to %1$s" "Folder: %1$s" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index e501cf4d0c..5d1a63df87 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -26,7 +26,8 @@ "La aplicación no está disponible." "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - "Mantén presionado el widget que desees elegir." + + "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "Buscar apps…" @@ -60,11 +61,14 @@ "COPIAR ÍCONOS" "EMPEZAR DE CERO" "Fondos, widgets y configuración" - "Mantén presionado el fondo para personalizarlo" + + "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" - "Toca para cerrar la carpeta." - "Toca para guardar el nuevo nombre." + + + + "Carpeta cerrada" "El nombre de la carpeta se cambió a %1$s." "Carpeta: %1$s" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index a5611872ac..306fe84ff9 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -26,7 +26,8 @@ "La aplicación no está disponible" "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - "Mantén pulsado el widget que quieras seleccionar." + + "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "Buscar aplicaciones…" @@ -60,11 +61,14 @@ "COPIAR ICONOS" "AJUSTES PREDETERMINADOS" "Fondos de pantalla, widgets y ajustes" - "Mantén pulsado el fondo para personalizarlo" + + "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" - "Toca para cerrar la carpeta" - "Toca para cambiar el nuevo nombre" + + + + "Carpeta cerrada" "Se ha cambiado el nombre de la carpeta a %1$s" "Carpeta: %1$s" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 4789374384..5a94bd67be 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -26,7 +26,8 @@ "Rakendus ei ole saadaval" "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" - "Vidina valimiseks vajutage ja hoidke seda all." + + "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "Otsimine rakendustest …" @@ -60,11 +61,14 @@ "KOPEERI IKOONID" "ALUSTA ALGUSEST" "Taustapildid, vidinad ja seaded" - "Kohandamiseks puudutage ja hoidke tausta all" + + "SELGE" "Kaust on avatud, %1$d x %2$d" - "Puudutage kausta sulgemiseks" - "Puudutage uue nime salvestamiseks" + + + + "Kaust on suletud" "Kausta uus nimi: %1$s" "Kaust: %1$s" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 5d740e42fd..99550ee818 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -26,7 +26,7 @@ "Ez dago erabilgarri aplikazioa" "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" - "Eduki ukituta widgeta aukeratzeko." + "Widgeta aukeratzeko, eduki ezazu sakatuta." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" "Bilatu aplikazioetan…" @@ -60,11 +60,11 @@ "KOPIATU IKONOAK" "HASI HUTSETIK" "Horma-paperak, widgetak eta ezarpenak" - "Pertsonalizatzeko, eduki ukituta atzeko planoa" + "Pertsonalizatzeko, eduki sakatuta atzeko planoa" "ADOS" "Karpeta ireki da: %1$d x %2$d" - "Karpeta ixteko, uki ezazu" - "Karpetaren izen berria gordetzeko, uki ezazu" + "Karpeta ixteko, sakatu hau" + "Izen berria gordetzeko, sakatu hau" "Karpeta itxi da" "Karpetari %1$s izena eman zaio" "Karpeta: %1$s" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 59ad6be75c..1f9e31f9ae 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -26,7 +26,8 @@ "برنامه در دسترس نیست" "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" - "برای انتخاب ابزارک لمس کنید و نگه دارید." + + "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "جستجوی برنامه‌ها…‏‏" @@ -60,11 +61,14 @@ "کپی نمادها" "شروع تازه" "کاغذدیواری‌ها، ابزارک‌ها و تنظیمات" - "برای سفارشی کردن، پس‌زمینه را لمس کنید و نگه‌دارید" + + "متوجه شدم" "پوشه باز شده، %1$d در %2$d" - "برای بستن پوشه لمس کنید" - "برای ذخیره تغییر نام لمس کنید" + + + + "پوشه بسته شد" "نام پوشه به %1$s تغییر کرد" "پوشه: %1$s" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 151ea7889f..88586b1c1d 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -26,7 +26,8 @@ "Sovellus ei ole käytettävissä" "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" - "Valitse widget painamalla sitä pitkään." + + "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Hae sovelluksia…" @@ -60,11 +61,14 @@ "KOPIOI KUVAKKEET" "ALOITA ALUSTA" "Taustakuvat, widgetit ja asetukset" - "Muokkaa taustaa koskettamalla ja painamalla pitkään" + + "SELVÄ" "Kansio avattu, koko %1$d x %2$d" - "Sulje kansio koskettamalla" - "Tallenna uudella nimellä koskettamalla" + + + + "Kansio on suljettu" "Kansion nimeksi vaihdettiin %1$s" "Kansio: %1$s" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index a3b5e37400..cbde868c3b 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -26,7 +26,8 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" - "Maintenez un doigt sur le widget pour l\'ajouter." + + "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "Rechercher des applications..." @@ -60,11 +61,14 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - "Maintenez le doigt sur le fond d\'écran pour personnaliser" + + "J\'ai compris" "Dossier ouvert, %1$d par %2$d" - "Toucher pour fermer le dossier" - "Toucher pour enregistrer le nouveau nom" + + + + "Dossier fermé" "Nouveau nom du dossier : %1$s" "Dossier : %1$s" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 0fddd68ca0..fe4a88c07a 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -26,7 +26,8 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." - "App. de manière prolongée pour sélectionner widget." + + "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "Rechercher des applications…" @@ -60,11 +61,14 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - "Appuyez de manière prolongée sur l\'arrière-plan pour le personnaliser." + + "OK" "Dossier ouvert, %1$d par %2$d" - "Appuyez pour fermer le dossier." - "Appuyez pour enregistrer le nouveau nom." + + + + "Dossier fermé" "Nouveau nom du dossier : %1$s" "Dossier \"%1$s\"" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 1d10d032c2..07281ef7d4 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -26,7 +26,8 @@ "A aplicación non está dispoñible" "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" - "Mantén premido un widget para seleccionalo." + + "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "Aplicacións de busca..." @@ -60,11 +61,14 @@ "COPIAR ICONAS" "COMEZAR DE CERO" "Fondos pantalla, widgets e configuración" - "Mantén tocado o segundo plano para personalizar" + + "DE ACORDO" "Abriuse o cartafol, %1$d por %2$d" - "Toca para pechar o cartafol" - "Toca para gardar o cambio de nome" + + + + "Pechouse o cartafol" "O cartafol cambiou o nome a %1$s" "Cartafol: %1$s" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 9f2107cdfe..6e03666db9 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -26,7 +26,7 @@ "એપ્લિકેશન ઉપલબ્ધ નથી" "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ એપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" - "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." + "વિજેટ ચૂંટવા માટે ટૅપ કરીને આંગળી દાબેલી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "ઍપ્લિકેશનોમાં શોધો…" @@ -60,11 +60,11 @@ "આયકન્સને કૉપિ કરો" "નવેસરથી પ્રારંભ કરો" "વૉલપેપર્સ, વિજેટ્સ અને સેટિંગ્સ" - "પૃષ્ઠભૂમિને કસ્ટમાઇઝ કરવા માટે ટચ કરો અને પકડી રાખો" + "કસ્ટમાઇઝ કરવા માટે પૃષ્ઠભૂમિને ટૅપ કરીને આંગળી દાબેલી રાખો" "સમજાઈ ગયું" "%1$d બાય %2$d નું ફોલ્ડર ખોલ્યું" - "ફોલ્ડર બંધ કરવા માટે ટચ કરો" - "નામ બદલવાનું સાચવવા માટે ટચ કરો" + "ફોલ્ડર બંધ કરવા માટે ટૅપ કરો" + "નામ બદલવાનું સાચવવા માટે ટૅપ કરો" "ફોલ્ડર બંધ કર્યું" "ફોલ્ડરનું નામ બદલીને %1$s કર્યું" "ફોલ્ડર: %1$s" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index f4179105c4..9faabfb8fa 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -26,7 +26,7 @@ "ऐप्स उपलब्ध नहीं है" "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" - "विजेट को चुनने के लिए स्‍पर्श करके रखें." + "कोई विजेट चुनने के लिए टैप करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" "ऐप्स खोजें…" @@ -60,11 +60,11 @@ "आइकन की प्रतिलिपि बनाएं" "फिर से शुरू करें" "वॉलपेपर, शॉर्टकट और सेटिंग" - "पृष्ठभूमि कस्टमाइज़ करने के लिए स्पर्श करके रखें" + "पृष्ठभूमि कस्टमाइज़ करने के लिए टैप करके रखें" "समझ लिया" "फ़ोल्डर खोला गया, %1$d गुणा %2$d" - "फ़ोल्‍डर बंद करने के लिए स्‍पर्श करें" - "बदला गया नाम सहेजने के लिए स्पर्श करें" + "फ़ोल्डर बंद करने के लिए टैप करें" + "नाम बदलना सहेजने के लिए टैप करें" "फ़ोल्डर बंद किया गया" "फ़ोल्डर का नाम बदलकर %1$s किया गया" "फ़ोल्डर: %1$s" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 4426c1808e..d4c17080ed 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -26,7 +26,7 @@ "Aplikacija nije dostupna" "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" - "Dodirnite i držite kako biste podigli widget." + "Dodirnite i zadržite da biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" "Pretraživanje aplikacija…" @@ -60,11 +60,11 @@ "KOPIRAJ IKONE" "POKRENI NOVO" "Pozadine, widgeti i postavke" - "Dodirnite i zadržite pozadinu radi prilagodbe" + "Dodirnite i zadržite pozadinu da biste je prilagodili" "SHVAĆAM" "Mapa je otvorena, %1$d x %2$d" - "Dodirnite da biste zatvorili mapu" - "Dodirnite da biste spremili preimenovanje" + "Dodirnite da biste zatvorili mapu" + "Dodirnite da biste spremili promijenjeni naziv" "Mapa je zatvorena" "Mapa je preimenovana u %1$s" "Mapa: %1$s" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 1382b9933c..c1c47b6a79 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -26,7 +26,8 @@ "Az alkalmazás nem érhető el" "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" - "Modul felvételéhez érintse meg, és tartsa lenyomva" + + "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "Alkalmazások keresése…" @@ -60,11 +61,14 @@ "IKONOK MÁSOLÁSA" "TELJESEN ÚJ" "Háttérképek, modulok és beállítások" - "Érintse meg és tartsa lenyomva a személyre szabáshoz" + + "MEGÉRTETTEM" "Mappa megnyitva – szélesség: %1$d; magasság: %2$d" - "Érintse meg a mappa bezárásához" - "Érintse meg az átnevezés mentéséhez" + + + + "Mappa lezárva" "A mappa új neve: %1$s" "Mappa: %1$s" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 2538bd289a..965797c5db 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -26,7 +26,8 @@ "Հավելվածը հասանելի չէ" "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" - "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" + + "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Հավելվածների որոնում…" @@ -60,11 +61,14 @@ "ՊԱՏՃԵՆԵԼ ՊԱՏԿԵՐԱԿՆԵՐԸ" "ՄԵԿՆԱՐԿԵԼ ԸՍՏ ԿԱՆԽԱԴՐՎԱԾԻ" "Պաստառներ, վիջեթներ և կարգավորումներ" - "Հարմարեցնելու համար հպեք և պահեք հետնաշերտի վրա" + + "ՀԱՍԿԱՆԱԼԻ Է" "Պանակը բաց է, %1$d-ից %2$d" - "Հպեք՝ պանակը փակելու համար" - "Հպեք՝ վերանվանումը պահելու համար" + + + + "Պանակը փակ է" "Պանակը վերանվանվեց %1$s" "Թղթապանակ՝ %1$s" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 9670ea6b86..c694c86b5b 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -26,7 +26,7 @@ "Aplikasi tidak tersedia" "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" - "Sentuh lama untuk memilih widget." + "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "Telusuri Aplikasi..." @@ -60,11 +60,11 @@ "IKON SALIN" "MULAI DARI AWAL" "Wallpaper, widget, & setelan" - "Sentuh & tahan latar belakang untuk menyesuaikan" + "Sentuh lama latar belakang untuk menyesuaikan" "MENGERTI" "Folder dibuka, %1$d x %2$d" - "Sentuh untuk menutup folder" - "Sentuh untuk menyimpan ganti nama" + "Ketuk untuk menutup folder" + "Ketuk untuk menyimpan ganti nama" "Folder ditutup" "Folder diganti namanya menjadi %1$s" "Folder: %1$s" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index cee6c53d6b..d140115f0d 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -26,7 +26,8 @@ "Forritið er ekki í boði" "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" - "Haltu fingri á græju til að grípa hana." + + "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "Leita í forritum…" @@ -60,11 +61,14 @@ "AFRITA TÁKN" "BYRJA UPP Á NÝTT" "Veggfóður, græjur og stillingar" - "Haltu fingri á bakgrunninum til að sérsníða hann" + + "ÉG SKIL" "Mappa opnuð, %1$d sinnum %2$d" - "Snertu til að loka möppunni" - "Snertu til að staðfesta nýtt heiti" + + + + "Möppu lokað" "Heiti möppu breytt í %1$s" "Mappa: %1$s" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 95a13b74c9..af7e3cb401 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -26,7 +26,7 @@ "App non disponibile" "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" - "Tocca e tieni premuto per scegliere un widget." + "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" "Ricerca app…" @@ -60,11 +60,11 @@ "COPIA ICONE" "RICOMINCIA" "Sfondi, widget e impostazioni" - "Tocca lo sfondo e tieni premuto per personalizzare" + "Tocca lo sfondo e tieni premuto per personalizzare" "OK" "Cartella aperta, %1$d per %2$d" - "Tocca per chiudere la cartella" - "Tocca per salvare nuovo nome" + "Tocca per chiudere la cartella" + "Tocca per salvare il nuovo nome" "Cartella chiusa" "Nome della cartella sostituito con %1$s" "Cartella: %1$s" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 0cdb6967fb..95bc169917 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -26,7 +26,7 @@ "האפליקציה אינה זמינה" "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" - "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." + "הקש הקשה רציפה על הווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" "חיפוש אפליקציות..." @@ -60,11 +60,11 @@ "העתק סמלים" "התחל דף חדש" "טפטים, ווידג\'טים והגדרות" - "גע והחזק ברקע לביצוע התאמה אישית" + "הקשה רציפה על הרקע לצורך התאמה אישית" "הבנתי" "תיקיה פתוחה, %1$d על %2$d" - "גע כדי לסגור את התיקיה" - "גע כדי לשמור את שינוי השם" + "הקש כדי לסגור את התיקייה" + "הקש כדי לשמור שינוי שם" "התיקיה נסגרה" "שם התיקיה שונה ל-%1$s" "תיקיה: %1$s" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 3df18bfeb8..13e4060663 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -26,7 +26,7 @@ "このアプリは使用できません" "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" - "ウィジェットを追加するには押し続けます。" + "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" "アプリを検索…" @@ -60,11 +60,11 @@ "アイコンをコピー" "初期状態にリセットする" "壁紙、ウィジェット、設定" - "カスタマイズするには背景を押し続けます" + "カスタマイズするにはバックグラウンドを押し続けます" "OK" "フォルダが開いています。%1$dx%2$dの大きさです" - "タップしてフォルダを閉じます" - "タップして名前の変更を保存します" + "タップしてフォルダを閉じます" + "タップして変更後の名前を保存します" "フォルダは閉じています" "フォルダの名前を「%1$s」に変更しました" "フォルダ: %1$s" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 6970f9d6ab..ee334fda44 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -26,7 +26,8 @@ "აპი მიუწვდომელია" "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" - "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." + + "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "აპების ძიება…" @@ -60,11 +61,14 @@ "ხატულების კოპირება" "სტანდარტული განლაგება" "ფონები, ვიჯეტები, & პარამეტრები" - "მოსარგებად შეეხეთ & დააყოვნეთ ფონზე" + + "გასაგებია" "საქაღალდე გახსნილია, %1$d x %2$d" - "შეეხეთ საქაღალდის დასახურად" - "შეეხეთ ახალი სახელის შესანახად" + + + + "საქაღალდე დაიხურა" "საქაღალდეს შეეცვალა სახელი „%1$s“-ად" "საქაღალდე: %1$s" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index f48c7a1aa2..2f70622bb0 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -26,7 +26,8 @@ "Қолданба қол жетімді емес" "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" - "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." + + "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Қолданбаларды іздеу…" @@ -60,11 +61,14 @@ "ТАҢБАЛАРДЫ КӨШІРУ" "ЖАҢАДАН БАСТАУ" "Тұсқағаздар, виджеттер және параметрлер" - "Теңшеу үшін фонды түртіп, ұстап тұрыңыз" + + "ТҮСІНДІМ" "Қалта ашылды, %1$d және %2$d" - "Қалтаны жабу үшін түртіңіз" - "Өзгертілген атауын сақтау үшін түртіңіз" + + + + "Қалта жабылды" "Қалта атауы %1$s болып өзгертілді" "Қалта: %1$s" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 6a9feef4f5..4656c9cffa 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -26,7 +26,7 @@ "មិន​មាន​កម្មវិធី" "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" - "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" + "ប៉ះ និងសង្កត់ឲ្យជាប់ដើម្បីជ្រើសធាតុក្រាហ្វិក" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" "ស្វែងរកកម្មវិធី…" @@ -60,11 +60,11 @@ "រូប​តំណាង​ច្បាប់​ចម្លង" "ចាប់ផ្ដើម​ធ្វើ​ឲ្យ​ស្រស់" "ផ្ទាំងរូបភាព,ធាតុក្រាហ្វិក & ការកំណត់" - "ប៉ះ & សង្កត់​ផ្ទៃ​ខាង​ក្រោយ​ដើម្បី​ប្ដូរ​តាម​​តម្រូវ​ការ" + "ប៉ះ និងសង្កត់ផ្ទៃខាងក្រោយឲ្យជាប់ដើម្បីប្ដូរតាមបំណង" "យល់​ហើយ" "បាន​បើក​ថត %1$d ដោយ %2$d" - "ប៉ះ ដើម្បី​បិទ​ថត" - "ប៉ះ ដើម្បី​រក្សាទុក​ការ​ប្ដូរ​ឈ្មោះ" + "ប៉ះ ដើម្បីបិទថត" + "ប៉ះដើម្បីរក្សាទុកឈ្មោះដែលបានប្តូរ" "បាន​បិទ​ថត" "បាន​ប្ដូរ​ឈ្មោះ​ថត​ជា %1$s" "ថត៖ %1$s" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index c033ea1996..0511d4909f 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -26,7 +26,7 @@ "ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ" "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" - "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." + "ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಟ್ಯಾಪ್ ಮಾಡಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." @@ -60,11 +60,11 @@ "ಐಕಾನ್‌ಗಳನ್ನು ನಕಲಿಸು" "ಹೊಸದಾಗಿ ಪ್ರಾರಂಭಿಸು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು, ವಿಜೆಟ್‌ಗಳು, & ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - "ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹಿನ್ನೆಲೆಯನ್ನು ಸ್ಪರ್ಶಿಸಿ & ಒತ್ತಿ ಹಿಡಿಯಿರಿ" + "ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹಿನ್ನೆಲೆಯನ್ನು ಹೋಲ್ಡ್‌ ಮಾಡಿ ಮತ್ತು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಅರ್ಥವಾಯಿತು" "ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, %1$d ಬೈ %2$d" - "ಫೋಲ್ಡರ್‌ ಮುಚ್ಚಲು ಸ್ಪರ್ಶಿಸಿ" - "ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ" + "ಫೋಲ್ಡರ್‌ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ" + "ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಫೋಲ್ಡರ್ ಮುಚ್ಚಿದೆ" "ಫೋಲ್ಡರ್‌ ಅನ್ನು %1$s ಗೆ ಮರುಹೆಸರಿಸಲಾಗಿದೆ" "ಫೋಲ್ಡರ್: %1$s" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 37fef014a5..425174e679 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -26,7 +26,7 @@ "앱을 사용할 수 없음" "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" - "위젯을 선택하려면 길게 터치하세요." + "길게 탭하여 위젯 선택" "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" "앱 검색..." @@ -60,11 +60,11 @@ "아이콘 복사" "새로 시작" "배경화면, 위젯, 설정" - "백그라운드를 길게 터치하여 맞춤설정합니다." + "백그라운드를 길게 탭하여 맞춤설정" "확인" "폴더 열림(%1$dX%2$d)" - "터치하여 폴더를 닫음" - "터치하여 바꾼 이름을 저장" + "탭하여 폴더를 닫음" + "탭하여 변경된 이름 저장" "폴더 닫음" "폴더 이름 변경: %1$s" "폴더: %1$s" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index e6ab0acf08..f26e73ce84 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -26,7 +26,8 @@ "Колдонмо жеткиликтүү эмес" "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" - "Виджетти тандаш үчүн, басып туруңуз" + + "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Колдонмолорду издөө…" @@ -60,11 +61,14 @@ "СҮРӨТЧӨЛӨРДҮ КӨЧҮРҮҮ" "ТАЗАСЫН БАШТОО" "Тушкагаздар, виджеттер & жөндөөлөр" - "Өзгөчөлөштүрүү үчүн фонго тийип & коё бербей туруңуз" + + "ТҮШҮНДҮМ" "Фолдер ачылды, туурасы %1$d, бийиктиги %2$d" - "Фолдерди жабыш үчүн тийиңиз" - "Тийип, аттын өзгөртүлүшүн сактаңыз" + + + + "Фолдер жабык" "Фолдердин аты %1$s деп өзгөртүлдү" "Фолдер: %1$s" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index f4294c0738..7f21176271 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -26,7 +26,7 @@ "ແອັບຯ​ໃຊ້​ບໍ່​ໄດ້" "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" - "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." + "ແຕະຄ້າງໄວ້ເພື່ອເລືອກວິດເຈັດໃດໜຶ່ງ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" "ຄົ້ນຫາແອັບ" @@ -60,11 +60,11 @@ "ສຳເນົາໄອຄອນ" "ເລີ່ມຕົ້ນໃໝ່" "​ຮູບ​ພື້ນຫຼັງ, ວິດເຈັດ, & ​ການ​ຕັ້ງ​ຄ່າ" - "ແຕະທີ່​ພາບ​ພື້ນ​ຫລັງ​ຄ້າງ​ໄວ້​ເພື່ອ​ປັບ​ແຕ່ງ" + "ແຕະທີ່ພາບພື້ນຫລັງຄ້າງໄວ້ເພື່ອປັບແຕ່ງ" "ເຂົ້າໃຈແລ້ວ" "ເປີດໂຟນເດີແລ້ວ, %1$d ຄູນ %2$d" - "ສຳພັດເພື່ອປິດໂຟນເດີ" - "ສຳພັດເພື່ອບັນທຶກການປ່ຽນຊື່" + "ແຕະເພື່ອປິດໂຟນເດີ" + "ແຕະເພື່ອບັນທຶກການປ່ຽນຊື່" "ປິດໂຟນເດີແລ້ວ" "ປ່ຽນຊື່ໂຟນເດີເປັນ %1$s ແລ້ວ" "ໂຟນເດີ: %1$s" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 49c90697b8..cd15c4dc5c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -26,7 +26,7 @@ "Programa nepasiekiama" "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" - "Palieskite ir laikykite, kad pasirinkt. valdiklį." + "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" "Ieškoti programų..." @@ -60,11 +60,11 @@ "KOPIJUOTI PIKTOGRAMAS" "PRADĖTI IŠ NAUJO" "Ekrano fonai, valdikliai ir nustatymai" - "Jei norite tinkinti, palieskite ir palaikykite foną" + "Jei norite tinkinti, palieskite ir palaikykite foną" "SUPRATAU" "Atidarytas aplankas, %1$d ir %2$d" - "Palieskite, kad uždarytumėte aplanką" - "Palieskite, kad išsaugotumėte naują pavadinimą" + "Palieskite, kad uždarytumėte aplanką" + "Palieskite, kad išsaugotumėte pakeistą pavadinimą" "Aplankas uždarytas" "Aplankas pervardytas kaip „%1$s“" "Aplankas: „%1$s“" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 46b58c7fbf..8f1043cd3e 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -26,7 +26,8 @@ "Lietotne nav pieejama." "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" - "Lai izvēlētos logrīku, pieskarieties un turiet to." + + "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "Meklēt lietotnes…" @@ -60,11 +61,14 @@ "KOPĒT IKONAS" "SĀKT NO SĀKUMA" "Fona tapetes, logrīki un iestatījumi" - "Lai pielāgotu, pieskarieties fonam un turiet to nospiestu." + + "SAPRATU!" "Atvērta mape: %1$d x %2$d" - "Pieskarieties, lai aizvērtu mapi." - "Pieskarieties, lai saglabātu pārdēvēto nosaukumu." + + + + "Mape aizvērta" "Mape pārdēvēta par: %1$s" "Mape: %1$s" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 4dbbb24c16..12026b8d24 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -26,7 +26,8 @@ "Апликацијата не е достапна" "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" - "Допри и задржи за да се избере виџетот." + + "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "Пребарувај апликации…" @@ -60,11 +61,14 @@ "КОПИРАЈ ИКОНИ" "СТАРТУВАЈ ОД ПОЧЕТОК" "Тапети, додатоци и поставки" - "Допрете и задржете на заднината за да приспособите" + + "СФАТИВ" "Отворена е папка, %1$d на %2$d" - "Допри за да се затвори папката" - "Допри за да се зачува преименувањето" + + + + "Папката е затворена" "Папката е преименувана во %1$s" "Папка: %1$s" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 748b367ab8..85803f27a6 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -26,7 +26,8 @@ "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" - "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." + + "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "ആപ്പ്‌സ് തിരയുക…" @@ -60,11 +61,14 @@ "ഐക്കണുകൾ പകർത്തുക" "പുതുതായി ആരംഭിക്കുക" "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ എന്നിവ" - "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്‌ചാത്തലം സ്‌പർശിച്ചുപിടിക്കുക" + + "മനസ്സിലായി" "ഫോൾഡർ തുറന്നു, %1$d / %2$d" - "ഫോൾഡർ അടയ്ക്കാൻ സ്‌പർശിക്കുക" - "പേരുമാറ്റം സംരക്ഷിക്കുന്നതിന് സ്‌പർശിക്കുക" + + + + "ഫോൾഡർ അടച്ചു" "ഫോൾഡറിന്റെ പേര് %1$s എന്നായി മാറ്റി" "ഫോൾഡർ: %1$s" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index b2ae00008f..7c59295067 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -26,7 +26,7 @@ "Апп-г ашиглах боломжгүй" "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" - "Виджетийг авах бол хүрээд барина уу." + "Жижиг хэрэгсэл авахын тулд дараад, хүлээнэ үү." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" "Апп хайх..." @@ -60,11 +60,11 @@ "ДҮРСҮҮДИЙГ ХУУЛАХ" "ШИНЭЭР ЭХЛЭХ" "Дэвсгэр зураг, виджет, & тохиргоо" - "Тааруулахын тулд арын дэлгэцэнд хүрээд & барина уу" + "Тохируулахын тулд арын дэлгэцийг дараад, хүлээнэ үү" "Ойлголоо" "%1$d %2$d фолдер нээгдэв" - "Фолдер хаах бол хүрнэ үү" - "Шинэ нэрийг хадгалах бол хүрнэ үү" + "Фолдерийг хаахын тулд дарна уу" + "Шинэ нэрийг хадгалахын тулд дарна уу." "Фолдер хаагдав" "Фолдерын нэр %1$s болов" "Фолдер: %1$s" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index bcde7b0c37..09e90fb829 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -26,7 +26,8 @@ "अॅप उपलब्ध नाही" "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" - "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." + + "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "अॅप्स शोधा..." @@ -60,11 +61,14 @@ "चिन्हे कॉपी करा" "नव्याने प्रारंभ करा" "वॉलपेपर, विजेट आणि सेटिंग्ज" - "सानुकूल करण्यासाठी पार्श्वभूमीस स्पर्श करा आणि धरुन ठेवा" + + "समजले" "फोल्डर उघडले, %1$d बाय %2$d" - "फोल्डर बंद करण्यासाठी स्पर्श करा" - "नवे नाव जतन करण्यासाठी स्पर्श करा" + + + + "फोल्डर बंद" "फोल्डरचे नाव बदलून %1$s असे ठेवले" "फोल्डर: %1$s" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 1ebfd0889f..d03f813f5b 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -26,7 +26,8 @@ "Apl tidak tersedia" "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" - "Sentuh & tahan untuk mengambil widget." + + "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Cari Apl..." @@ -60,11 +61,14 @@ "SALIN IKON" "MULAKAN YANG BAHARU" "Kertas dinding, widget & tetapan" - "Sentuh & tahan latar belakang untuk memperibadikan" + + "FAHAM" "Folder dibuka, %1$d kali %2$d" - "Sentuh untuk menutup folder" - "Sentuh untuk menyimpan penamaan semula" + + + + "Folder ditutup" "Folder dinamakan semula kepada %1$s" "Folder: %1$s" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 7b94b71aae..0ac8dcb354 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -26,7 +26,8 @@ "App လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် appကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" - "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" + + "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အက်ပ်များကို ရှာဖွေပါ…" @@ -60,11 +61,14 @@ "COPY ICONS" "START FRESH" "နောက်ခံများ၊ ဝီဂျက်များ& ဆက်တင်များ" - "နောက်ခံကို စိတ်တိုင်းကျ ပြုလုပ်ရန် ထိလျက် & ကိုင်ထားပါ" + + "ရပြီ" "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" - "အကန့်ကို ပိတ်ရန် ဖိကိုင်ပါ" - "အမည်ပြောင်းခြင်း အတည်ပြုရန် ဖိကိုင်ပါ" + + + + "ပိတ်ထားသောအကန့်" "ပြောင်းလဲလိုက်သော အကန့်အမည် %1$s" "အကန့်အမည်: %1$s" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 7d0f3f0f15..989fffc57b 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -26,7 +26,8 @@ "Appen er ikke tilgjengelig" "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" - "Trykk og hold inne for å plukke opp en modul." + + "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "Søk i apper" @@ -60,11 +61,14 @@ "KOPIÉR IKONENE" "START PÅ NYTT" "Bakgrunner, moduler og innstillinger" - "Trykk og hold på bakgrunnen for å tilpasse den" + + "SKJØNNER" "Mappen er åpnet – %1$d ganger %2$d" - "Trykk for å lukke mappen" - "Trykk for å lagre det nye navnet" + + + + "Mappen ble lukket" "Mappen heter nå %1$s" "Mappe: %1$s" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 501aa560f1..fc970a4c7c 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -26,7 +26,8 @@ "अनुप्रयोग उपलब्ध छैन" "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" - "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" + + "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "अनुप्रयोगहरू खोज्नुहोस्..." @@ -60,11 +61,14 @@ "ICONS प्रतिलिप गर्नुहोस्" "START FRESH" "वालपेपरहरू, विजेट; सेटिङहरू" - "छुनुहोस् ; अनुकूलन पृष्ठभूमि होल्ड गर्नुहोस्" + + "बुझियो" "फोल्डर खुल्यो %1$d बाट %2$d" - "फोल्डर बन्द गर्नको लागि टच गर्नुहोस्" - "पुन: नामाकरण बचत गर्न टच गर्नुहोस्।" + + + + "फोल्डर बन्द भयो" "फोल्डर %1$s मा पुनःनामाकरण गरियो।" "फोल्डर: %1$s" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 8325b58fca..da202566d6 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -26,7 +26,7 @@ "App is niet beschikbaar" "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" - "Blijf aanraken om een widget toe te voegen." + "Tik lang om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" "Apps zoeken…" @@ -60,11 +60,11 @@ "PICTOGRAMMEN KOPIËREN" "OPNIEUW BEGINNEN" "Achtergronden, widgets en instellingen" - "Blijf de achtergrond aanraken om deze aan te passen" + "Tik lang op de achtergrond om deze aan te passen" "OK" "Map geopend, %1$d bij %2$d" - "Raak dit aan om de map te sluiten" - "Raak dit aan om de gewijzigde naam op te slaan" + "Tik om de map te sluiten" + "Tik om de gewijzigde naam op te slaan" "Map gesloten" "De naam van de map is gewijzigd in %1$s" "Map: %1$s" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 00e5ae34f3..73fa2ef3a5 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -26,7 +26,8 @@ "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜੇਟਸ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" - "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" + + "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "ਐਪਾਂ ਖੋਜੋ…" @@ -60,11 +61,14 @@ "ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" "ਤਾਜ਼ਾ ਸ਼ੁਰੂ ਕਰੋ" "ਵਾਲਪੇਪਰ, ਵਿਜੇਟ, & ਸੈਟਿੰਗਾਂ" - "ਅਨੁਕੂਲ ਕਰਨ ਲਈ ਪਿਛੋਕੜ ਛੋਹਵੋ & ਹੋਲਡ ਕਰੋ" + + "ਸਮਝ ਗਿਆ" "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %2$d" - "ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਛੋਹਵੋ" - "ਮੁੜ ਨਾਮ ਦਿਓ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ ਛੋਹਵੋ" + + + + "ਫੋਲਡਰ ਬੰਦ ਕੀਤਾ" "ਫੋਲਡਰ ਨੂੰ %1$s ਮੁੜ ਨਾਮ ਦਿੱਤਾ ਗਿਆ" "ਫੋਲਡਰ: %1$s" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e39d7a7bc6..97a617b9d2 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -26,7 +26,8 @@ "Aplikacja niedostępna" "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" - "Aby dodać widżet, kliknij go i przytrzymaj." + + "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szukaj w aplikacjach…" @@ -60,11 +61,14 @@ "KOPIUJ IKONY" "ZACZNIJ OD NOWA" "Tapety, widżety i ustawienia" - "Kliknij i przytrzymaj tło, by dostosować" + + "OK" "Folder otwarty, %1$d na %2$d" - "Kliknij, by zamknąć folder" - "Kliknij, by zapisać zmianę nazwy" + + + + "Folder zamknięty" "Nazwa folderu zmieniona na %1$s" "Folder: %1$s" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8bc5c0e053..5209fbc921 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -26,7 +26,7 @@ "A aplicação não está disponível" "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" - "Prima sem soltar para escolher um widget." + "Toque sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" "Pesquisar aplicações..." @@ -60,11 +60,11 @@ "COPIAR ÍCONES" "COMEÇAR DO INÍCIO" "Imagens de fundo, widgets e definições" - "Toque sem soltar no fundo para personalizar" + "Tocar sem soltar no fundo para personalizar" "COMPREENDI" "Pasta aberta, %1$d por %2$d" - "Toque para fechar a pasta" - "Toque para guardar o nome novo" + "Tocar para fechar a pasta" + "Tocar para guardar o nome novo" "Pasta fechada" "Nome de pasta alterado para %1$s" "Pasta: %1$s" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index b51574d7dc..7fb638d310 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -26,7 +26,8 @@ "O app não está disponível" "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" - "Toque e pressione para selecionar um widget." + + "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "Pesquisar apps..." @@ -60,11 +61,14 @@ "COPIAR ÍCONES" "COMEÇAR DO ZERO" "Plano de fundo, widgets e configurações" - "Toque e mantenha pressionado o segundo plano para personalizar" + + "ENTENDI" "Pasta aberta, %1$d por %2$d" - "Toque para fechar a pasta" - "Toque para salvar o novo nome" + + + + "Pasta fechada" "Pasta renomeada para %1$s" "Pasta: %1$s" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index e32e524fb3..152c2e2021 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -26,7 +26,8 @@ "Aplicația nu este disponibilă" "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" - "Atingeți lung un widget pentru a-l alege." + + "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "Căutați aplicații…" @@ -60,11 +61,14 @@ "COPIAȚI PICTOGRAMELE" "REÎNCEPEȚI" "Imagini de fundal, widgeturi și setări" - "Atingeți lung fundalul pentru a-l personaliza" + + "AM ÎNȚELES" "Dosar deschis, %1$d pe %2$d" - "Atingeți pentru a închide dosarul" - "Atingeți pentru a salva redenumirea" + + + + "Dosar închis" "Dosar redenumit %1$s" "Dosar: %1$s" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 84b9948d3d..669643af54 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -26,7 +26,8 @@ "Приложение недоступно" "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" - "Чтобы выбрать виджет, нажмите на значок и удерживайте его." + + "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Поиск приложений" @@ -60,11 +61,14 @@ "КОПИРОВАТЬ ЗНАЧКИ" "ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ МАКЕТ" "Обои, виджеты и настройки" - "Чтобы выполнить настройку, коснитесь фона и удерживайте его" + + "ОК" "Папка открыта, %1$d x %2$d" - "Нажмите, чтобы закрыть папку" - "Нажмите, чтобы подтвердить переименование" + + + + "Папка закрыта" "Папка переименована в \"%1$s\"" "Папка: %1$s" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 405035a8cd..0a0e961886 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -26,7 +26,8 @@ "යෙදුම නොතිබේ" "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" - "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." + + "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "යෙදුම් සොයන්න..." @@ -60,11 +61,14 @@ "නිරූපක පිටපත් කරන්න" "අලුතින් පටන්ගන්න" "වෝල්පේපර, විජට්, සහ සැකසීම්" - "පසුබිම අභිරුචිකරණය කිරීමට ස්පර්ශ කර අල්ලා සිටින්න" + + "තේරුණා" "ෆෝල්ඩරය විවෘත විය, %1$d හි %2$d" - "ෆෝල්ඩරය වැසීමට ස්පර්ශ කරන්න" - "නැවත නම් කිරීම සුරැකීමට ස්පර්ශ කරන්න" + + + + "ෆෝල්ඩරය වසා ඇත" "%1$s වෙත ෆෝල්ඩරය නැවත නම් කෙරිණි" "ෆෝල්ඩරය: %1$s" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 2c0938a981..53ed1e8b8d 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -26,7 +26,8 @@ "Aplikácia nie je k dispozícii" "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" - "Miniaplikáciu pridáte stlačením a podržaním." + + "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "Vyhľadávanie v aplikáciách…" @@ -60,11 +61,14 @@ "SKOPÍROVAŤ IKONY" "ZAČAŤ ODZNOVA" "Pozadia, miniaplikácie a nastavenia" - "Ak si chcete pozadie prispôsobiť, klepnite naň a podržte ho" + + "DOBRE" "Otvorený priečinok, %1$d x %2$d" - "Dotykom zavriete priečinok" - "Dotykom premenovanie uložíte" + + + + "Priečinok je uzavretý" "Priečinok bol premenovaný na %1$s" "Priečinok: %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 72e58ce4fa..48c546768f 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -26,7 +26,8 @@ "Aplikacija ni na voljo" "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" - "Za izbiro pripomočka se ga dotaknite in pridržite." + + "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Iskanje po aplikacijah …" @@ -60,11 +61,14 @@ "KOPIRAJ IKONE" "SVEŽ ZAČETEK" "Ozadja, pripomočki in nastavitve" - "Za prilagajanje se dotaknite ozadja in ga pridržite" + + "V REDU" "Mapa je odprta, %1$d krat %2$d" - "Dotaknite se, da zaprete mapo" - "Dotaknite se, da shranite preimenovanje" + + + + "Mapa je zaprta" "Mapa je preimenovana v %1$s" "Mapa: %1$s" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 5d918c03f8..b34cf2be07 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -26,7 +26,8 @@ "Aplikacioni nuk mundësohet" "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" - "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." + + "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "Kërko për aplikacione..." @@ -60,11 +61,14 @@ "KOPJO IKONA" "FILLO NGA E PARA" "Imazhe në sfond, miniaplikacione dhe cilësime" - "Prek dhe mbaj shtypur sfondin për ta personalizuar." + + "E KUPTOVA!" "Dosja u hap, %1$d me %2$d" - "Prek për të afruar dosjen" - "Prek për të ruajtur riemërtimin" + + + + "Dosja u mbyll" "Dosja u riemërtua në %1$s" "Dosja: %1$s" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 7362223065..a3f2385bce 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -26,7 +26,8 @@ "Апликација није доступна" "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" - "Додирните и задржите да бисте изабрали виџет." + + "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "Претражите апликације..." @@ -60,11 +61,14 @@ "КОПИРАЈТЕ ИКОНЕ" "ПОЧНИТЕ ИСПОЧЕТКА" "Позадине, виџети и подешавања" - "Додирните и задржите позадину да бисте прилагодили" + + "ВАЖИ" "Директоријум је отворен, %1$d пута %2$d" - "Додирните да бисте затворили директоријум" - "Додирните да бисте сачували промену имена" + + + + "Директоријум је затворен" "Директоријум је преименован у %1$s" "Директоријум: %1$s" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 49e9244822..3f63b94511 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -26,7 +26,8 @@ "Appen är inte tillgänglig" "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" - "Tryck länge om du vill flytta en widget." + + "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "Sök efter appar …" @@ -60,11 +61,14 @@ "KOPIERA IKONER" "BÖRJA OM" "Bakgrunder, widgetar och inställningar" - "Tryck länge på bakgrunden om du vill anpassa den" + + "OK" "Mappen är öppen, %1$d gånger %2$d" - "Tryck om du vill stänga mappen" - "Tryck om du vill spara det nya namnet" + + + + "Mappen är stängd" "Mappen har bytt namn till %1$s" "Mapp: %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 11dc79e604..9057ff9102 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -26,7 +26,8 @@ "Programu haipatikani" "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" - "Gusa na ushikilie ili kuteua wijeti." + + "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Tafuta Programu..." @@ -62,11 +63,14 @@ "NAKILI IKONI" "ANZA UPYA" "Mandhari, wijeti, na mipangilio" - "Gusa na ushikilie mandhari ili uweke mapendeleo" + + "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" - "Gusa ili ufunge folda" - "Gusa ili uhifadhi jina jipya" + + + + "Folda imefungwa" "Folda imebadilishwa jina kuwa %1$s" "Folda: %1$s" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index b440d56c24..1650ed03e1 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -26,7 +26,8 @@ "பயன்பாடு இல்லை" "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" - "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." + + "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "பயன்பாடுகளில் தேடுக…" @@ -60,11 +61,14 @@ "ஐகான்களை நகலெடு" "புதிதாகத் தொடங்கு" "வால்பேப்பர்கள், விட்ஜெட்கள் & அமைப்புகள்" - "தனிப்பயனாக்க, பின்னணியைத் தொட்டுப் பிடிக்கவும்" + + "புரிந்தது" "திறக்கப்பட்டக் கோப்புறை, %1$d x %2$d" - "கோப்புறையை மூட, தொடவும்" - "மறுபெயரிட்டதைச் சேமிக்க, தொடவும்" + + + + "கோப்புறை மூடப்பட்டது" "கோப்புறை %1$s என மறுபெயரிடப்பட்டது" "கோப்புறை: %1$s" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 4457b08a7c..c0e84d0a61 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -26,7 +26,7 @@ "అనువర్తనం అందుబాటులో లేదు" "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" - "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." + "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి, ఉంచండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "అనువర్తనాల్లో శోధించండి…" @@ -60,11 +60,11 @@ "చిహ్నాలను కాపీ చేయి" "తాజాగా ప్రారంభించు" "వాల్‌పేపర్‌లు, విడ్జెట్‌లు & సెట్టింగ్‌లు" - "అనుకూలీకరించడానికి నేపథ్యాన్ని నొక్కి & ఉంచండి" + "అనుకూలీకరించడానికి నేపథ్యాన్ని నొక్కి, ఉంచండి" "అర్థమైంది" "ఫోల్డర్ తెరవబడింది, %1$d X %2$d" - "ఫోల్డర్‌ను మూసివేయడానికి తాకండి" - "పేరు మార్పును సేవ్ చేయడానికి తాకండి" + "ఫోల్డర్‌ను మూసివేయడానికి నొక్కండి" + "పేరు మార్పును సేవ్ చేయడానికి నొక్కండి" "ఫోల్డర్ మూసివేయబడింది" "ఫోల్డర్ పేరు %1$sగా మార్చబడింది" "ఫోల్డర్: %1$s" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index eb67678b88..988d92c0b5 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -26,7 +26,7 @@ "แอปไม่พร้อมใช้งาน" "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" - "แตะค้างเพื่อรับวิดเจ็ต" + "แตะค้างไว้เพื่อเลือกวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" "ค้นหาแอป…" @@ -60,11 +60,11 @@ "คัดลอกไอคอน" "เริ่มต้นใหม่" "วอลเปเปอร์ วิดเจ็ต และการตั้งค่า" - "แตะพื้นหลังค้างไว้เพื่อกำหนดค่า" + "แตะพื้นหลังค้างไว้เพื่อกำหนดค่า" "รับทราบ" "เปิดโฟลเดอร์ %1$d x %2$d" - "แตะเพื่อปิดโฟลเดอร์" - "แตะเพื่อบันทึกการเปลี่ยนชื่อ" + "แตะเพื่อปิดโฟลเดอร์" + "แตะเพื่อบันทึกการเปลี่ยนชื่อ" "โฟลเดอร์ปิดอยู่" "เปลี่ยนชื่อโฟลเดอร์เป็น %1$s" "โฟลเดอร์: %1$s" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index f1cf879d17..1be6eacac5 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -26,7 +26,7 @@ "Hindi available ang app" "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" - "Pindutin nang matagal upang kumuha ng widget." + "Pindutin nang matagal upang mag-angat ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "Maghanap ng Mga App…" @@ -60,11 +60,11 @@ "KOPYAHIN ANG MGA ICON" "MAGSIMULA NANG BAGO" "Mga wallpaper, widget at setting" - "Pindutin nang matagal ang background upang i-customize" + "Pindutin nang matagal ang background upang mag-customize" "NAKUHA KO" "Binuksan ang folder, %1$d by %2$d" - "Pindutin upang isara ang folder" - "Pindutin upang i-save ang pagpapalit ng pangalan" + "I-tap upang isara ang folder" + "I-tap upang i-save ang bagong pangalan" "Nakasara ang folder" "Pinalitan ang pangalan ng folder ng %1$s" "Folder: %1$s" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 0e7637ebfb..2fea00a312 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -26,7 +26,8 @@ "Uygulama kullanılamıyor" "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" - "Widget seçmek için dokunun ve basılı tutun." + + "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "Uygulamalarda Ara…" @@ -60,11 +61,14 @@ "SİMGELERİ KOPYALA" "VARSAYILANI KULLAN" "Duvar kağıtları, widget\'lar ve ayarlar" - "Özelleştirmek için arka plana dokunun ve basılı tutun" + + "TAMAM" "Klasör açıldı, %1$d x %2$d" - "Klasörü kapatmak için dokunun" - "Yeni adı kaydetmek için dokunun" + + + + "Klasör kapatıldı" "Klasörün adı %1$s olarak değiştirildi" "Klasör: %1$s" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index aa92b09ec9..7285235fc5 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -26,7 +26,7 @@ "Додаток недоступний" "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" - "Натисніть і утримуйте, щоб вибрати віджет." + "Натисніть і втримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" "Пошук додатків…" @@ -60,11 +60,11 @@ "КОПІЮВАТИ ЗНАЧКИ" "ПАНЕЛЬ ЗАПУСКУ ЗА УМОВЧАННЯМ" "Фонові малюнки, віджети й налаштування" - "Натисніть і втримуйте фон, щоб налаштувати робочу область" + "Натисніть і втримуйте фон, щоб налаштувати" "ЗРОЗУМІЛО" "Папку відкрито (%1$d х %2$d)" - "Торкніться, щоб закрити папку" - "Торкніться, щоб зберегти нову назву" + "Торкніться, щоб закрити папку" + "Торкніться, щоб зберегти зміни" "Папку закрито" "Папку перейменовано на %1$s" "Папка %1$s" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 247465b92d..98523c26a6 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -26,7 +26,8 @@ "ایپ دستیاب نہیں ہے" "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" - "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" + + "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "ایپس تلاش کریں…" @@ -60,11 +61,14 @@ "آئیکنز کاپی کریں" "نئے سرے سے شروع کریں" "وال پیپرز، ویجیٹس اور ترتیبات" - "حسب ضرورت بنانے کیلئے پس منظر کو ٹچ کریں اور دبائے رکھیں" + + "سمجھ آ گئی" "فولڈر کھولا گیا، %1$d × %2$d" - "فولڈر بند کرنے کیلئے ٹچ کریں" - "نام کی تبدیلی محفوظ کرنے کیلئے ٹچ کریں" + + + + "فولڈر بند ہو گیا" "فولڈر کا نام تبدیل کر کے %1$s کر دیا گیا" "فولڈر: %1$s" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0084fc459b..ff1f3cb589 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,7 +26,8 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" - "Vidjetni tanlash uchun bosib turing." + + "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Ilovalarni qidirish…" @@ -60,11 +61,14 @@ "NISHONCHALARNI NUSXALASH" "YANGIDAN BOSHLASH" "Orqa fon rasmlari, vidjet va sozlamalar" - "Orqa fonni moslashtirish uchun uni bosing va ushlab turing" + + "OK" "Jild ochildi, %1$d ga %2$d" - "Jildni yopish uchun bosing" - "O‘zgartirilgan nomni saqlash uchun bosing" + + + + "Jild yopildi" "Jild nomi %1$sga o‘zgartirildi" "Jild: %1$s" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 0df0af3719..923b8f837b 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -26,7 +26,7 @@ "Ứng dụng không có sẵn" "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" - "Chạm và giữ để chọn tiện ích con." + "Nhấn và giữ để chọn tiện ích." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" "Tìm kiếm ứng dụng..." @@ -60,11 +60,11 @@ "BIỂU TƯỢNG SAO CHÉP" "BẮT ĐẦU LÀM MỚI" "Hình nền, tiện ích và cài đặt" - "Chạm và giữ nền để tùy chỉnh" + "Nhấn và giữ nền để tùy chỉnh" "OK" "Đã mở thư mục, %1$d x %2$d" - "Chạm để đóng thư mục" - "Chạm để lưu tên mới" + "Nhấn để đóng thư mục" + "Nhấn để lưu đổi tên" "Đã đóng thư mục" "Đã đổi tên thư mục thành %1$s" "Thư mục: %1$s" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 41d55ddb17..fccdf0179f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -26,7 +26,8 @@ "应用不可用" "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" - "触摸并按住小部件即可选择。" + + "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "搜索应用…" @@ -60,11 +61,14 @@ "复制图标" "使用全新配置" "壁纸、小部件和设置" - "触摸并按住背景,即可进行个性化设置" + + "知道了" "文件夹已打开,大小为%1$d×%2$d" - "触摸可关闭文件夹" - "触摸可保存新名称" + + + + "文件夹已关闭" "已将文件夹重命名为“%1$s”" "文件夹:%1$s" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 6c8e869c69..c59c714416 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -26,7 +26,7 @@ "目前無法使用這個應用程式" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" - "輕觸並按住小工具即可選取。" + "按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" "搜尋應用程式…" @@ -60,11 +60,11 @@ "複製圖示" "重新開始" "桌布、小工具和設定" - "輕觸並按住背景即可自訂" + "按住背景即可自訂" "知道了" "資料夾已開啟 (%1$d x %2$d)" - "輕觸即可關閉資料夾" - "輕觸即可儲存新改的名稱" + "輕按即可關閉資料夾" + "輕按即可儲存新名稱" "已關閉資料夾" "資料夾已重新命名為「%1$s」" "資料夾:%1$s" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 4cc3467cb0..0c39ece0b3 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -26,7 +26,7 @@ "應用程式目前無法使用" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" - "輕觸並按住小工具即可選取。" + "按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" "搜尋應用程式…" @@ -60,11 +60,11 @@ "複製圖示" "重新開始" "桌布、小工具和設定" - "輕觸並按住背景即可自訂" + "按住背景即可自訂" "知道了" "資料夾已開啟 (%1$d x %2$d)" - "輕觸即可關閉資料夾" - "輕觸即可儲存新名稱" + "輕按即可關閉資料夾" + "輕按即可儲存新名稱" "資料夾已關閉" "已將資料夾重新命名為「%1$s」" "資料夾:%1$s" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index c3eb3f436b..e840f7930c 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -26,7 +26,8 @@ "Uhlelo lokusebenza alutholakali" "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" - "Thinta uphinde ubambe ukuze uphakamise iwijethi." + + "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "Sesha izinhlelo zokusebenza..." @@ -60,11 +61,14 @@ "KOPISHA IZITHONJANA" "QALISA KABUSHA" "Izithombe zangemuva, amawijethi, nezilungiselelo" - "Thinta uphinde ubambe ingemuva ukuze wenze ngokwezifiso" + + "NGIYITHOLILE" "Ifolda ivuliwe, %1$d nge-%2$d" - "Thinta ukuze uvale ifolda" - "Thinta ukuze ulondoloze ukuqamba kabusha" + + + + "Ifolda ivaliwe" "Ifolda iqanjwe kabusha ngo-%1$s" "Ifolda: %1$s" From 77fc9746bc7f5b60fa29d2bdf10a46c72119d4c0 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Mon, 29 Feb 2016 05:26:49 -0800 Subject: [PATCH 003/382] Import translations. DO NOT MERGE Change-Id: Ifd012dd665092cbec4b999b84e26c45a0973276f Auto-generated-cl: translation import --- res/values-bg/strings.xml | 12 ++++-------- res/values-bn-rBD/strings.xml | 12 ++++-------- res/values-ca/strings.xml | 12 ++++-------- res/values-cs/strings.xml | 12 ++++-------- res/values-de/strings.xml | 12 ++++-------- res/values-el/strings.xml | 12 ++++-------- res/values-es-rUS/strings.xml | 12 ++++-------- res/values-es/strings.xml | 12 ++++-------- res/values-et-rEE/strings.xml | 12 ++++-------- res/values-fa/strings.xml | 12 ++++-------- res/values-fi/strings.xml | 12 ++++-------- res/values-fr-rCA/strings.xml | 12 ++++-------- res/values-fr/strings.xml | 12 ++++-------- res/values-gl-rES/strings.xml | 12 ++++-------- res/values-hu/strings.xml | 12 ++++-------- res/values-hy-rAM/strings.xml | 14 +++++--------- res/values-is-rIS/strings.xml | 12 ++++-------- res/values-ka-rGE/strings.xml | 12 ++++-------- res/values-kk-rKZ/strings.xml | 12 ++++-------- res/values-ko/strings.xml | 2 +- res/values-ky-rKG/strings.xml | 12 ++++-------- res/values-lv/strings.xml | 12 ++++-------- res/values-mk-rMK/strings.xml | 12 ++++-------- res/values-ml-rIN/strings.xml | 12 ++++-------- res/values-mr-rIN/strings.xml | 12 ++++-------- res/values-ms-rMY/strings.xml | 12 ++++-------- res/values-my-rMM/strings.xml | 12 ++++-------- res/values-nb/strings.xml | 12 ++++-------- res/values-ne-rNP/strings.xml | 12 ++++-------- res/values-pa-rIN/strings.xml | 12 ++++-------- res/values-pl/strings.xml | 12 ++++-------- res/values-pt/strings.xml | 12 ++++-------- res/values-ro/strings.xml | 12 ++++-------- res/values-ru/strings.xml | 12 ++++-------- res/values-si-rLK/strings.xml | 12 ++++-------- res/values-sk/strings.xml | 12 ++++-------- res/values-sl/strings.xml | 12 ++++-------- res/values-sq-rAL/strings.xml | 12 ++++-------- res/values-sr/strings.xml | 12 ++++-------- res/values-sv/strings.xml | 12 ++++-------- res/values-sw/strings.xml | 12 ++++-------- res/values-ta-rIN/strings.xml | 12 ++++-------- res/values-te-rIN/strings.xml | 2 +- res/values-tr/strings.xml | 12 ++++-------- res/values-ur-rPK/strings.xml | 12 ++++-------- res/values-uz-rUZ/strings.xml | 12 ++++-------- res/values-zh-rCN/strings.xml | 12 ++++-------- res/values-zu/strings.xml | 12 ++++-------- 48 files changed, 187 insertions(+), 371 deletions(-) diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index d54a6d4ac4..00a2339dbc 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -26,8 +26,7 @@ "Приложението не е налично" "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" - - + "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Търсене в приложенията…" @@ -61,14 +60,11 @@ "КОПИРАНЕ НА ИКОНИТЕ" "СТАРТИРАНЕ ОТНАЧАЛО" "Тапети, приспособления и настройки" - - + "Докоснете и задръжте фона, за да го персонализирате" "РАЗБРАХ" "Папката е отворена – %1$d на %2$d" - - - - + "Докоснете, за да затворите папката" + "Докоснете, за да запазите новото име" "Папката бе затворена" "Папката е преименувана на „%1$s“" "Папка: „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 2fc1008f44..dc6e772e4b 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -26,8 +26,7 @@ "অ্যাপ্লিকেশান অনুপলব্ধ" "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" - - + "একটি উইজেট বেছে নিতে আলতো চেপে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." @@ -61,14 +60,11 @@ "আইকনগুলি অনুলিপি করুন" "নতুন করে শুরু করুন" "ওয়ালপেপার, উইজেট এবং সেটিংস" - - + "কাস্টমাইজ করার জন্য পটভূমিতে আলতো চেপে ধরে রাখুন" "বুঝেছি" "ফোল্ডার খোলা হয়েছে, %1$d বাই %2$d" - - - - + "ফোল্ডার বন্ধ করতে আলতো চাপ দিন" + "পুনঃনামকরণ সংরক্ষণ করতে আলতো চাপ দিন" "ফোল্ডার বন্ধ করা হয়েছে" "ফোল্ডারের নাম পাল্টে %1$s করা হয়েছে" "ফোল্ডার: %1$s" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 7d3778c483..608c3b2367 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -26,8 +26,7 @@ "L\'aplicació no està disponible." "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." - - + "Toca i mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "Cerca a les aplicacions…" @@ -61,14 +60,11 @@ "COPIA LES ICONES." "NOU COMENÇAMENT" "Fons de pantalla, widgets i configuració" - - + "Toca i mantén premut el fons per personalitzar-lo" "D\'ACORD" "S\'ha obert la carpeta, %1$d per %2$d" - - - - + "Toca per tancar la carpeta" + "Toca per desar el nom nou" "Carpeta tancada" "S\'ha canviat el nom de la carpeta a %1$s" "Carpeta: %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 40f18e54b6..1f2c13cfec 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -26,8 +26,7 @@ "Aplikace není k dispozici." "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." - - + "Widget vyberete klepnutím a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "Hledat v aplikacích…" @@ -61,14 +60,11 @@ "ZKOPÍROVAT IKONY" "ZAČÍT S VÝCHOZÍM ROZVRŽENÍM" "Tapety, widgety a nastavení" - - + "Pozadí můžete přizpůsobit klepnutím a podržením." "ROZUMÍM" "Složka otevřena, rozměry %1$d x %2$d" - - - - + "Klepnutím složku zavřete" + "Klepnutím změnu názvu uložíte" "Složka je uzavřena" "Složka přejmenována na %1$s" "Složka: %1$s" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c8dd114650..4da85e9306 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -26,8 +26,7 @@ "App nicht verfügbar" "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" - - + "Widget zum Hinzufügen antippen und halten." "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "Apps suchen…" @@ -61,14 +60,11 @@ "Symbole kopieren" "Standardübersicht verwenden" "Hintergründe, Widgets & Einstellungen" - - + "Hintergrund zum Anpassen antippen und halten" "OK" "Ordner geöffnet, %1$d x %2$d" - - - - + "Ordner zum Schließen antippen" + "Neuen Namen zum Speichern antippen" "Ordner geschlossen" "Ordner umbenannt in %1$s" "Ordner: %1$s" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index cd6c03dda0..935dc85e05 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,8 +26,7 @@ "Η εφαρμογή δεν είναι διαθέσιμη" "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" - - + "Πατήστε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Αναζήτηση εφαρμογών…" @@ -61,14 +60,11 @@ "ΑΝΤΙΓΡΑΦΗ ΕΙΚΟΝΙΔΙΩΝ" "ΝΕΑ ΕΝΑΡΞΗ" "Ταπετσαρίες, γραφικά στοιχεία και ρυθμίσεις" - - + "Πατήστε παρατεταμένα το παρασκήνιο για προσαρμογή" "ΕΓΙΝΕ" "Άνοιγμα φακέλου, %1$d επί %2$d" - - - - + "Πατήστε για να κλείσετε το φάκελο" + "Πατήστε για να αποθηκεύσετε τη νέα ονομασία" "Ο φάκελος έκλεισε" "Ο φάκελος μετονομάστηκε σε %1$s" "Φάκελος: %1$s" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 5d1a63df87..902cc0ebc0 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -26,8 +26,7 @@ "La aplicación no está disponible." "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - - + "Mantén presionado para elegir un widget." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "Buscar apps…" @@ -61,14 +60,11 @@ "COPIAR ÍCONOS" "EMPEZAR DE CERO" "Fondos, widgets y configuración" - - + "Mantén presionado el fondo para personalizarlo" "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" - - - - + "Presiona para cerrar la carpeta" + "Presiona para guardar el cambio de nombre" "Carpeta cerrada" "El nombre de la carpeta se cambió a %1$s." "Carpeta: %1$s" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 306fe84ff9..de04464a27 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -26,8 +26,7 @@ "La aplicación no está disponible" "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - - + "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "Buscar aplicaciones…" @@ -61,14 +60,11 @@ "COPIAR ICONOS" "AJUSTES PREDETERMINADOS" "Fondos de pantalla, widgets y ajustes" - - + "Mantén pulsado el fondo para personalizarlo" "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" - - - - + "Toca para cerrar la carpeta" + "Toca para guardar el nuevo nombre" "Carpeta cerrada" "Se ha cambiado el nombre de la carpeta a %1$s" "Carpeta: %1$s" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5a94bd67be..c3cf245613 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -26,8 +26,7 @@ "Rakendus ei ole saadaval" "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" - - + "Vidina valimiseks puudutage pikalt." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "Otsimine rakendustest …" @@ -61,14 +60,11 @@ "KOPEERI IKOONID" "ALUSTA ALGUSEST" "Taustapildid, vidinad ja seaded" - - + "Kohandamiseks puudutage pikalt tausta" "SELGE" "Kaust on avatud, %1$d x %2$d" - - - - + "Puudutage kausta sulgemiseks" + "Puudutage ümbernimetamise salvestamiseks" "Kaust on suletud" "Kausta uus nimi: %1$s" "Kaust: %1$s" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 1f9e31f9ae..eec2c17115 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -26,8 +26,7 @@ "برنامه در دسترس نیست" "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" - - + "برای انتخاب ابزارک، لمس کنید و نگه‌دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "جستجوی برنامه‌ها…‏‏" @@ -61,14 +60,11 @@ "کپی نمادها" "شروع تازه" "کاغذدیواری‌ها، ابزارک‌ها و تنظیمات" - - + "برای سفارشی کردن، پس‌زمینه را لمس کنید و نگه‌دارید" "متوجه شدم" "پوشه باز شده، %1$d در %2$d" - - - - + "برای بستن پوشه، ضربه بزنید" + "برای ذخیره تغییر نام، ضربه بزنید" "پوشه بسته شد" "نام پوشه به %1$s تغییر کرد" "پوشه: %1$s" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 88586b1c1d..450b3f9aaa 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -26,8 +26,7 @@ "Sovellus ei ole käytettävissä" "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" - - + "Valitse widget koskettamalla pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Hae sovelluksia…" @@ -61,14 +60,11 @@ "KOPIOI KUVAKKEET" "ALOITA ALUSTA" "Taustakuvat, widgetit ja asetukset" - - + "Muokkaa taustaa koskettamalla pitkään." "SELVÄ" "Kansio avattu, koko %1$d x %2$d" - - - - + "Sulje kansio koskettamalla." + "Tallenna uusi nimi koskettamalla." "Kansio on suljettu" "Kansion nimeksi vaihdettiin %1$s" "Kansio: %1$s" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index cbde868c3b..36ef94ed49 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -26,8 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" - - + "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "Rechercher des applications..." @@ -61,14 +60,11 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - - + "Maintenez un doigt sur le fond d\'écran pour le personnaliser" "J\'ai compris" "Dossier ouvert, %1$d par %2$d" - - - - + "Touchez pour fermer le dossier" + "Touchez pour enregistrer le nouveau nom" "Dossier fermé" "Nouveau nom du dossier : %1$s" "Dossier : %1$s" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index fe4a88c07a..449ed68a03 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -26,8 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." - - + "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "Rechercher des applications…" @@ -61,14 +60,11 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - - + "Appuyez de manière prolongée sur l\'arrière-plan pour le personnaliser." "OK" "Dossier ouvert, %1$d par %2$d" - - - - + "Appuyez pour fermer le dossier." + "Appuyez pour enregistrer le nouveau nom du dossier." "Dossier fermé" "Nouveau nom du dossier : %1$s" "Dossier \"%1$s\"" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 07281ef7d4..0ebbd17361 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -26,8 +26,7 @@ "A aplicación non está dispoñible" "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" - - + "Mantén tocado un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "Aplicacións de busca..." @@ -61,14 +60,11 @@ "COPIAR ICONAS" "COMEZAR DE CERO" "Fondos pantalla, widgets e configuración" - - + "Mantén tocado o segundo plano para personalizalo" "DE ACORDO" "Abriuse o cartafol, %1$d por %2$d" - - - - + "Toca fóra para pechar o cartafol" + "Toca fóra para cambiar o nome do cartafol" "Pechouse o cartafol" "O cartafol cambiou o nome a %1$s" "Cartafol: %1$s" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index c1c47b6a79..16cf2c6bd6 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -26,8 +26,7 @@ "Az alkalmazás nem érhető el" "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" - - + "Modul felvételéhez koppintson, és tartsa lenyomva." "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "Alkalmazások keresése…" @@ -61,14 +60,11 @@ "IKONOK MÁSOLÁSA" "TELJESEN ÚJ" "Háttérképek, modulok és beállítások" - - + "Koppintson és tartsa lenyomva a személyre szabáshoz" "MEGÉRTETTEM" "Mappa megnyitva – szélesség: %1$d; magasság: %2$d" - - - - + "Érintse meg a mappa bezárásához" + "Koppintson ide az átnevezés mentéséhez" "Mappa lezárva" "A mappa új neve: %1$s" "Mappa: %1$s" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 965797c5db..70a4aa2d5a 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -26,8 +26,7 @@ "Հավելվածը հասանելի չէ" "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" - - + "Հպեք և պահեք՝ վիջեթ ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Հավելվածների որոնում…" @@ -61,17 +60,14 @@ "ՊԱՏՃԵՆԵԼ ՊԱՏԿԵՐԱԿՆԵՐԸ" "ՄԵԿՆԱՐԿԵԼ ԸՍՏ ԿԱՆԽԱԴՐՎԱԾԻ" "Պաստառներ, վիջեթներ և կարգավորումներ" - - + "Հարմարեցնելու համար հպեք ֆոնին և պահեք" "ՀԱՍԿԱՆԱԼԻ Է" "Պանակը բաց է, %1$d-ից %2$d" - - - - + "Հպեք՝ պանակը փակելու համար" + "Հպեք՝ նոր անվանումը պահելու համար" "Պանակը փակ է" "Պանակը վերանվանվեց %1$s" - "Թղթապանակ՝ %1$s" + "Պանակ՝ %1$s" "Վիջեթներ" "Պաստառներ" "Կարգավորումներ" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index d140115f0d..91bebb527b 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -26,8 +26,7 @@ "Forritið er ekki í boði" "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" - - + "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "Leita í forritum…" @@ -61,14 +60,11 @@ "AFRITA TÁKN" "BYRJA UPP Á NÝTT" "Veggfóður, græjur og stillingar" - - + "Haltu fingri á bakgrunninum til að sérsníða hann" "ÉG SKIL" "Mappa opnuð, %1$d sinnum %2$d" - - - - + "Ýttu til að loka möppunni" + "Ýttu til að vista breytt heiti" "Möppu lokað" "Heiti möppu breytt í %1$s" "Mappa: %1$s" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index ee334fda44..01732ecf83 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -26,8 +26,7 @@ "აპი მიუწვდომელია" "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" - - + "შეეხეთ ხანგრძლივად ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "აპების ძიება…" @@ -61,14 +60,11 @@ "ხატულების კოპირება" "სტანდარტული განლაგება" "ფონები, ვიჯეტები, & პარამეტრები" - - + "მოსარგებად, ხანგრძლივად შეეხეთ ფონს." "გასაგებია" "საქაღალდე გახსნილია, %1$d x %2$d" - - - - + "შეეხეთ საქაღალდის დასახურად" + "შეეხეთ გადარქმეული სახელის შესანახად" "საქაღალდე დაიხურა" "საქაღალდეს შეეცვალა სახელი „%1$s“-ად" "საქაღალდე: %1$s" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 2f70622bb0..001cd3e1b0 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -26,8 +26,7 @@ "Қолданба қол жетімді емес" "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" - - + "Виджетті таңдау үшін оны түртіп, ұстап тұрыңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Қолданбаларды іздеу…" @@ -61,14 +60,11 @@ "ТАҢБАЛАРДЫ КӨШІРУ" "ЖАҢАДАН БАСТАУ" "Тұсқағаздар, виджеттер және параметрлер" - - + "Теңшеу үшін фонды түртіп, ұстап тұрыңыз" "ТҮСІНДІМ" "Қалта ашылды, %1$d және %2$d" - - - - + "Қалтаны жабу үшін түртіңіз" + "Қайта атауды сақтау үшін түртіңіз" "Қалта жабылды" "Қалта атауы %1$s болып өзгертілді" "Қалта: %1$s" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 425174e679..c6413d5ef7 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -63,7 +63,7 @@ "백그라운드를 길게 탭하여 맞춤설정" "확인" "폴더 열림(%1$dX%2$d)" - "탭하여 폴더를 닫음" + "탭하여 폴더 닫기" "탭하여 변경된 이름 저장" "폴더 닫음" "폴더 이름 변경: %1$s" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index f26e73ce84..9d635e1baf 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -26,8 +26,7 @@ "Колдонмо жеткиликтүү эмес" "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" - - + "Виджетти тандаш үчүн таптап, коё бербей туруңуз." "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Колдонмолорду издөө…" @@ -61,14 +60,11 @@ "СҮРӨТЧӨЛӨРДҮ КӨЧҮРҮҮ" "ТАЗАСЫН БАШТОО" "Тушкагаздар, виджеттер & жөндөөлөр" - - + "Ыңгайлаштыруу үчүн фонду таптап, коё бербей туруңуз" "ТҮШҮНДҮМ" "Фолдер ачылды, туурасы %1$d, бийиктиги %2$d" - - - - + "Куржунду жабуу үчүн таптаңыз" + "Өзгөртүлгөн аталышын сактоо үчүн таптаңыз" "Фолдер жабык" "Фолдердин аты %1$s деп өзгөртүлдү" "Фолдер: %1$s" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 8f1043cd3e..66318fcde9 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -26,8 +26,7 @@ "Lietotne nav pieejama." "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" - - + "Lai izvēlētos logrīku, pieskarieties un turiet." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "Meklēt lietotnes…" @@ -61,14 +60,11 @@ "KOPĒT IKONAS" "SĀKT NO SĀKUMA" "Fona tapetes, logrīki un iestatījumi" - - + "Lai pielāgotu fonu, pieskarieties tam un turiet." "SAPRATU!" "Atvērta mape: %1$d x %2$d" - - - - + "Pieskarieties, lai aizvērtu mapi." + "Pieskarieties, lai saglabātu jauno nosaukumu." "Mape aizvērta" "Mape pārdēvēta par: %1$s" "Mape: %1$s" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 12026b8d24..7c44f51208 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -26,8 +26,7 @@ "Апликацијата не е достапна" "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" - - + "Допрете и задржете за да изберете додаток." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "Пребарувај апликации…" @@ -61,14 +60,11 @@ "КОПИРАЈ ИКОНИ" "СТАРТУВАЈ ОД ПОЧЕТОК" "Тапети, додатоци и поставки" - - + "Допрете и задржете на заднината за да приспособите" "СФАТИВ" "Отворена е папка, %1$d на %2$d" - - - - + "Допрете за да ја затворите папката" + "Допрете за да го зачувате преименувањето" "Папката е затворена" "Папката е преименувана во %1$s" "Папка: %1$s" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 85803f27a6..4d12adb824 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -26,8 +26,7 @@ "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" - - + "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് ടാപ്പുചെയ്ത് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "ആപ്പ്‌സ് തിരയുക…" @@ -61,14 +60,11 @@ "ഐക്കണുകൾ പകർത്തുക" "പുതുതായി ആരംഭിക്കുക" "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ എന്നിവ" - - + "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്ചാത്തലം ടാപ്പുചെയ്ത് പിടിക്കുക" "മനസ്സിലായി" "ഫോൾഡർ തുറന്നു, %1$d / %2$d" - - - - + "ഫോൾഡർ അടയ്ക്കുന്നതിന് ടാപ്പുചെയ്യുക" + "പേരുമാറ്റം സംരക്ഷിക്കുന്നതിന് ടാപ്പുചെയ്യുക" "ഫോൾഡർ അടച്ചു" "ഫോൾഡറിന്റെ പേര് %1$s എന്നായി മാറ്റി" "ഫോൾഡർ: %1$s" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 09e90fb829..7007ce08bd 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -26,8 +26,7 @@ "अॅप उपलब्ध नाही" "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" - - + "विजेट निवडण्यासाठी टॅप करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "अॅप्स शोधा..." @@ -61,14 +60,11 @@ "चिन्हे कॉपी करा" "नव्याने प्रारंभ करा" "वॉलपेपर, विजेट आणि सेटिंग्ज" - - + "सानुकूल करण्यासाठी पार्श्वभूमी टॅप करा आणि धरुन ठेवा" "समजले" "फोल्डर उघडले, %1$d बाय %2$d" - - - - + "फोल्डर बंद करण्यासाठी टॅप करा" + "पुनर्नामित करणे जतन करण्यासाठी टॅप करा" "फोल्डर बंद" "फोल्डरचे नाव बदलून %1$s असे ठेवले" "फोल्डर: %1$s" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index d03f813f5b..3b57892a14 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -26,8 +26,7 @@ "Apl tidak tersedia" "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" - - + "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Cari Apl..." @@ -61,14 +60,11 @@ "SALIN IKON" "MULAKAN YANG BAHARU" "Kertas dinding, widget & tetapan" - - + "Sentuh & tahan latar belakang untuk menyesuaikan" "FAHAM" "Folder dibuka, %1$d kali %2$d" - - - - + "Ketik untuk menutup folder" + "Ketik untuk menyimpan penamaan semula" "Folder ditutup" "Folder dinamakan semula kepada %1$s" "Folder: %1$s" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 0ac8dcb354..604893385f 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -26,8 +26,7 @@ "App လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် appကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" - - + "ဝစ်ဂျက်တစ်ခုကို ရွေးချယ်ရန် တို့၍ & ဖိထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အက်ပ်များကို ရှာဖွေပါ…" @@ -61,14 +60,11 @@ "COPY ICONS" "START FRESH" "နောက်ခံများ၊ ဝီဂျက်များ& ဆက်တင်များ" - - + "စိတ်တိုင်းကျပြုပြင်ရန် နောက်ခံတို့၍ & ဖိထားပါ" "ရပြီ" "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" - - - - + "ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ" + "အမည်ပြောင်းခြင်းကို သိမ်းဆည်းရန် တို့ပါ" "ပိတ်ထားသောအကန့်" "ပြောင်းလဲလိုက်သော အကန့်အမည် %1$s" "အကန့်အမည်: %1$s" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 989fffc57b..fe40505eff 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -26,8 +26,7 @@ "Appen er ikke tilgjengelig" "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" - - + "Trykk og hold for å legge til en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "Søk i apper" @@ -61,14 +60,11 @@ "KOPIÉR IKONENE" "START PÅ NYTT" "Bakgrunner, moduler og innstillinger" - - + "Trykk og hold på bakgrunnen for å tilpasse den" "SKJØNNER" "Mappen er åpnet – %1$d ganger %2$d" - - - - + "Trykk for å lukke mappen" + "Trykk for å lagre det nye navnet" "Mappen ble lukket" "Mappen heter nå %1$s" "Mappe: %1$s" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index fc970a4c7c..53d3bee0eb 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -26,8 +26,7 @@ "अनुप्रयोग उपलब्ध छैन" "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" - - + "विजेट छनोट गर्नका लागि ट्याप गरी थिचिरहनुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "अनुप्रयोगहरू खोज्नुहोस्..." @@ -61,14 +60,11 @@ "ICONS प्रतिलिप गर्नुहोस्" "START FRESH" "वालपेपरहरू, विजेट; सेटिङहरू" - - + "अनुकूलन गर्नका लागि पृष्ठभूमिलाई ट्याप गरी थिचिरहनुहोस्" "बुझियो" "फोल्डर खुल्यो %1$d बाट %2$d" - - - - + "फोल्डरलाई बन्द गर्न ट्याप गर्नुहोस्" + "पुनःनामाकरणलाई सुरक्षित गर्न ट्याप गर्नुहोस्" "फोल्डर बन्द भयो" "फोल्डर %1$s मा पुनःनामाकरण गरियो।" "फोल्डर: %1$s" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 73fa2ef3a5..11fbe2fd5d 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -26,8 +26,7 @@ "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜੇਟਸ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" - - + "ਇੱਕ ਵਿਜਿਟ ਨੂੰ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "ਐਪਾਂ ਖੋਜੋ…" @@ -61,14 +60,11 @@ "ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" "ਤਾਜ਼ਾ ਸ਼ੁਰੂ ਕਰੋ" "ਵਾਲਪੇਪਰ, ਵਿਜੇਟ, & ਸੈਟਿੰਗਾਂ" - - + "ਬੈਕਗ੍ਰਾਊਂਡ ਨੂੰ ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" "ਸਮਝ ਗਿਆ" "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %2$d" - - - - + "ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" + "ਬਦਲੇ ਗਏ ਨਾਮ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਫੋਲਡਰ ਬੰਦ ਕੀਤਾ" "ਫੋਲਡਰ ਨੂੰ %1$s ਮੁੜ ਨਾਮ ਦਿੱਤਾ ਗਿਆ" "ਫੋਲਡਰ: %1$s" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 97a617b9d2..f94a0dcbfc 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -26,8 +26,7 @@ "Aplikacja niedostępna" "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" - - + "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szukaj w aplikacjach…" @@ -61,14 +60,11 @@ "KOPIUJ IKONY" "ZACZNIJ OD NOWA" "Tapety, widżety i ustawienia" - - + "Kliknij i przytrzymaj tło, by je dostosować" "OK" "Folder otwarty, %1$d na %2$d" - - - - + "Kliknij, by zamknąć folder" + "Kliknij, by zapisać nową nazwę" "Folder zamknięty" "Nazwa folderu zmieniona na %1$s" "Folder: %1$s" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 7fb638d310..1c548278e4 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -26,8 +26,7 @@ "O app não está disponível" "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" - - + "Toque e segure para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "Pesquisar apps..." @@ -61,14 +60,11 @@ "COPIAR ÍCONES" "COMEÇAR DO ZERO" "Plano de fundo, widgets e configurações" - - + "Toque no segundo plano e mantenha pressionado para personalizar" "ENTENDI" "Pasta aberta, %1$d por %2$d" - - - - + "Toque para fechar a pasta" + "Toque para salvar o novo nome" "Pasta fechada" "Pasta renomeada para %1$s" "Pasta: %1$s" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 152c2e2021..0b6c162e2d 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -26,8 +26,7 @@ "Aplicația nu este disponibilă" "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" - - + "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "Căutați aplicații…" @@ -61,14 +60,11 @@ "COPIAȚI PICTOGRAMELE" "REÎNCEPEȚI" "Imagini de fundal, widgeturi și setări" - - + "Atingeți lung fundalul pentru a-l personaliza" "AM ÎNȚELES" "Dosar deschis, %1$d pe %2$d" - - - - + "Atingeți pentru a închide dosarul" + "Atingeți pentru a salva noul nume" "Dosar închis" "Dosar redenumit %1$s" "Dosar: %1$s" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 669643af54..6abf971794 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -26,8 +26,7 @@ "Приложение недоступно" "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" - - + "Чтобы выбрать виджет, коснитесь его и удерживайте." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Поиск приложений" @@ -61,14 +60,11 @@ "КОПИРОВАТЬ ЗНАЧКИ" "ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ МАКЕТ" "Обои, виджеты и настройки" - - + "Чтобы выполнить настройку, коснитесь фона и удерживайте его" "ОК" "Папка открыта, %1$d x %2$d" - - - - + "Нажмите, чтобы закрыть папку" + "Нажмите, чтобы подтвердить переименование" "Папка закрыта" "Папка переименована в \"%1$s\"" "Папка: %1$s" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 0a0e961886..8180a84c15 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -26,8 +26,7 @@ "යෙදුම නොතිබේ" "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" - - + "විජට් එකක් අහුලා ගැනීමට තට්ටු කර අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "යෙදුම් සොයන්න..." @@ -61,14 +60,11 @@ "නිරූපක පිටපත් කරන්න" "අලුතින් පටන්ගන්න" "වෝල්පේපර, විජට්, සහ සැකසීම්" - - + "අභිරුචිකරණය කිරීමට පසුබිම තට්ටු කර අල්ලාගෙන සිටින්න" "තේරුණා" "ෆෝල්ඩරය විවෘත විය, %1$d හි %2$d" - - - - + "ෆෝල්ඩරය වැසීමට තට්ටු කරන්න" + "යළි නම් කිරීම සුරැකීමට තට්ටු කරන්න" "ෆෝල්ඩරය වසා ඇත" "%1$s වෙත ෆෝල්ඩරය නැවත නම් කෙරිණි" "ෆෝල්ඩරය: %1$s" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 53ed1e8b8d..a5e2500168 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -26,8 +26,7 @@ "Aplikácia nie je k dispozícii" "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" - - + "Miniaplikáciu pridáte klepnutím a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "Vyhľadávanie v aplikáciách…" @@ -61,14 +60,11 @@ "SKOPÍROVAŤ IKONY" "ZAČAŤ ODZNOVA" "Pozadia, miniaplikácie a nastavenia" - - + "Pozadie prispôsobíte klepnutím a podržaním" "DOBRE" "Otvorený priečinok, %1$d x %2$d" - - - - + "Priečinok zavriete klepnutím" + "Nový názov uložíte klepnutím" "Priečinok je uzavretý" "Priečinok bol premenovaný na %1$s" "Priečinok: %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 48c546768f..f484396de2 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -26,8 +26,7 @@ "Aplikacija ni na voljo" "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" - - + "Pridržite pripomoček, da ga izberete." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Iskanje po aplikacijah …" @@ -61,14 +60,11 @@ "KOPIRAJ IKONE" "SVEŽ ZAČETEK" "Ozadja, pripomočki in nastavitve" - - + "Za prilagajanje pridržite ozadje" "V REDU" "Mapa je odprta, %1$d krat %2$d" - - - - + "Dotaknite se, da zaprete mapo" + "Dotaknite se, da shranite preimenovanje" "Mapa je zaprta" "Mapa je preimenovana v %1$s" "Mapa: %1$s" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index b34cf2be07..7087a5e218 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -26,8 +26,7 @@ "Aplikacioni nuk mundësohet" "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" - - + "Trokit dhe mbaj prekur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "Kërko për aplikacione..." @@ -61,14 +60,11 @@ "KOPJO IKONA" "FILLO NGA E PARA" "Imazhe në sfond, miniaplikacione dhe cilësime" - - + "Trokit dhe mbaj prekur sfondin për ta personalizuar" "E KUPTOVA!" "Dosja u hap, %1$d me %2$d" - - - - + "Trokit për të mbyllur dosjen" + "Trokit për të ruajtur riemërtimin" "Dosja u mbyll" "Dosja u riemërtua në %1$s" "Dosja: %1$s" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index a3f2385bce..6aaa497198 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -26,8 +26,7 @@ "Апликација није доступна" "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" - - + "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "Претражите апликације..." @@ -61,14 +60,11 @@ "КОПИРАЈТЕ ИКОНЕ" "ПОЧНИТЕ ИСПОЧЕТКА" "Позадине, виџети и подешавања" - - + "Додирните и задржите позадину да бисте прилагодили" "ВАЖИ" "Директоријум је отворен, %1$d пута %2$d" - - - - + "Додирните да бисте затворили директоријум" + "Додирните да бисте сачували преименовање" "Директоријум је затворен" "Директоријум је преименован у %1$s" "Директоријум: %1$s" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3f63b94511..e38086ffb0 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -26,8 +26,7 @@ "Appen är inte tillgänglig" "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" - - + "Tryck länge om du vill lägga till en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "Sök efter appar …" @@ -61,14 +60,11 @@ "KOPIERA IKONER" "BÖRJA OM" "Bakgrunder, widgetar och inställningar" - - + "Tryck länge på bakgrunden om du vill anpassa den" "OK" "Mappen är öppen, %1$d gånger %2$d" - - - - + "Tryck om du vill stänga mappen" + "Tryck om du vill spara namnändringen" "Mappen är stängd" "Mappen har bytt namn till %1$s" "Mapp: %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 9057ff9102..8460081318 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -26,8 +26,7 @@ "Programu haipatikani" "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" - - + "Gusa na ushikilie ili uteue wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Tafuta Programu..." @@ -63,14 +62,11 @@ "NAKILI IKONI" "ANZA UPYA" "Mandhari, wijeti, na mipangilio" - - + "Gusa na ushikilie mandhari ili uweke mapendeleo" "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" - - - - + "Gonga ili ufunge folda" + "Gonga ili ubadilishe jina" "Folda imefungwa" "Folda imebadilishwa jina kuwa %1$s" "Folda: %1$s" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 1650ed03e1..e22b104b53 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -26,8 +26,7 @@ "பயன்பாடு இல்லை" "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" - - + "விட்ஜெட்டைச் சேர்க்க, தொட்டுப் பிடித்திருக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "பயன்பாடுகளில் தேடுக…" @@ -61,14 +60,11 @@ "ஐகான்களை நகலெடு" "புதிதாகத் தொடங்கு" "வால்பேப்பர்கள், விட்ஜெட்கள் & அமைப்புகள்" - - + "தனிப்பயனாக்க, பின்னணியைத் தொட்டுப் பிடித்திருக்கவும்" "புரிந்தது" "திறக்கப்பட்டக் கோப்புறை, %1$d x %2$d" - - - - + "கோப்புறையை மூட, தட்டவும்" + "மாற்றிய பெயரைச் சேமிக்க, தட்டவும்" "கோப்புறை மூடப்பட்டது" "கோப்புறை %1$s என மறுபெயரிடப்பட்டது" "கோப்புறை: %1$s" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index c0e84d0a61..5f8059b32c 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -26,7 +26,7 @@ "అనువర్తనం అందుబాటులో లేదు" "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" - "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి, ఉంచండి." + "విడ్జెట్‌ను ఎంచుకోవడానికి నొక్కి, ఉంచండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "అనువర్తనాల్లో శోధించండి…" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 2fea00a312..51cbe75693 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -26,8 +26,7 @@ "Uygulama kullanılamıyor" "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" - - + "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "Uygulamalarda Ara…" @@ -61,14 +60,11 @@ "SİMGELERİ KOPYALA" "VARSAYILANI KULLAN" "Duvar kağıtları, widget\'lar ve ayarlar" - - + "Özelleştirmek için arka plana dokunun ve basılı tutun" "TAMAM" "Klasör açıldı, %1$d x %2$d" - - - - + "Klasörü kapatmak için hafifçe dokunun" + "Yeni adın kaydedilmesi için hafifçe dokunun" "Klasör kapatıldı" "Klasörün adı %1$s olarak değiştirildi" "Klasör: %1$s" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 98523c26a6..4755c46689 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -26,8 +26,7 @@ "ایپ دستیاب نہیں ہے" "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" - - + "کوئی ویجیٹ منتخب کرنے کیلئے تھپتھپائیں اور دبائے رکھیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "ایپس تلاش کریں…" @@ -61,14 +60,11 @@ "آئیکنز کاپی کریں" "نئے سرے سے شروع کریں" "وال پیپرز، ویجیٹس اور ترتیبات" - - + "حسب ضرورت بنانے کیلئے پس منظر کو تھپتھپائیں اور دبائے رکھیں" "سمجھ آ گئی" "فولڈر کھولا گیا، %1$d × %2$d" - - - - + "فولڈر کو بند کرنے کیلئے تھپتھپائیں" + "نام کی تبدیلی محفوظ کرنے کیلئے تھپتھپائیں" "فولڈر بند ہو گیا" "فولڈر کا نام تبدیل کر کے %1$s کر دیا گیا" "فولڈر: %1$s" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index ff1f3cb589..14989c3ea7 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,8 +26,7 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" - - + "Vidjetni tanlab olish uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Ilovalarni qidirish…" @@ -61,14 +60,11 @@ "NISHONCHALARNI NUSXALASH" "YANGIDAN BOSHLASH" "Orqa fon rasmlari, vidjet va sozlamalar" - - + "Orqa fonni moslashtirish uchun uni bosib turing" "OK" "Jild ochildi, %1$d ga %2$d" - - - - + "Jildni yopish uchun ustiga bosing" + "O‘zgarishni saqlash uchun ustiga bosing" "Jild yopildi" "Jild nomi %1$sga o‘zgartirildi" "Jild: %1$s" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index fccdf0179f..eb5a001751 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -26,8 +26,7 @@ "应用不可用" "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" - - + "按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "搜索应用…" @@ -61,14 +60,11 @@ "复制图标" "使用全新配置" "壁纸、小部件和设置" - - + "按住背景即可进行个性化设置" "知道了" "文件夹已打开,大小为%1$d×%2$d" - - - - + "点按可关闭文件夹" + "点按可保存新名称" "文件夹已关闭" "已将文件夹重命名为“%1$s”" "文件夹:%1$s" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index e840f7930c..5d76d36ab6 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -26,8 +26,7 @@ "Uhlelo lokusebenza alutholakali" "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" - - + "Thepha uphinde ubambe ukuze ukhethe iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "Sesha izinhlelo zokusebenza..." @@ -61,14 +60,11 @@ "KOPISHA IZITHONJANA" "QALISA KABUSHA" "Izithombe zangemuva, amawijethi, nezilungiselelo" - - + "Thepha uphinde ubambe ingemuva ukuze wenze ngendlela oyifisayo" "NGIYITHOLILE" "Ifolda ivuliwe, %1$d nge-%2$d" - - - - + "Thepa ukuze uvale ifolda" + "Thepha ukuze ulondoloze ukuqamba kabusha" "Ifolda ivaliwe" "Ifolda iqanjwe kabusha ngo-%1$s" "Ifolda: %1$s" From f4ecaa258c9b4cbf42910bb8a4cac100576b4b99 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Tue, 19 Apr 2016 02:04:54 -0700 Subject: [PATCH 004/382] Import translations. DO NOT MERGE Change-Id: Ia594dbb558f7beb6933e63eac91fdc310537fa25 Auto-generated-cl: translation import --- res/values-bn-rBD/strings.xml | 4 ++-- res/values-nl/strings.xml | 2 +- res/values-uz-rUZ/strings.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index dc6e772e4b..4e5b631325 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -55,9 +55,9 @@ "%2$dটির %1$d নম্বর হোম স্ক্রীন" "নতুন হোম স্ক্রীনের পৃষ্ঠা" "স্বাগতম" - "আপনার অ্যাপ্লিকেশান আইকনগুলি অনুলিপি করুন" + "আপনার অ্যাপ্লিকেশান আইকনগুলি কপি করুন" "আপনার পুরানো হোম স্ক্রীন থেকে আইকন এবং ফোল্ডারগুলি আমদানি করবেন?" - "আইকনগুলি অনুলিপি করুন" + "আইকনগুলি কপি করুন" "নতুন করে শুরু করুন" "ওয়ালপেপার, উইজেট এবং সেটিংস" "কাস্টমাইজ করার জন্য পটভূমিতে আলতো চেপে ধরে রাখুন" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index da202566d6..3761d9a38c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -40,7 +40,7 @@ "Verwijderen" "Deïnstalleren" "App-info" - "Snelkoppelingen instellen" + "Snelle links instellen" "Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker." "instellingen en snelkoppelingen op de startpagina lezen" "De app toestaan de instellingen en snelkoppelingen op de startpagina te lezen." diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 14989c3ea7..3e2ae58454 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -38,7 +38,7 @@ "Ilovalar" "Uy" "Olib tashlash" - "O‘chirish" + "O‘chirib tashlash" "Ilova haqida" "yorliqlar yaratish" "Ilovalarga foydalanuvchidan so‘ramasdan yorliqlar qo‘shishga ruxsat beradi." From 36a7fe5c0aacc74a4bebfd901e51c1984fde2eaa Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 25 Apr 2016 07:29:20 -0700 Subject: [PATCH 005/382] Import translations. DO NOT MERGE Change-Id: Ib82caeb7b04cd82ee0a646e397ba5c7a6c2eaacc Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 ++ res/values-am/strings.xml | 2 ++ res/values-ar/strings.xml | 2 ++ res/values-az-rAZ/strings.xml | 1 + res/values-bg/strings.xml | 2 ++ res/values-bn-rBD/strings.xml | 2 ++ res/values-ca/strings.xml | 2 ++ res/values-cs/strings.xml | 2 ++ res/values-da/strings.xml | 2 ++ res/values-de/strings.xml | 2 ++ res/values-el/strings.xml | 2 ++ res/values-en-rAU/strings.xml | 1 + res/values-en-rGB/strings.xml | 1 + res/values-en-rIN/strings.xml | 1 + res/values-es-rUS/strings.xml | 2 ++ res/values-es/strings.xml | 2 ++ res/values-et-rEE/strings.xml | 1 + res/values-eu-rES/strings.xml | 2 ++ res/values-fa/strings.xml | 2 ++ res/values-fi/strings.xml | 2 ++ res/values-fr-rCA/strings.xml | 2 ++ res/values-fr/strings.xml | 2 ++ res/values-gl-rES/strings.xml | 2 ++ res/values-gu-rIN/strings.xml | 2 ++ res/values-hi/strings.xml | 1 + res/values-hr/strings.xml | 1 + res/values-hu/strings.xml | 1 + res/values-hy-rAM/strings.xml | 2 ++ res/values-in/strings.xml | 1 + res/values-is-rIS/strings.xml | 2 ++ res/values-it/strings.xml | 1 + res/values-iw/strings.xml | 1 + res/values-ja/strings.xml | 2 ++ res/values-ka-rGE/strings.xml | 2 ++ res/values-kk-rKZ/strings.xml | 2 ++ res/values-km-rKH/strings.xml | 1 + res/values-kn-rIN/strings.xml | 2 ++ res/values-ko/strings.xml | 2 ++ res/values-ky-rKG/strings.xml | 2 ++ res/values-lo-rLA/strings.xml | 1 + res/values-lt/strings.xml | 2 ++ res/values-lv/strings.xml | 2 ++ res/values-mk-rMK/strings.xml | 2 ++ res/values-ml-rIN/strings.xml | 2 ++ res/values-mn-rMN/strings.xml | 1 + res/values-mr-rIN/strings.xml | 1 + res/values-ms-rMY/strings.xml | 2 ++ res/values-my-rMM/strings.xml | 1 + res/values-nb/strings.xml | 2 ++ res/values-ne-rNP/strings.xml | 1 + res/values-nl/strings.xml | 2 ++ res/values-pa-rIN/strings.xml | 1 + res/values-pl/strings.xml | 2 ++ res/values-pt-rPT/strings.xml | 1 + res/values-pt/strings.xml | 2 ++ res/values-ro/strings.xml | 2 ++ res/values-ru/strings.xml | 2 ++ res/values-si-rLK/strings.xml | 1 + res/values-sk/strings.xml | 1 + res/values-sl/strings.xml | 2 ++ res/values-sq-rAL/strings.xml | 2 ++ res/values-sr/strings.xml | 2 ++ res/values-sv/strings.xml | 2 ++ res/values-sw/strings.xml | 1 + res/values-ta-rIN/strings.xml | 2 ++ res/values-te-rIN/strings.xml | 1 + res/values-th/strings.xml | 1 + res/values-tl/strings.xml | 1 + res/values-tr/strings.xml | 2 ++ res/values-uk/strings.xml | 2 ++ res/values-ur-rPK/strings.xml | 2 ++ res/values-uz-rUZ/strings.xml | 2 ++ res/values-vi/strings.xml | 1 + res/values-zh-rCN/strings.xml | 2 ++ res/values-zh-rHK/strings.xml | 1 + res/values-zh-rTW/strings.xml | 5 +++-- res/values-zu/strings.xml | 2 ++ 77 files changed, 128 insertions(+), 2 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 19ed41be15..aa447953f7 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -71,6 +71,8 @@ "Legstukke" "Muurpapiere" "Instellings" + + "Laat draai toe" "Onbekend" "Verwyder" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 8887963ebe..dd54ea54e9 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -71,6 +71,8 @@ "ፍርግሞች" "የግድግዳ ወረቀቶች" "ቅንብሮች" + + "ማሽከርከርን ይፍቀዱ" "የማይታወቅ" "አስወግድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 7c5a3b025e..1a5fda7bbc 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -71,6 +71,8 @@ "الأدوات" "الخلفيات" "الإعدادات" + + "السماح بالتدوير" "غير معروفة" "إزالة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 1e041b39cd..6e051324b9 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -71,6 +71,7 @@ "Vidcet" "Divar kağızları" "Ayarlar" + "Admininiz tərəfindən deaktiv edilib" "Fırlatmağa icazə verin" "Naməlum" "Yığışdır" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 00a2339dbc..6b934c8da8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -71,6 +71,8 @@ "Приспособления" "Тапети" "Настройки" + + "Разрешаване на завъртането" "Няма информация" "Премахване" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 4e5b631325..ffa85b0584 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -71,6 +71,8 @@ "উইজেটগুলি" "ওয়ালপেপারগুলি" "সেটিংস" + + "ঘূর্ণনের অনুমতি দিন" "অজানা" "সরান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 608c3b2367..f2bf6bf4b7 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fons de pantalla" "Configuració" + + "Permet la rotació" "Desconegut" "Suprimeix" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 1f2c13cfec..7697563e07 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -71,6 +71,8 @@ "Widgety" "Tapety" "Nastavení" + + "Povolit otáčení" "Neznámé" "Odstranit" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 704158d9bb..f3a4ff70e7 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Baggrunde" "Indstillinger" + + "Tillad rotation" "Ukendt" "Fjern" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4da85e9306..ab097316e2 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Hintergründe" "Einstellungen" + + "Drehung zulassen" "Unbekannt" "Entfernen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 935dc85e05..b33ea93328 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -71,6 +71,8 @@ "Γραφικά στοιχεία" "Ταπετσαρίες" "Ρυθμίσεις" + + "Να επιτρέπεται η περιστροφή" "Άγνωστο" "Κατάργηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 873cb80c3c..09fc3a2feb 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -71,6 +71,7 @@ "Widgets" "Wallpapers" "Settings" + "Disabled by your admin" "Allow rotation" "Unknown" "Remove" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 873cb80c3c..09fc3a2feb 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -71,6 +71,7 @@ "Widgets" "Wallpapers" "Settings" + "Disabled by your admin" "Allow rotation" "Unknown" "Remove" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 873cb80c3c..09fc3a2feb 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -71,6 +71,7 @@ "Widgets" "Wallpapers" "Settings" + "Disabled by your admin" "Allow rotation" "Unknown" "Remove" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 902cc0ebc0..9aea3c7de4 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fondos de pantalla" "Configuración" + + "Permitir la rotación" "Desconocido" "Eliminar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index de04464a27..ebb8f59b45 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fondos de pantalla" "Ajustes" + + "Permitir rotación" "Desconocido" "Eliminar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index c3cf245613..371e6328cd 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -71,6 +71,7 @@ "Vidinad" "Taustapildid" "Seaded" + "Keelas administraator" "Luba pööramine" "Teadmata" "Eemalda" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 99550ee818..eefc2ac05d 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -71,6 +71,8 @@ "Widgetak" "Horma-paperak" "Ezarpenak" + + "Baimendu biratzeko aukera" "Ezezaguna" "Kendu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index eec2c17115..6203eb65be 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -71,6 +71,8 @@ "ابزارک‌ها" "کاغذدیواری‌ها" "تنظیمات" + + "چرخش مجاز است" "نامشخص" "حذف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 450b3f9aaa..6c0c894550 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -71,6 +71,8 @@ "Widgetit" "Taustakuvat" "Asetukset" + + "Salli kierto" "Tuntematon" "Poista" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 36ef94ed49..60a7641fe2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fonds d\'écran" "Paramètres" + + "Permettre la rotation" "Inconnu" "Supprimer" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 449ed68a03..cd5c5309fb 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fonds d\'écran" "Paramètres" + + "Autoriser la rotation" "Inconnu" "Supprimer" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 0ebbd17361..d5cff23769 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Fondos de pantalla" "Configuración" + + "Permitir xiro" "Descoñecido" "Eliminar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 6e03666db9..9acbd157df 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -71,6 +71,8 @@ "વિજેટ્સ" "વૉલપેપર્સ" "સેટિંગ્સ" + + "પરિભ્રમણને મંજૂરી આપો" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 9faabfb8fa..5e99e61412 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -71,6 +71,7 @@ "शॉर्टकट" "वॉलपेपर" "सेटिंग" + "आपके व्यवस्थापक द्वारा अक्षम" "रोटेशन की अनुमति दें" "अज्ञात" "निकालें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index d4c17080ed..8fe238fa14 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -71,6 +71,7 @@ "Widgeti" "Pozadine" "Postavke" + "Onemogućio administrator" "Dopusti rotaciju" "Nepoznato" "Ukloni" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 16cf2c6bd6..d750866670 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -71,6 +71,7 @@ "Modulok" "Háttérképek" "Beállítások" + "A rendszergazda letiltotta" "Elforgatás engedélyezése" "Ismeretlen" "Eltávolítás" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 70a4aa2d5a..be5e09456d 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -71,6 +71,8 @@ "Վիջեթներ" "Պաստառներ" "Կարգավորումներ" + + "Թույլ տալ պարբերական կրկնությունը" "Անհայտ է" "Հեռացնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index c694c86b5b..c9403c28e0 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -71,6 +71,7 @@ "Widget" "Wallpaper" "Setelan" + "Dinonaktifkan oleh admin" "Izinkan putaran" "Tidak dikenal" "Buang" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 91bebb527b..76b5c52006 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -71,6 +71,8 @@ "Græjur" "Veggfóður" "Stillingar" + + "Leyfa snúning" "Óþekkt" "Fjarlægja" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index af7e3cb401..90207191d4 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -71,6 +71,7 @@ "Widget" "Sfondi" "Impostazioni" + "Disattivata dall\'amministratore" "Consenti rotazione" "Sconosciuto" "Rimuovi" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 95bc169917..1e03cf59ad 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -71,6 +71,7 @@ "רכיבי ווידג\'ט" "טפטים" "הגדרות" + "הושבת על ידי מנהל המערכת שלך" "אפשרות סיבוב" "לא ידוע" "הסר" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 13e4060663..997cd68329 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -71,6 +71,8 @@ "ウィジェット" "壁紙" "設定" + + "回転を許可" "不明" "削除" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 01732ecf83..e0c7c51814 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -71,6 +71,8 @@ "ვიჯეტები" "ფონები" "პარამეტრები" + + "როტაციის დაშვება" "უცნობი" "ამოშლა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 001cd3e1b0..12d163c4b7 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -71,6 +71,8 @@ "Виджеттер" "Артқы фондар" "Параметрлер" + + "Айналуға рұқсат ету" "Белгісіз" "Алып тастау" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 4656c9cffa..6f3af8b30a 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -71,6 +71,7 @@ "ធាតុ​ក្រាហ្វិក" "ផ្ទាំង​រូបភាព" "ការកំណត់" + "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "អនុញ្ញាតឲ្យបង្វិល" "មិន​ស្គាល់" "លុបចេញ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 0511d4909f..2a36991369 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -71,6 +71,8 @@ "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" + + "ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index c6413d5ef7..e288c4dd91 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -71,6 +71,8 @@ "위젯" "배경화면" "설정" + + "회전 허용" "알 수 없음" "삭제" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 9d635e1baf..8f6a46b0a4 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -71,6 +71,8 @@ "Виджеттер" "Тушкагаздар" "Тууралоолор" + + "Айлантууга уруксат берүү" "Белгисиз" "Алып салуу" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 7f21176271..5c61e553a1 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -71,6 +71,7 @@ "ວິດເຈັດ" "ພາບພື້ນຫຼັງ" "ການຕັ້ງຄ່າ" + "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ອະ​ນຸ​ຍາດ​ການ​ໝຸນ" "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index cd15c4dc5c..8922ce4686 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -71,6 +71,8 @@ "Valdikliai" "Ekrano fonai" "Nustatymai" + + "Leisti kaitaliojimą" "Nežinoma" "Pašalinti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 66318fcde9..7e6d41f5c7 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -71,6 +71,8 @@ "Logrīki" "Fona tapetes" "Iestatījumi" + + "Rotācijas atļauja" "Nezināma" "Noņemt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 7c44f51208..de4e0f4f21 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -71,6 +71,8 @@ "Виџети" "Тапети" "Поставки" + + "Дозволи ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 4d12adb824..1f3a3a8a42 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -71,6 +71,8 @@ "വിജറ്റുകൾ" "വാൾപേപ്പറുകൾ" "ക്രമീകരണങ്ങൾ" + + "തിരിക്കൽ അനുവദിക്കുക" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 7c59295067..e9a20770c0 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -71,6 +71,7 @@ "Виджет" "Ханын зураг" "Тохиргоо" + "Таны админ идэвхгүй болгосон" "Эргүүлэхийг зөвшөөрөх" "Тодорхойгүй" "Устгах" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 7007ce08bd..a8ae19b08a 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -71,6 +71,7 @@ "विजेट" "वॉलपेपर" "सेटिंग्ज" + "आपल्या प्रशासकाने अक्षम केले" "फिरविण्‍यास अनुमती द्या" "अज्ञात" "काढा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 3b57892a14..9c7d09374a 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -71,6 +71,8 @@ "Widget" "Kertas dinding" "Tetapan" + + "Benarkan putaran" "Tidak diketahui" "Alih keluar" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 604893385f..68a95d1341 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -71,6 +71,7 @@ "ဝဒ်ဂျက်များ" "နောက်ခံများ" "အပြင်အဆင်များ" + "သင့်စီမံခန့်ခွဲသူမှ ပိတ်လိုက်ပါသည်" "လှည့်ရန် ခွင့်ပြုမည်" "မသိရ" "ဖယ်ရှားရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index fe40505eff..123d9dcf85 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -71,6 +71,8 @@ "Moduler" "Bakgrunner" "Innstillinger" + + "Tillat rotasjon" "Ukjent" "Fjern" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 53d3bee0eb..29db37d965 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -71,6 +71,7 @@ "विजेटहरू" "वालपेपरहरु" "सेटिंङहरू" + "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिक्रमणलाई अनुमति दिनुहोस्" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 3761d9a38c..e3e1eb611b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Achtergronden" "Instellingen" + + "Draaien toestaan" "Onbekend" "Verwijderen" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 11fbe2fd5d..b8a7b43e20 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -71,6 +71,7 @@ "ਵਿਜੇਟਸ" "ਵਾਲਪੇਪਰ" "ਸੈਟਿੰਗਾਂ" + "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੋਟੇਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index f94a0dcbfc..6ef40a06bc 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -71,6 +71,8 @@ "Widżety" "Tapety" "Ustawienia" + + "Zezwól na obrót" "Brak informacji" "Usuń" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 5209fbc921..fd6ddee03e 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -71,6 +71,7 @@ "Widgets" "Imagens de fundo" "Definições" + "Desativada pelo administrador" "Permitir rotação" "Desconhecido" "Remover" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 1c548278e4..0fe0d1b51f 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -71,6 +71,8 @@ "Widgets" "Planos de fundo" "Configurações" + + "Permitir rotação" "Desconhecido" "Remover" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 0b6c162e2d..3f78a4aeff 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -71,6 +71,8 @@ "Widgeturi" "Imagini de fundal" "Setări" + + "Permiteți rotirea" "Necunoscut" "Eliminați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6abf971794..151c1cf0fd 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -71,6 +71,8 @@ "Виджеты" "Обои" "Настройки" + + "Разрешить автоповорот" "Неизвестно" "Удалить" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 8180a84c15..89fb60fe35 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -71,6 +71,7 @@ "විජට්" "වෝල්පේපර" "සැකසීම්" + "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "කරකැවීමට ඉඩ දෙන්න" "නොදනී" "ඉවත් කරන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index a5e2500168..de017dc8ee 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -71,6 +71,7 @@ "Miniaplikácie" "Tapety" "Nastavenia" + "Zakázané vaším správcom" "Povoliť otáčanie" "Neznáme" "Odstrániť" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index f484396de2..97dc5d279e 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -71,6 +71,8 @@ "Pripomočki" "Ozadja" "Nastavitve" + + "Omogočanje zasuka" "Neznano" "Odstrani" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 7087a5e218..c4f0d8680b 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -71,6 +71,8 @@ "Miniaplikacionet" "Imazhet e sfondit" "Cilësimet" + + "Lejo rotacionin" "I panjohur" "Hiq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 6aaa497198..f8dd4a9b33 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -71,6 +71,8 @@ "Виџети" "Позадине" "Подешавања" + + "Дозволи ротацију" "Непознато" "Уклони" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index e38086ffb0..d130924cc3 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -71,6 +71,8 @@ "Widgetar" "Bakgrunder" "Inställningar" + + "Tillåt rotering" "Okänt" "Ta bort" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 8460081318..58c9ef059c 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -73,6 +73,7 @@ "Wijeti" "Mandhari" "Mipangilio" + "Imezimwa na msimamizi wako" "Ruhusu kuzungusha" "Yasiyojulikana" "Ondoa" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index e22b104b53..777f81f70d 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -71,6 +71,8 @@ "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" "அமைப்பு" + + "சுழற்ற அனுமதி" "தெரியாதது" "அகற்று" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 5f8059b32c..402c261d3a 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -71,6 +71,7 @@ "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" "సెట్టింగ్‌లు" + "మీ నిర్వాహకులు నిలిపివేసారు" "భ్రమణాన్ని అనుమతించండి" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 988d92c0b5..292a95bdf0 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -71,6 +71,7 @@ "วิดเจ็ต" "วอลเปเปอร์" "การตั้งค่า" + "ปิดใช้โดยผู้ดูแลระบบ" "อนุญาตให้ใช้การหมุน" "ไม่รู้จัก" "ลบ" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 1be6eacac5..5de4a9dc19 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -71,6 +71,7 @@ "Mga Widget" "Mga Wallpaper" "Mga Setting" + "Na-disable ng iyong admin" "Payagan ang pag-rotate" "Hindi kilala" "Alisin" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 51cbe75693..05bbc8ec7d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -71,6 +71,8 @@ "Widget\'lar" "Duvar Kağıtları" "Ayarlar" + + "Döndürmeye izin ver" "Bilinmiyor" "Kaldır" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 7285235fc5..6cd350a70c 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -71,6 +71,8 @@ "Віджети" "Фонові малюнки" "Налаштування" + + "Дозволити обертання" "Невідомо" "Видалити" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 4755c46689..8eceeb5e10 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -71,6 +71,8 @@ "ویجیٹس" "وال پیپرز" "ترتیبات" + + "گردش کی اجازت دیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 3e2ae58454..0f27d75f3d 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -71,6 +71,8 @@ "Vidjetlar" "Fon rasmlari" "Sozlamalar" + + "Aylanishga ruxsat berish" "Noma’lum" "O‘chirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 923b8f837b..b3e6234baf 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -71,6 +71,7 @@ "Tiện ích con" "Hình nền" "Cài đặt" + "Bị tắt bởi quản trị viên của bạn" "Cho phép xoay" "Không xác định" "Xóa" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index eb5a001751..6242644a3f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -71,6 +71,8 @@ "小部件" "壁纸" "设置" + + "允许旋转" "未知" "移除" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index c59c714416..63e853b73d 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -71,6 +71,7 @@ "小工具" "桌布" "設定" + "已由您的管理員停用" "允許旋轉" "不明" "移除" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 0c39ece0b3..2c6046fa63 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -63,14 +63,15 @@ "按住背景即可自訂" "知道了" "資料夾已開啟 (%1$d x %2$d)" - "輕按即可關閉資料夾" - "輕按即可儲存新名稱" + "輕觸即可關閉資料夾" + "輕觸即可儲存新名稱" "資料夾已關閉" "已將資料夾重新命名為「%1$s」" "資料夾:%1$s" "小工具" "桌布" "設定" + "已由您的管理員停用" "允許輪播" "不明" "移除" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 5d76d36ab6..60280e3077 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -71,6 +71,8 @@ "Amawijethi" "Izithombe zangemuva" "Izilungiselelo" + + "Vumela ukuphenduka" "Akwaziwa" "Susa" From aa520db2829326cb7065a2f70ba332d1a808c500 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Tue, 26 Apr 2016 10:40:19 -0700 Subject: [PATCH 006/382] Import translations. DO NOT MERGE Change-Id: I9c9933669dadf4e9818a5d58cb58f7e06d549c98 Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 2 +- res/values-nb/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 49 files changed, 49 insertions(+), 97 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index aa447953f7..6285171098 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -71,8 +71,7 @@ "Legstukke" "Muurpapiere" "Instellings" - - + "Gedeaktiveer deur jou administrateur" "Laat draai toe" "Onbekend" "Verwyder" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index dd54ea54e9..f862e2c23c 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -71,8 +71,7 @@ "ፍርግሞች" "የግድግዳ ወረቀቶች" "ቅንብሮች" - - + "በእርስዎ አስተዳዳሪ የተሰናከለ" "ማሽከርከርን ይፍቀዱ" "የማይታወቅ" "አስወግድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 1a5fda7bbc..21435395c8 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -71,8 +71,7 @@ "الأدوات" "الخلفيات" "الإعدادات" - - + "عطَّل المشرف هذه الميزة" "السماح بالتدوير" "غير معروفة" "إزالة" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 6b934c8da8..c85bf6b2c8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -71,8 +71,7 @@ "Приспособления" "Тапети" "Настройки" - - + "Деактивирано от администратора ви" "Разрешаване на завъртането" "Няма информация" "Премахване" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index ffa85b0584..29c218f63e 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -71,8 +71,7 @@ "উইজেটগুলি" "ওয়ালপেপারগুলি" "সেটিংস" - - + "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "ঘূর্ণনের অনুমতি দিন" "অজানা" "সরান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index f2bf6bf4b7..9f72b95811 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fons de pantalla" "Configuració" - - + "Desactivada per l\'administrador" "Permet la rotació" "Desconegut" "Suprimeix" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 7697563e07..8b3a8ed476 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -71,8 +71,7 @@ "Widgety" "Tapety" "Nastavení" - - + "Zakázáno administrátorem" "Povolit otáčení" "Neznámé" "Odstranit" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index f3a4ff70e7..e69871aac6 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Baggrunde" "Indstillinger" - - + "Deaktiveret af din administrator" "Tillad rotation" "Ukendt" "Fjern" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ab097316e2..186a06a0e0 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Hintergründe" "Einstellungen" - - + "Von deinem Administrator deaktiviert" "Drehung zulassen" "Unbekannt" "Entfernen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index b33ea93328..4f4e15feae 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -71,8 +71,7 @@ "Γραφικά στοιχεία" "Ταπετσαρίες" "Ρυθμίσεις" - - + "Απενεργοποιήθηκε από τον διαχειριστή σας" "Να επιτρέπεται η περιστροφή" "Άγνωστο" "Κατάργηση" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 9aea3c7de4..dd18c1eb43 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Configuración" - - + "El administrador inhabilitó esta función" "Permitir la rotación" "Desconocido" "Eliminar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ebb8f59b45..579dd845d7 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Ajustes" - - + "Inhabilitada por el administrador" "Permitir rotación" "Desconocido" "Eliminar" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index eefc2ac05d..fa19b45010 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -71,8 +71,7 @@ "Widgetak" "Horma-paperak" "Ezarpenak" - - + "Administratzaileak desgaitu du" "Baimendu biratzeko aukera" "Ezezaguna" "Kendu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 6203eb65be..148e0cf69b 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -71,8 +71,7 @@ "ابزارک‌ها" "کاغذدیواری‌ها" "تنظیمات" - - + "توسط سرپرست سیستم غیرفعال شده است" "چرخش مجاز است" "نامشخص" "حذف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6c0c894550..f04896a5b4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -71,8 +71,7 @@ "Widgetit" "Taustakuvat" "Asetukset" - - + "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Salli kierto" "Tuntematon" "Poista" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 60a7641fe2..b323b82fc2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fonds d\'écran" "Paramètres" - - + "Cette fonction est désactivée par votre administrateur" "Permettre la rotation" "Inconnu" "Supprimer" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index cd5c5309fb..e6d7a20e59 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fonds d\'écran" "Paramètres" - - + "Désactivé par votre administrateur" "Autoriser la rotation" "Inconnu" "Supprimer" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index d5cff23769..f402072a22 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Configuración" - - + "Función desactivada polo administrador" "Permitir xiro" "Descoñecido" "Eliminar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 9acbd157df..385d41a17c 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -71,8 +71,7 @@ "વિજેટ્સ" "વૉલપેપર્સ" "સેટિંગ્સ" - - + "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "પરિભ્રમણને મંજૂરી આપો" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index be5e09456d..a17216c9b7 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -71,8 +71,7 @@ "Վիջեթներ" "Պաստառներ" "Կարգավորումներ" - - + "Անջատվել է ձեր ադմինիստրատորի կողմից" "Թույլ տալ պարբերական կրկնությունը" "Անհայտ է" "Հեռացնել" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 76b5c52006..86f42e8856 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -71,8 +71,7 @@ "Græjur" "Veggfóður" "Stillingar" - - + "Gert óvirkt af kerfisstjóra" "Leyfa snúning" "Óþekkt" "Fjarlægja" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 997cd68329..fb06f21393 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -71,8 +71,7 @@ "ウィジェット" "壁紙" "設定" - - + "管理者により無効にされています" "回転を許可" "不明" "削除" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index e0c7c51814..b147c0377f 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -71,8 +71,7 @@ "ვიჯეტები" "ფონები" "პარამეტრები" - - + "გათიშულია თქვენი ადმინისტრატორის მიერ" "როტაციის დაშვება" "უცნობი" "ამოშლა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 12d163c4b7..61a5dcccd4 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -71,8 +71,7 @@ "Виджеттер" "Артқы фондар" "Параметрлер" - - + "Әкімші өшірді" "Айналуға рұқсат ету" "Белгісіз" "Алып тастау" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 2a36991369..3931359e84 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -71,8 +71,7 @@ "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - - + "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index e288c4dd91..ff0e63fc25 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -71,8 +71,7 @@ "위젯" "배경화면" "설정" - - + "관리자가 사용 중지함" "회전 허용" "알 수 없음" "삭제" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8f6a46b0a4..8f7aa0a598 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -71,8 +71,7 @@ "Виджеттер" "Тушкагаздар" "Тууралоолор" - - + "Администраторуңуз өчүрүп койгон" "Айлантууга уруксат берүү" "Белгисиз" "Алып салуу" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 8922ce4686..61437b6afe 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -71,8 +71,7 @@ "Valdikliai" "Ekrano fonai" "Nustatymai" - - + "Išjungė administratorius" "Leisti kaitaliojimą" "Nežinoma" "Pašalinti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 7e6d41f5c7..226467591e 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -71,8 +71,7 @@ "Logrīki" "Fona tapetes" "Iestatījumi" - - + "Atspējojis administrators" "Rotācijas atļauja" "Nezināma" "Noņemt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index de4e0f4f21..a3b76bb7a9 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -71,8 +71,7 @@ "Виџети" "Тапети" "Поставки" - - + "Оневозможено од администраторот" "Дозволи ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 1f3a3a8a42..ac4e9ae5bc 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -71,8 +71,7 @@ "വിജറ്റുകൾ" "വാൾപേപ്പറുകൾ" "ക്രമീകരണങ്ങൾ" - - + "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "തിരിക്കൽ അനുവദിക്കുക" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 9c7d09374a..e5a15e82a4 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -71,8 +71,7 @@ "Widget" "Kertas dinding" "Tetapan" - - + "Dilumpuhkan oleh pentadbir anda" "Benarkan putaran" "Tidak diketahui" "Alih keluar" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 68a95d1341..ffee1c0d4e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -71,7 +71,7 @@ "ဝဒ်ဂျက်များ" "နောက်ခံများ" "အပြင်အဆင်များ" - "သင့်စီမံခန့်ခွဲသူမှ ပိတ်လိုက်ပါသည်" + "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "လှည့်ရန် ခွင့်ပြုမည်" "မသိရ" "ဖယ်ရှားရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 123d9dcf85..be6b6441e8 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -71,8 +71,7 @@ "Moduler" "Bakgrunner" "Innstillinger" - - + "Administratoren har slått av funksjonen" "Tillat rotasjon" "Ukjent" "Fjern" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e3e1eb611b..4a22bce5cb 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Achtergronden" "Instellingen" - - + "Uitgeschakeld door je beheerder" "Draaien toestaan" "Onbekend" "Verwijderen" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 6ef40a06bc..ad9fbf4424 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -71,8 +71,7 @@ "Widżety" "Tapety" "Ustawienia" - - + "Funkcja wyłączona przez administratora" "Zezwól na obrót" "Brak informacji" "Usuń" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 0fe0d1b51f..e542418709 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Planos de fundo" "Configurações" - - + "Desativado pelo administrador" "Permitir rotação" "Desconhecido" "Remover" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 3f78a4aeff..eb54ae7bea 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -71,8 +71,7 @@ "Widgeturi" "Imagini de fundal" "Setări" - - + "Dezactivată de administrator" "Permiteți rotirea" "Necunoscut" "Eliminați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 151c1cf0fd..f73cdf22da 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -71,8 +71,7 @@ "Виджеты" "Обои" "Настройки" - - + "Функция отключена администратором" "Разрешить автоповорот" "Неизвестно" "Удалить" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 97dc5d279e..c386458b67 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -71,8 +71,7 @@ "Pripomočki" "Ozadja" "Nastavitve" - - + "Onemogočil skrbnik." "Omogočanje zasuka" "Neznano" "Odstrani" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index c4f0d8680b..ccd2c9c897 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -71,8 +71,7 @@ "Miniaplikacionet" "Imazhet e sfondit" "Cilësimet" - - + "Çaktivizuar nga administratori" "Lejo rotacionin" "I panjohur" "Hiq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f8dd4a9b33..82f44b2eac 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -71,8 +71,7 @@ "Виџети" "Позадине" "Подешавања" - - + "Администратор је онемогућио" "Дозволи ротацију" "Непознато" "Уклони" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index d130924cc3..79e8f42ba7 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -71,8 +71,7 @@ "Widgetar" "Bakgrunder" "Inställningar" - - + "Inaktiverat av administratören" "Tillåt rotering" "Okänt" "Ta bort" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 777f81f70d..ecd4cb0be0 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -71,8 +71,7 @@ "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" "அமைப்பு" - - + "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "சுழற்ற அனுமதி" "தெரியாதது" "அகற்று" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 05bbc8ec7d..44feebc885 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -71,8 +71,7 @@ "Widget\'lar" "Duvar Kağıtları" "Ayarlar" - - + "Yöneticiniz tarafından devre dışı bırakıldı" "Döndürmeye izin ver" "Bilinmiyor" "Kaldır" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 6cd350a70c..b5d81eed79 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -71,8 +71,7 @@ "Віджети" "Фонові малюнки" "Налаштування" - - + "Вимкнув адміністратор" "Дозволити обертання" "Невідомо" "Видалити" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 8eceeb5e10..bbf9d87b04 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -71,8 +71,7 @@ "ویجیٹس" "وال پیپرز" "ترتیبات" - - + "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "گردش کی اجازت دیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0f27d75f3d..0ae7d7aa9f 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -71,8 +71,7 @@ "Vidjetlar" "Fon rasmlari" "Sozlamalar" - - + "Administrator tomonidan o‘chirilgan" "Aylanishga ruxsat berish" "Noma’lum" "O‘chirish" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 60280e3077..eeffe89d51 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -71,8 +71,7 @@ "Amawijethi" "Izithombe zangemuva" "Izilungiselelo" - - + "Kukhutshazwe umlawuli wakho" "Vumela ukuphenduka" "Akwaziwa" "Susa" From e9ab7e7dc4673a35b3bb855fd4548e5491a5b5ee Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 26 Apr 2016 19:32:37 -0700 Subject: [PATCH 007/382] Import translations. DO NOT MERGE Change-Id: I7d769bfea20fb68b0420839758446ca3ca8eda6e Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 2 +- res/values-nb/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 49 files changed, 49 insertions(+), 97 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index aa447953f7..6285171098 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -71,8 +71,7 @@ "Legstukke" "Muurpapiere" "Instellings" - - + "Gedeaktiveer deur jou administrateur" "Laat draai toe" "Onbekend" "Verwyder" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index dd54ea54e9..f862e2c23c 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -71,8 +71,7 @@ "ፍርግሞች" "የግድግዳ ወረቀቶች" "ቅንብሮች" - - + "በእርስዎ አስተዳዳሪ የተሰናከለ" "ማሽከርከርን ይፍቀዱ" "የማይታወቅ" "አስወግድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 1a5fda7bbc..21435395c8 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -71,8 +71,7 @@ "الأدوات" "الخلفيات" "الإعدادات" - - + "عطَّل المشرف هذه الميزة" "السماح بالتدوير" "غير معروفة" "إزالة" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 6b934c8da8..c85bf6b2c8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -71,8 +71,7 @@ "Приспособления" "Тапети" "Настройки" - - + "Деактивирано от администратора ви" "Разрешаване на завъртането" "Няма информация" "Премахване" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index ffa85b0584..29c218f63e 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -71,8 +71,7 @@ "উইজেটগুলি" "ওয়ালপেপারগুলি" "সেটিংস" - - + "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "ঘূর্ণনের অনুমতি দিন" "অজানা" "সরান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index f2bf6bf4b7..9f72b95811 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fons de pantalla" "Configuració" - - + "Desactivada per l\'administrador" "Permet la rotació" "Desconegut" "Suprimeix" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 7697563e07..8b3a8ed476 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -71,8 +71,7 @@ "Widgety" "Tapety" "Nastavení" - - + "Zakázáno administrátorem" "Povolit otáčení" "Neznámé" "Odstranit" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index f3a4ff70e7..e69871aac6 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Baggrunde" "Indstillinger" - - + "Deaktiveret af din administrator" "Tillad rotation" "Ukendt" "Fjern" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ab097316e2..186a06a0e0 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Hintergründe" "Einstellungen" - - + "Von deinem Administrator deaktiviert" "Drehung zulassen" "Unbekannt" "Entfernen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index b33ea93328..4f4e15feae 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -71,8 +71,7 @@ "Γραφικά στοιχεία" "Ταπετσαρίες" "Ρυθμίσεις" - - + "Απενεργοποιήθηκε από τον διαχειριστή σας" "Να επιτρέπεται η περιστροφή" "Άγνωστο" "Κατάργηση" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 9aea3c7de4..dd18c1eb43 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Configuración" - - + "El administrador inhabilitó esta función" "Permitir la rotación" "Desconocido" "Eliminar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ebb8f59b45..579dd845d7 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Ajustes" - - + "Inhabilitada por el administrador" "Permitir rotación" "Desconocido" "Eliminar" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index eefc2ac05d..fa19b45010 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -71,8 +71,7 @@ "Widgetak" "Horma-paperak" "Ezarpenak" - - + "Administratzaileak desgaitu du" "Baimendu biratzeko aukera" "Ezezaguna" "Kendu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 6203eb65be..148e0cf69b 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -71,8 +71,7 @@ "ابزارک‌ها" "کاغذدیواری‌ها" "تنظیمات" - - + "توسط سرپرست سیستم غیرفعال شده است" "چرخش مجاز است" "نامشخص" "حذف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6c0c894550..f04896a5b4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -71,8 +71,7 @@ "Widgetit" "Taustakuvat" "Asetukset" - - + "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Salli kierto" "Tuntematon" "Poista" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 60a7641fe2..b323b82fc2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fonds d\'écran" "Paramètres" - - + "Cette fonction est désactivée par votre administrateur" "Permettre la rotation" "Inconnu" "Supprimer" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index cd5c5309fb..e6d7a20e59 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fonds d\'écran" "Paramètres" - - + "Désactivé par votre administrateur" "Autoriser la rotation" "Inconnu" "Supprimer" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index d5cff23769..f402072a22 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Fondos de pantalla" "Configuración" - - + "Función desactivada polo administrador" "Permitir xiro" "Descoñecido" "Eliminar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 9acbd157df..385d41a17c 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -71,8 +71,7 @@ "વિજેટ્સ" "વૉલપેપર્સ" "સેટિંગ્સ" - - + "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "પરિભ્રમણને મંજૂરી આપો" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index be5e09456d..a17216c9b7 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -71,8 +71,7 @@ "Վիջեթներ" "Պաստառներ" "Կարգավորումներ" - - + "Անջատվել է ձեր ադմինիստրատորի կողմից" "Թույլ տալ պարբերական կրկնությունը" "Անհայտ է" "Հեռացնել" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 76b5c52006..86f42e8856 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -71,8 +71,7 @@ "Græjur" "Veggfóður" "Stillingar" - - + "Gert óvirkt af kerfisstjóra" "Leyfa snúning" "Óþekkt" "Fjarlægja" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 997cd68329..fb06f21393 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -71,8 +71,7 @@ "ウィジェット" "壁紙" "設定" - - + "管理者により無効にされています" "回転を許可" "不明" "削除" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index e0c7c51814..b147c0377f 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -71,8 +71,7 @@ "ვიჯეტები" "ფონები" "პარამეტრები" - - + "გათიშულია თქვენი ადმინისტრატორის მიერ" "როტაციის დაშვება" "უცნობი" "ამოშლა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 12d163c4b7..61a5dcccd4 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -71,8 +71,7 @@ "Виджеттер" "Артқы фондар" "Параметрлер" - - + "Әкімші өшірді" "Айналуға рұқсат ету" "Белгісіз" "Алып тастау" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 2a36991369..3931359e84 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -71,8 +71,7 @@ "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - - + "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index e288c4dd91..ff0e63fc25 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -71,8 +71,7 @@ "위젯" "배경화면" "설정" - - + "관리자가 사용 중지함" "회전 허용" "알 수 없음" "삭제" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8f6a46b0a4..8f7aa0a598 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -71,8 +71,7 @@ "Виджеттер" "Тушкагаздар" "Тууралоолор" - - + "Администраторуңуз өчүрүп койгон" "Айлантууга уруксат берүү" "Белгисиз" "Алып салуу" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 8922ce4686..61437b6afe 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -71,8 +71,7 @@ "Valdikliai" "Ekrano fonai" "Nustatymai" - - + "Išjungė administratorius" "Leisti kaitaliojimą" "Nežinoma" "Pašalinti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 7e6d41f5c7..226467591e 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -71,8 +71,7 @@ "Logrīki" "Fona tapetes" "Iestatījumi" - - + "Atspējojis administrators" "Rotācijas atļauja" "Nezināma" "Noņemt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index de4e0f4f21..a3b76bb7a9 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -71,8 +71,7 @@ "Виџети" "Тапети" "Поставки" - - + "Оневозможено од администраторот" "Дозволи ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 1f3a3a8a42..ac4e9ae5bc 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -71,8 +71,7 @@ "വിജറ്റുകൾ" "വാൾപേപ്പറുകൾ" "ക്രമീകരണങ്ങൾ" - - + "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "തിരിക്കൽ അനുവദിക്കുക" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 9c7d09374a..e5a15e82a4 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -71,8 +71,7 @@ "Widget" "Kertas dinding" "Tetapan" - - + "Dilumpuhkan oleh pentadbir anda" "Benarkan putaran" "Tidak diketahui" "Alih keluar" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 68a95d1341..ffee1c0d4e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -71,7 +71,7 @@ "ဝဒ်ဂျက်များ" "နောက်ခံများ" "အပြင်အဆင်များ" - "သင့်စီမံခန့်ခွဲသူမှ ပိတ်လိုက်ပါသည်" + "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "လှည့်ရန် ခွင့်ပြုမည်" "မသိရ" "ဖယ်ရှားရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 123d9dcf85..be6b6441e8 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -71,8 +71,7 @@ "Moduler" "Bakgrunner" "Innstillinger" - - + "Administratoren har slått av funksjonen" "Tillat rotasjon" "Ukjent" "Fjern" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e3e1eb611b..4a22bce5cb 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Achtergronden" "Instellingen" - - + "Uitgeschakeld door je beheerder" "Draaien toestaan" "Onbekend" "Verwijderen" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 6ef40a06bc..ad9fbf4424 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -71,8 +71,7 @@ "Widżety" "Tapety" "Ustawienia" - - + "Funkcja wyłączona przez administratora" "Zezwól na obrót" "Brak informacji" "Usuń" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 0fe0d1b51f..e542418709 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -71,8 +71,7 @@ "Widgets" "Planos de fundo" "Configurações" - - + "Desativado pelo administrador" "Permitir rotação" "Desconhecido" "Remover" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 3f78a4aeff..eb54ae7bea 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -71,8 +71,7 @@ "Widgeturi" "Imagini de fundal" "Setări" - - + "Dezactivată de administrator" "Permiteți rotirea" "Necunoscut" "Eliminați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 151c1cf0fd..f73cdf22da 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -71,8 +71,7 @@ "Виджеты" "Обои" "Настройки" - - + "Функция отключена администратором" "Разрешить автоповорот" "Неизвестно" "Удалить" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 97dc5d279e..c386458b67 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -71,8 +71,7 @@ "Pripomočki" "Ozadja" "Nastavitve" - - + "Onemogočil skrbnik." "Omogočanje zasuka" "Neznano" "Odstrani" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index c4f0d8680b..ccd2c9c897 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -71,8 +71,7 @@ "Miniaplikacionet" "Imazhet e sfondit" "Cilësimet" - - + "Çaktivizuar nga administratori" "Lejo rotacionin" "I panjohur" "Hiq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f8dd4a9b33..82f44b2eac 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -71,8 +71,7 @@ "Виџети" "Позадине" "Подешавања" - - + "Администратор је онемогућио" "Дозволи ротацију" "Непознато" "Уклони" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index d130924cc3..79e8f42ba7 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -71,8 +71,7 @@ "Widgetar" "Bakgrunder" "Inställningar" - - + "Inaktiverat av administratören" "Tillåt rotering" "Okänt" "Ta bort" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 777f81f70d..ecd4cb0be0 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -71,8 +71,7 @@ "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" "அமைப்பு" - - + "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "சுழற்ற அனுமதி" "தெரியாதது" "அகற்று" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 05bbc8ec7d..44feebc885 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -71,8 +71,7 @@ "Widget\'lar" "Duvar Kağıtları" "Ayarlar" - - + "Yöneticiniz tarafından devre dışı bırakıldı" "Döndürmeye izin ver" "Bilinmiyor" "Kaldır" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 6cd350a70c..b5d81eed79 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -71,8 +71,7 @@ "Віджети" "Фонові малюнки" "Налаштування" - - + "Вимкнув адміністратор" "Дозволити обертання" "Невідомо" "Видалити" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 8eceeb5e10..bbf9d87b04 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -71,8 +71,7 @@ "ویجیٹس" "وال پیپرز" "ترتیبات" - - + "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "گردش کی اجازت دیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0f27d75f3d..0ae7d7aa9f 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -71,8 +71,7 @@ "Vidjetlar" "Fon rasmlari" "Sozlamalar" - - + "Administrator tomonidan o‘chirilgan" "Aylanishga ruxsat berish" "Noma’lum" "O‘chirish" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 60280e3077..eeffe89d51 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -71,8 +71,7 @@ "Amawijethi" "Izithombe zangemuva" "Izilungiselelo" - - + "Kukhutshazwe umlawuli wakho" "Vumela ukuphenduka" "Akwaziwa" "Susa" From 690a41170b1f5cdffd31fd4c4348df15ef1215c5 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Mon, 2 May 2016 13:23:55 -0700 Subject: [PATCH 008/382] Import translations. DO NOT MERGE Change-Id: I7810b992f10df06127053ac60cd954fcd6187392 Auto-generated-cl: translation import --- res/values-zh-rCN/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 6242644a3f..5911c124fc 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -71,8 +71,7 @@ "小部件" "壁纸" "设置" - - + "已被您的管理员停用" "允许旋转" "未知" "移除" From f478efd10cd15ec86f72e7075cd38b19f3023a52 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Tue, 17 May 2016 00:22:34 -0700 Subject: [PATCH 009/382] Import translations. DO NOT MERGE Change-Id: I799b7bb6b24c2ef7cd1026863cb5daae32ea346b Auto-generated-cl: translation import --- res/values-ca/strings.xml | 2 +- res/values-el/strings.xml | 2 +- res/values-gu-rIN/strings.xml | 14 +++++++------- res/values-it/strings.xml | 2 +- res/values-kk-rKZ/strings.xml | 2 +- res/values-lo-rLA/strings.xml | 2 +- res/values-ml-rIN/strings.xml | 6 +++--- res/values-mn-rMN/strings.xml | 2 +- res/values-pa-rIN/strings.xml | 2 +- res/values-sw/strings.xml | 2 +- res/values-tl/strings.xml | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 9f72b95811..4a6ba59cf0 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -54,7 +54,7 @@ "Pàgina %1$d de %2$d" "Pantalla d\'inici %1$d de %2$d" "Pàgina de la pantalla d\'inici nova" - "Us donem la benvinguda" + "Et donem la benvinguda" "Copiar les icones d\'aplicació" "Importar icones i carpetes de pantalles d\'inici anteriors?" "COPIA LES ICONES." diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 4f4e15feae..90b623533f 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -61,7 +61,7 @@ "ΝΕΑ ΕΝΑΡΞΗ" "Ταπετσαρίες, γραφικά στοιχεία και ρυθμίσεις" "Πατήστε παρατεταμένα το παρασκήνιο για προσαρμογή" - "ΕΓΙΝΕ" + "ΤΟ ΚΑΤΑΛΑΒΑ" "Άνοιγμα φακέλου, %1$d επί %2$d" "Πατήστε για να κλείσετε το φάκελο" "Πατήστε για να αποθηκεύσετε τη νέα ονομασία" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 385d41a17c..8c8a2babba 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -22,9 +22,9 @@ "Launcher3" "કાર્યાલય" - "એપ્લિકેશન ઇન્સ્ટોલ થઈ નથી." - "એપ્લિકેશન ઉપલબ્ધ નથી" - "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ એપ્લિકેશન અક્ષમ કરી" + "ઍપ્લિકેશન ઇન્સ્ટોલ થઈ નથી." + "ઍપ્લિકેશન ઉપલબ્ધ નથી" + "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" "વિજેટ ચૂંટવા માટે ટૅપ કરીને આંગળી દાબેલી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." @@ -49,13 +49,13 @@ "%1$s ને ફોન કૉલ્સ કરવાની મંજૂરી નથી" "વિજેટ લોડ કરવામાં સમસ્યા" "સેટઅપ" - "આ એક સિસ્ટમ એપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી." + "આ એક સિસ્ટમ ઍપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી." "અનામી ફોલ્ડર" "%2$d માંથી %1$d પૃષ્ઠ" "%2$d માંથી %1$d હોમ સ્ક્રીન" "નવું હોમ સ્ક્રીન પૃષ્ઠ" "સ્વાગત છે" - "તમારા એપ્લિકેશન આયકન્સને કૉપિ કરો" + "તમારા ઍપ્લિકેશન આયકન્સને કૉપિ કરો" "તમારી જૂની હોમ સ્ક્રીન્સથી આયકન્સ અને ફોલ્ડર્સને આયાત કરીએ?" "આયકન્સને કૉપિ કરો" "નવેસરથી પ્રારંભ કરો" @@ -76,8 +76,8 @@ "અજાણ્યો" "દૂર કરો" "શોધો" - "આ એપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી" - "આ આયકન માટેની એપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી. તમે તેને દૂર કરી શકો છો અથવા એપ્લિકેશન માટે શોધ કરી અને તેને મેન્યુઅલી ઇન્સ્ટોલ કરી શકો છો." + "આ ઍપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી" + "આ આયકન માટેની ઍપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી. તમે તેને દૂર કરી શકો છો અથવા ઍપ્લિકેશન માટે શોધ કરી અને તેને મેન્યુઅલી ઇન્સ્ટોલ કરી શકો છો." "%1$s ડાઉનલોડ કરી રહ્યાં છે, %2$s પૂર્ણ" "%1$s, ઇન્સ્ટૉલ થવાની રાહ જોઈ રહ્યું છે" "હોમ સ્ક્રીન પર ઉમેરો" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 90207191d4..c66cc936da 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -60,7 +60,7 @@ "COPIA ICONE" "RICOMINCIA" "Sfondi, widget e impostazioni" - "Tocca lo sfondo e tieni premuto per personalizzare" + "Tieni premuto un dito sullo sfondo per personalizzare" "OK" "Cartella aperta, %1$d per %2$d" "Tocca per chiudere la cartella" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 61a5dcccd4..647e2f549c 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -60,7 +60,7 @@ "ТАҢБАЛАРДЫ КӨШІРУ" "ЖАҢАДАН БАСТАУ" "Тұсқағаздар, виджеттер және параметрлер" - "Теңшеу үшін фонды түртіп, ұстап тұрыңыз" + "Реттеу үшін фонды саусағыңызбен басып тұрыңыз" "ТҮСІНДІМ" "Қалта ашылды, %1$d және %2$d" "Қалтаны жабу үшін түртіңіз" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 5c61e553a1..4b43ebd3ec 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -59,7 +59,7 @@ "ນຳເຂົ້າໄອຄອນ ແລະ ໂຟນເດີຈາກໂຮມສະກຣີນອັນເກົ່າຂອງທ່ານບໍ່?" "ສຳເນົາໄອຄອນ" "ເລີ່ມຕົ້ນໃໝ່" - "​ຮູບ​ພື້ນຫຼັງ, ວິດເຈັດ, & ​ການ​ຕັ້ງ​ຄ່າ" + "ຮູບພາບພື້ນຫຼັງ, ວິດເຈັດ ແລະ ການຕັ້ງຄ່າ" "ແຕະທີ່ພາບພື້ນຫລັງຄ້າງໄວ້ເພື່ອປັບແຕ່ງ" "ເຂົ້າໃຈແລ້ວ" "ເປີດໂຟນເດີແລ້ວ, %1$d ຄູນ %2$d" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index ac4e9ae5bc..7a41dcfe9a 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -59,7 +59,7 @@ "നിങ്ങളുടെ പഴയ ഹോം സ്ക്രീനുകളിൽ നിന്ന് ഐക്കണുകളും ഫോൾഡറുകളും ഇമ്പോർട്ടുചെയ്യണോ?" "ഐക്കണുകൾ പകർത്തുക" "പുതുതായി ആരംഭിക്കുക" - "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ എന്നിവ" + "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ" "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്ചാത്തലം ടാപ്പുചെയ്ത് പിടിക്കുക" "മനസ്സിലായി" "ഫോൾഡർ തുറന്നു, %1$d / %2$d" @@ -69,8 +69,8 @@ "ഫോൾഡറിന്റെ പേര് %1$s എന്നായി മാറ്റി" "ഫോൾഡർ: %1$s" "വിജറ്റുകൾ" - "വാൾപേപ്പറുകൾ" - "ക്രമീകരണങ്ങൾ" + "വാൾപേപ്പർ" + "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "തിരിക്കൽ അനുവദിക്കുക" "അജ്ഞാതം" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index e9a20770c0..830937455d 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -31,7 +31,7 @@ "%1$d × %2$d" "Апп хайх..." "Аппликейшныг ачаалж байна..." - "\"%1$s\"-тай нийцэх апп олдсонгүй" + "\"%1$s\"-д нийцэх апп олдсонгүй" "%1$s руу очих" "Энэ Нүүр дэлгэц зайгүй." "\"Дуртай\" трей дээр өөр зай байхгүй байна" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index b8a7b43e20..5d0ac65876 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -35,7 +35,7 @@ "%1$s ਤੇ ਜਾਓ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" - "ਐਪਸ" + "ਐਪਾਂ" "ਹੋਮ" "ਹਟਾਓ" "ਸਥਾਪਨਾ ਰੱਦ ਕਰੋ" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 58c9ef059c..a74fb39342 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -61,7 +61,7 @@ "Je, ungependa kuingiza ikoni na folda kutoka kwenye skrini zako za Mwanzo za zamani?" "NAKILI IKONI" "ANZA UPYA" - "Mandhari, wijeti, na mipangilio" + "Mandhari, wijeti na mipangilio" "Gusa na ushikilie mandhari ili uweke mapendeleo" "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 5de4a9dc19..d7da5dd656 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -54,7 +54,7 @@ "Pahina %1$d ng %2$d" "Home screen %1$d ng %2$d" "Bagong page ng home screen" - "Maligayang Pagdating" + "Welcome" "Kopyahin ang mga icon ng app" "I-import ang icon at folder mula sa luma mong Home screen?" "KOPYAHIN ANG MGA ICON" From 12455136310bd2f7685adc7b6ba0bb98fdb5e9f4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 23 May 2016 03:16:49 -0700 Subject: [PATCH 010/382] Import translations. DO NOT MERGE Change-Id: I869352120f57a9be27c9b6515f75a79b151a05b9 Auto-generated-cl: translation import --- res/values-af/strings.xml | 4 +++- res/values-am/strings.xml | 4 +++- res/values-ar/strings.xml | 4 +++- res/values-az-rAZ/strings.xml | 4 +++- res/values-bg/strings.xml | 4 +++- res/values-bn-rBD/strings.xml | 4 +++- res/values-ca/strings.xml | 4 +++- res/values-cs/strings.xml | 4 +++- res/values-da/strings.xml | 4 +++- res/values-de/strings.xml | 4 +++- res/values-el/strings.xml | 4 +++- res/values-en-rAU/strings.xml | 4 +++- res/values-en-rGB/strings.xml | 4 +++- res/values-en-rIN/strings.xml | 4 +++- res/values-es-rUS/strings.xml | 4 +++- res/values-es/strings.xml | 4 +++- res/values-et-rEE/strings.xml | 4 +++- res/values-eu-rES/strings.xml | 4 +++- res/values-fa/strings.xml | 4 +++- res/values-fi/strings.xml | 4 +++- res/values-fr-rCA/strings.xml | 4 +++- res/values-fr/strings.xml | 4 +++- res/values-gl-rES/strings.xml | 8 +++++--- res/values-gu-rIN/strings.xml | 10 ++++++---- res/values-hi/strings.xml | 4 +++- res/values-hr/strings.xml | 4 +++- res/values-hu/strings.xml | 4 +++- res/values-hy-rAM/strings.xml | 4 +++- res/values-in/strings.xml | 4 +++- res/values-is-rIS/strings.xml | 4 +++- res/values-it/strings.xml | 4 +++- res/values-iw/strings.xml | 4 +++- res/values-ja/strings.xml | 4 +++- res/values-ka-rGE/strings.xml | 4 +++- res/values-kk-rKZ/strings.xml | 4 +++- res/values-km-rKH/strings.xml | 4 +++- res/values-kn-rIN/strings.xml | 4 +++- res/values-ko/strings.xml | 4 +++- res/values-ky-rKG/strings.xml | 6 ++++-- res/values-lo-rLA/strings.xml | 4 +++- res/values-lt/strings.xml | 4 +++- res/values-lv/strings.xml | 4 +++- res/values-mk-rMK/strings.xml | 16 +++++++++------- res/values-ml-rIN/strings.xml | 4 +++- res/values-mn-rMN/strings.xml | 4 +++- res/values-mr-rIN/strings.xml | 4 +++- res/values-ms-rMY/strings.xml | 4 +++- res/values-my-rMM/strings.xml | 8 +++++--- res/values-nb/strings.xml | 4 +++- res/values-ne-rNP/strings.xml | 8 +++++--- res/values-nl/strings.xml | 6 ++++-- res/values-pa-rIN/strings.xml | 16 +++++++++------- res/values-pl/strings.xml | 4 +++- res/values-pt-rPT/strings.xml | 4 +++- res/values-pt/strings.xml | 4 +++- res/values-ro/strings.xml | 4 +++- res/values-ru/strings.xml | 6 ++++-- res/values-si-rLK/strings.xml | 4 +++- res/values-sk/strings.xml | 6 ++++-- res/values-sl/strings.xml | 4 +++- res/values-sq-rAL/strings.xml | 4 +++- res/values-sr/strings.xml | 4 +++- res/values-sv/strings.xml | 4 +++- res/values-sw/strings.xml | 4 +++- res/values-ta-rIN/strings.xml | 4 +++- res/values-te-rIN/strings.xml | 4 +++- res/values-th/strings.xml | 4 +++- res/values-tl/strings.xml | 4 +++- res/values-tr/strings.xml | 4 +++- res/values-uk/strings.xml | 4 +++- res/values-ur-rPK/strings.xml | 4 +++- res/values-uz-rUZ/strings.xml | 14 ++++++++------ res/values-vi/strings.xml | 4 +++- res/values-zh-rCN/strings.xml | 4 +++- res/values-zh-rHK/strings.xml | 4 +++- res/values-zh-rTW/strings.xml | 4 +++- res/values-zu/strings.xml | 4 +++- 77 files changed, 261 insertions(+), 107 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 6285171098..ed5ad770d8 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -72,7 +72,9 @@ "Muurpapiere" "Instellings" "Gedeaktiveer deur jou administrateur" - "Laat draai toe" + "Laat tuisskermrotasie toe" + "Wanneer toestel gedraai word" + "Huidige vertooninstelling laat nie rotasie toe nie" "Onbekend" "Verwyder" "Soek" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index f862e2c23c..c8070f043d 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -72,7 +72,9 @@ "የግድግዳ ወረቀቶች" "ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" - "ማሽከርከርን ይፍቀዱ" + "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" + "መሣሪያው ሲዞር" + "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" "የማይታወቅ" "አስወግድ" "ፈልግ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 21435395c8..e059d26cbb 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -72,7 +72,9 @@ "الخلفيات" "الإعدادات" "عطَّل المشرف هذه الميزة" - "السماح بالتدوير" + "السماح بتدوير الشاشة الرئيسية" + "أوقات تدوير الجهاز" + "لا يسمح إعداد العرض الحالي بالتدوير" "غير معروفة" "إزالة" "بحث" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 6e051324b9..239d718d23 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -72,7 +72,9 @@ "Divar kağızları" "Ayarlar" "Admininiz tərəfindən deaktiv edilib" - "Fırlatmağa icazə verin" + "Əsas ekranın firlanmağına icazə verin" + "Cihaz çevrilən zaman" + "Cari Ekran ayarı fırlatmağa icazə vermir" "Naməlum" "Yığışdır" "Axtarış" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index c85bf6b2c8..a09d45773e 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -72,7 +72,9 @@ "Тапети" "Настройки" "Деактивирано от администратора ви" - "Разрешаване на завъртането" + "Разрешаване на завъртането на началния екран" + "При завъртане на устройството" + "Текущата настройка на екрана не разрешава завъртане" "Няма информация" "Премахване" "Търсене" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 29c218f63e..a584f1755a 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -72,7 +72,9 @@ "ওয়ালপেপারগুলি" "সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" - "ঘূর্ণনের অনুমতি দিন" + "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" + "ডিভাইস যখন ঘোরানো হবে" + "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" "অজানা" "সরান" "অনুসন্ধান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 4a6ba59cf0..8027031e04 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -72,7 +72,9 @@ "Fons de pantalla" "Configuració" "Desactivada per l\'administrador" - "Permet la rotació" + "Permet la rotació de la pantalla d\'inici" + "En girar el dispositiu" + "La configuració actual de la pantalla no permet la rotació" "Desconegut" "Suprimeix" "Cerca" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 8b3a8ed476..a047c39d47 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -72,7 +72,9 @@ "Tapety" "Nastavení" "Zakázáno administrátorem" - "Povolit otáčení" + "Povolit otáčení plochy" + "Při otočení zařízení" + "Aktuální nastavení displeje neumožňuje otáčení" "Neznámé" "Odstranit" "Hledat" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index e69871aac6..c24c1594a8 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -72,7 +72,9 @@ "Baggrunde" "Indstillinger" "Deaktiveret af din administrator" - "Tillad rotation" + "Tillad rotation af startskærmen" + "Når enheden roteres" + "Den aktuelle indstilling for visning tillader ikke rotation" "Ukendt" "Fjern" "Søg" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 186a06a0e0..4633adb046 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -72,7 +72,9 @@ "Hintergründe" "Einstellungen" "Von deinem Administrator deaktiviert" - "Drehung zulassen" + "Drehung des Startbildschirms zulassen" + "Bei Drehung des Geräts" + "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" "Unbekannt" "Entfernen" "Suchen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 90b623533f..fd8f1f84b7 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -72,7 +72,9 @@ "Ταπετσαρίες" "Ρυθμίσεις" "Απενεργοποιήθηκε από τον διαχειριστή σας" - "Να επιτρέπεται η περιστροφή" + "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" + "Όταν η συσκευή περιστρέφεται" + "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" "Άγνωστο" "Κατάργηση" "Αναζήτηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 09fc3a2feb..23882b1a67 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -72,7 +72,9 @@ "Wallpapers" "Settings" "Disabled by your admin" - "Allow rotation" + "Allow homescreen rotation" + "When device is rotated" + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" "Search" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 09fc3a2feb..23882b1a67 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -72,7 +72,9 @@ "Wallpapers" "Settings" "Disabled by your admin" - "Allow rotation" + "Allow homescreen rotation" + "When device is rotated" + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" "Search" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 09fc3a2feb..23882b1a67 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -72,7 +72,9 @@ "Wallpapers" "Settings" "Disabled by your admin" - "Allow rotation" + "Allow homescreen rotation" + "When device is rotated" + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" "Search" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index dd18c1eb43..0061f66afd 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -72,7 +72,9 @@ "Fondos de pantalla" "Configuración" "El administrador inhabilitó esta función" - "Permitir la rotación" + "Permitir la rotación de la pantalla principal" + "Al rotar el dispositivo" + "La configuración actual no permite la rotación de la pantalla" "Desconocido" "Eliminar" "Buscar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 579dd845d7..1169f44e09 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -72,7 +72,9 @@ "Fondos de pantalla" "Ajustes" "Inhabilitada por el administrador" - "Permitir rotación" + "Permitir rotación de la pantalla de inicio" + "Al girar el dispositivo" + "La configuración de pantalla actual no permite girar la pantalla" "Desconocido" "Eliminar" "Buscar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 371e6328cd..3fb031ae06 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -72,7 +72,9 @@ "Taustapildid" "Seaded" "Keelas administraator" - "Luba pööramine" + "Luba avaekraani pööramine" + "Kui seadet pööratakse" + "Praegune kuvaseade ei luba pööramist" "Teadmata" "Eemalda" "Otsing" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index fa19b45010..6688ed4687 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -72,7 +72,9 @@ "Horma-paperak" "Ezarpenak" "Administratzaileak desgaitu du" - "Baimendu biratzeko aukera" + "Baimendu hasierako pantaila biratzea" + "Gailua biratzen denean" + "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" "Ezezaguna" "Kendu" "Bilatu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 148e0cf69b..720bb31988 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -72,7 +72,9 @@ "کاغذدیواری‌ها" "تنظیمات" "توسط سرپرست سیستم غیرفعال شده است" - "چرخش مجاز است" + "مجاز کردن چرخش صفحه‌اصلی" + "وقتی دستگاه چرخانده می‌شود" + "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" "نامشخص" "حذف" "جستجو" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f04896a5b4..ac14d86e50 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -72,7 +72,9 @@ "Taustakuvat" "Asetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." - "Salli kierto" + "Salli aloitusnäytön kiertäminen" + "Kun laitetta kierretään" + "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." "Tuntematon" "Poista" "Haku" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index b323b82fc2..c87169f52d 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -72,7 +72,9 @@ "Fonds d\'écran" "Paramètres" "Cette fonction est désactivée par votre administrateur" - "Permettre la rotation" + "Autoriser la rotation de l\'écran d\'accueil" + "Lorsque l\'utilisateur pivote l\'appareil" + "Le mode d\'affichage actuel ne permet pas le pivotement" "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index e6d7a20e59..192a025d3c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -72,7 +72,9 @@ "Fonds d\'écran" "Paramètres" "Désactivé par votre administrateur" - "Autoriser la rotation" + "Autoriser la rotation de l\'écran d\'accueil" + "Lorsque l\'utilisateur fait pivoter l\'appareil" + "Le paramètre d\'affichage actuel n\'autorise pas la rotation." "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index f402072a22..6ddef283d3 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -29,7 +29,7 @@ "Mantén tocado un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" - "Aplicacións de busca..." + "Buscar aplicacións..." "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" "Ir a %1$s" @@ -59,7 +59,7 @@ "Queres importar as iconas e os cartafoles doutras pantallas de inicio?" "COPIAR ICONAS" "COMEZAR DE CERO" - "Fondos pantalla, widgets e configuración" + "Fondos de pantalla, widgets e configuración" "Mantén tocado o segundo plano para personalizalo" "DE ACORDO" "Abriuse o cartafol, %1$d por %2$d" @@ -72,7 +72,9 @@ "Fondos de pantalla" "Configuración" "Función desactivada polo administrador" - "Permitir xiro" + "Permitir xirar a pantalla de inicio" + "Ao xirar o dispositivo" + "A configuración de visualización actual non permite xirar a pantalla" "Descoñecido" "Eliminar" "Buscar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 8c8a2babba..fbe3efe4c6 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -30,12 +30,12 @@ "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "ઍપ્લિકેશનોમાં શોધો…" - "એપ્લિકેશનો લોડ કરી રહ્યું છે…" - "\"%1$s\" થી મેળ ખાતી કોઈ એપ્લિકેશનો મળી નથી" + "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" + "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" "%1$s પર જાઓ" "આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી." "મનપસંદ ટ્રે પર વધુ જગ્યા નથી" - "એપ્લિકેશનો" + "ઍપ્લિકેશનો" "હોમ" "દૂર કરો" "અનઇન્સ્ટોલ કરો" @@ -72,7 +72,9 @@ "વૉલપેપર્સ" "સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" - "પરિભ્રમણને મંજૂરી આપો" + "હોમસ્ક્રીનને ફેરવવાની મંજૂરી આપો" + "જ્યારે ઉપકરણ ફેરવેલું હોય ત્યારે" + "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" "અજાણ્યો" "દૂર કરો" "શોધો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 5e99e61412..695a1e6ab3 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -72,7 +72,9 @@ "वॉलपेपर" "सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" - "रोटेशन की अनुमति दें" + "होमस्क्रीन घुमाने की अनुमति दें" + "डिवाइस घुमाए जाने पर" + "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" "अज्ञात" "निकालें" "खोजें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 8fe238fa14..61b365f09c 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -72,7 +72,9 @@ "Pozadine" "Postavke" "Onemogućio administrator" - "Dopusti rotaciju" + "Dopusti zakretanje početnog zaslona" + "Kada se uređaj zakrene" + "Trenutačna postavka zaslona ne dopušta zakretanje" "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index d750866670..f558fb61bc 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -72,7 +72,9 @@ "Háttérképek" "Beállítások" "A rendszergazda letiltotta" - "Elforgatás engedélyezése" + "Kezdőképernyő elforgatásának engedélyezése" + "Az eszköz forgatásakor" + "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" "Ismeretlen" "Eltávolítás" "Keresés" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index a17216c9b7..1f2de4c368 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -72,7 +72,9 @@ "Պաստառներ" "Կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" - "Թույլ տալ պարբերական կրկնությունը" + "Թույլ տալ գլխավոր էկրանի պտտումը" + "Սարքը պտտելու դեպքում" + "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" "Անհայտ է" "Հեռացնել" "Գտնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index c9403c28e0..578e86f2b7 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -72,7 +72,9 @@ "Wallpaper" "Setelan" "Dinonaktifkan oleh admin" - "Izinkan putaran" + "Izinkan putaran layar utama" + "Saat perangkat diputar" + "Setelan Tampilan Saat Ini tidak memungkinkan putaran" "Tidak dikenal" "Buang" "Telusuri" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 86f42e8856..c2f3396e1b 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -72,7 +72,9 @@ "Veggfóður" "Stillingar" "Gert óvirkt af kerfisstjóra" - "Leyfa snúning" + "Leyfa snúning fyrir heimaskjá" + "Þegar tækinu er snúið" + "Núverandi skjástilling leyfir ekki snúning" "Óþekkt" "Fjarlægja" "Leita" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index c66cc936da..467094fb6a 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -72,7 +72,9 @@ "Sfondi" "Impostazioni" "Disattivata dall\'amministratore" - "Consenti rotazione" + "Consenti rotazione della schermata Home" + "Quando il dispositivo viene ruotato" + "L\'impostazione corrente del display non consente la rotazione" "Sconosciuto" "Rimuovi" "Cerca" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 1e03cf59ad..161227d85a 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -72,7 +72,9 @@ "טפטים" "הגדרות" "הושבת על ידי מנהל המערכת שלך" - "אפשרות סיבוב" + "אפשרות סיבוב של מסך דף הבית" + "בעת סיבוב המכשיר" + "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" "לא ידוע" "הסר" "חפש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index fb06f21393..e86e56f05f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -72,7 +72,9 @@ "壁紙" "設定" "管理者により無効にされています" - "回転を許可" + "ホーム画面の回転を許可" + "端末が回転したとき" + "現在の [ディスプレイ] 設定では回転を使用できません" "不明" "削除" "検索" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index b147c0377f..682cc126a5 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -72,7 +72,9 @@ "ფონები" "პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" - "როტაციის დაშვება" + "მთავარი ეკრანის ბრუნვის დაშვება" + "მოწყობილობის ბრუნვისას" + "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" "უცნობი" "ამოშლა" "ძიება" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 647e2f549c..3fa3d80250 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -72,7 +72,9 @@ "Артқы фондар" "Параметрлер" "Әкімші өшірді" - "Айналуға рұқсат ету" + "Негізгі экранды айналдыруды рұқсат ету" + "Құрылғы айналғанда" + "Экранның ағымдағы параметрі айналуға рұқсат бермейді" "Белгісіз" "Алып тастау" "Іздеу" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 6f3af8b30a..4cd6856f47 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -72,7 +72,9 @@ "ផ្ទាំង​រូបភាព" "ការកំណត់" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" - "អនុញ្ញាតឲ្យបង្វិល" + "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" + "នៅ​ពេល​បង្វិល​ឧបករណ៍When device is rotated" + "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" "មិន​ស្គាល់" "លុបចេញ" "ស្វែងរក" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 3931359e84..dcd64ecd56 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -72,7 +72,9 @@ "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" - "ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" + "ಮುಖಪರದೆ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" + "ಸಾಧನವನ್ನು ತಿರುಗಿಸಿದಾಗ" + "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" "ಹುಡುಕು" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index ff0e63fc25..572c62d0c2 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -72,7 +72,9 @@ "배경화면" "설정" "관리자가 사용 중지함" - "회전 허용" + "메인 스크린 회전 허용" + "기기 회전 시" + "현재 표시 설정에는 회전 기능이 허용되지 않습니다." "알 수 없음" "삭제" "검색" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8f7aa0a598..7f03a0b96c 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -59,7 +59,7 @@ "Эски үй экрандарыңыздан сүрөтчөлөр жана фолдерлер импорттолсунбу?" "СҮРӨТЧӨЛӨРДҮ КӨЧҮРҮҮ" "ТАЗАСЫН БАШТОО" - "Тушкагаздар, виджеттер & жөндөөлөр" + "Тушкагаздар, виджеттер жана жөндөөлөр" "Ыңгайлаштыруу үчүн фонду таптап, коё бербей туруңуз" "ТҮШҮНДҮМ" "Фолдер ачылды, туурасы %1$d, бийиктиги %2$d" @@ -72,7 +72,9 @@ "Тушкагаздар" "Тууралоолор" "Администраторуңуз өчүрүп койгон" - "Айлантууга уруксат берүү" + "Башкы экранды айлантууга уруксат берүү" + "Түзмөк айланганда" + "Учурдагы дисплей жөндөөсү айлантууга уруксат бербейт" "Белгисиз" "Алып салуу" "Издөө" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 4b43ebd3ec..228bd90c79 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -72,7 +72,9 @@ "ພາບພື້ນຫຼັງ" "ການຕັ້ງຄ່າ" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" - "ອະ​ນຸ​ຍາດ​ການ​ໝຸນ" + "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" + "ເມື່ອໝຸນອຸປະກອນ" + "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" "ຊອກຫາ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 61437b6afe..3796c26e02 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -72,7 +72,9 @@ "Ekrano fonai" "Nustatymai" "Išjungė administratorius" - "Leisti kaitaliojimą" + "Leisti pasukti pagrindinį ekraną" + "Kai įrenginys pasukamas" + "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" "Nežinoma" "Pašalinti" "Ieškoti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 226467591e..c592d3b69e 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -72,7 +72,9 @@ "Fona tapetes" "Iestatījumi" "Atspējojis administrators" - "Rotācijas atļauja" + "Atļaut sākuma ekrāna pagriešanu" + "Kad ierīce tiek pagriezta" + "Pašreizējā displeja iestatījumā nav atļauta pagriešana." "Nezināma" "Noņemt" "Meklēt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index a3b76bb7a9..a691bcee46 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -42,9 +42,9 @@ "Инф. за апликација" "инсталирај кратенки" "Овозможува апликацијата да додава кратенки без интервенција на корисникот." - "прочитај подесувања и кратенки на почетна страница" + "чита поставки и кратенки на почетна страница" "Овозможува апликацијата да ги менува подесувањата и кратенките на почетната страница." - "напиши подесувања и кратенки на почетна страница" + "пишува поставки и кратенки на почетна страница" "Овозможува апликацијата да ги менува подесувањата и кратенките на почетната страница." "%1$s нема дозвола за телефонски повици" "Проблем при вчитувањето на виџетот" @@ -54,12 +54,12 @@ "Страница %1$d од %2$d" "Екран на почетна страница %1$d од %2$d" "Нова страница на почетен екран" - "Добредојдовте" + "Добре дојдовте" "Копирај икони за апликација" "Зачувај икони и папки од твоите стари почетни страни?" "КОПИРАЈ ИКОНИ" "СТАРТУВАЈ ОД ПОЧЕТОК" - "Тапети, додатоци и поставки" + "Позадини, додатоци и поставки" "Допрете и задржете на заднината за да приспособите" "СФАТИВ" "Отворена е папка, %1$d на %2$d" @@ -68,11 +68,13 @@ "Папката е затворена" "Папката е преименувана во %1$s" "Папка: %1$s" - "Виџети" - "Тапети" + "Додатоци" + "Позадини" "Поставки" "Оневозможено од администраторот" - "Дозволи ротација" + "Дозволете ротација на Почетниот екран" + "Кога уредот се ротира" + "Тековната поставка на Екранот не дозволува ротација" "Непознато" "Отстрани" "Барај" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 7a41dcfe9a..5cfff55c26 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -72,7 +72,9 @@ "വാൾപേപ്പർ" "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" - "തിരിക്കൽ അനുവദിക്കുക" + "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" + "ഉപകരണം തിരിക്കുമ്പോൾ" + "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" "അജ്ഞാതം" "നീക്കംചെയ്യുക" "തിരയുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 830937455d..a47fcfc81e 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -72,7 +72,9 @@ "Ханын зураг" "Тохиргоо" "Таны админ идэвхгүй болгосон" - "Эргүүлэхийг зөвшөөрөх" + "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" + "Төхөөрөмжийг эргүүлсэн үед" + "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" "Тодорхойгүй" "Устгах" "Хайх" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index a8ae19b08a..c14a5d25e3 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -72,7 +72,9 @@ "वॉलपेपर" "सेटिंग्ज" "आपल्या प्रशासकाने अक्षम केले" - "फिरविण्‍यास अनुमती द्या" + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" + "डिव्हाइस फिरविलेले असताना" + "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" "अज्ञात" "काढा" "शोधा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index e5a15e82a4..9bb4ea0329 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -72,7 +72,9 @@ "Kertas dinding" "Tetapan" "Dilumpuhkan oleh pentadbir anda" - "Benarkan putaran" + "Benarkan putaran skrin utama" + "Apabila peranti diputar" + "Tetapan Paparan semasa tidak membenarkan putaran" "Tidak diketahui" "Alih keluar" "Carian" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index ffee1c0d4e..b9ca0ea873 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -24,7 +24,7 @@ "အလုပ်" "အပ်ပလီကေးရှင်း မထည့်သွင်းထားပါ" "App လက်လှမ်း မမှီပါ" - "ဒေါင်းလုဒ် appကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" + "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" "ဝစ်ဂျက်တစ်ခုကို ရွေးချယ်ရန် တို့၍ & ဖိထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" @@ -72,12 +72,14 @@ "နောက်ခံများ" "အပြင်အဆင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" - "လှည့်ရန် ခွင့်ပြုမည်" + "ပင်မစာမျက်နှာကို လှည့်ခွင့်ပြုပါ" + "စက်ပစ္စည်းကို လှည့်ထားသည့်အခါ" + "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" "မသိရ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" "App မတပ်ဆင်ရသေးပါ" - "ဤအိုင်ကွန်အတွက် app အားမထည့်သွင်းထားပါ။ You can remove it, or search for the app and install it manually." + "ဤအိုင်ကွန်အတွက် အက်ပ် အားမထည့်သွင်းထားပါ။ You can remove it, or search for the အက်ပ် and install it manually." "%1$s ဒေါင်းလုဒ်လုပ်နေသည်၊ %2$s ပြီးပါပြီ" "%1$s ကိုထည့်သွင်းရန်စောင့်နေသည်" "ပင်မမျက်နှာစာသို့ ထည့်ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index be6b6441e8..e5bd1c1fa3 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -72,7 +72,9 @@ "Bakgrunner" "Innstillinger" "Administratoren har slått av funksjonen" - "Tillat rotasjon" + "Tillat rotasjon av startskjermen" + "Når enheten roteres" + "Med den nåværende skjerminnstillingen støttes ikke rotasjon" "Ukjent" "Fjern" "Søk" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 29db37d965..e4d1409557 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -54,14 +54,14 @@ "पृष्ठ %2$d को %1$d" "गृह स्क्रिन %1$d को %2$d" "नयाँ गृह स्क्रिन पृष्ठ" - "स्वागतम" + "स्वागतम्" "तपाईँको अनुप्रयोग आईकनको प्रतिलिप गर्नुहोस्" "आफ्नो पुरानो गृह स्क्रीनबाट अाईकन र फोल्डरहरू आयात गर्नुहोस्?" "ICONS प्रतिलिप गर्नुहोस्" "START FRESH" "वालपेपरहरू, विजेट; सेटिङहरू" "अनुकूलन गर्नका लागि पृष्ठभूमिलाई ट्याप गरी थिचिरहनुहोस्" - "बुझियो" + "बुँझें" "फोल्डर खुल्यो %1$d बाट %2$d" "फोल्डरलाई बन्द गर्न ट्याप गर्नुहोस्" "पुनःनामाकरणलाई सुरक्षित गर्न ट्याप गर्नुहोस्" @@ -72,7 +72,9 @@ "वालपेपरहरु" "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" - "परिक्रमणलाई अनुमति दिनुहोस्" + "गृहस्क्रिन घुम्ने सुविधालाई अनुमति दिनुहोस्" + "यन्त्रलाई घुमाइँदा" + "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" "अज्ञात" "हटाउनुहोस्" "खोजी गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 4a22bce5cb..a546a855d5 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -69,10 +69,12 @@ "De naam van de map is gewijzigd in %1$s" "Map: %1$s" "Widgets" - "Achtergronden" + "Achtergrond" "Instellingen" "Uitgeschakeld door je beheerder" - "Draaien toestaan" + "Draaien van startscherm toestaan" + "Wanneer het apparaat wordt gedraaid" + "Huidige scherminstelling staat draaien niet toe" "Onbekend" "Verwijderen" "Zoeken" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 5d0ac65876..47bb556235 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -25,13 +25,13 @@ "ਐਪ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ।" "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" - "ਵਿਜੇਟਸ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" + "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਇੱਕ ਵਿਜਿਟ ਨੂੰ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "ਐਪਾਂ ਖੋਜੋ…" "ਐਪਸ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ..." - "\"%1$s\" ਨਾਲ ਮਿਲਦੀ ਕੋਈ ਵੀ ਐਪਸ ਨਹੀਂ ਲੱਭੀਆਂ" + "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" "%1$s ਤੇ ਜਾਓ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" @@ -48,7 +48,7 @@ "ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ੌਰਟਕਟ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" "%1$s ਨੂੰ ਫੋਨ ਕਾਲਾਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ" "ਵਿਜੇਟ ਲੋਡ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ" - "ਸੈਟਅਪ" + "ਸਥਾਪਤ ਕਰੋ" "ਇਹ ਇੱਕ ਸਿਸਟਮ ਐਪ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" "ਬਿਨਾਂ ਨਾਮ ਦਿੱਤਾ ਫੋਲਡਰ" "ਸਫ਼ਾ %2$d ਦਾ %1$d" @@ -59,20 +59,22 @@ "ਕੀ ਆਪਣੀਆਂ ਪੁਰਾਣੀਆਂ ਹੋਮ ਸਕ੍ਰੀਨਾਂ ਤੋਂ ਆਈਕਨਾਂ ਅਤੇ ਫੋਲਡਰ ਆਯਾਤ ਕਰਨੇ ਹਨ?" "ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" "ਤਾਜ਼ਾ ਸ਼ੁਰੂ ਕਰੋ" - "ਵਾਲਪੇਪਰ, ਵਿਜੇਟ, & ਸੈਟਿੰਗਾਂ" + "ਵਾਲਪੇਪਰ, ਵਿਜਿਟ, ਅਤੇ ਸੈਟਿੰਗਾਂ" "ਬੈਕਗ੍ਰਾਊਂਡ ਨੂੰ ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" - "ਸਮਝ ਗਿਆ" + "ਸਮਝ ਲਿਆ" "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %2$d" "ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਬਦਲੇ ਗਏ ਨਾਮ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਫੋਲਡਰ ਬੰਦ ਕੀਤਾ" "ਫੋਲਡਰ ਨੂੰ %1$s ਮੁੜ ਨਾਮ ਦਿੱਤਾ ਗਿਆ" "ਫੋਲਡਰ: %1$s" - "ਵਿਜੇਟਸ" + "ਵਿਜਿਟ" "ਵਾਲਪੇਪਰ" "ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" - "ਰੋਟੇਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ" + "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" + "ਜਦੋਂ ਡੀਵਾਈਸ ਘੁੰਮਾਈ ਜਾਂਦੀ ਹੈ" + "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" "ਖੋਜੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index ad9fbf4424..54d7780cf6 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -72,7 +72,9 @@ "Tapety" "Ustawienia" "Funkcja wyłączona przez administratora" - "Zezwól na obrót" + "Zezwalaj na obrót ekranu głównego" + "Podczas obrotu urządzenia" + "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" "Brak informacji" "Usuń" "Szukaj" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index fd6ddee03e..dddf2dc2f2 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -72,7 +72,9 @@ "Imagens de fundo" "Definições" "Desativada pelo administrador" - "Permitir rotação" + "Permitir rotação do ecrã principal" + "Quando o dispositivo é rodado" + "A definição de visualização atual não permite a rotação" "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index e542418709..f821b212cc 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -72,7 +72,9 @@ "Planos de fundo" "Configurações" "Desativado pelo administrador" - "Permitir rotação" + "Permitir rotação da tela inicial" + "Quando o dispositivo for girado" + "A configuração atual de exibição não permite rotação" "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index eb54ae7bea..6be772704f 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -72,7 +72,9 @@ "Imagini de fundal" "Setări" "Dezactivată de administrator" - "Permiteți rotirea" + "Permiteți rotirea ecranului de pornire" + "Când dispozitivul este rotit" + "Setarea actuală a afișajului nu permite rotirea" "Necunoscut" "Eliminați" "Căutați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index f73cdf22da..9349c0b832 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -60,7 +60,7 @@ "КОПИРОВАТЬ ЗНАЧКИ" "ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ МАКЕТ" "Обои, виджеты и настройки" - "Чтобы выполнить настройку, коснитесь фона и удерживайте его" + "Чтобы выполнить настройку, коснитесь фона и удерживайте его." "ОК" "Папка открыта, %1$d x %2$d" "Нажмите, чтобы закрыть папку" @@ -72,7 +72,9 @@ "Обои" "Настройки" "Функция отключена администратором" - "Разрешить автоповорот" + "Разрешить поворачивать главный экран" + "При повороте устройства" + "В настройках отключен поворот экрана" "Неизвестно" "Удалить" "Найти" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 89fb60fe35..d13ae32901 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -72,7 +72,9 @@ "වෝල්පේපර" "සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" - "කරකැවීමට ඉඩ දෙන්න" + "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" + "උපංගය කරකැවූ විට" + "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" "නොදනී" "ඉවත් කරන්න" "සොයන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index de017dc8ee..4f92d1e07b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -59,7 +59,7 @@ "Chcete importovať ikony a priečinky zo starých plôch?" "SKOPÍROVAŤ IKONY" "ZAČAŤ ODZNOVA" - "Pozadia, miniaplikácie a nastavenia" + "Tapety, miniaplikácie a nastavenia" "Pozadie prispôsobíte klepnutím a podržaním" "DOBRE" "Otvorený priečinok, %1$d x %2$d" @@ -72,7 +72,9 @@ "Tapety" "Nastavenia" "Zakázané vaším správcom" - "Povoliť otáčanie" + "Povoliť otáčanie plochy" + "Pri otočení zariadenia" + "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" "Neznáme" "Odstrániť" "Vyhľadať" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index c386458b67..27412db24b 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -72,7 +72,9 @@ "Ozadja" "Nastavitve" "Onemogočil skrbnik." - "Omogočanje zasuka" + "Omogočanje sukanja začetnega zaslona" + "Ko se naprava zasuka" + "Trenutna nastavitev zaslona ne dovoljuje sukanja" "Neznano" "Odstrani" "Iskanje" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index ccd2c9c897..4ee58f0326 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -72,7 +72,9 @@ "Imazhet e sfondit" "Cilësimet" "Çaktivizuar nga administratori" - "Lejo rotacionin" + "Lejo rrotullimin e ekranit kryesor" + "Kur pajisja rrotullohet" + "Cilësimi aktuali i afishimit nuk lejon rrotullimin" "I panjohur" "Hiq" "Kërko" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 82f44b2eac..c174ace65b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -72,7 +72,9 @@ "Позадине" "Подешавања" "Администратор је онемогућио" - "Дозволи ротацију" + "Дозволи ротацију почетног екрана" + "Када се уређај ротира" + "Актуелно подешавање приказа не дозвољава ротацију" "Непознато" "Уклони" "Претражи" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 79e8f42ba7..3019603b06 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -72,7 +72,9 @@ "Bakgrunder" "Inställningar" "Inaktiverat av administratören" - "Tillåt rotering" + "Tillåt rotering av startskärmen" + "När enheten roterar" + "Rotering tillåts inte i de nuvarande skärminställningarna" "Okänt" "Ta bort" "Sök" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index a74fb39342..5b2eb27086 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -74,7 +74,9 @@ "Mandhari" "Mipangilio" "Imezimwa na msimamizi wako" - "Ruhusu kuzungusha" + "Ruhusu kuzungusha skrini ya kwanza" + "Kifaa kinapozungushwa" + "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" "Yasiyojulikana" "Ondoa" "Tafuta" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index ecd4cb0be0..6bb0a1046b 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -72,7 +72,9 @@ "வால்பேப்பர்கள்" "அமைப்பு" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" - "சுழற்ற அனுமதி" + "முகப்புத் திரை சுழற்சியை அனுமதி" + "சாதனத்தைச் சுழற்றும் போது" + "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" "தெரியாதது" "அகற்று" "தேடு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 402c261d3a..82a772e406 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -72,7 +72,9 @@ "వాల్‌పేపర్‌లు" "సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" - "భ్రమణాన్ని అనుమతించండి" + "హోమ్‌స్క్రీన్ భ్రమణాన్ని అనుమతించండి" + "పరికరాన్ని తిప్పినప్పుడు" + "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" "తెలియదు" "తీసివేయి" "శోధించు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 292a95bdf0..e22ebf1439 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -72,7 +72,9 @@ "วอลเปเปอร์" "การตั้งค่า" "ปิดใช้โดยผู้ดูแลระบบ" - "อนุญาตให้ใช้การหมุน" + "อนุญาตให้หมุนหน้าจอหลัก" + "เมื่อหมุนอุปกรณ์" + "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" "ไม่รู้จัก" "ลบ" "ค้นหา" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index d7da5dd656..ed0206e922 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -72,7 +72,9 @@ "Mga Wallpaper" "Mga Setting" "Na-disable ng iyong admin" - "Payagan ang pag-rotate" + "Payagan ang pag-rotate ng homescreen" + "Kapag na-rotate ang device" + "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" "Hindi kilala" "Alisin" "Maghanap" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 44feebc885..94c38d92a8 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -72,7 +72,9 @@ "Duvar Kağıtları" "Ayarlar" "Yöneticiniz tarafından devre dışı bırakıldı" - "Döndürmeye izin ver" + "Ana ekranı döndürmeye izin ver" + "Cihaz döndürüldüğünde" + "Mevcut Ekran ayarı, döndürmeye izin vermiyor" "Bilinmiyor" "Kaldır" "Ara" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index b5d81eed79..1fc74b66f1 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -72,7 +72,9 @@ "Фонові малюнки" "Налаштування" "Вимкнув адміністратор" - "Дозволити обертання" + "Дозволити обертання головного екрана" + "Коли пристрій обертається" + "Поточні налаштування дисплея не підтримують обертання" "Невідомо" "Видалити" "Шукати" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index bbf9d87b04..c6e6cfc4fd 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -72,7 +72,9 @@ "وال پیپرز" "ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" - "گردش کی اجازت دیں" + "ہوم اسکرین گھمانے کی اجازت دیں" + "جب آلہ گھمایا جائے" + "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" "نامعلوم" "ہٹائیں" "تلاش کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0ae7d7aa9f..859ff12ea4 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -29,14 +29,14 @@ "Vidjetni tanlab olish uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" - "Ilovalarni qidirish…" + "Ilovalar ichidan qidirish…" "Ilovalar yuklanmoqda…" - "“%1$s” bilan mos hech qanday ilova topilmadi" - "O‘tish: %1$s" + "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" + "%1$s" "Uy ekranida bitta ham xona yo‘q." "Ajratilganlarda birorta ham xona yo‘q" "Ilovalar" - "Uy" + "Bosh sahifa" "Olib tashlash" "O‘chirib tashlash" "Ilova haqida" @@ -59,7 +59,7 @@ "Eski \"Uy\" ekranlaringizdan jildlar va nishonchalar import qilinsinmi?" "NISHONCHALARNI NUSXALASH" "YANGIDAN BOSHLASH" - "Orqa fon rasmlari, vidjet va sozlamalar" + "Fon rasmlari, vidjet va sozlamalar" "Orqa fonni moslashtirish uchun uni bosib turing" "OK" "Jild ochildi, %1$d ga %2$d" @@ -72,7 +72,9 @@ "Fon rasmlari" "Sozlamalar" "Administrator tomonidan o‘chirilgan" - "Aylanishga ruxsat berish" + "Asosiy ekranni aylantirishga ruxsat berish" + "Qurilma aylanganda" + "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" "Noma’lum" "O‘chirish" "Qidirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index b3e6234baf..5da05a1f05 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -72,7 +72,9 @@ "Hình nền" "Cài đặt" "Bị tắt bởi quản trị viên của bạn" - "Cho phép xoay" + "Cho phép xoay màn hình chính" + "Khi xoay thiết bị" + "Cài đặt Hiển thị hiện tại không cho phép xoay" "Không xác định" "Xóa" "Tìm kiếm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 5911c124fc..8f269ed776 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -72,7 +72,9 @@ "壁纸" "设置" "已被您的管理员停用" - "允许旋转" + "允许旋转主屏幕" + "设备旋转时" + "当前的显示设置不允许旋转设备" "未知" "移除" "搜索" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 63e853b73d..a8bd7bbccc 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -72,7 +72,9 @@ "桌布" "設定" "已由您的管理員停用" - "允許旋轉" + "允許主畫面旋轉" + "當裝置旋轉時" + "「目前顯示屏」設定不允許旋轉" "不明" "移除" "搜尋" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 2c6046fa63..6d66f1863b 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -72,7 +72,9 @@ "桌布" "設定" "已由您的管理員停用" - "允許輪播" + "允許旋轉主畫面" + "當裝置旋轉時" + "目前的顯示設定不允許旋轉畫面" "不明" "移除" "搜尋" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index eeffe89d51..2184831738 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -72,7 +72,9 @@ "Izithombe zangemuva" "Izilungiselelo" "Kukhutshazwe umlawuli wakho" - "Vumela ukuphenduka" + "Vumela ukuzungezisa kwesikrini sasekhaya" + "Uma idivayisi izungeziswa" + "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" "Akwaziwa" "Susa" "Sesha" From 6ee09c1f9a63da55a2824b750eda8918057f165f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 25 May 2016 18:39:12 -0700 Subject: [PATCH 011/382] Import translations. DO NOT MERGE Change-Id: I313e48bdf98902a6698135246da430b14fc61e0a Auto-generated-cl: translation import --- res/values-in/strings.xml | 2 +- res/values-iw/strings.xml | 2 +- res/values-ky-rKG/strings.xml | 2 +- res/values-ne-rNP/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 578e86f2b7..50aa03d707 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -72,7 +72,7 @@ "Wallpaper" "Setelan" "Dinonaktifkan oleh admin" - "Izinkan putaran layar utama" + "Izinkan layar utama diputar" "Saat perangkat diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" "Tidak dikenal" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 161227d85a..14d0aa6470 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -73,7 +73,7 @@ "הגדרות" "הושבת על ידי מנהל המערכת שלך" "אפשרות סיבוב של מסך דף הבית" - "בעת סיבוב המכשיר" + "בסיבוב המכשיר" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" "לא ידוע" "הסר" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 7f03a0b96c..2edd170bbb 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -74,7 +74,7 @@ "Администраторуңуз өчүрүп койгон" "Башкы экранды айлантууга уруксат берүү" "Түзмөк айланганда" - "Учурдагы дисплей жөндөөсү айлантууга уруксат бербейт" + "Экранды айлантуу параметри өчүрүлгөн" "Белгисиз" "Алып салуу" "Издөө" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index e4d1409557..169f3de403 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -72,7 +72,7 @@ "वालपेपरहरु" "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" - "गृहस्क्रिन घुम्ने सुविधालाई अनुमति दिनुहोस्" + "गृहस्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "यन्त्रलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" "अज्ञात" From 713a6861de0f438aadbdcd4264b3c5313c6ded4e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 1 Jun 2016 07:22:01 -0700 Subject: [PATCH 012/382] Import translations. DO NOT MERGE Change-Id: I6450636d1dc024bc8f51f00fce4eda1dff181a04 Auto-generated-cl: translation import --- res/values-en-rAU/strings.xml | 2 +- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-my-rMM/strings.xml | 8 ++++---- res/values-sk/strings.xml | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 23882b1a67..89e0eabd16 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -59,7 +59,7 @@ "Import icons and folders from your old Home screens?" "COPY ICONS" "START AFRESH" - "Wallpapers, widgets, & settings" + "Wallpapers, widgets & settings" "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 23882b1a67..89e0eabd16 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -59,7 +59,7 @@ "Import icons and folders from your old Home screens?" "COPY ICONS" "START AFRESH" - "Wallpapers, widgets, & settings" + "Wallpapers, widgets & settings" "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 23882b1a67..89e0eabd16 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -59,7 +59,7 @@ "Import icons and folders from your old Home screens?" "COPY ICONS" "START AFRESH" - "Wallpapers, widgets, & settings" + "Wallpapers, widgets & settings" "Tap & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index b9ca0ea873..9081e84910 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -59,18 +59,18 @@ "ပင်မစာမျက်နှာအဟောင်းမှ ပုံညွှန်းများ နှင့် အကန့်များကို ယူလာပါမလား" "COPY ICONS" "START FRESH" - "နောက်ခံများ၊ ဝီဂျက်များ& ဆက်တင်များ" + "နောက်ခံများ၊ ဝိဂျက်များ& ဆက်တင်များ" "စိတ်တိုင်းကျပြုပြင်ရန် နောက်ခံတို့၍ & ဖိထားပါ" - "ရပြီ" + "ရပါပြီ" "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" "ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ" "အမည်ပြောင်းခြင်းကို သိမ်းဆည်းရန် တို့ပါ" "ပိတ်ထားသောအကန့်" "ပြောင်းလဲလိုက်သော အကန့်အမည် %1$s" "အကန့်အမည်: %1$s" - "ဝဒ်ဂျက်များ" + "ဝိဂျက်များ" "နောက်ခံများ" - "အပြင်အဆင်များ" + "ဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ပင်မစာမျက်နှာကို လှည့်ခွင့်ပြုပါ" "စက်ပစ္စည်းကို လှည့်ထားသည့်အခါ" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 4f92d1e07b..134f464c88 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -29,10 +29,10 @@ "Miniaplikáciu pridáte klepnutím a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" - "Vyhľadávanie v aplikáciách…" + "Hľadať aplikácie…" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" - "Prejsť na dopyt %1$s" + "Prejsť na %1$s" "Na tejto ploche už nie je miesto" "Na paneli Obľúbené položky už nie je miesto" "Aplikácie" @@ -60,7 +60,7 @@ "SKOPÍROVAŤ IKONY" "ZAČAŤ ODZNOVA" "Tapety, miniaplikácie a nastavenia" - "Pozadie prispôsobíte klepnutím a podržaním" + "Pozadie môžete prispôsobiť jeho pridržaním" "DOBRE" "Otvorený priečinok, %1$d x %2$d" "Priečinok zavriete klepnutím" From ff76b90a62c22dca0f20b1c1ead71efe3b5558df Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 6 Jun 2016 16:28:13 -0700 Subject: [PATCH 013/382] Import translations. DO NOT MERGE Change-Id: Id5cb43a9bce01723cce1bf61670ba5d2210a59cf Auto-generated-cl: translation import --- res/values-es/strings.xml | 4 ++-- res/values-ka-rGE/strings.xml | 2 +- res/values-my-rMM/strings.xml | 2 +- res/values-ne-rNP/strings.xml | 2 +- res/values-pa-rIN/strings.xml | 14 +++++++------- res/values-sw/strings.xml | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1169f44e09..8fa7586682 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,10 +76,10 @@ "Al girar el dispositivo" "La configuración de pantalla actual no permite girar la pantalla" "Desconocido" - "Eliminar" + "Quitar" "Buscar" "Esta aplicación no está instalada" - "La aplicación de este icono no está instalada. Puedes eliminar el icono o buscar la aplicación e instalarla manualmente." + "La aplicación de este icono no está instalada. Puedes quitar el icono o buscar la aplicación e instalarla manualmente." "Descargando %1$s (%2$s completado)" "Esperando para instalar %1$s" "Añadir a la pantalla de inicio" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 682cc126a5..3cc188599b 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -59,7 +59,7 @@ "გსურთ, ძველი მთავარი ეკრანიდან ხატულების და საქაღ. იმპორტი?" "ხატულების კოპირება" "სტანდარტული განლაგება" - "ფონები, ვიჯეტები, & პარამეტრები" + "ფონები, ვიჯეტები & პარამეტრები" "მოსარგებად, ხანგრძლივად შეეხეთ ფონს." "გასაგებია" "საქაღალდე გახსნილია, %1$d x %2$d" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 9081e84910..a1acc03a8e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -35,7 +35,7 @@ "%1$sကို သွားပါ" "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" - "အပ်ပလီကေးရှင်းများ" + "အက်ပ်များ" "ပင်မစာမျက်နှာ" "ဖယ်ရှားမည်" "ဖယ်ထုတ်မည်" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 169f3de403..acebc33ed7 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -59,7 +59,7 @@ "आफ्नो पुरानो गृह स्क्रीनबाट अाईकन र फोल्डरहरू आयात गर्नुहोस्?" "ICONS प्रतिलिप गर्नुहोस्" "START FRESH" - "वालपेपरहरू, विजेट; सेटिङहरू" + "वालपेपर, विजेट तथा सेटिङहरू" "अनुकूलन गर्नका लागि पृष्ठभूमिलाई ट्याप गरी थिचिरहनुहोस्" "बुँझें" "फोल्डर खुल्यो %1$d बाट %2$d" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 47bb556235..8e8e6ea0af 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -30,7 +30,7 @@ "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "ਐਪਾਂ ਖੋਜੋ…" - "ਐਪਸ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ..." + "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" "%1$s ਤੇ ਜਾਓ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" @@ -40,12 +40,12 @@ "ਹਟਾਓ" "ਸਥਾਪਨਾ ਰੱਦ ਕਰੋ" "ਐਪ ਜਾਣਕਾਰੀ" - "ਸ਼ੌਰਟਕਟ ਇੰਸਟੌਲ ਕਰੋ" - "ਇੱਕ ਐਪ ਨੂੰ ਉਪਭੋਗਤਾ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਸ਼ੌਰਟਕਟ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" - "ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ੌਰਟਕਟ ਪੜ੍ਹੋ" - "ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ੌਰਟਕਟ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" - "ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ੌਰਟਕਟ ਲਿਖੋ" - "ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ੌਰਟਕਟ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" + "ਸ਼ਾਰਟਕੱਟ ਇੰਸਟੌਲ ਕਰੋ" + "ਇੱਕ ਐਪ ਨੂੰ ਉਪਭੋਗਤਾ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਸ਼ਾਰਟਕੱਟ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" + "ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਪੜ੍ਹੋ" + "ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" + "ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਲਿਖੋ" + "ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" "%1$s ਨੂੰ ਫੋਨ ਕਾਲਾਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ" "ਵਿਜੇਟ ਲੋਡ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ" "ਸਥਾਪਤ ਕਰੋ" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 5b2eb27086..19f7a77ae4 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -62,7 +62,7 @@ "NAKILI IKONI" "ANZA UPYA" "Mandhari, wijeti na mipangilio" - "Gusa na ushikilie mandhari ili uweke mapendeleo" + "Gusa na ushikilie mandhari ili ubadilishe upendavyo" "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" "Gonga ili ufunge folda" From 64cc9d2bdc8b234491767217c7dcc6b9458b76e7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 7 Jun 2016 13:44:01 -0700 Subject: [PATCH 014/382] Import translations. DO NOT MERGE Change-Id: I8f147e0f54e6c7b11590df74337cd75419609126 Auto-generated-cl: translation import --- res/values-kk-rKZ/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 3fa3d80250..c49cf4683c 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -69,7 +69,7 @@ "Қалта атауы %1$s болып өзгертілді" "Қалта: %1$s" "Виджеттер" - "Артқы фондар" + "Тұсқағаздар" "Параметрлер" "Әкімші өшірді" "Негізгі экранды айналдыруды рұқсат ету" From 77ec2cf4718cc29f87b556f856bd5b878855a69d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Jun 2016 00:28:41 -0700 Subject: [PATCH 015/382] Import translations. DO NOT MERGE Change-Id: Ie8ea10dfeaeb6d3b6786bd61ff826c6b67a63984 Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 ++- res/values-am/strings.xml | 3 ++- res/values-ar/strings.xml | 3 ++- res/values-az-rAZ/strings.xml | 3 ++- res/values-bg/strings.xml | 3 ++- res/values-bn-rBD/strings.xml | 3 ++- res/values-ca/strings.xml | 3 ++- res/values-cs/strings.xml | 3 ++- res/values-da/strings.xml | 3 ++- res/values-de/strings.xml | 3 ++- res/values-el/strings.xml | 3 ++- res/values-en-rAU/strings.xml | 3 ++- res/values-en-rGB/strings.xml | 3 ++- res/values-en-rIN/strings.xml | 3 ++- res/values-es-rUS/strings.xml | 3 ++- res/values-es/strings.xml | 3 ++- res/values-et-rEE/strings.xml | 3 ++- res/values-eu-rES/strings.xml | 3 ++- res/values-fa/strings.xml | 3 ++- res/values-fi/strings.xml | 3 ++- res/values-fr-rCA/strings.xml | 3 ++- res/values-fr/strings.xml | 3 ++- res/values-gl-rES/strings.xml | 3 ++- res/values-gu-rIN/strings.xml | 3 ++- res/values-hi/strings.xml | 3 ++- res/values-hr/strings.xml | 3 ++- res/values-hu/strings.xml | 3 ++- res/values-hy-rAM/strings.xml | 3 ++- res/values-in/strings.xml | 3 ++- res/values-is-rIS/strings.xml | 3 ++- res/values-it/strings.xml | 3 ++- res/values-iw/strings.xml | 3 ++- res/values-ja/strings.xml | 3 ++- res/values-ka-rGE/strings.xml | 3 ++- res/values-kk-rKZ/strings.xml | 3 ++- res/values-km-rKH/strings.xml | 3 ++- res/values-kn-rIN/strings.xml | 3 ++- res/values-ko/strings.xml | 3 ++- res/values-ky-rKG/strings.xml | 3 ++- res/values-lo-rLA/strings.xml | 3 ++- res/values-lt/strings.xml | 3 ++- res/values-lv/strings.xml | 3 ++- res/values-mk-rMK/strings.xml | 3 ++- res/values-ml-rIN/strings.xml | 3 ++- res/values-mn-rMN/strings.xml | 3 ++- res/values-mr-rIN/strings.xml | 3 ++- res/values-ms-rMY/strings.xml | 3 ++- res/values-my-rMM/strings.xml | 3 ++- res/values-nb/strings.xml | 3 ++- res/values-ne-rNP/strings.xml | 3 ++- res/values-nl/strings.xml | 3 ++- res/values-pa-rIN/strings.xml | 3 ++- res/values-pl/strings.xml | 3 ++- res/values-pt-rPT/strings.xml | 3 ++- res/values-pt/strings.xml | 3 ++- res/values-ro/strings.xml | 3 ++- res/values-ru/strings.xml | 3 ++- res/values-si-rLK/strings.xml | 3 ++- res/values-sk/strings.xml | 3 ++- res/values-sl/strings.xml | 3 ++- res/values-sq-rAL/strings.xml | 3 ++- res/values-sr/strings.xml | 3 ++- res/values-sv/strings.xml | 3 ++- res/values-sw/strings.xml | 3 ++- res/values-ta-rIN/strings.xml | 3 ++- res/values-te-rIN/strings.xml | 3 ++- res/values-th/strings.xml | 3 ++- res/values-tl/strings.xml | 3 ++- res/values-tr/strings.xml | 3 ++- res/values-uk/strings.xml | 3 ++- res/values-ur-rPK/strings.xml | 3 ++- res/values-uz-rUZ/strings.xml | 5 +++-- res/values-vi/strings.xml | 3 ++- res/values-zh-rCN/strings.xml | 3 ++- res/values-zh-rHK/strings.xml | 3 ++- res/values-zh-rTW/strings.xml | 3 ++- res/values-zu/strings.xml | 3 ++- 77 files changed, 155 insertions(+), 78 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index ed5ad770d8..e25fd4e567 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -32,7 +32,8 @@ "Deursoek programme …" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" - "Gaan na %1$s" + + "Niks meer spasie op die tuisskerm nie." "Geen plek meer in die Gunstelinge-laai nie" "Programme" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index c8070f043d..40b1694055 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -32,7 +32,8 @@ "መተግበሪያዎችን ይፈልጉ…" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" - "ወደ %1$s ሂድ" + + "በዚህ መነሻ ማያ ገጽ ላይ ምንም ቦታ የለም።" "በተወዳጆች መሣቢያ ውስጥ ተጨማሪ ቦታ የለም" "መተግበሪያዎች" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index e059d26cbb..f555ee1ca1 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -32,7 +32,8 @@ "البحث في التطبيقات…" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" - "الانتقال إلى %1$s" + + "ليس هناك مساحة أخرى في هذه الشاشة الرئيسية." "لا يوجد المزيد من الحقول في علبة المفضلة" "التطبيقات" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 239d718d23..cf109b4026 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -32,7 +32,8 @@ "Tətbiqləri Axtarın..." "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" - "%1$s daxil olun" + + "Bu Əsas ekranda boş yer yoxdur." "Favoritlər-də yer yoxdur" "Tətbiqlər" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index a09d45773e..b2c072f476 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -32,7 +32,8 @@ "Търсене в приложенията…" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" - "Отваряне на %1$s" + + "На този начален екран няма повече място." "Няма повече място в областта с любимите" "Приложения" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index a584f1755a..271d73922d 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -32,7 +32,8 @@ "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" - "%1$s এ যান" + + "এই হোম স্ক্রীনে আর কোনো জায়গা নেই৷" "পছন্দসই ট্রে-তে আর কোনো জায়গা নেই" "অ্যাপ্লিকেশানগুলি" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 8027031e04..17044599fe 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -32,7 +32,8 @@ "Cerca a les aplicacions…" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" - "Vés a %1$s" + + "Ja no queda espai en aquesta pantalla d\'inici." "No hi ha més espai a la safata Preferits." "Aplicacions" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index a047c39d47..9a7459d2e5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -32,7 +32,8 @@ "Hledat v aplikacích…" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" - "Přejít na %1$s" + + "Na této ploše již není místo." "Na panelu Oblíbené položky již není místo." "Aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c24c1594a8..811a802f53 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -32,7 +32,8 @@ "Søg i Apps…" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" - "Gå til %1$s" + + "Der er ikke mere plads på denne startskærm." "Der er ikke mere plads i bakken Foretrukne" "Apps" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4633adb046..a87ccd8c55 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -32,7 +32,8 @@ "Apps suchen…" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" - "Gehe zu %1$s" + + "Auf diesem Startbildschirm ist kein Platz mehr vorhanden." "Ablage \"Favoriten\" ist voll." "Apps" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index fd8f1f84b7..f2081e7f7f 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -32,7 +32,8 @@ "Αναζήτηση εφαρμογών…" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" - "Μετάβαση σε %1$s" + + "Δεν υπάρχει χώρος σε αυτήν την αρχική οθόνη." "Δεν υπάρχει επιπλέον χώρος στην περιοχή Αγαπημένα" "Εφαρμογές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 89e0eabd16..781ddee27e 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -32,7 +32,8 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - "Go to %1$s" + + "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 89e0eabd16..781ddee27e 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -32,7 +32,8 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - "Go to %1$s" + + "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 89e0eabd16..781ddee27e 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -32,7 +32,8 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - "Go to %1$s" + + "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 0061f66afd..fd32a19887 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -32,7 +32,8 @@ "Buscar apps…" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." - "Ir a %1$s" + + "No hay más espacio en esta pantalla principal." "La bandeja de favoritos está llena." "Aplicaciones" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 8fa7586682..8e5d07f0f2 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -32,7 +32,8 @@ "Buscar aplicaciones…" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" - "Ir a %1$s" + + "No queda espacio en la pantalla de inicio." "La bandeja de favoritos está completa" "Aplicaciones" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 3fb031ae06..00f960d5d4 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -32,7 +32,8 @@ "Otsimine rakendustest …" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" - "Mine: %1$s" + + "Sellel avaekraanil pole enam ruumi." "Salves Lemmikud pole rohkem ruumi" "Rakendused" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 6688ed4687..e410597b49 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -32,7 +32,8 @@ "Bilatu aplikazioetan…" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" - "Joan hona: %1$s" + + "Hasierako pantaila honetan ez dago toki gehiago." "Ez dago toki gehiago Gogokoak erretiluan" "Aplikazioak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 720bb31988..747da847aa 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -32,7 +32,8 @@ "جستجوی برنامه‌ها…‏‏" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" - "رفتن به %1$s" + + "فضای بیشتری در این صفحه اصلی موجود نیست." "فضای بیشتری در سینی موارد دلخواه وجود ندارد" "برنامه‌ها" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index ac14d86e50..c97d7b11a1 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -32,7 +32,8 @@ "Hae sovelluksia…" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." - "Siirry: %1$s" + + "Tässä aloitusruudussa ei ole enää tilaa." "Suosikit-valikossa ei ole enää tilaa" "Sovellukset" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index c87169f52d..265e636a47 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -32,7 +32,8 @@ "Rechercher des applications..." "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" - "Aller à « %1$s »" + + "Pas d\'espace libre sur l\'écran d\'accueil." "Il n\'y a plus d\'espace dans la zone des favoris" "Applications" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 192a025d3c..af19699e3c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -32,7 +32,8 @@ "Rechercher des applications…" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." - "Accéder à %1$s" + + "Pas d\'espace libre sur cet écran d\'accueil." "Plus d\'espace disponible dans la zone de favoris." "Applications" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 6ddef283d3..115497a9b4 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -32,7 +32,8 @@ "Buscar aplicacións..." "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" - "Ir a %1$s" + + "Non hai máis espazo nesta pantalla de inicio." "Non hai máis espazo na bandexa de favoritos" "Aplicacións" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index fbe3efe4c6..ef3731825a 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -32,7 +32,8 @@ "ઍપ્લિકેશનોમાં શોધો…" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" - "%1$s પર જાઓ" + + "આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી." "મનપસંદ ટ્રે પર વધુ જગ્યા નથી" "ઍપ્લિકેશનો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 695a1e6ab3..742cd90b07 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -32,7 +32,8 @@ "ऐप्स खोजें…" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" - "%1$s पर जाएं" + + "इस होम स्‍क्रीन पर स्थान शेष नहीं है." "पसंदीदा ट्रे में और स्थान नहीं है" "ऐप्लिकेशन" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 61b365f09c..027c9265fe 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -32,7 +32,8 @@ "Pretraživanje aplikacija…" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" - "Idite na %1$s" + + "Na ovom početnom zaslonu više nema mjesta." "Nema više prostora na traci Favoriti" "Aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f558fb61bc..783a367711 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -32,7 +32,8 @@ "Alkalmazások keresése…" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." - "Keresse fel ezt: %1$s" + + "Nincs több hely ezen a kezdőképernyőn." "Nincs több hely a Kedvencek tálcán" "Alkalmazások" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 1f2de4c368..8d57e5905e 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -32,7 +32,8 @@ "Հավելվածների որոնում…" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" - "Գնալ %1$s" + + "Այլևս տեղ չկա այս հիմնական էկրանին:" "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" "Ծրագրեր" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 50aa03d707..3faefb79db 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -32,7 +32,8 @@ "Telusuri Aplikasi..." "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" - "Buka %1$s" + + "Tidak ada ruang lagi pada layar Utama ini." "Tidak ada ruang tersisa di baki Favorit" "Aplikasi" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index c2f3396e1b..42cb440dc7 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -32,7 +32,8 @@ "Leita í forritum…" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" - "Fara í %1$s" + + "Ekki meira pláss á þessum heimaskjá." "Ekki meira pláss í bakka fyrir uppáhald" "Forrit" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 467094fb6a..b651bc8f68 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -32,7 +32,8 @@ "Ricerca app…" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" - "Vai a %1$s" + + "Spazio nella schermata Home esaurito." "Spazio esaurito nella barra dei Preferiti" "App" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 14d0aa6470..44bcd875c8 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -32,7 +32,8 @@ "חיפוש אפליקציות..." "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" - "עבור אל %1$s" + + "אין עוד מקום במסך דף הבית הזה." "אין עוד מקום במגש המועדפים" "אפליקציות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index e86e56f05f..e70770ca41 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -32,7 +32,8 @@ "アプリを検索…" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" - "%1$sにアクセス" + + "このホーム画面に空きスペースがありません。" "お気に入りトレイに空きスペースがありません" "アプリ" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 3cc188599b..b531a56427 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -32,7 +32,8 @@ "აპების ძიება…" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" - "გადადი %1$s-ში" + + "ამ მთავარ ეკრანზე ადგილი აღარ არის." "რჩეულების თაროზე ადგილი არ არის" "აპები" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index c49cf4683c..7c9aaeec06 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -32,7 +32,8 @@ "Қолданбаларды іздеу…" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" - "%1$s сұрауына өту" + + "Бұл Негізгі экранда орын қалмады." "Қалаулылар науасында орын қалмады" "Қолданбалар" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 4cd6856f47..dc9b606b8a 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -32,7 +32,8 @@ "ស្វែងរកកម្មវិធី…" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" - "ចូលទៅកាន់ %1$s" + + "គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។" "គ្មាន​បន្ទប់​​ក្នុង​ថាស​និយម​ប្រើ" "កម្មវិធី" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index dcd64ecd56..5d6ec41c3e 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -32,7 +32,8 @@ "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" - "%1$s ಗೆ ಹೋಗಿ" + + "ಈ ಮುಖಪುಟದ ಪರದೆಯಲ್ಲಿ ಹೆಚ್ಚು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ." "ಮೆಚ್ಚಿನವುಗಳ ಟ್ರೇನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 572c62d0c2..5fd20e2ae1 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -32,7 +32,8 @@ "앱 검색..." "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." - "%1$s(으)로 이동" + + "홈 화면에 더 이상 공간이 없습니다." "즐겨찾기 트레이에 더 이상 공간이 없습니다." "앱" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 2edd170bbb..8fce8c899c 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -32,7 +32,8 @@ "Колдонмолорду издөө…" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" - "%1$s сурамына өтүңүз" + + "Бул Үй экранында бош орун жок." "Тандамалдар тайпасында орун калган жок" "Колдонмолор" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 228bd90c79..24e6096d4a 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -32,7 +32,8 @@ "ຄົ້ນຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" - "ໄປ​ທີ່ %1$s" + + "ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້." "ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ" "ແອັບຯ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 3796c26e02..f48f569a58 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -32,7 +32,8 @@ "Ieškoti programų..." "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" - "Eiti į %1$s" + + "Šiame pagrindiniame ekrane vietos nebėra." "Mėgstamiausių dėkle nebėra vietos" "Programos" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index c592d3b69e..7aaab862b6 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -32,7 +32,8 @@ "Meklēt lietotnes…" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." - "Doties uz: %1$s" + + "Šajā sākuma ekrānā vairs nav vietas." "Izlases joslā vairs nav vietas." "Lietotnes" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index a691bcee46..d7c67f2463 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -32,7 +32,8 @@ "Пребарувај апликации…" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" - "Оди на %1$s" + + "Нема повеќе простор на овој екран на почетната страница." "Нема повеќе простор на лентата „Омилени“" "Апликации" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 5cfff55c26..94dd5b51d4 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -32,7 +32,8 @@ "ആപ്പ്‌സ് തിരയുക…" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" - "%1$s എന്നതിലേക്ക് പോവുക" + + "ഈ ഹോം സ്‌ക്രീനിൽ ഒഴിവൊന്നുമില്ല." "പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല" "അപ്ലിക്കേഷനുകൾ" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index a47fcfc81e..35d522c196 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -32,7 +32,8 @@ "Апп хайх..." "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" - "%1$s руу очих" + + "Энэ Нүүр дэлгэц зайгүй." "\"Дуртай\" трей дээр өөр зай байхгүй байна" "Апп" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index c14a5d25e3..1598e52a12 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -32,7 +32,8 @@ "अॅप्स शोधा..." "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" - "%1$s वर जा" + + "या मुख्य स्क्रीनवर आणखी जागा नाही." "आवडीच्या ट्रे मध्ये आणखी जागा नाही" "अॅप्स" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 9bb4ea0329..e9c4eac92d 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -32,7 +32,8 @@ "Cari Apl..." "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" - "Pergi ke %1$s" + + "Tiada lagi ruang pada skrin Laman Utama ini." "Tiada ruang dalam dulang Kegemaran lagi" "Apl" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index a1acc03a8e..53786a76df 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -32,7 +32,8 @@ "အက်ပ်များကို ရှာဖွေပါ…" "App များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" - "%1$sကို သွားပါ" + + "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" "အက်ပ်များ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index e5bd1c1fa3..5a0c2b570a 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -32,7 +32,8 @@ "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" - "Gå til %1$s" + + "Denne startsiden er full." "Favoritter-skuffen er full" "Apper" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index acebc33ed7..22d994e036 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -32,7 +32,8 @@ "अनुप्रयोगहरू खोज्नुहोस्..." "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" - "%1$s मा जानुहोस्" + + "यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।" "मनपर्ने ट्रे अब कुनै ठाँउ छैन" "अनुप्रयोगहरू" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a546a855d5..b2f48a000d 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -32,7 +32,8 @@ "Apps zoeken…" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" - "Ga naar %1$s" + + "Er is geen ruimte meer op dit startscherm." "Geen ruimte meer in het vak \'Favorieten\'" "Apps" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 8e8e6ea0af..4ab6b9bacf 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -32,7 +32,8 @@ "ਐਪਾਂ ਖੋਜੋ…" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" - "%1$s ਤੇ ਜਾਓ" + + "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" "ਐਪਾਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 54d7780cf6..92063e18d7 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -32,7 +32,8 @@ "Szukaj w aplikacjach…" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" - "Otwórz %1$s" + + "Brak miejsca na tym ekranie głównym." "Brak miejsca w Ulubionych" "Aplikacje" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index dddf2dc2f2..29d6c94f27 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -32,7 +32,8 @@ "Pesquisar aplicações..." "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" - "Aceder a %1$s" + + "Sem espaço suficiente neste Ecrã principal." "Não existe mais espaço no tabuleiro de Favoritos" "Aplicações" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index f821b212cc..69a60e1cc2 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -32,7 +32,8 @@ "Pesquisar apps..." "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" - "Ir para %1$s" + + "Não há mais espaço na tela inicial." "Sem espaço na bandeja de favoritos" "Apps" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 6be772704f..cfe631fc2a 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -32,7 +32,8 @@ "Căutați aplicații…" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" - "Accesați %1$s" + + "Nu mai este loc pe acest Ecran de pornire." "Spațiu epuizat în bara Preferate" "Aplicații" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 9349c0b832..a9fe9491fa 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -32,7 +32,8 @@ "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" - "%1$s" + + "На этом экране все занято" "В разделе \"Избранное\" больше нет места" "Приложения" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index d13ae32901..41e4d9a519 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -32,7 +32,8 @@ "යෙදුම් සොයන්න..." "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" - "%1$s වෙත යන්න" + + "මෙම මුල් පිටු තිරය මත තවත් අවසර නැත." "ප්‍රියතම දෑ ඇති තැටියේ තවත් ඉඩ නොමැත" "යෙදුම්" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 134f464c88..d0dcf27f2c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -32,7 +32,8 @@ "Hľadať aplikácie…" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" - "Prejsť na %1$s" + + "Na tejto ploche už nie je miesto" "Na paneli Obľúbené položky už nie je miesto" "Aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 27412db24b..5d396e4700 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -32,7 +32,8 @@ "Iskanje po aplikacijah …" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" - "Odpri storitev %1$s" + + "Na tem začetnem zaslonu ni več prostora." "V vrstici za priljubljene ni več prostora" "Aplikacije" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 4ee58f0326..262769161f 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -32,7 +32,8 @@ "Kërko për aplikacione..." "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" - "Shko te %1$s" + + "Nuk ka më hapësirë në këtë ekran bazë." "Nuk ka më hapësirë në tabakanë \"Të preferuarat\"" "Aplikacionet" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index c174ace65b..c4154f563c 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -32,7 +32,8 @@ "Претражите апликације..." "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" - "Иди на апликацију %1$s" + + "Нема више простора на овом почетном екрану." "Нема више простора на траци Омиљено" "Апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3019603b06..7f5af4b6ef 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -32,7 +32,8 @@ "Sök efter appar …" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" - "Gå till %1$s" + + "Det finns inte plats för mer på den här startskärmen." "Favoritfältet är fullt" "Appar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 19f7a77ae4..291e52d731 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -32,7 +32,8 @@ "Tafuta Programu..." "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" - "Nenda kwenye %1$s" + + "Hakuna nafasi katika skrini hii ya Mwanzo." "Hakuna nafasi zaidi katika treya ya Vipendeleo" "Programu" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 6bb0a1046b..495f9d1056 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -32,7 +32,8 @@ "பயன்பாடுகளில் தேடுக…" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" - "%1$sக்குச் செல்லவும்" + + "முகப்புத் திரையில் இடமில்லை." "பிடித்தவை ட்ரேயில் இடமில்லை" "பயன்பாடுகள்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 82a772e406..2757d4a6be 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -32,7 +32,8 @@ "అనువర్తనాల్లో శోధించండి…" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" - "%1$sకి వెళ్లు" + + "ఈ హోమ్ స్క్రీన్‌లో ఖాళీ లేదు." "ఇష్టమైనవి ట్రేలో ఖాళీ లేదు" "అనువర్తనాలు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index e22ebf1439..3fa6211d2e 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -32,7 +32,8 @@ "ค้นหาแอป…" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" - "ไปที่ %1$s" + + "ไม่มีที่ว่างในหน้าจอหลักนี้" "ไม่มีพื้นที่เหลือในถาดรายการโปรด" "แอป" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index ed0206e922..dd7adeaaac 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -32,7 +32,8 @@ "Maghanap ng Mga App…" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" - "Pumunta sa %1$s" + + "Wala nang lugar sa Home screen na ito." "Wala nang lugar sa tray ng Mga Paborito" "Apps" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 94c38d92a8..40ac47310b 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -32,7 +32,8 @@ "Uygulamalarda Ara…" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" - "%1$s uygulamasına git" + + "Bu Ana ekranda yer kalmadı." "Favoriler tepsisinde başka yer kalmadı" "Uygulamalar" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 1fc74b66f1..497d71e5a2 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -32,7 +32,8 @@ "Пошук додатків…" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" - "Перейти в додаток %1$s" + + "На цьому головному екрані більше немає місця." "В області \"Вибране\" немає місця" "Додатки" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index c6e6cfc4fd..6bc601d493 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -32,7 +32,8 @@ "ایپس تلاش کریں…" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" - "%1$s پر جائیں" + + "اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔" "پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے" "ایپس" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 859ff12ea4..80e3460fb3 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -32,7 +32,8 @@ "Ilovalar ichidan qidirish…" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" - "%1$s" + + "Uy ekranida bitta ham xona yo‘q." "Ajratilganlarda birorta ham xona yo‘q" "Ilovalar" @@ -73,7 +74,7 @@ "Sozlamalar" "Administrator tomonidan o‘chirilgan" "Asosiy ekranni aylantirishga ruxsat berish" - "Qurilma aylanganda" + "Qurilma burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" "Noma’lum" "O‘chirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 5da05a1f05..baf2cada0c 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -32,7 +32,8 @@ "Tìm kiếm ứng dụng..." "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" - "Chuyển tới %1$s" + + "Không còn chỗ trên Màn hình chính này." "Không còn chỗ trong khay Mục yêu thích" "Ứng dụng" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 8f269ed776..d784b471e3 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -32,7 +32,8 @@ "搜索应用…" "正在加载应用…" "未找到与“%1$s”相符的应用" - "转到 %1$s" + + "此主屏幕上已没有空间。" "收藏栏已满" "应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index a8bd7bbccc..04406481b9 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -32,7 +32,8 @@ "搜尋應用程式…" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" - "前往 %1$s" + + "主畫面已無空間。" "我的收藏寄存區沒有足夠空間" "應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 6d66f1863b..c9bb47f53e 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -32,7 +32,8 @@ "搜尋應用程式…" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" - "前往 %1$s" + + "這個主螢幕已無空間。" "「我的最愛」匣已無可用空間" "應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 2184831738..bacf2b8da8 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -32,7 +32,8 @@ "Sesha izinhlelo zokusebenza..." "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" - "Hamba ku-%1$s" + + "Asisekho isikhala kulesi sikrini Sasekhaya." "Asisekho isikhala kwitreyi lezintandokazi" "Izinhlelo zokusebenza" From c59be9e961cde2dc43d07e62f98a21cdf5011733 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 13 Jun 2016 23:58:27 -0700 Subject: [PATCH 016/382] Import translations. DO NOT MERGE Change-Id: I48c00e48de0a05cbcaaf6fc8fd57a648c626feb5 Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-az-rAZ/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-en-rAU/strings.xml | 3 +-- res/values-en-rGB/strings.xml | 3 +-- res/values-en-rIN/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-et-rEE/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-km-rKH/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lo-rLA/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-mn-rMN/strings.xml | 3 +-- res/values-mr-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-ne-rNP/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pa-rIN/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-si-rLK/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-te-rIN/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-vi/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 3 +-- res/values-zh-rHK/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 77 files changed, 77 insertions(+), 154 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index e25fd4e567..e3d8086afb 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -32,8 +32,7 @@ "Deursoek programme …" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" - - + "Soek meer programme" "Niks meer spasie op die tuisskerm nie." "Geen plek meer in die Gunstelinge-laai nie" "Programme" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 40b1694055..a931605c09 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -32,8 +32,7 @@ "መተግበሪያዎችን ይፈልጉ…" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" - - + "ተጨማሪ መተግበሪያዎች ይፈልጉ" "በዚህ መነሻ ማያ ገጽ ላይ ምንም ቦታ የለም።" "በተወዳጆች መሣቢያ ውስጥ ተጨማሪ ቦታ የለም" "መተግበሪያዎች" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index f555ee1ca1..104f0f0f16 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -32,8 +32,7 @@ "البحث في التطبيقات…" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" - - + "البحث عن مزيد من التطبيقات" "ليس هناك مساحة أخرى في هذه الشاشة الرئيسية." "لا يوجد المزيد من الحقول في علبة المفضلة" "التطبيقات" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index cf109b4026..5d6b2eebae 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -32,8 +32,7 @@ "Tətbiqləri Axtarın..." "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" - - + "Daha çox tətbiq üçün axtarış edin" "Bu Əsas ekranda boş yer yoxdur." "Favoritlər-də yer yoxdur" "Tətbiqlər" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index b2c072f476..06c318350b 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -32,8 +32,7 @@ "Търсене в приложенията…" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" - - + "Търсене на още приложения" "На този начален екран няма повече място." "Няма повече място в областта с любимите" "Приложения" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 271d73922d..a92ea4a7f1 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -32,8 +32,7 @@ "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" - - + "আরো অ্যাপ্লিকেশানের জন্য অনুসন্ধান করুন" "এই হোম স্ক্রীনে আর কোনো জায়গা নেই৷" "পছন্দসই ট্রে-তে আর কোনো জায়গা নেই" "অ্যাপ্লিকেশানগুলি" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 17044599fe..2494feff28 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -32,8 +32,7 @@ "Cerca a les aplicacions…" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" - - + "Cerca més aplicacions" "Ja no queda espai en aquesta pantalla d\'inici." "No hi ha més espai a la safata Preferits." "Aplicacions" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 9a7459d2e5..e7aefa4f9f 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -32,8 +32,7 @@ "Hledat v aplikacích…" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" - - + "Vyhledat další aplikace" "Na této ploše již není místo." "Na panelu Oblíbené položky již není místo." "Aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 811a802f53..6b87ea292f 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -32,8 +32,7 @@ "Søg i Apps…" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" - - + "Søg efter flere apps" "Der er ikke mere plads på denne startskærm." "Der er ikke mere plads i bakken Foretrukne" "Apps" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a87ccd8c55..c769f397bc 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -32,8 +32,7 @@ "Apps suchen…" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" - - + "Weitere Apps suchen" "Auf diesem Startbildschirm ist kein Platz mehr vorhanden." "Ablage \"Favoriten\" ist voll." "Apps" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index f2081e7f7f..8cd4e63941 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -32,8 +32,7 @@ "Αναζήτηση εφαρμογών…" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" - - + "Αναζήτηση περισσότερων εφαρμογών" "Δεν υπάρχει χώρος σε αυτήν την αρχική οθόνη." "Δεν υπάρχει επιπλέον χώρος στην περιοχή Αγαπημένα" "Εφαρμογές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 781ddee27e..c799cb7151 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -32,8 +32,7 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - - + "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 781ddee27e..c799cb7151 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -32,8 +32,7 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - - + "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 781ddee27e..c799cb7151 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -32,8 +32,7 @@ "Search Apps…" "Loading Apps…" "No Apps found matching \"%1$s\"" - - + "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" "Apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index fd32a19887..ba08c89bd8 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -32,8 +32,7 @@ "Buscar apps…" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." - - + "Buscar más apps" "No hay más espacio en esta pantalla principal." "La bandeja de favoritos está llena." "Aplicaciones" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 8e5d07f0f2..fa8cc281d2 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -32,8 +32,7 @@ "Buscar aplicaciones…" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" - - + "Buscar más aplicaciones" "No queda espacio en la pantalla de inicio." "La bandeja de favoritos está completa" "Aplicaciones" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 00f960d5d4..8b9ada25d8 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -32,8 +32,7 @@ "Otsimine rakendustest …" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" - - + "Otsi rohkem rakendusi" "Sellel avaekraanil pole enam ruumi." "Salves Lemmikud pole rohkem ruumi" "Rakendused" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index e410597b49..b0029f559c 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -32,8 +32,7 @@ "Bilatu aplikazioetan…" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" - - + "Bilatu aplikazio gehiago" "Hasierako pantaila honetan ez dago toki gehiago." "Ez dago toki gehiago Gogokoak erretiluan" "Aplikazioak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 747da847aa..cbf6747ee6 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -32,8 +32,7 @@ "جستجوی برنامه‌ها…‏‏" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" - - + "جستجوی برنامه‌های بیشتر" "فضای بیشتری در این صفحه اصلی موجود نیست." "فضای بیشتری در سینی موارد دلخواه وجود ندارد" "برنامه‌ها" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index c97d7b11a1..3ee5ac739b 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -32,8 +32,7 @@ "Hae sovelluksia…" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." - - + "Hae lisää sovelluksia" "Tässä aloitusruudussa ei ole enää tilaa." "Suosikit-valikossa ei ole enää tilaa" "Sovellukset" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 265e636a47..0a64c5001f 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -32,8 +32,7 @@ "Rechercher des applications..." "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" - - + "Rechercher plus d\'applications" "Pas d\'espace libre sur l\'écran d\'accueil." "Il n\'y a plus d\'espace dans la zone des favoris" "Applications" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index af19699e3c..f7a603540a 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -32,8 +32,7 @@ "Rechercher des applications…" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." - - + "Rechercher plus d\'applications" "Pas d\'espace libre sur cet écran d\'accueil." "Plus d\'espace disponible dans la zone de favoris." "Applications" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 115497a9b4..88230e946a 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -32,8 +32,7 @@ "Buscar aplicacións..." "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" - - + "Buscar máis aplicacións" "Non hai máis espazo nesta pantalla de inicio." "Non hai máis espazo na bandexa de favoritos" "Aplicacións" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index ef3731825a..19ad9b7552 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -32,8 +32,7 @@ "ઍપ્લિકેશનોમાં શોધો…" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" - - + "વધુ ઍપ્લિકેશનો શોધો" "આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી." "મનપસંદ ટ્રે પર વધુ જગ્યા નથી" "ઍપ્લિકેશનો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 742cd90b07..60ed3de8f3 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -32,8 +32,7 @@ "ऐप्स खोजें…" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" - - + "अधिक ऐप्लिकेशन खोजें" "इस होम स्‍क्रीन पर स्थान शेष नहीं है." "पसंदीदा ट्रे में और स्थान नहीं है" "ऐप्लिकेशन" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 027c9265fe..a9155c170f 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -32,8 +32,7 @@ "Pretraživanje aplikacija…" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" - - + "Traži više aplikacija" "Na ovom početnom zaslonu više nema mjesta." "Nema više prostora na traci Favoriti" "Aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 783a367711..a3254f954f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -32,8 +32,7 @@ "Alkalmazások keresése…" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." - - + "További alkalmazások keresése" "Nincs több hely ezen a kezdőképernyőn." "Nincs több hely a Kedvencek tálcán" "Alkalmazások" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 8d57e5905e..5ad6d45078 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -32,8 +32,7 @@ "Հավելվածների որոնում…" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" - - + "Որոնել այլ հավելվածներ" "Այլևս տեղ չկա այս հիմնական էկրանին:" "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" "Ծրագրեր" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 3faefb79db..e2157db3d9 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -32,8 +32,7 @@ "Telusuri Aplikasi..." "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" - - + "Telusuri aplikasi lainnya" "Tidak ada ruang lagi pada layar Utama ini." "Tidak ada ruang tersisa di baki Favorit" "Aplikasi" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 42cb440dc7..3dbd75a722 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -32,8 +32,7 @@ "Leita í forritum…" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" - - + "Leita að fleiri forritum" "Ekki meira pláss á þessum heimaskjá." "Ekki meira pláss í bakka fyrir uppáhald" "Forrit" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b651bc8f68..221f30ec75 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -32,8 +32,7 @@ "Ricerca app…" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" - - + "Cerca altre app" "Spazio nella schermata Home esaurito." "Spazio esaurito nella barra dei Preferiti" "App" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 44bcd875c8..12bc7406bf 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -32,8 +32,7 @@ "חיפוש אפליקציות..." "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" - - + "חפש אפליקציות נוספות" "אין עוד מקום במסך דף הבית הזה." "אין עוד מקום במגש המועדפים" "אפליקציות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index e70770ca41..4b717a4a94 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -32,8 +32,7 @@ "アプリを検索…" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" - - + "他のアプリを検索" "このホーム画面に空きスペースがありません。" "お気に入りトレイに空きスペースがありません" "アプリ" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index b531a56427..bc1af5f456 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -32,8 +32,7 @@ "აპების ძიება…" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" - - + "მეტი აპის პოვნა" "ამ მთავარ ეკრანზე ადგილი აღარ არის." "რჩეულების თაროზე ადგილი არ არის" "აპები" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 7c9aaeec06..1db6961b96 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -32,8 +32,7 @@ "Қолданбаларды іздеу…" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" - - + "Қосымша қолданбалар іздеу" "Бұл Негізгі экранда орын қалмады." "Қалаулылар науасында орын қалмады" "Қолданбалар" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index dc9b606b8a..4a3ecf7609 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -32,8 +32,7 @@ "ស្វែងរកកម្មវិធី…" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" - - + "ស្វែងរកកម្មវិធីច្រើនទៀត" "គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។" "គ្មាន​បន្ទប់​​ក្នុង​ថាស​និយម​ប្រើ" "កម្មវិធី" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 5d6ec41c3e..f086213240 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -32,8 +32,7 @@ "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" - - + "ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕು" "ಈ ಮುಖಪುಟದ ಪರದೆಯಲ್ಲಿ ಹೆಚ್ಚು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ." "ಮೆಚ್ಚಿನವುಗಳ ಟ್ರೇನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 5fd20e2ae1..6089a5c68f 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -32,8 +32,7 @@ "앱 검색..." "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." - - + "더 많은 앱 검색" "홈 화면에 더 이상 공간이 없습니다." "즐겨찾기 트레이에 더 이상 공간이 없습니다." "앱" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8fce8c899c..1a10e33477 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -32,8 +32,7 @@ "Колдонмолорду издөө…" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" - - + "Көбүрөөк колдонмолорду издөө" "Бул Үй экранында бош орун жок." "Тандамалдар тайпасында орун калган жок" "Колдонмолор" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 24e6096d4a..ecab5222cf 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -32,8 +32,7 @@ "ຄົ້ນຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" - - + "ຊອກຫາແອັບເພີ່ມເຕີມ" "ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້." "ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ" "ແອັບຯ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index f48f569a58..4bd9e24e0e 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -32,8 +32,7 @@ "Ieškoti programų..." "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" - - + "Ieškoti daugiau programų" "Šiame pagrindiniame ekrane vietos nebėra." "Mėgstamiausių dėkle nebėra vietos" "Programos" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 7aaab862b6..15821ddaaf 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -32,8 +32,7 @@ "Meklēt lietotnes…" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." - - + "Meklēt citas lietotnes" "Šajā sākuma ekrānā vairs nav vietas." "Izlases joslā vairs nav vietas." "Lietotnes" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index d7c67f2463..a5a18266d7 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -32,8 +32,7 @@ "Пребарувај апликации…" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" - - + "Пребарај други апликации" "Нема повеќе простор на овој екран на почетната страница." "Нема повеќе простор на лентата „Омилени“" "Апликации" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 94dd5b51d4..68104a6ba8 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -32,8 +32,7 @@ "ആപ്പ്‌സ് തിരയുക…" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" - - + "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" "ഈ ഹോം സ്‌ക്രീനിൽ ഒഴിവൊന്നുമില്ല." "പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല" "അപ്ലിക്കേഷനുകൾ" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 35d522c196..a1352fb031 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -32,8 +32,7 @@ "Апп хайх..." "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" - - + "Бусад апп-г хайх" "Энэ Нүүр дэлгэц зайгүй." "\"Дуртай\" трей дээр өөр зай байхгүй байна" "Апп" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 1598e52a12..b2c2f18a67 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -32,8 +32,7 @@ "अॅप्स शोधा..." "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" - - + "अधिक अॅप्स शोधा" "या मुख्य स्क्रीनवर आणखी जागा नाही." "आवडीच्या ट्रे मध्ये आणखी जागा नाही" "अॅप्स" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index e9c4eac92d..8bed230a79 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -32,8 +32,7 @@ "Cari Apl..." "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" - - + "Cari lagi apl" "Tiada lagi ruang pada skrin Laman Utama ini." "Tiada ruang dalam dulang Kegemaran lagi" "Apl" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 53786a76df..26d6e6c218 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -32,8 +32,7 @@ "အက်ပ်များကို ရှာဖွေပါ…" "App များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" - - + "နောက်ထပ် အက်ပ်များကို ရှာပါ" "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" "အက်ပ်များ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 5a0c2b570a..6a822e72b6 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -32,8 +32,7 @@ "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" - - + "Søk etter flere apper" "Denne startsiden er full." "Favoritter-skuffen er full" "Apper" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 22d994e036..130217878c 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -32,8 +32,7 @@ "अनुप्रयोगहरू खोज्नुहोस्..." "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" - - + "थप अनुप्रयोगहरू खोज्नुहोस्" "यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।" "मनपर्ने ट्रे अब कुनै ठाँउ छैन" "अनुप्रयोगहरू" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index b2f48a000d..3dcf08f387 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -32,8 +32,7 @@ "Apps zoeken…" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" - - + "Zoeken naar meer apps" "Er is geen ruimte meer op dit startscherm." "Geen ruimte meer in het vak \'Favorieten\'" "Apps" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 4ab6b9bacf..ede6082583 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -32,8 +32,7 @@ "ਐਪਾਂ ਖੋਜੋ…" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" - - + "ਹੋਰ ਐਪਾਂ ਖੋਜੋ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" "ਐਪਾਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 92063e18d7..713dcc0058 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -32,8 +32,7 @@ "Szukaj w aplikacjach…" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" - - + "Wyszukaj więcej aplikacji" "Brak miejsca na tym ekranie głównym." "Brak miejsca w Ulubionych" "Aplikacje" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 29d6c94f27..29ccae2334 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -32,8 +32,7 @@ "Pesquisar aplicações..." "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" - - + "Pesquisar mais aplicações" "Sem espaço suficiente neste Ecrã principal." "Não existe mais espaço no tabuleiro de Favoritos" "Aplicações" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 69a60e1cc2..7e79853529 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -32,8 +32,7 @@ "Pesquisar apps..." "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" - - + "Pesquisar mais apps" "Não há mais espaço na tela inicial." "Sem espaço na bandeja de favoritos" "Apps" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index cfe631fc2a..484bbe473c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -32,8 +32,7 @@ "Căutați aplicații…" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" - - + "Căutați mai multe aplicații" "Nu mai este loc pe acest Ecran de pornire." "Spațiu epuizat în bara Preferate" "Aplicații" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a9fe9491fa..11d3250a49 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -32,8 +32,7 @@ "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" - - + "Искать другие приложения" "На этом экране все занято" "В разделе \"Избранное\" больше нет места" "Приложения" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 41e4d9a519..c08285ae95 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -32,8 +32,7 @@ "යෙදුම් සොයන්න..." "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" - - + "තව යෙදුම් සඳහා සොයන්න" "මෙම මුල් පිටු තිරය මත තවත් අවසර නැත." "ප්‍රියතම දෑ ඇති තැටියේ තවත් ඉඩ නොමැත" "යෙදුම්" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index d0dcf27f2c..133b503a65 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -32,8 +32,7 @@ "Hľadať aplikácie…" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" - - + "Hľadať ďalšie aplikácie" "Na tejto ploche už nie je miesto" "Na paneli Obľúbené položky už nie je miesto" "Aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 5d396e4700..b2c2f61bbd 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -32,8 +32,7 @@ "Iskanje po aplikacijah …" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" - - + "Iskanje več aplikacij" "Na tem začetnem zaslonu ni več prostora." "V vrstici za priljubljene ni več prostora" "Aplikacije" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 262769161f..f55ee488ec 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -32,8 +32,7 @@ "Kërko për aplikacione..." "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" - - + "Kërko për më shumë aplikacione" "Nuk ka më hapësirë në këtë ekran bazë." "Nuk ka më hapësirë në tabakanë \"Të preferuarat\"" "Aplikacionet" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index c4154f563c..fa979706ab 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -32,8 +32,7 @@ "Претражите апликације..." "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" - - + "Претражи још апликација" "Нема више простора на овом почетном екрану." "Нема више простора на траци Омиљено" "Апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 7f5af4b6ef..6713d1da1d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -32,8 +32,7 @@ "Sök efter appar …" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" - - + "Sök efter fler appar" "Det finns inte plats för mer på den här startskärmen." "Favoritfältet är fullt" "Appar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 291e52d731..0b57b81612 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -32,8 +32,7 @@ "Tafuta Programu..." "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" - - + "Tafuta programu zaidi" "Hakuna nafasi katika skrini hii ya Mwanzo." "Hakuna nafasi zaidi katika treya ya Vipendeleo" "Programu" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 495f9d1056..dc9b927646 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -32,8 +32,7 @@ "பயன்பாடுகளில் தேடுக…" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" - - + "கூடுதல் பயன்பாடுகளைத் தேடு" "முகப்புத் திரையில் இடமில்லை." "பிடித்தவை ட்ரேயில் இடமில்லை" "பயன்பாடுகள்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 2757d4a6be..3b56760b7b 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -32,8 +32,7 @@ "అనువర్తనాల్లో శోధించండి…" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" - - + "మరిన్ని అనువర్తనాల కోసం శోధించు" "ఈ హోమ్ స్క్రీన్‌లో ఖాళీ లేదు." "ఇష్టమైనవి ట్రేలో ఖాళీ లేదు" "అనువర్తనాలు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 3fa6211d2e..58b1d98e3e 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -32,8 +32,7 @@ "ค้นหาแอป…" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" - - + "ค้นหาแอปเพิ่มเติม" "ไม่มีที่ว่างในหน้าจอหลักนี้" "ไม่มีพื้นที่เหลือในถาดรายการโปรด" "แอป" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index dd7adeaaac..370e137089 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -32,8 +32,7 @@ "Maghanap ng Mga App…" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" - - + "Maghanap ng higit pang mga app" "Wala nang lugar sa Home screen na ito." "Wala nang lugar sa tray ng Mga Paborito" "Apps" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 40ac47310b..1b1818d6a1 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -32,8 +32,7 @@ "Uygulamalarda Ara…" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" - - + "Başka uygulamalar ara" "Bu Ana ekranda yer kalmadı." "Favoriler tepsisinde başka yer kalmadı" "Uygulamalar" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 497d71e5a2..581046b6fd 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -32,8 +32,7 @@ "Пошук додатків…" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" - - + "Шукати ще додатки" "На цьому головному екрані більше немає місця." "В області \"Вибране\" немає місця" "Додатки" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 6bc601d493..34777b8222 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -32,8 +32,7 @@ "ایپس تلاش کریں…" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" - - + "مزید ایپس تلاش کریں" "اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔" "پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے" "ایپس" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 80e3460fb3..a059b6430a 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -32,8 +32,7 @@ "Ilovalar ichidan qidirish…" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" - - + "Boshqa ilovalarni qidirish" "Uy ekranida bitta ham xona yo‘q." "Ajratilganlarda birorta ham xona yo‘q" "Ilovalar" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index baf2cada0c..14bb30e94a 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -32,8 +32,7 @@ "Tìm kiếm ứng dụng..." "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" - - + "Tìm kiếm thêm ứng dụng" "Không còn chỗ trên Màn hình chính này." "Không còn chỗ trong khay Mục yêu thích" "Ứng dụng" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index d784b471e3..276ebd8c22 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -32,8 +32,7 @@ "搜索应用…" "正在加载应用…" "未找到与“%1$s”相符的应用" - - + "搜索更多应用" "此主屏幕上已没有空间。" "收藏栏已满" "应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 04406481b9..71a35f91e5 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -32,8 +32,7 @@ "搜尋應用程式…" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" - - + "搜尋更多應用程式" "主畫面已無空間。" "我的收藏寄存區沒有足夠空間" "應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c9bb47f53e..9b239b2c2d 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -32,8 +32,7 @@ "搜尋應用程式…" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" - - + "搜尋更多應用程式" "這個主螢幕已無空間。" "「我的最愛」匣已無可用空間" "應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index bacf2b8da8..e19253d413 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -32,8 +32,7 @@ "Sesha izinhlelo zokusebenza..." "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" - - + "Sesha izinhlelo zokusebenza eziningi" "Asisekho isikhala kulesi sikrini Sasekhaya." "Asisekho isikhala kwitreyi lezintandokazi" "Izinhlelo zokusebenza" From 5c4d9d1b6f6e6b80ebe26f5e7a9487558e107ed4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 23 Jun 2016 07:27:35 -0700 Subject: [PATCH 017/382] Import translations. DO NOT MERGE Change-Id: I5a894e35050d7445d4593ca4578a5d26eef05131 Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 ++++-- res/values-am/strings.xml | 6 ++++-- res/values-ar/strings.xml | 6 ++++-- res/values-az-rAZ/strings.xml | 6 ++++-- res/values-bg/strings.xml | 6 ++++-- res/values-bn-rBD/strings.xml | 6 ++++-- res/values-ca/strings.xml | 8 +++++--- res/values-cs/strings.xml | 6 ++++-- res/values-da/strings.xml | 6 ++++-- res/values-de/strings.xml | 6 ++++-- res/values-el/strings.xml | 6 ++++-- res/values-en-rAU/strings.xml | 6 ++++-- res/values-en-rGB/strings.xml | 6 ++++-- res/values-en-rIN/strings.xml | 6 ++++-- res/values-es-rUS/strings.xml | 6 ++++-- res/values-es/strings.xml | 6 ++++-- res/values-et-rEE/strings.xml | 6 ++++-- res/values-eu-rES/strings.xml | 6 ++++-- res/values-fa/strings.xml | 6 ++++-- res/values-fi/strings.xml | 6 ++++-- res/values-fr-rCA/strings.xml | 6 ++++-- res/values-fr/strings.xml | 6 ++++-- res/values-gl-rES/strings.xml | 6 ++++-- res/values-gu-rIN/strings.xml | 6 ++++-- res/values-hi/strings.xml | 6 ++++-- res/values-hr/strings.xml | 6 ++++-- res/values-hu/strings.xml | 6 ++++-- res/values-hy-rAM/strings.xml | 6 ++++-- res/values-in/strings.xml | 6 ++++-- res/values-is-rIS/strings.xml | 6 ++++-- res/values-it/strings.xml | 6 ++++-- res/values-iw/strings.xml | 6 ++++-- res/values-ja/strings.xml | 6 ++++-- res/values-ka-rGE/strings.xml | 6 ++++-- res/values-kk-rKZ/strings.xml | 6 ++++-- res/values-km-rKH/strings.xml | 6 ++++-- res/values-kn-rIN/strings.xml | 6 ++++-- res/values-ko/strings.xml | 6 ++++-- res/values-ky-rKG/strings.xml | 6 ++++-- res/values-lo-rLA/strings.xml | 6 ++++-- res/values-lt/strings.xml | 6 ++++-- res/values-lv/strings.xml | 6 ++++-- res/values-mk-rMK/strings.xml | 6 ++++-- res/values-ml-rIN/strings.xml | 6 ++++-- res/values-mn-rMN/strings.xml | 6 ++++-- res/values-mr-rIN/strings.xml | 6 ++++-- res/values-ms-rMY/strings.xml | 6 ++++-- res/values-my-rMM/strings.xml | 6 ++++-- res/values-nb/strings.xml | 6 ++++-- res/values-ne-rNP/strings.xml | 6 ++++-- res/values-nl/strings.xml | 6 ++++-- res/values-pa-rIN/strings.xml | 6 ++++-- res/values-pl/strings.xml | 6 ++++-- res/values-pt-rPT/strings.xml | 6 ++++-- res/values-pt/strings.xml | 6 ++++-- res/values-ro/strings.xml | 6 ++++-- res/values-ru/strings.xml | 6 ++++-- res/values-si-rLK/strings.xml | 6 ++++-- res/values-sk/strings.xml | 6 ++++-- res/values-sl/strings.xml | 6 ++++-- res/values-sq-rAL/strings.xml | 6 ++++-- res/values-sr/strings.xml | 6 ++++-- res/values-sv/strings.xml | 6 ++++-- res/values-sw/strings.xml | 6 ++++-- res/values-ta-rIN/strings.xml | 6 ++++-- res/values-te-rIN/strings.xml | 6 ++++-- res/values-th/strings.xml | 6 ++++-- res/values-tl/strings.xml | 6 ++++-- res/values-tr/strings.xml | 6 ++++-- res/values-uk/strings.xml | 6 ++++-- res/values-ur-rPK/strings.xml | 6 ++++-- res/values-uz-rUZ/strings.xml | 6 ++++-- res/values-vi/strings.xml | 6 ++++-- res/values-zh-rCN/strings.xml | 6 ++++-- res/values-zh-rHK/strings.xml | 6 ++++-- res/values-zh-rTW/strings.xml | 6 ++++-- res/values-zu/strings.xml | 6 ++++-- 77 files changed, 309 insertions(+), 155 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index e3d8086afb..dd69e3e7b5 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -26,7 +26,7 @@ "Program is nie beskikbaar nie" "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" - "Tik en hou om \'n legstuk op te tel." + "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" "Deursoek programme …" @@ -60,7 +60,7 @@ "KOPIEER IKONE" "BEGIN VAN NUUTS AF" "Muurpapiere, legstukke en instellings" - "Tik en hou agtergrond om te pasmaak" + "Raak en hou agtergrond om te pasmaak" "HET DIT" "Vouer oopgemaak, %1$d by %2$d" "Tik om die vouer toe te maak" @@ -72,6 +72,8 @@ "Muurpapiere" "Instellings" "Gedeaktiveer deur jou administrateur" + + "Laat tuisskermrotasie toe" "Wanneer toestel gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index a931605c09..784b3c31a8 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -26,7 +26,7 @@ "መተግበሪያ አይገኝም" "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" - "ንዑስ ፕሮግራም ለማንሳት መታ አድርገው ይያዙት።" + "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" "መተግበሪያዎችን ይፈልጉ…" @@ -60,7 +60,7 @@ "አዶዎችን ይቅዱ" "እንደ አዲስ ይጀምሩ" "የግድግዳ ወረቀቶች፣ ንዑስ ፕሮግራሞች እና ቅንብሮች" - "ለማበጀት ጀርባውን መታ አድርገው ይያዙት" + "ለማበጀት ጀርባውን ነክተው ይያዙት" "ገባኝ" "አቃፊ ተከፍቷል፣ %1$d%2$d" "አቃፊን ለመዝጋት መታ ያድርጉ" @@ -72,6 +72,8 @@ "የግድግዳ ወረቀቶች" "ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" + + "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "መሣሪያው ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 104f0f0f16..46d6757c0c 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -26,7 +26,7 @@ "التطبيق ليس متاحًا" "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" - "المس مع الاستمرار لاختيار إحدى الأدوات." + "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "البحث في التطبيقات…" @@ -60,7 +60,7 @@ "نسخ الرموز" "بداية جديدة" "الخلفيات والأدوات والإعدادات" - "المس مع الاستمرار الخلفية لتخصيصها" + "المس مع الاستمرار الخلفية لتخصيصها" "حسنًا" "تم فتح المجلد، بمقاس %1$d في %2$d" "انقر لإغلاق المجلد" @@ -72,6 +72,8 @@ "الخلفيات" "الإعدادات" "عطَّل المشرف هذه الميزة" + + "السماح بتدوير الشاشة الرئيسية" "أوقات تدوير الجهاز" "لا يسمح إعداد العرض الحالي بالتدوير" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 5d6b2eebae..4403b49ca8 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -26,7 +26,7 @@ "Tətbiq əlçatmazdır" "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" - "Vidceti götürmək üçün toxunaraq saxlayın." + "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" "Tətbiqləri Axtarın..." @@ -60,7 +60,7 @@ "İKONALARI KOPYALA" "YENİDƏN BAŞLA" "Divar kağızları, vidcetlər və ayarlar" - "Fərdiləşdirmək üçün arxa fona toxunaraq saxlayın" + "Fərdiləşdirmək üçün arxa fona toxunaraq saxlayın" "ANLADIM" "Qovluq açıldı, %2$d hündürlük ilə %1$d enində" "Qovluq bağlamaq üçün toxunun" @@ -72,6 +72,8 @@ "Divar kağızları" "Ayarlar" "Admininiz tərəfindən deaktiv edilib" + + "Əsas ekranın firlanmağına icazə verin" "Cihaz çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 06c318350b..8aaf8158bc 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -26,7 +26,7 @@ "Приложението не е налично" "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" - "Докоснете и задръжте за избор на приспособление." + "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Търсене в приложенията…" @@ -60,7 +60,7 @@ "КОПИРАНЕ НА ИКОНИТЕ" "СТАРТИРАНЕ ОТНАЧАЛО" "Тапети, приспособления и настройки" - "Докоснете и задръжте фона, за да го персонализирате" + "Докоснете и задръжте фона за персонализиране" "РАЗБРАХ" "Папката е отворена – %1$d на %2$d" "Докоснете, за да затворите папката" @@ -72,6 +72,8 @@ "Тапети" "Настройки" "Деактивирано от администратора ви" + + "Разрешаване на завъртането на началния екран" "При завъртане на устройството" "Текущата настройка на екрана не разрешава завъртане" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index a92ea4a7f1..5ba583adab 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -26,7 +26,7 @@ "অ্যাপ্লিকেশান অনুপলব্ধ" "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" - "একটি উইজেট বেছে নিতে আলতো চেপে ধরে রাখুন৷" + "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." @@ -60,7 +60,7 @@ "আইকনগুলি কপি করুন" "নতুন করে শুরু করুন" "ওয়ালপেপার, উইজেট এবং সেটিংস" - "কাস্টমাইজ করার জন্য পটভূমিতে আলতো চেপে ধরে রাখুন" + "নিজের পছন্দমত সাজানোর জন্য পটভূমি স্পর্শ করে ধরে থাকুন" "বুঝেছি" "ফোল্ডার খোলা হয়েছে, %1$d বাই %2$d" "ফোল্ডার বন্ধ করতে আলতো চাপ দিন" @@ -72,6 +72,8 @@ "ওয়ালপেপারগুলি" "সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" + + "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "ডিভাইস যখন ঘোরানো হবে" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 2494feff28..c8813ec623 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -26,7 +26,7 @@ "L\'aplicació no està disponible." "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." - "Toca i mantén premut un widget per triar-lo." + "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "Cerca a les aplicacions…" @@ -58,9 +58,9 @@ "Copiar les icones d\'aplicació" "Importar icones i carpetes de pantalles d\'inici anteriors?" "COPIA LES ICONES." - "NOU COMENÇAMENT" + "COMENÇA DE ZERO" "Fons de pantalla, widgets i configuració" - "Toca i mantén premut el fons per personalitzar-lo" + "Mantén premut el fons per fer personalitzacions." "D\'ACORD" "S\'ha obert la carpeta, %1$d per %2$d" "Toca per tancar la carpeta" @@ -72,6 +72,8 @@ "Fons de pantalla" "Configuració" "Desactivada per l\'administrador" + + "Permet la rotació de la pantalla d\'inici" "En girar el dispositiu" "La configuració actual de la pantalla no permet la rotació" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index e7aefa4f9f..4d5052303b 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -26,7 +26,7 @@ "Aplikace není k dispozici." "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." - "Widget vyberete klepnutím a podržením." + "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "Hledat v aplikacích…" @@ -60,7 +60,7 @@ "ZKOPÍROVAT IKONY" "ZAČÍT S VÝCHOZÍM ROZVRŽENÍM" "Tapety, widgety a nastavení" - "Pozadí můžete přizpůsobit klepnutím a podržením." + "Pozadí můžete přizpůsobit klepnutím a podržením" "ROZUMÍM" "Složka otevřena, rozměry %1$d x %2$d" "Klepnutím složku zavřete" @@ -72,6 +72,8 @@ "Tapety" "Nastavení" "Zakázáno administrátorem" + + "Povolit otáčení plochy" "Při otočení zařízení" "Aktuální nastavení displeje neumožňuje otáčení" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 6b87ea292f..9fd53716a5 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -26,7 +26,7 @@ "Appen er ikke tilgængelig" "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" - "Tryk på en widget, og hold den nede for at vælge." + "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "Søg i Apps…" @@ -60,7 +60,7 @@ "KOPIÉR IKONER" "START PÅ EN FRISK" "Baggrunde, widgets og indstillinger" - "Tryk på baggrunden, og hold fingeren nede for at tilpasse den" + "Tryk på baggrunden, og hold fingeren nede for at tilpasse den" "OK, FORSTÅET" "Mappen er åben, %1$d gange %2$d" "Tryk for at lukke mappen" @@ -72,6 +72,8 @@ "Baggrunde" "Indstillinger" "Deaktiveret af din administrator" + + "Tillad rotation af startskærmen" "Når enheden roteres" "Den aktuelle indstilling for visning tillader ikke rotation" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c769f397bc..eab0b011c9 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -26,7 +26,7 @@ "App nicht verfügbar" "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" - "Widget zum Hinzufügen antippen und halten." + "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "Apps suchen…" @@ -60,7 +60,7 @@ "Symbole kopieren" "Standardübersicht verwenden" "Hintergründe, Widgets & Einstellungen" - "Hintergrund zum Anpassen antippen und halten" + "Berühre und halte den Hintergrund, um ihn anzupassen." "OK" "Ordner geöffnet, %1$d x %2$d" "Ordner zum Schließen antippen" @@ -72,6 +72,8 @@ "Hintergründe" "Einstellungen" "Von deinem Administrator deaktiviert" + + "Drehung des Startbildschirms zulassen" "Bei Drehung des Geräts" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 8cd4e63941..fdd5947d3f 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,7 +26,7 @@ "Η εφαρμογή δεν είναι διαθέσιμη" "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" - "Πατήστε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." + "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Αναζήτηση εφαρμογών…" @@ -60,7 +60,7 @@ "ΑΝΤΙΓΡΑΦΗ ΕΙΚΟΝΙΔΙΩΝ" "ΝΕΑ ΕΝΑΡΞΗ" "Ταπετσαρίες, γραφικά στοιχεία και ρυθμίσεις" - "Πατήστε παρατεταμένα το παρασκήνιο για προσαρμογή" + "Αγγίξτε παρατεταμένα το παρασκήνιο για προσαρμογή" "ΤΟ ΚΑΤΑΛΑΒΑ" "Άνοιγμα φακέλου, %1$d επί %2$d" "Πατήστε για να κλείσετε το φάκελο" @@ -72,6 +72,8 @@ "Ταπετσαρίες" "Ρυθμίσεις" "Απενεργοποιήθηκε από τον διαχειριστή σας" + + "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν η συσκευή περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c799cb7151..3c69bdddab 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Tap & hold to pick up a widget." + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,7 +60,7 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets & settings" - "Tap & hold background to customise" + "Touch & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" @@ -72,6 +72,8 @@ "Wallpapers" "Settings" "Disabled by your admin" + + "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index c799cb7151..3c69bdddab 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Tap & hold to pick up a widget." + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,7 +60,7 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets & settings" - "Tap & hold background to customise" + "Touch & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" @@ -72,6 +72,8 @@ "Wallpapers" "Settings" "Disabled by your admin" + + "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index c799cb7151..3c69bdddab 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -26,7 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - "Tap & hold to pick up a widget." + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "Search Apps…" @@ -60,7 +60,7 @@ "COPY ICONS" "START AFRESH" "Wallpapers, widgets & settings" - "Tap & hold background to customise" + "Touch & hold background to customise" "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" @@ -72,6 +72,8 @@ "Wallpapers" "Settings" "Disabled by your admin" + + "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index ba08c89bd8..07642a4c88 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -26,7 +26,7 @@ "La aplicación no está disponible." "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - "Mantén presionado para elegir un widget." + "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "Buscar apps…" @@ -60,7 +60,7 @@ "COPIAR ÍCONOS" "EMPEZAR DE CERO" "Fondos, widgets y configuración" - "Mantén presionado el fondo para personalizarlo" + "Mantén presionado el fondo para personalizarlo" "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" "Presiona para cerrar la carpeta" @@ -72,6 +72,8 @@ "Fondos de pantalla" "Configuración" "El administrador inhabilitó esta función" + + "Permitir la rotación de la pantalla principal" "Al rotar el dispositivo" "La configuración actual no permite la rotación de la pantalla" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index fa8cc281d2..1f322bae3b 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -26,7 +26,7 @@ "La aplicación no está disponible" "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - "Mantén pulsado el widget que quieras seleccionar." + "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "Buscar aplicaciones…" @@ -60,7 +60,7 @@ "COPIAR ICONOS" "AJUSTES PREDETERMINADOS" "Fondos de pantalla, widgets y ajustes" - "Mantén pulsado el fondo para personalizarlo" + "Mantén pulsado el fondo para personalizarlo" "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" "Toca para cerrar la carpeta" @@ -72,6 +72,8 @@ "Fondos de pantalla" "Ajustes" "Inhabilitada por el administrador" + + "Permitir rotación de la pantalla de inicio" "Al girar el dispositivo" "La configuración de pantalla actual no permite girar la pantalla" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 8b9ada25d8..a3515329fa 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -26,7 +26,7 @@ "Rakendus ei ole saadaval" "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" - "Vidina valimiseks puudutage pikalt." + "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "Otsimine rakendustest …" @@ -60,7 +60,7 @@ "KOPEERI IKOONID" "ALUSTA ALGUSEST" "Taustapildid, vidinad ja seaded" - "Kohandamiseks puudutage pikalt tausta" + "Kohandamiseks puudutage ja hoidke tausta all" "SELGE" "Kaust on avatud, %1$d x %2$d" "Puudutage kausta sulgemiseks" @@ -72,6 +72,8 @@ "Taustapildid" "Seaded" "Keelas administraator" + + "Luba avaekraani pööramine" "Kui seadet pööratakse" "Praegune kuvaseade ei luba pööramist" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index b0029f559c..58a4cc50aa 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -26,7 +26,7 @@ "Ez dago erabilgarri aplikazioa" "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" - "Widgeta aukeratzeko, eduki ezazu sakatuta." + "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" "Bilatu aplikazioetan…" @@ -60,7 +60,7 @@ "KOPIATU IKONOAK" "HASI HUTSETIK" "Horma-paperak, widgetak eta ezarpenak" - "Pertsonalizatzeko, eduki sakatuta atzeko planoa" + "Pertsonalizatzeko, eduki sakatuta atzeko planoa" "ADOS" "Karpeta ireki da: %1$d x %2$d" "Karpeta ixteko, sakatu hau" @@ -72,6 +72,8 @@ "Horma-paperak" "Ezarpenak" "Administratzaileak desgaitu du" + + "Baimendu hasierako pantaila biratzea" "Gailua biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index cbf6747ee6..fafdead5da 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -26,7 +26,7 @@ "برنامه در دسترس نیست" "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" - "برای انتخاب ابزارک، لمس کنید و نگه‌دارید." + "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "جستجوی برنامه‌ها…‏‏" @@ -60,7 +60,7 @@ "کپی نمادها" "شروع تازه" "کاغذدیواری‌ها، ابزارک‌ها و تنظیمات" - "برای سفارشی کردن، پس‌زمینه را لمس کنید و نگه‌دارید" + "برای سفارشی کردن، پس‌زمینه را لمس کنید و نگه‌دارید" "متوجه شدم" "پوشه باز شده، %1$d در %2$d" "برای بستن پوشه، ضربه بزنید" @@ -72,6 +72,8 @@ "کاغذدیواری‌ها" "تنظیمات" "توسط سرپرست سیستم غیرفعال شده است" + + "مجاز کردن چرخش صفحه‌اصلی" "وقتی دستگاه چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 3ee5ac739b..8483e7a956 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -26,7 +26,7 @@ "Sovellus ei ole käytettävissä" "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" - "Valitse widget koskettamalla pitkään." + "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Hae sovelluksia…" @@ -60,7 +60,7 @@ "KOPIOI KUVAKKEET" "ALOITA ALUSTA" "Taustakuvat, widgetit ja asetukset" - "Muokkaa taustaa koskettamalla pitkään." + "Muokkaa taustaa koskettamalla ja painamalla pitkään." "SELVÄ" "Kansio avattu, koko %1$d x %2$d" "Sulje kansio koskettamalla." @@ -72,6 +72,8 @@ "Taustakuvat" "Asetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." + + "Salli aloitusnäytön kiertäminen" "Kun laitetta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 0a64c5001f..48ed903483 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -26,7 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" - "Maintenez un doigt sur le widget pour l\'ajouter." + "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "Rechercher des applications..." @@ -60,7 +60,7 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - "Maintenez un doigt sur le fond d\'écran pour le personnaliser" + "Maintenez le doigt sur le fond d\'écran pour le personnaliser" "J\'ai compris" "Dossier ouvert, %1$d par %2$d" "Touchez pour fermer le dossier" @@ -72,6 +72,8 @@ "Fonds d\'écran" "Paramètres" "Cette fonction est désactivée par votre administrateur" + + "Autoriser la rotation de l\'écran d\'accueil" "Lorsque l\'utilisateur pivote l\'appareil" "Le mode d\'affichage actuel ne permet pas le pivotement" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f7a603540a..8602348676 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -26,7 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." - "App. de manière prolongée pour sélectionner widget." + "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "Rechercher des applications…" @@ -60,7 +60,7 @@ "COPIER LES ICÔNES" "DISPOSITION PAR DÉFAUT" "Fonds d\'écran, widgets et paramètres" - "Appuyez de manière prolongée sur l\'arrière-plan pour le personnaliser." + "Appuyez de manière prolongée sur l\'arrière-plan pour le personnaliser." "OK" "Dossier ouvert, %1$d par %2$d" "Appuyez pour fermer le dossier." @@ -72,6 +72,8 @@ "Fonds d\'écran" "Paramètres" "Désactivé par votre administrateur" + + "Autoriser la rotation de l\'écran d\'accueil" "Lorsque l\'utilisateur fait pivoter l\'appareil" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 88230e946a..d784943d58 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -26,7 +26,7 @@ "A aplicación non está dispoñible" "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" - "Mantén tocado un widget para seleccionalo." + "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "Buscar aplicacións..." @@ -60,7 +60,7 @@ "COPIAR ICONAS" "COMEZAR DE CERO" "Fondos de pantalla, widgets e configuración" - "Mantén tocado o segundo plano para personalizalo" + "Mantén premido o fondo para personalizalo" "DE ACORDO" "Abriuse o cartafol, %1$d por %2$d" "Toca fóra para pechar o cartafol" @@ -72,6 +72,8 @@ "Fondos de pantalla" "Configuración" "Función desactivada polo administrador" + + "Permitir xirar a pantalla de inicio" "Ao xirar o dispositivo" "A configuración de visualización actual non permite xirar a pantalla" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 19ad9b7552..e0d8853cf8 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -26,7 +26,7 @@ "ઍપ્લિકેશન ઉપલબ્ધ નથી" "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" - "વિજેટ ચૂંટવા માટે ટૅપ કરીને આંગળી દાબેલી રાખો." + "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "ઍપ્લિકેશનોમાં શોધો…" @@ -60,7 +60,7 @@ "આયકન્સને કૉપિ કરો" "નવેસરથી પ્રારંભ કરો" "વૉલપેપર્સ, વિજેટ્સ અને સેટિંગ્સ" - "કસ્ટમાઇઝ કરવા માટે પૃષ્ઠભૂમિને ટૅપ કરીને આંગળી દાબેલી રાખો" + "પૃષ્ઠભૂમિને કસ્ટમાઇઝ કરવા માટે ટચ કરો અને પકડી રાખો" "સમજાઈ ગયું" "%1$d બાય %2$d નું ફોલ્ડર ખોલ્યું" "ફોલ્ડર બંધ કરવા માટે ટૅપ કરો" @@ -72,6 +72,8 @@ "વૉલપેપર્સ" "સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" + + "હોમસ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ઉપકરણ ફેરવેલું હોય ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 60ed3de8f3..a2b4276f5c 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -26,7 +26,7 @@ "ऐप्स उपलब्ध नहीं है" "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" - "कोई विजेट चुनने के लिए टैप करके रखें." + "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" "ऐप्स खोजें…" @@ -60,7 +60,7 @@ "आइकन की प्रतिलिपि बनाएं" "फिर से शुरू करें" "वॉलपेपर, शॉर्टकट और सेटिंग" - "पृष्ठभूमि कस्टमाइज़ करने के लिए टैप करके रखें" + "पृष्ठभूमि कस्टमाइज़ करने के लिए स्पर्श करके रखें" "समझ लिया" "फ़ोल्डर खोला गया, %1$d गुणा %2$d" "फ़ोल्डर बंद करने के लिए टैप करें" @@ -72,6 +72,8 @@ "वॉलपेपर" "सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" + + "होमस्क्रीन घुमाने की अनुमति दें" "डिवाइस घुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index a9155c170f..06c51884f2 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -26,7 +26,7 @@ "Aplikacija nije dostupna" "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" - "Dodirnite i zadržite da biste podigli widget." + "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" "Pretraživanje aplikacija…" @@ -60,7 +60,7 @@ "KOPIRAJ IKONE" "POKRENI NOVO" "Pozadine, widgeti i postavke" - "Dodirnite i zadržite pozadinu da biste je prilagodili" + "Dodirnite i zadržite pozadinu radi prilagodbe" "SHVAĆAM" "Mapa je otvorena, %1$d x %2$d" "Dodirnite da biste zatvorili mapu" @@ -72,6 +72,8 @@ "Pozadine" "Postavke" "Onemogućio administrator" + + "Dopusti zakretanje početnog zaslona" "Kada se uređaj zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index a3254f954f..d79b0d1849 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -26,7 +26,7 @@ "Az alkalmazás nem érhető el" "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" - "Modul felvételéhez koppintson, és tartsa lenyomva." + "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "Alkalmazások keresése…" @@ -60,7 +60,7 @@ "IKONOK MÁSOLÁSA" "TELJESEN ÚJ" "Háttérképek, modulok és beállítások" - "Koppintson és tartsa lenyomva a személyre szabáshoz" + "Érintse meg és tartsa lenyomva a személyre szabáshoz" "MEGÉRTETTEM" "Mappa megnyitva – szélesség: %1$d; magasság: %2$d" "Érintse meg a mappa bezárásához" @@ -72,6 +72,8 @@ "Háttérképek" "Beállítások" "A rendszergazda letiltotta" + + "Kezdőképernyő elforgatásának engedélyezése" "Az eszköz forgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 5ad6d45078..c5876ff515 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -26,7 +26,7 @@ "Հավելվածը հասանելի չէ" "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" - "Հպեք և պահեք՝ վիջեթ ընտրելու համար:" + "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Հավելվածների որոնում…" @@ -60,7 +60,7 @@ "ՊԱՏՃԵՆԵԼ ՊԱՏԿԵՐԱԿՆԵՐԸ" "ՄԵԿՆԱՐԿԵԼ ԸՍՏ ԿԱՆԽԱԴՐՎԱԾԻ" "Պաստառներ, վիջեթներ և կարգավորումներ" - "Հարմարեցնելու համար հպեք ֆոնին և պահեք" + "Հարմարեցնելու համար հպեք և պահեք հետնաշերտի վրա" "ՀԱՍԿԱՆԱԼԻ Է" "Պանակը բաց է, %1$d-ից %2$d" "Հպեք՝ պանակը փակելու համար" @@ -72,6 +72,8 @@ "Պաստառներ" "Կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" + + "Թույլ տալ գլխավոր էկրանի պտտումը" "Սարքը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index e2157db3d9..ef73c4426e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -26,7 +26,7 @@ "Aplikasi tidak tersedia" "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" - "Sentuh lama untuk memilih widget." + "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "Telusuri Aplikasi..." @@ -60,7 +60,7 @@ "IKON SALIN" "MULAI DARI AWAL" "Wallpaper, widget, & setelan" - "Sentuh lama latar belakang untuk menyesuaikan" + "Sentuh & tahan latar belakang untuk menyesuaikan" "MENGERTI" "Folder dibuka, %1$d x %2$d" "Ketuk untuk menutup folder" @@ -72,6 +72,8 @@ "Wallpaper" "Setelan" "Dinonaktifkan oleh admin" + + "Izinkan layar utama diputar" "Saat perangkat diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 3dbd75a722..15510fd27d 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -26,7 +26,7 @@ "Forritið er ekki í boði" "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" - "Haltu fingri á græju til að grípa hana." + "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "Leita í forritum…" @@ -60,7 +60,7 @@ "AFRITA TÁKN" "BYRJA UPP Á NÝTT" "Veggfóður, græjur og stillingar" - "Haltu fingri á bakgrunninum til að sérsníða hann" + "Haltu fingri á bakgrunninum til að sérsníða hann" "ÉG SKIL" "Mappa opnuð, %1$d sinnum %2$d" "Ýttu til að loka möppunni" @@ -72,6 +72,8 @@ "Veggfóður" "Stillingar" "Gert óvirkt af kerfisstjóra" + + "Leyfa snúning fyrir heimaskjá" "Þegar tækinu er snúið" "Núverandi skjástilling leyfir ekki snúning" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 221f30ec75..67fc02f90c 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -26,7 +26,7 @@ "App non disponibile" "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" - "Tocca e tieni premuto per scegliere un widget." + "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" "Ricerca app…" @@ -60,7 +60,7 @@ "COPIA ICONE" "RICOMINCIA" "Sfondi, widget e impostazioni" - "Tieni premuto un dito sullo sfondo per personalizzare" + "Tieni premuto un dito sullo sfondo per personalizzare" "OK" "Cartella aperta, %1$d per %2$d" "Tocca per chiudere la cartella" @@ -72,6 +72,8 @@ "Sfondi" "Impostazioni" "Disattivata dall\'amministratore" + + "Consenti rotazione della schermata Home" "Quando il dispositivo viene ruotato" "L\'impostazione corrente del display non consente la rotazione" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 12bc7406bf..9b8bb9d551 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -26,7 +26,7 @@ "האפליקציה אינה זמינה" "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" - "הקש הקשה רציפה על הווידג\'ט כדי לבחור בו." + "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" "חיפוש אפליקציות..." @@ -60,7 +60,7 @@ "העתק סמלים" "התחל דף חדש" "טפטים, ווידג\'טים והגדרות" - "הקשה רציפה על הרקע לצורך התאמה אישית" + "גע והחזק ברקע כדי לבצע התאמה אישית" "הבנתי" "תיקיה פתוחה, %1$d על %2$d" "הקש כדי לסגור את התיקייה" @@ -72,6 +72,8 @@ "טפטים" "הגדרות" "הושבת על ידי מנהל המערכת שלך" + + "אפשרות סיבוב של מסך דף הבית" "בסיבוב המכשיר" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 4b717a4a94..83013879fb 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -26,7 +26,7 @@ "このアプリは使用できません" "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" - "ウィジェットを追加するには押し続けます。" + "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" "アプリを検索…" @@ -60,7 +60,7 @@ "アイコンをコピー" "初期状態にリセットする" "壁紙、ウィジェット、設定" - "カスタマイズするにはバックグラウンドを押し続けます" + "カスタマイズするには背景を押し続けます" "OK" "フォルダが開いています。%1$dx%2$dの大きさです" "タップしてフォルダを閉じます" @@ -72,6 +72,8 @@ "壁紙" "設定" "管理者により無効にされています" + + "ホーム画面の回転を許可" "端末が回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index bc1af5f456..63706ace9d 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -26,7 +26,7 @@ "აპი მიუწვდომელია" "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" - "შეეხეთ ხანგრძლივად ვიჯეტის ასარჩევად." + "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "აპების ძიება…" @@ -60,7 +60,7 @@ "ხატულების კოპირება" "სტანდარტული განლაგება" "ფონები, ვიჯეტები & პარამეტრები" - "მოსარგებად, ხანგრძლივად შეეხეთ ფონს." + "მოსარგებად შეეხეთ & დააყოვნეთ ფონზე" "გასაგებია" "საქაღალდე გახსნილია, %1$d x %2$d" "შეეხეთ საქაღალდის დასახურად" @@ -72,6 +72,8 @@ "ფონები" "პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" + + "მთავარი ეკრანის ბრუნვის დაშვება" "მოწყობილობის ბრუნვისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 1db6961b96..70008e7d72 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -26,7 +26,7 @@ "Қолданба қол жетімді емес" "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" - "Виджетті таңдау үшін оны түртіп, ұстап тұрыңыз." + "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Қолданбаларды іздеу…" @@ -60,7 +60,7 @@ "ТАҢБАЛАРДЫ КӨШІРУ" "ЖАҢАДАН БАСТАУ" "Тұсқағаздар, виджеттер және параметрлер" - "Реттеу үшін фонды саусағыңызбен басып тұрыңыз" + "Реттеу үшін фонды саусағыңызбен басып тұрыңыз" "ТҮСІНДІМ" "Қалта ашылды, %1$d және %2$d" "Қалтаны жабу үшін түртіңіз" @@ -72,6 +72,8 @@ "Тұсқағаздар" "Параметрлер" "Әкімші өшірді" + + "Негізгі экранды айналдыруды рұқсат ету" "Құрылғы айналғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 4a3ecf7609..da7ece1752 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -26,7 +26,7 @@ "មិន​មាន​កម្មវិធី" "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" - "ប៉ះ និងសង្កត់ឲ្យជាប់ដើម្បីជ្រើសធាតុក្រាហ្វិក" + "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" "ស្វែងរកកម្មវិធី…" @@ -60,7 +60,7 @@ "រូប​តំណាង​ច្បាប់​ចម្លង" "ចាប់ផ្ដើម​ធ្វើ​ឲ្យ​ស្រស់" "ផ្ទាំងរូបភាព,ធាតុក្រាហ្វិក & ការកំណត់" - "ប៉ះ និងសង្កត់ផ្ទៃខាងក្រោយឲ្យជាប់ដើម្បីប្ដូរតាមបំណង" + "ប៉ះ & សង្កត់​ផ្ទៃ​ខាង​ក្រោយ​ឲ្យជាប់ ដើម្បី​ប្ដូរ​តាមបំណង" "យល់​ហើយ" "បាន​បើក​ថត %1$d ដោយ %2$d" "ប៉ះ ដើម្បីបិទថត" @@ -72,6 +72,8 @@ "ផ្ទាំង​រូបភាព" "ការកំណត់" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" + + "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅ​ពេល​បង្វិល​ឧបករណ៍When device is rotated" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index f086213240..841696067e 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -26,7 +26,7 @@ "ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ" "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" - "ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಟ್ಯಾಪ್ ಮಾಡಿ." + "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." @@ -60,7 +60,7 @@ "ಐಕಾನ್‌ಗಳನ್ನು ನಕಲಿಸು" "ಹೊಸದಾಗಿ ಪ್ರಾರಂಭಿಸು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು, ವಿಜೆಟ್‌ಗಳು, & ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - "ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹಿನ್ನೆಲೆಯನ್ನು ಹೋಲ್ಡ್‌ ಮಾಡಿ ಮತ್ತು ಟ್ಯಾಪ್ ಮಾಡಿ" + "ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹಿನ್ನೆಲೆಯನ್ನು ಸ್ಪರ್ಶಿಸಿ & ಒತ್ತಿ ಹಿಡಿಯಿರಿ" "ಅರ್ಥವಾಯಿತು" "ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, %1$d ಬೈ %2$d" "ಫೋಲ್ಡರ್‌ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ" @@ -72,6 +72,8 @@ "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" + + "ಮುಖಪರದೆ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಸಾಧನವನ್ನು ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 6089a5c68f..346f6079cc 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -26,7 +26,7 @@ "앱을 사용할 수 없음" "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" - "길게 탭하여 위젯 선택" + "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" "앱 검색..." @@ -60,7 +60,7 @@ "아이콘 복사" "새로 시작" "배경화면, 위젯, 설정" - "백그라운드를 길게 탭하여 맞춤설정" + "백그라운드를 길게 터치하여 맞춤설정합니다." "확인" "폴더 열림(%1$dX%2$d)" "탭하여 폴더 닫기" @@ -72,6 +72,8 @@ "배경화면" "설정" "관리자가 사용 중지함" + + "메인 스크린 회전 허용" "기기 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 1a10e33477..eb120c2b2a 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -26,7 +26,7 @@ "Колдонмо жеткиликтүү эмес" "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" - "Виджетти тандаш үчүн таптап, коё бербей туруңуз." + "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Колдонмолорду издөө…" @@ -60,7 +60,7 @@ "СҮРӨТЧӨЛӨРДҮ КӨЧҮРҮҮ" "ТАЗАСЫН БАШТОО" "Тушкагаздар, виджеттер жана жөндөөлөр" - "Ыңгайлаштыруу үчүн фонду таптап, коё бербей туруңуз" + "Өзгөчөлөштүрүү үчүн фонго тийип коё бербей басып туруңуз" "ТҮШҮНДҮМ" "Фолдер ачылды, туурасы %1$d, бийиктиги %2$d" "Куржунду жабуу үчүн таптаңыз" @@ -72,6 +72,8 @@ "Тушкагаздар" "Тууралоолор" "Администраторуңуз өчүрүп койгон" + + "Башкы экранды айлантууга уруксат берүү" "Түзмөк айланганда" "Экранды айлантуу параметри өчүрүлгөн" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index ecab5222cf..3080219037 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -26,7 +26,7 @@ "ແອັບຯ​ໃຊ້​ບໍ່​ໄດ້" "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" - "ແຕະຄ້າງໄວ້ເພື່ອເລືອກວິດເຈັດໃດໜຶ່ງ." + "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" "ຄົ້ນຫາແອັບ" @@ -60,7 +60,7 @@ "ສຳເນົາໄອຄອນ" "ເລີ່ມຕົ້ນໃໝ່" "ຮູບພາບພື້ນຫຼັງ, ວິດເຈັດ ແລະ ການຕັ້ງຄ່າ" - "ແຕະທີ່ພາບພື້ນຫລັງຄ້າງໄວ້ເພື່ອປັບແຕ່ງ" + "ແຕະທີ່​ພາບ​ພື້ນ​ຫລັງ​ຄ້າງ​ໄວ້​ເພື່ອ​ປັບ​ແຕ່ງ" "ເຂົ້າໃຈແລ້ວ" "ເປີດໂຟນເດີແລ້ວ, %1$d ຄູນ %2$d" "ແຕະເພື່ອປິດໂຟນເດີ" @@ -72,6 +72,8 @@ "ພາບພື້ນຫຼັງ" "ການຕັ້ງຄ່າ" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" + + "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນອຸປະກອນ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 4bd9e24e0e..077837dea9 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -26,7 +26,7 @@ "Programa nepasiekiama" "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" - "Palieskite ir laikykite, kad pasirinkt. valdiklį." + "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" "Ieškoti programų..." @@ -60,7 +60,7 @@ "KOPIJUOTI PIKTOGRAMAS" "PRADĖTI IŠ NAUJO" "Ekrano fonai, valdikliai ir nustatymai" - "Jei norite tinkinti, palieskite ir palaikykite foną" + "Jei norite tinkinti, palieskite ir palaikykite foną" "SUPRATAU" "Atidarytas aplankas, %1$d ir %2$d" "Palieskite, kad uždarytumėte aplanką" @@ -72,6 +72,8 @@ "Ekrano fonai" "Nustatymai" "Išjungė administratorius" + + "Leisti pasukti pagrindinį ekraną" "Kai įrenginys pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 15821ddaaf..9be6f1fad3 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -26,7 +26,7 @@ "Lietotne nav pieejama." "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" - "Lai izvēlētos logrīku, pieskarieties un turiet." + "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "Meklēt lietotnes…" @@ -60,7 +60,7 @@ "KOPĒT IKONAS" "SĀKT NO SĀKUMA" "Fona tapetes, logrīki un iestatījumi" - "Lai pielāgotu fonu, pieskarieties tam un turiet." + "Lai pielāgotu, pieskarieties fonam un turiet to nospiestu." "SAPRATU!" "Atvērta mape: %1$d x %2$d" "Pieskarieties, lai aizvērtu mapi." @@ -72,6 +72,8 @@ "Fona tapetes" "Iestatījumi" "Atspējojis administrators" + + "Atļaut sākuma ekrāna pagriešanu" "Kad ierīce tiek pagriezta" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index a5a18266d7..75e68f4054 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -26,7 +26,7 @@ "Апликацијата не е достапна" "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" - "Допрете и задржете за да изберете додаток." + "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "Пребарувај апликации…" @@ -60,7 +60,7 @@ "КОПИРАЈ ИКОНИ" "СТАРТУВАЈ ОД ПОЧЕТОК" "Позадини, додатоци и поставки" - "Допрете и задржете на заднината за да приспособите" + "Допрете и задржете на заднината за да приспособите" "СФАТИВ" "Отворена е папка, %1$d на %2$d" "Допрете за да ја затворите папката" @@ -72,6 +72,8 @@ "Позадини" "Поставки" "Оневозможено од администраторот" + + "Дозволете ротација на Почетниот екран" "Кога уредот се ротира" "Тековната поставка на Екранот не дозволува ротација" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 68104a6ba8..1371adaeca 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -26,7 +26,7 @@ "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" - "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് ടാപ്പുചെയ്ത് പിടിക്കുക." + "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "ആപ്പ്‌സ് തിരയുക…" @@ -60,7 +60,7 @@ "ഐക്കണുകൾ പകർത്തുക" "പുതുതായി ആരംഭിക്കുക" "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ" - "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്ചാത്തലം ടാപ്പുചെയ്ത് പിടിക്കുക" + "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്‌ചാത്തലം സ്‌പർശിച്ചുപിടിക്കുക" "മനസ്സിലായി" "ഫോൾഡർ തുറന്നു, %1$d / %2$d" "ഫോൾഡർ അടയ്ക്കുന്നതിന് ടാപ്പുചെയ്യുക" @@ -72,6 +72,8 @@ "വാൾപേപ്പർ" "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" + + "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഉപകരണം തിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index a1352fb031..0a01736179 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -26,7 +26,7 @@ "Апп-г ашиглах боломжгүй" "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" - "Жижиг хэрэгсэл авахын тулд дараад, хүлээнэ үү." + "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" "Апп хайх..." @@ -60,7 +60,7 @@ "ДҮРСҮҮДИЙГ ХУУЛАХ" "ШИНЭЭР ЭХЛЭХ" "Дэвсгэр зураг, виджет, & тохиргоо" - "Тохируулахын тулд арын дэлгэцийг дараад, хүлээнэ үү" + "Тааруулахын тулд арын дэлгэцэнд хүрээд & барина уу" "Ойлголоо" "%1$d %2$d фолдер нээгдэв" "Фолдерийг хаахын тулд дарна уу" @@ -72,6 +72,8 @@ "Ханын зураг" "Тохиргоо" "Таны админ идэвхгүй болгосон" + + "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Төхөөрөмжийг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index b2c2f18a67..ff85cdec2f 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -26,7 +26,7 @@ "अॅप उपलब्ध नाही" "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" - "विजेट निवडण्यासाठी टॅप करा आणि धरून ठेवा." + "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "अॅप्स शोधा..." @@ -60,7 +60,7 @@ "चिन्हे कॉपी करा" "नव्याने प्रारंभ करा" "वॉलपेपर, विजेट आणि सेटिंग्ज" - "सानुकूल करण्यासाठी पार्श्वभूमी टॅप करा आणि धरुन ठेवा" + "सानुकूल करण्यासाठी पार्श्वभूमीस स्पर्श करा आणि धरुन ठेवा" "समजले" "फोल्डर उघडले, %1$d बाय %2$d" "फोल्डर बंद करण्यासाठी टॅप करा" @@ -72,6 +72,8 @@ "वॉलपेपर" "सेटिंग्ज" "आपल्या प्रशासकाने अक्षम केले" + + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "डिव्हाइस फिरविलेले असताना" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 8bed230a79..7186f079ce 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -26,7 +26,7 @@ "Apl tidak tersedia" "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" - "Sentuh & tahan untuk mengambil widget." + "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Cari Apl..." @@ -60,7 +60,7 @@ "SALIN IKON" "MULAKAN YANG BAHARU" "Kertas dinding, widget & tetapan" - "Sentuh & tahan latar belakang untuk menyesuaikan" + "Sentuh & tahan latar belakang untuk memperibadikan" "FAHAM" "Folder dibuka, %1$d kali %2$d" "Ketik untuk menutup folder" @@ -72,6 +72,8 @@ "Kertas dinding" "Tetapan" "Dilumpuhkan oleh pentadbir anda" + + "Benarkan putaran skrin utama" "Apabila peranti diputar" "Tetapan Paparan semasa tidak membenarkan putaran" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 26d6e6c218..bb2f1882ae 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -26,7 +26,7 @@ "App လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" - "ဝစ်ဂျက်တစ်ခုကို ရွေးချယ်ရန် တို့၍ & ဖိထားပါ" + "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အက်ပ်များကို ရှာဖွေပါ…" @@ -60,7 +60,7 @@ "COPY ICONS" "START FRESH" "နောက်ခံများ၊ ဝိဂျက်များ& ဆက်တင်များ" - "စိတ်တိုင်းကျပြုပြင်ရန် နောက်ခံတို့၍ & ဖိထားပါ" + "နောက်ခံကို စိတ်တိုင်းကျ ပြုလုပ်ရန် ထိလျက် & ကိုင်ထားပါ" "ရပါပြီ" "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" "ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ" @@ -72,6 +72,8 @@ "နောက်ခံများ" "ဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" + + "ပင်မစာမျက်နှာကို လှည့်ခွင့်ပြုပါ" "စက်ပစ္စည်းကို လှည့်ထားသည့်အခါ" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 6a822e72b6..e6a77b83d8 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -26,7 +26,7 @@ "Appen er ikke tilgjengelig" "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" - "Trykk og hold for å legge til en modul." + "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "Søk i apper" @@ -60,7 +60,7 @@ "KOPIÉR IKONENE" "START PÅ NYTT" "Bakgrunner, moduler og innstillinger" - "Trykk og hold på bakgrunnen for å tilpasse den" + "Trykk og hold på bakgrunnen for å tilpasse den" "SKJØNNER" "Mappen er åpnet – %1$d ganger %2$d" "Trykk for å lukke mappen" @@ -72,6 +72,8 @@ "Bakgrunner" "Innstillinger" "Administratoren har slått av funksjonen" + + "Tillat rotasjon av startskjermen" "Når enheten roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 130217878c..23e17d9630 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -26,7 +26,7 @@ "अनुप्रयोग उपलब्ध छैन" "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" - "विजेट छनोट गर्नका लागि ट्याप गरी थिचिरहनुहोस्।" + "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "अनुप्रयोगहरू खोज्नुहोस्..." @@ -60,7 +60,7 @@ "ICONS प्रतिलिप गर्नुहोस्" "START FRESH" "वालपेपर, विजेट तथा सेटिङहरू" - "अनुकूलन गर्नका लागि पृष्ठभूमिलाई ट्याप गरी थिचिरहनुहोस्" + "अनुकूलन गर्न पृष्ठभूमिलाई छुनुहोस् र होल्ड गर्नुहोस्" "बुँझें" "फोल्डर खुल्यो %1$d बाट %2$d" "फोल्डरलाई बन्द गर्न ट्याप गर्नुहोस्" @@ -72,6 +72,8 @@ "वालपेपरहरु" "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" + + "गृहस्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "यन्त्रलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 3dcf08f387..930a980238 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -26,7 +26,7 @@ "App is niet beschikbaar" "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" - "Tik lang om een widget toe te voegen." + "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" "Apps zoeken…" @@ -60,7 +60,7 @@ "PICTOGRAMMEN KOPIËREN" "OPNIEUW BEGINNEN" "Achtergronden, widgets en instellingen" - "Tik lang op de achtergrond om deze aan te passen" + "Blijf de achtergrond aanraken om deze aan te passen" "OK" "Map geopend, %1$d bij %2$d" "Tik om de map te sluiten" @@ -72,6 +72,8 @@ "Achtergrond" "Instellingen" "Uitgeschakeld door je beheerder" + + "Draaien van startscherm toestaan" "Wanneer het apparaat wordt gedraaid" "Huidige scherminstelling staat draaien niet toe" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index ede6082583..a8a8a07e7b 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -26,7 +26,7 @@ "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" - "ਇੱਕ ਵਿਜਿਟ ਨੂੰ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।" + "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "ਐਪਾਂ ਖੋਜੋ…" @@ -60,7 +60,7 @@ "ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" "ਤਾਜ਼ਾ ਸ਼ੁਰੂ ਕਰੋ" "ਵਾਲਪੇਪਰ, ਵਿਜਿਟ, ਅਤੇ ਸੈਟਿੰਗਾਂ" - "ਬੈਕਗ੍ਰਾਊਂਡ ਨੂੰ ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" + "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਪਿੱਠਭੂਮੀ ਨੂੰ ਛੂਹੋ ਅਤੇ ਛੂਹੀ ਰੱਖੋ" "ਸਮਝ ਲਿਆ" "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %2$d" "ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" @@ -72,6 +72,8 @@ "ਵਾਲਪੇਪਰ" "ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" + + "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਡੀਵਾਈਸ ਘੁੰਮਾਈ ਜਾਂਦੀ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 713dcc0058..24cf584670 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -26,7 +26,7 @@ "Aplikacja niedostępna" "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" - "Aby dodać widżet, kliknij go i przytrzymaj." + "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szukaj w aplikacjach…" @@ -60,7 +60,7 @@ "KOPIUJ IKONY" "ZACZNIJ OD NOWA" "Tapety, widżety i ustawienia" - "Kliknij i przytrzymaj tło, by je dostosować" + "Kliknij i przytrzymaj tło, by dostosować" "OK" "Folder otwarty, %1$d na %2$d" "Kliknij, by zamknąć folder" @@ -72,6 +72,8 @@ "Tapety" "Ustawienia" "Funkcja wyłączona przez administratora" + + "Zezwalaj na obrót ekranu głównego" "Podczas obrotu urządzenia" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 29ccae2334..ed3d862b6a 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -26,7 +26,7 @@ "A aplicação não está disponível" "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" - "Toque sem soltar para escolher um widget." + "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" "Pesquisar aplicações..." @@ -60,7 +60,7 @@ "COPIAR ÍCONES" "COMEÇAR DO INÍCIO" "Imagens de fundo, widgets e definições" - "Tocar sem soltar no fundo para personalizar" + "Toque sem soltar no fundo para personalizar" "COMPREENDI" "Pasta aberta, %1$d por %2$d" "Tocar para fechar a pasta" @@ -72,6 +72,8 @@ "Imagens de fundo" "Definições" "Desativada pelo administrador" + + "Permitir rotação do ecrã principal" "Quando o dispositivo é rodado" "A definição de visualização atual não permite a rotação" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 7e79853529..e2d222b0c4 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -26,7 +26,7 @@ "O app não está disponível" "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" - "Toque e segure para selecionar um widget." + "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "Pesquisar apps..." @@ -60,7 +60,7 @@ "COPIAR ÍCONES" "COMEÇAR DO ZERO" "Plano de fundo, widgets e configurações" - "Toque no segundo plano e mantenha pressionado para personalizar" + "Toque no segundo plano e mantenha pressionado para personalizar" "ENTENDI" "Pasta aberta, %1$d por %2$d" "Toque para fechar a pasta" @@ -72,6 +72,8 @@ "Planos de fundo" "Configurações" "Desativado pelo administrador" + + "Permitir rotação da tela inicial" "Quando o dispositivo for girado" "A configuração atual de exibição não permite rotação" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 484bbe473c..411ac24145 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -26,7 +26,7 @@ "Aplicația nu este disponibilă" "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" - "Atingeți lung un widget pentru a-l alege." + "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "Căutați aplicații…" @@ -60,7 +60,7 @@ "COPIAȚI PICTOGRAMELE" "REÎNCEPEȚI" "Imagini de fundal, widgeturi și setări" - "Atingeți lung fundalul pentru a-l personaliza" + "Atingeți lung fundalul pentru a-l personaliza" "AM ÎNȚELES" "Dosar deschis, %1$d pe %2$d" "Atingeți pentru a închide dosarul" @@ -72,6 +72,8 @@ "Imagini de fundal" "Setări" "Dezactivată de administrator" + + "Permiteți rotirea ecranului de pornire" "Când dispozitivul este rotit" "Setarea actuală a afișajului nu permite rotirea" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 11d3250a49..ef550d797b 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -26,7 +26,7 @@ "Приложение недоступно" "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" - "Чтобы выбрать виджет, коснитесь его и удерживайте." + "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Поиск приложений" @@ -60,7 +60,7 @@ "КОПИРОВАТЬ ЗНАЧКИ" "ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ МАКЕТ" "Обои, виджеты и настройки" - "Чтобы выполнить настройку, коснитесь фона и удерживайте его." + "Чтобы выполнить настройку, коснитесь фона и удерживайте его." "ОК" "Папка открыта, %1$d x %2$d" "Нажмите, чтобы закрыть папку" @@ -72,6 +72,8 @@ "Обои" "Настройки" "Функция отключена администратором" + + "Разрешить поворачивать главный экран" "При повороте устройства" "В настройках отключен поворот экрана" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index c08285ae95..db4216e34e 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -26,7 +26,7 @@ "යෙදුම නොතිබේ" "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" - "විජට් එකක් අහුලා ගැනීමට තට්ටු කර අල්ලාගෙන සිටින්න." + "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "යෙදුම් සොයන්න..." @@ -60,7 +60,7 @@ "නිරූපක පිටපත් කරන්න" "අලුතින් පටන්ගන්න" "වෝල්පේපර, විජට්, සහ සැකසීම්" - "අභිරුචිකරණය කිරීමට පසුබිම තට්ටු කර අල්ලාගෙන සිටින්න" + "පසුබිම අභිරුචිකරණය කිරීමට ස්පර්ශ කර අල්ලා සිටින්න" "තේරුණා" "ෆෝල්ඩරය විවෘත විය, %1$d හි %2$d" "ෆෝල්ඩරය වැසීමට තට්ටු කරන්න" @@ -72,6 +72,8 @@ "වෝල්පේපර" "සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" + + "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "උපංගය කරකැවූ විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 133b503a65..0826c069a5 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -26,7 +26,7 @@ "Aplikácia nie je k dispozícii" "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" - "Miniaplikáciu pridáte klepnutím a podržaním." + "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "Hľadať aplikácie…" @@ -60,7 +60,7 @@ "SKOPÍROVAŤ IKONY" "ZAČAŤ ODZNOVA" "Tapety, miniaplikácie a nastavenia" - "Pozadie môžete prispôsobiť jeho pridržaním" + "Pozadie môžete prispôsobiť jeho pridržaním" "DOBRE" "Otvorený priečinok, %1$d x %2$d" "Priečinok zavriete klepnutím" @@ -72,6 +72,8 @@ "Tapety" "Nastavenia" "Zakázané vaším správcom" + + "Povoliť otáčanie plochy" "Pri otočení zariadenia" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index b2c2f61bbd..7cdb7f63e5 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -26,7 +26,7 @@ "Aplikacija ni na voljo" "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" - "Pridržite pripomoček, da ga izberete." + "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Iskanje po aplikacijah …" @@ -60,7 +60,7 @@ "KOPIRAJ IKONE" "SVEŽ ZAČETEK" "Ozadja, pripomočki in nastavitve" - "Za prilagajanje pridržite ozadje" + "Za prilagajanje se dotaknite ozadja in ga pridržite" "V REDU" "Mapa je odprta, %1$d krat %2$d" "Dotaknite se, da zaprete mapo" @@ -72,6 +72,8 @@ "Ozadja" "Nastavitve" "Onemogočil skrbnik." + + "Omogočanje sukanja začetnega zaslona" "Ko se naprava zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index f55ee488ec..9201e99eed 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -26,7 +26,7 @@ "Aplikacioni nuk mundësohet" "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" - "Trokit dhe mbaj prekur për të zgjedhur një miniaplikacion." + "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "Kërko për aplikacione..." @@ -60,7 +60,7 @@ "KOPJO IKONA" "FILLO NGA E PARA" "Imazhe në sfond, miniaplikacione dhe cilësime" - "Trokit dhe mbaj prekur sfondin për ta personalizuar" + "Prek dhe mbaj shtypur sfondin për ta personalizuar." "E KUPTOVA!" "Dosja u hap, %1$d me %2$d" "Trokit për të mbyllur dosjen" @@ -72,6 +72,8 @@ "Imazhet e sfondit" "Cilësimet" "Çaktivizuar nga administratori" + + "Lejo rrotullimin e ekranit kryesor" "Kur pajisja rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index fa979706ab..7987fa7787 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -26,7 +26,7 @@ "Апликација није доступна" "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" - "Додирните и задржите да бисте изабрали виџет." + "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "Претражите апликације..." @@ -60,7 +60,7 @@ "КОПИРАЈТЕ ИКОНЕ" "ПОЧНИТЕ ИСПОЧЕТКА" "Позадине, виџети и подешавања" - "Додирните и задржите позадину да бисте прилагодили" + "Додирните и задржите позадину да бисте прилагодили" "ВАЖИ" "Директоријум је отворен, %1$d пута %2$d" "Додирните да бисте затворили директоријум" @@ -72,6 +72,8 @@ "Позадине" "Подешавања" "Администратор је онемогућио" + + "Дозволи ротацију почетног екрана" "Када се уређај ротира" "Актуелно подешавање приказа не дозвољава ротацију" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6713d1da1d..9f4e38a9c2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -26,7 +26,7 @@ "Appen är inte tillgänglig" "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" - "Tryck länge om du vill lägga till en widget." + "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "Sök efter appar …" @@ -60,7 +60,7 @@ "KOPIERA IKONER" "BÖRJA OM" "Bakgrunder, widgetar och inställningar" - "Tryck länge på bakgrunden om du vill anpassa den" + "Tryck länge på bakgrunden om du vill anpassa den" "OK" "Mappen är öppen, %1$d gånger %2$d" "Tryck om du vill stänga mappen" @@ -72,6 +72,8 @@ "Bakgrunder" "Inställningar" "Inaktiverat av administratören" + + "Tillåt rotering av startskärmen" "När enheten roterar" "Rotering tillåts inte i de nuvarande skärminställningarna" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 0b57b81612..d0d39dcc9e 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -26,7 +26,7 @@ "Programu haipatikani" "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" - "Gusa na ushikilie ili uteue wijeti." + "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Tafuta Programu..." @@ -62,7 +62,7 @@ "NAKILI IKONI" "ANZA UPYA" "Mandhari, wijeti na mipangilio" - "Gusa na ushikilie mandhari ili ubadilishe upendavyo" + "Gusa na ushikilie mandhari ili ubadilishe upendavyo" "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" "Gonga ili ufunge folda" @@ -74,6 +74,8 @@ "Mandhari" "Mipangilio" "Imezimwa na msimamizi wako" + + "Ruhusu kuzungusha skrini ya kwanza" "Kifaa kinapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index dc9b927646..dc5d9c9dcf 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -26,7 +26,7 @@ "பயன்பாடு இல்லை" "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" - "விட்ஜெட்டைச் சேர்க்க, தொட்டுப் பிடித்திருக்கவும்." + "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "பயன்பாடுகளில் தேடுக…" @@ -60,7 +60,7 @@ "ஐகான்களை நகலெடு" "புதிதாகத் தொடங்கு" "வால்பேப்பர்கள், விட்ஜெட்கள் & அமைப்புகள்" - "தனிப்பயனாக்க, பின்னணியைத் தொட்டுப் பிடித்திருக்கவும்" + "தனிப்பயனாக்க, பின்னணியைத் தொட்டுப் பிடிக்கவும்" "புரிந்தது" "திறக்கப்பட்டக் கோப்புறை, %1$d x %2$d" "கோப்புறையை மூட, தட்டவும்" @@ -72,6 +72,8 @@ "வால்பேப்பர்கள்" "அமைப்பு" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" + + "முகப்புத் திரை சுழற்சியை அனுமதி" "சாதனத்தைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 3b56760b7b..bd06829094 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -26,7 +26,7 @@ "అనువర్తనం అందుబాటులో లేదు" "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" - "విడ్జెట్‌ను ఎంచుకోవడానికి నొక్కి, ఉంచండి." + "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "అనువర్తనాల్లో శోధించండి…" @@ -60,7 +60,7 @@ "చిహ్నాలను కాపీ చేయి" "తాజాగా ప్రారంభించు" "వాల్‌పేపర్‌లు, విడ్జెట్‌లు & సెట్టింగ్‌లు" - "అనుకూలీకరించడానికి నేపథ్యాన్ని నొక్కి, ఉంచండి" + "అనుకూలీకరించడానికి నేపథ్యాన్ని నొక్కి & ఉంచండి" "అర్థమైంది" "ఫోల్డర్ తెరవబడింది, %1$d X %2$d" "ఫోల్డర్‌ను మూసివేయడానికి నొక్కండి" @@ -72,6 +72,8 @@ "వాల్‌పేపర్‌లు" "సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" + + "హోమ్‌స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "పరికరాన్ని తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 58b1d98e3e..95fa49debe 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -26,7 +26,7 @@ "แอปไม่พร้อมใช้งาน" "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" - "แตะค้างไว้เพื่อเลือกวิดเจ็ต" + "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" "ค้นหาแอป…" @@ -60,7 +60,7 @@ "คัดลอกไอคอน" "เริ่มต้นใหม่" "วอลเปเปอร์ วิดเจ็ต และการตั้งค่า" - "แตะพื้นหลังค้างไว้เพื่อกำหนดค่า" + "แตะพื้นหลังค้างไว้เพื่อกำหนดค่า" "รับทราบ" "เปิดโฟลเดอร์ %1$d x %2$d" "แตะเพื่อปิดโฟลเดอร์" @@ -72,6 +72,8 @@ "วอลเปเปอร์" "การตั้งค่า" "ปิดใช้โดยผู้ดูแลระบบ" + + "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนอุปกรณ์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 370e137089..07756a48bf 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -26,7 +26,7 @@ "Hindi available ang app" "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" - "Pindutin nang matagal upang mag-angat ng widget." + "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "Maghanap ng Mga App…" @@ -60,7 +60,7 @@ "KOPYAHIN ANG MGA ICON" "MAGSIMULA NANG BAGO" "Mga wallpaper, widget at setting" - "Pindutin nang matagal ang background upang mag-customize" + "Pindutin nang matagal ang background upang i-customize" "NAKUHA KO" "Binuksan ang folder, %1$d by %2$d" "I-tap upang isara ang folder" @@ -72,6 +72,8 @@ "Mga Wallpaper" "Mga Setting" "Na-disable ng iyong admin" + + "Payagan ang pag-rotate ng homescreen" "Kapag na-rotate ang device" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 1b1818d6a1..44b527d397 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -26,7 +26,7 @@ "Uygulama kullanılamıyor" "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" - "Widget seçmek için dokunun ve basılı tutun." + "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "Uygulamalarda Ara…" @@ -60,7 +60,7 @@ "SİMGELERİ KOPYALA" "VARSAYILANI KULLAN" "Duvar kağıtları, widget\'lar ve ayarlar" - "Özelleştirmek için arka plana dokunun ve basılı tutun" + "Özelleştirmek için arka plana dokunun ve basılı tutun" "TAMAM" "Klasör açıldı, %1$d x %2$d" "Klasörü kapatmak için hafifçe dokunun" @@ -72,6 +72,8 @@ "Duvar Kağıtları" "Ayarlar" "Yöneticiniz tarafından devre dışı bırakıldı" + + "Ana ekranı döndürmeye izin ver" "Cihaz döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 581046b6fd..7d73306616 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -26,7 +26,7 @@ "Додаток недоступний" "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" - "Натисніть і втримуйте, щоб вибрати віджет." + "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" "Пошук додатків…" @@ -60,7 +60,7 @@ "КОПІЮВАТИ ЗНАЧКИ" "ПАНЕЛЬ ЗАПУСКУ ЗА УМОВЧАННЯМ" "Фонові малюнки, віджети й налаштування" - "Натисніть і втримуйте фон, щоб налаштувати" + "Натисніть і втримуйте фон, щоб налаштувати робочу область" "ЗРОЗУМІЛО" "Папку відкрито (%1$d х %2$d)" "Торкніться, щоб закрити папку" @@ -72,6 +72,8 @@ "Фонові малюнки" "Налаштування" "Вимкнув адміністратор" + + "Дозволити обертання головного екрана" "Коли пристрій обертається" "Поточні налаштування дисплея не підтримують обертання" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 34777b8222..b465d249c4 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -26,7 +26,7 @@ "ایپ دستیاب نہیں ہے" "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" - "کوئی ویجیٹ منتخب کرنے کیلئے تھپتھپائیں اور دبائے رکھیں۔" + "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "ایپس تلاش کریں…" @@ -60,7 +60,7 @@ "آئیکنز کاپی کریں" "نئے سرے سے شروع کریں" "وال پیپرز، ویجیٹس اور ترتیبات" - "حسب ضرورت بنانے کیلئے پس منظر کو تھپتھپائیں اور دبائے رکھیں" + "حسب ضرورت بنانے کیلئے پس منظر کو ٹچ کریں اور دبائے رکھیں" "سمجھ آ گئی" "فولڈر کھولا گیا، %1$d × %2$d" "فولڈر کو بند کرنے کیلئے تھپتھپائیں" @@ -72,6 +72,8 @@ "وال پیپرز" "ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" + + "ہوم اسکرین گھمانے کی اجازت دیں" "جب آلہ گھمایا جائے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index a059b6430a..aa38406837 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,7 +26,7 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" - "Vidjetni tanlab olish uchun bosib turing." + "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Ilovalar ichidan qidirish…" @@ -60,7 +60,7 @@ "NISHONCHALARNI NUSXALASH" "YANGIDAN BOSHLASH" "Fon rasmlari, vidjet va sozlamalar" - "Orqa fonni moslashtirish uchun uni bosib turing" + "Moslashtirish uchun orqa fon ustiga biroz bosib turing" "OK" "Jild ochildi, %1$d ga %2$d" "Jildni yopish uchun ustiga bosing" @@ -72,6 +72,8 @@ "Fon rasmlari" "Sozlamalar" "Administrator tomonidan o‘chirilgan" + + "Asosiy ekranni aylantirishga ruxsat berish" "Qurilma burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 14bb30e94a..b4f91dba30 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -26,7 +26,7 @@ "Ứng dụng không có sẵn" "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" - "Nhấn và giữ để chọn tiện ích." + "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" "Tìm kiếm ứng dụng..." @@ -60,7 +60,7 @@ "BIỂU TƯỢNG SAO CHÉP" "BẮT ĐẦU LÀM MỚI" "Hình nền, tiện ích và cài đặt" - "Nhấn và giữ nền để tùy chỉnh" + "Chạm và giữ nền để tùy chỉnh" "OK" "Đã mở thư mục, %1$d x %2$d" "Nhấn để đóng thư mục" @@ -72,6 +72,8 @@ "Hình nền" "Cài đặt" "Bị tắt bởi quản trị viên của bạn" + + "Cho phép xoay màn hình chính" "Khi xoay thiết bị" "Cài đặt Hiển thị hiện tại không cho phép xoay" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 276ebd8c22..5e2c44e7c7 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -26,7 +26,7 @@ "应用不可用" "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" - "按住小部件即可选择。" + "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "搜索应用…" @@ -60,7 +60,7 @@ "复制图标" "使用全新配置" "壁纸、小部件和设置" - "按住背景即可进行个性化设置" + "触摸并按住背景,即可进行个性化设置" "知道了" "文件夹已打开,大小为%1$d×%2$d" "点按可关闭文件夹" @@ -72,6 +72,8 @@ "壁纸" "设置" "已被您的管理员停用" + + "允许旋转主屏幕" "设备旋转时" "当前的显示设置不允许旋转设备" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 71a35f91e5..1d6fc8b0ef 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -26,7 +26,7 @@ "目前無法使用這個應用程式" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" - "按住小工具即可選取。" + "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" "搜尋應用程式…" @@ -60,7 +60,7 @@ "複製圖示" "重新開始" "桌布、小工具和設定" - "按住背景即可自訂" + "輕觸並按住背景即可自訂" "知道了" "資料夾已開啟 (%1$d x %2$d)" "輕按即可關閉資料夾" @@ -72,6 +72,8 @@ "桌布" "設定" "已由您的管理員停用" + + "允許主畫面旋轉" "當裝置旋轉時" "「目前顯示屏」設定不允許旋轉" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 9b239b2c2d..c45c632fd0 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -26,7 +26,7 @@ "應用程式目前無法使用" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" - "按住小工具即可選取。" + "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" "搜尋應用程式…" @@ -60,7 +60,7 @@ "複製圖示" "重新開始" "桌布、小工具和設定" - "按住背景即可自訂" + "輕觸並按住背景即可自訂" "知道了" "資料夾已開啟 (%1$d x %2$d)" "輕觸即可關閉資料夾" @@ -72,6 +72,8 @@ "桌布" "設定" "已由您的管理員停用" + + "允許旋轉主畫面" "當裝置旋轉時" "目前的顯示設定不允許旋轉畫面" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index e19253d413..8417cf680b 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -26,7 +26,7 @@ "Uhlelo lokusebenza alutholakali" "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" - "Thepha uphinde ubambe ukuze ukhethe iwijethi." + "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "Sesha izinhlelo zokusebenza..." @@ -60,7 +60,7 @@ "KOPISHA IZITHONJANA" "QALISA KABUSHA" "Izithombe zangemuva, amawijethi, nezilungiselelo" - "Thepha uphinde ubambe ingemuva ukuze wenze ngendlela oyifisayo" + "Thinta uphinde ubambe ingemuva ukuze wenze ngokwezifiso" "NGIYITHOLILE" "Ifolda ivuliwe, %1$d nge-%2$d" "Thepa ukuze uvale ifolda" @@ -72,6 +72,8 @@ "Izithombe zangemuva" "Izilungiselelo" "Kukhutshazwe umlawuli wakho" + + "Vumela ukuzungezisa kwesikrini sasekhaya" "Uma idivayisi izungeziswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" From 4a3e010d0c01875c053027b9cc8a023cc3e8687b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 27 Jun 2016 09:05:25 -0700 Subject: [PATCH 018/382] Import translations. DO NOT MERGE Change-Id: Iec47e6daa9e729ad3e872a3105a7ea1f256e5726 Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-az-rAZ/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-en-rAU/strings.xml | 3 +-- res/values-en-rGB/strings.xml | 3 +-- res/values-en-rIN/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-et-rEE/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-km-rKH/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lo-rLA/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-mn-rMN/strings.xml | 3 +-- res/values-mr-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-ne-rNP/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pa-rIN/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-si-rLK/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-te-rIN/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-vi/strings.xml | 3 +-- res/values-zh-rHK/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 75 files changed, 75 insertions(+), 150 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index dd69e3e7b5..68020918d9 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -72,8 +72,7 @@ "Muurpapiere" "Instellings" "Gedeaktiveer deur jou administrateur" - - + "Oorsig" "Laat tuisskermrotasie toe" "Wanneer toestel gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 784b3c31a8..2429d1fe0c 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -72,8 +72,7 @@ "የግድግዳ ወረቀቶች" "ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" - - + "አጠቃላይ ዕይታ" "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "መሣሪያው ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 46d6757c0c..c19569cc06 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -72,8 +72,7 @@ "الخلفيات" "الإعدادات" "عطَّل المشرف هذه الميزة" - - + "نظرة عامة" "السماح بتدوير الشاشة الرئيسية" "أوقات تدوير الجهاز" "لا يسمح إعداد العرض الحالي بالتدوير" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 4403b49ca8..1e5dfedf50 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -72,8 +72,7 @@ "Divar kağızları" "Ayarlar" "Admininiz tərəfindən deaktiv edilib" - - + "İcmal" "Əsas ekranın firlanmağına icazə verin" "Cihaz çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 8aaf8158bc..a325d14b44 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -72,8 +72,7 @@ "Тапети" "Настройки" "Деактивирано от администратора ви" - - + "Общ преглед" "Разрешаване на завъртането на началния екран" "При завъртане на устройството" "Текущата настройка на екрана не разрешава завъртане" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 5ba583adab..610fa60f0e 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -72,8 +72,7 @@ "ওয়ালপেপারগুলি" "সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" - - + "এক নজরে" "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "ডিভাইস যখন ঘোরানো হবে" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index c8813ec623..ac125b76fb 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -72,8 +72,7 @@ "Fons de pantalla" "Configuració" "Desactivada per l\'administrador" - - + "Visió general" "Permet la rotació de la pantalla d\'inici" "En girar el dispositiu" "La configuració actual de la pantalla no permet la rotació" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 4d5052303b..ff0de135cf 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -72,8 +72,7 @@ "Tapety" "Nastavení" "Zakázáno administrátorem" - - + "Přehled" "Povolit otáčení plochy" "Při otočení zařízení" "Aktuální nastavení displeje neumožňuje otáčení" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 9fd53716a5..adb598cb20 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -72,8 +72,7 @@ "Baggrunde" "Indstillinger" "Deaktiveret af din administrator" - - + "Oversigt" "Tillad rotation af startskærmen" "Når enheden roteres" "Den aktuelle indstilling for visning tillader ikke rotation" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index eab0b011c9..b4807c3f9d 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -72,8 +72,7 @@ "Hintergründe" "Einstellungen" "Von deinem Administrator deaktiviert" - - + "Übersicht" "Drehung des Startbildschirms zulassen" "Bei Drehung des Geräts" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index fdd5947d3f..88ca32298b 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -72,8 +72,7 @@ "Ταπετσαρίες" "Ρυθμίσεις" "Απενεργοποιήθηκε από τον διαχειριστή σας" - - + "Επισκόπηση" "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν η συσκευή περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 3c69bdddab..799b8c59d9 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -72,8 +72,7 @@ "Wallpapers" "Settings" "Disabled by your admin" - - + "Overview" "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 3c69bdddab..799b8c59d9 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -72,8 +72,7 @@ "Wallpapers" "Settings" "Disabled by your admin" - - + "Overview" "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 3c69bdddab..799b8c59d9 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -72,8 +72,7 @@ "Wallpapers" "Settings" "Disabled by your admin" - - + "Overview" "Allow homescreen rotation" "When device is rotated" "Current display setting doesn\'t permit rotation" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 07642a4c88..8aada0f8b9 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -72,8 +72,7 @@ "Fondos de pantalla" "Configuración" "El administrador inhabilitó esta función" - - + "Recientes" "Permitir la rotación de la pantalla principal" "Al rotar el dispositivo" "La configuración actual no permite la rotación de la pantalla" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1f322bae3b..c31b13faa0 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -72,8 +72,7 @@ "Fondos de pantalla" "Ajustes" "Inhabilitada por el administrador" - - + "Visión general" "Permitir rotación de la pantalla de inicio" "Al girar el dispositivo" "La configuración de pantalla actual no permite girar la pantalla" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index a3515329fa..e6e6801cbf 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -72,8 +72,7 @@ "Taustapildid" "Seaded" "Keelas administraator" - - + "Ülevaade" "Luba avaekraani pööramine" "Kui seadet pööratakse" "Praegune kuvaseade ei luba pööramist" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 58a4cc50aa..3e6dee6fab 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -72,8 +72,7 @@ "Horma-paperak" "Ezarpenak" "Administratzaileak desgaitu du" - - + "Ikuspegi orokorra" "Baimendu hasierako pantaila biratzea" "Gailua biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index fafdead5da..bbfcfe5cb6 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -72,8 +72,7 @@ "کاغذدیواری‌ها" "تنظیمات" "توسط سرپرست سیستم غیرفعال شده است" - - + "نمای کلی" "مجاز کردن چرخش صفحه‌اصلی" "وقتی دستگاه چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 8483e7a956..90985b9e7d 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -72,8 +72,7 @@ "Taustakuvat" "Asetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." - - + "Yleiskatsaus" "Salli aloitusnäytön kiertäminen" "Kun laitetta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 48ed903483..9dd19efaeb 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -72,8 +72,7 @@ "Fonds d\'écran" "Paramètres" "Cette fonction est désactivée par votre administrateur" - - + "Présentation" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque l\'utilisateur pivote l\'appareil" "Le mode d\'affichage actuel ne permet pas le pivotement" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 8602348676..db6b0dda5e 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -72,8 +72,7 @@ "Fonds d\'écran" "Paramètres" "Désactivé par votre administrateur" - - + "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque l\'utilisateur fait pivoter l\'appareil" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index d784943d58..26f248b41d 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -72,8 +72,7 @@ "Fondos de pantalla" "Configuración" "Función desactivada polo administrador" - - + "Visión xeral" "Permitir xirar a pantalla de inicio" "Ao xirar o dispositivo" "A configuración de visualización actual non permite xirar a pantalla" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index e0d8853cf8..8184d1e714 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -72,8 +72,7 @@ "વૉલપેપર્સ" "સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" - - + "વિહંગાવલોકન" "હોમસ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ઉપકરણ ફેરવેલું હોય ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index a2b4276f5c..01bf960edd 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -72,8 +72,7 @@ "वॉलपेपर" "सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" - - + "अवलोकन" "होमस्क्रीन घुमाने की अनुमति दें" "डिवाइस घुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 06c51884f2..9e1370d138 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -72,8 +72,7 @@ "Pozadine" "Postavke" "Onemogućio administrator" - - + "Pregled" "Dopusti zakretanje početnog zaslona" "Kada se uređaj zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index d79b0d1849..5cc090ee11 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -72,8 +72,7 @@ "Háttérképek" "Beállítások" "A rendszergazda letiltotta" - - + "Áttekintés" "Kezdőképernyő elforgatásának engedélyezése" "Az eszköz forgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index c5876ff515..32b83e3c1b 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -72,8 +72,7 @@ "Պաստառներ" "Կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" - - + "Համատեսք" "Թույլ տալ գլխավոր էկրանի պտտումը" "Սարքը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index ef73c4426e..b841fc4a69 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -72,8 +72,7 @@ "Wallpaper" "Setelan" "Dinonaktifkan oleh admin" - - + "Ringkasan" "Izinkan layar utama diputar" "Saat perangkat diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 15510fd27d..d8d350ad92 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -72,8 +72,7 @@ "Veggfóður" "Stillingar" "Gert óvirkt af kerfisstjóra" - - + "Yfirlit" "Leyfa snúning fyrir heimaskjá" "Þegar tækinu er snúið" "Núverandi skjástilling leyfir ekki snúning" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 67fc02f90c..0c0b3eae67 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -72,8 +72,7 @@ "Sfondi" "Impostazioni" "Disattivata dall\'amministratore" - - + "Panoramica" "Consenti rotazione della schermata Home" "Quando il dispositivo viene ruotato" "L\'impostazione corrente del display non consente la rotazione" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 9b8bb9d551..4fb24d207c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -72,8 +72,7 @@ "טפטים" "הגדרות" "הושבת על ידי מנהל המערכת שלך" - - + "סקירה" "אפשרות סיבוב של מסך דף הבית" "בסיבוב המכשיר" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 83013879fb..2015f80dba 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -72,8 +72,7 @@ "壁紙" "設定" "管理者により無効にされています" - - + "概要" "ホーム画面の回転を許可" "端末が回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 63706ace9d..82e49677dd 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -72,8 +72,7 @@ "ფონები" "პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" - - + "მიმოხილვა" "მთავარი ეკრანის ბრუნვის დაშვება" "მოწყობილობის ბრუნვისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 70008e7d72..9116eeaf9d 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -72,8 +72,7 @@ "Тұсқағаздар" "Параметрлер" "Әкімші өшірді" - - + "Шолу" "Негізгі экранды айналдыруды рұқсат ету" "Құрылғы айналғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index da7ece1752..a7cb66ec65 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -72,8 +72,7 @@ "ផ្ទាំង​រូបភាព" "ការកំណត់" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" - - + "សង្ខេប" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅ​ពេល​បង្វិល​ឧបករណ៍When device is rotated" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 841696067e..b628f5ed49 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -72,8 +72,7 @@ "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" - - + "ಅವಲೋಕನ" "ಮುಖಪರದೆ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಸಾಧನವನ್ನು ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 346f6079cc..d55d8cb2a3 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -72,8 +72,7 @@ "배경화면" "설정" "관리자가 사용 중지함" - - + "개요" "메인 스크린 회전 허용" "기기 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index eb120c2b2a..5394223c52 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -72,8 +72,7 @@ "Тушкагаздар" "Тууралоолор" "Администраторуңуз өчүрүп койгон" - - + "Көз жүгүртүү" "Башкы экранды айлантууга уруксат берүү" "Түзмөк айланганда" "Экранды айлантуу параметри өчүрүлгөн" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 3080219037..b03f5fb2fa 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -72,8 +72,7 @@ "ພາບພື້ນຫຼັງ" "ການຕັ້ງຄ່າ" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" - - + "ພາບຮວມ" "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນອຸປະກອນ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 077837dea9..e2c35e321a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -72,8 +72,7 @@ "Ekrano fonai" "Nustatymai" "Išjungė administratorius" - - + "Apžvalga" "Leisti pasukti pagrindinį ekraną" "Kai įrenginys pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 9be6f1fad3..b5468c4e26 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -72,8 +72,7 @@ "Fona tapetes" "Iestatījumi" "Atspējojis administrators" - - + "Kopsavilkums" "Atļaut sākuma ekrāna pagriešanu" "Kad ierīce tiek pagriezta" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 75e68f4054..009c2225d7 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -72,8 +72,7 @@ "Позадини" "Поставки" "Оневозможено од администраторот" - - + "Краток преглед" "Дозволете ротација на Почетниот екран" "Кога уредот се ротира" "Тековната поставка на Екранот не дозволува ротација" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 1371adaeca..cb78905d16 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -72,8 +72,7 @@ "വാൾപേപ്പർ" "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" - - + "കാഴ്ച" "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഉപകരണം തിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 0a01736179..70296ad494 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -72,8 +72,7 @@ "Ханын зураг" "Тохиргоо" "Таны админ идэвхгүй болгосон" - - + "Тойм" "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Төхөөрөмжийг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index ff85cdec2f..9402104055 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -72,8 +72,7 @@ "वॉलपेपर" "सेटिंग्ज" "आपल्या प्रशासकाने अक्षम केले" - - + "विहंगावलोकन" "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "डिव्हाइस फिरविलेले असताना" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 7186f079ce..d5a3fa3d24 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -72,8 +72,7 @@ "Kertas dinding" "Tetapan" "Dilumpuhkan oleh pentadbir anda" - - + "Ikhtisar" "Benarkan putaran skrin utama" "Apabila peranti diputar" "Tetapan Paparan semasa tidak membenarkan putaran" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index bb2f1882ae..e6a46894fd 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -72,8 +72,7 @@ "နောက်ခံများ" "ဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" - - + "ခြုံငုံသုံးသပ်ချက်" "ပင်မစာမျက်နှာကို လှည့်ခွင့်ပြုပါ" "စက်ပစ္စည်းကို လှည့်ထားသည့်အခါ" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index e6a77b83d8..db99da5883 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -72,8 +72,7 @@ "Bakgrunner" "Innstillinger" "Administratoren har slått av funksjonen" - - + "Oversikt" "Tillat rotasjon av startskjermen" "Når enheten roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 23e17d9630..fc3c4a8cc4 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -72,8 +72,7 @@ "वालपेपरहरु" "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" - - + "परिदृश्य" "गृहस्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "यन्त्रलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 930a980238..13b6effa91 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -72,8 +72,7 @@ "Achtergrond" "Instellingen" "Uitgeschakeld door je beheerder" - - + "Overzicht" "Draaien van startscherm toestaan" "Wanneer het apparaat wordt gedraaid" "Huidige scherminstelling staat draaien niet toe" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index a8a8a07e7b..3f82acdb2f 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -72,8 +72,7 @@ "ਵਾਲਪੇਪਰ" "ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" - - + "ਰੂਪ-ਰੇਖਾ" "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਡੀਵਾਈਸ ਘੁੰਮਾਈ ਜਾਂਦੀ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 24cf584670..ff38a1c3fb 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -72,8 +72,7 @@ "Tapety" "Ustawienia" "Funkcja wyłączona przez administratora" - - + "Przegląd" "Zezwalaj na obrót ekranu głównego" "Podczas obrotu urządzenia" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index ed3d862b6a..81b14d9dd6 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -72,8 +72,7 @@ "Imagens de fundo" "Definições" "Desativada pelo administrador" - - + "Vista geral" "Permitir rotação do ecrã principal" "Quando o dispositivo é rodado" "A definição de visualização atual não permite a rotação" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index e2d222b0c4..fff859e3ba 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -72,8 +72,7 @@ "Planos de fundo" "Configurações" "Desativado pelo administrador" - - + "Visão geral" "Permitir rotação da tela inicial" "Quando o dispositivo for girado" "A configuração atual de exibição não permite rotação" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 411ac24145..8f3630f158 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -72,8 +72,7 @@ "Imagini de fundal" "Setări" "Dezactivată de administrator" - - + "Prezentare generală" "Permiteți rotirea ecranului de pornire" "Când dispozitivul este rotit" "Setarea actuală a afișajului nu permite rotirea" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index db4216e34e..e74bbe5c13 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -72,8 +72,7 @@ "වෝල්පේපර" "සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" - - + "දළ විශ්ලේෂණය" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "උපංගය කරකැවූ විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 0826c069a5..9183ffc457 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -72,8 +72,7 @@ "Tapety" "Nastavenia" "Zakázané vaším správcom" - - + "Prehľad" "Povoliť otáčanie plochy" "Pri otočení zariadenia" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 7cdb7f63e5..3e33bca4e5 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -72,8 +72,7 @@ "Ozadja" "Nastavitve" "Onemogočil skrbnik." - - + "Pregled" "Omogočanje sukanja začetnega zaslona" "Ko se naprava zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 9201e99eed..a3ae0dae9e 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -72,8 +72,7 @@ "Imazhet e sfondit" "Cilësimet" "Çaktivizuar nga administratori" - - + "Përmbledhje" "Lejo rrotullimin e ekranit kryesor" "Kur pajisja rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 7987fa7787..6a2c71f668 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -72,8 +72,7 @@ "Позадине" "Подешавања" "Администратор је онемогућио" - - + "Преглед" "Дозволи ротацију почетног екрана" "Када се уређај ротира" "Актуелно подешавање приказа не дозвољава ротацију" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 9f4e38a9c2..856b664432 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -72,8 +72,7 @@ "Bakgrunder" "Inställningar" "Inaktiverat av administratören" - - + "Översikt" "Tillåt rotering av startskärmen" "När enheten roterar" "Rotering tillåts inte i de nuvarande skärminställningarna" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index d0d39dcc9e..5ce90e096e 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -74,8 +74,7 @@ "Mandhari" "Mipangilio" "Imezimwa na msimamizi wako" - - + "Muhtasari" "Ruhusu kuzungusha skrini ya kwanza" "Kifaa kinapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index dc5d9c9dcf..e018ea7fb7 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -72,8 +72,7 @@ "வால்பேப்பர்கள்" "அமைப்பு" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" - - + "மேலோட்டப் பார்வை" "முகப்புத் திரை சுழற்சியை அனுமதி" "சாதனத்தைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index bd06829094..34ce1b77ec 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -72,8 +72,7 @@ "వాల్‌పేపర్‌లు" "సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" - - + "స్థూలదృష్టి" "హోమ్‌స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "పరికరాన్ని తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 95fa49debe..54a1bcf360 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -72,8 +72,7 @@ "วอลเปเปอร์" "การตั้งค่า" "ปิดใช้โดยผู้ดูแลระบบ" - - + "ภาพรวม" "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนอุปกรณ์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 07756a48bf..d615706255 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -72,8 +72,7 @@ "Mga Wallpaper" "Mga Setting" "Na-disable ng iyong admin" - - + "Pangkalahatang-ideya" "Payagan ang pag-rotate ng homescreen" "Kapag na-rotate ang device" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 44b527d397..cee7014b97 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -72,8 +72,7 @@ "Duvar Kağıtları" "Ayarlar" "Yöneticiniz tarafından devre dışı bırakıldı" - - + "Genel bakış" "Ana ekranı döndürmeye izin ver" "Cihaz döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 7d73306616..401d77186f 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -72,8 +72,7 @@ "Фонові малюнки" "Налаштування" "Вимкнув адміністратор" - - + "Огляд" "Дозволити обертання головного екрана" "Коли пристрій обертається" "Поточні налаштування дисплея не підтримують обертання" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index b465d249c4..f4e22aaf51 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -72,8 +72,7 @@ "وال پیپرز" "ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" - - + "مجموعی جائزہ" "ہوم اسکرین گھمانے کی اجازت دیں" "جب آلہ گھمایا جائے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index aa38406837..20b0863ddd 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -72,8 +72,7 @@ "Fon rasmlari" "Sozlamalar" "Administrator tomonidan o‘chirilgan" - - + "Umumiy ko‘rinish" "Asosiy ekranni aylantirishga ruxsat berish" "Qurilma burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index b4f91dba30..7ef588fee1 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -72,8 +72,7 @@ "Hình nền" "Cài đặt" "Bị tắt bởi quản trị viên của bạn" - - + "Tổng quan" "Cho phép xoay màn hình chính" "Khi xoay thiết bị" "Cài đặt Hiển thị hiện tại không cho phép xoay" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 1d6fc8b0ef..7507ea5471 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -72,8 +72,7 @@ "桌布" "設定" "已由您的管理員停用" - - + "概覽" "允許主畫面旋轉" "當裝置旋轉時" "「目前顯示屏」設定不允許旋轉" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c45c632fd0..727dc9c62e 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -72,8 +72,7 @@ "桌布" "設定" "已由您的管理員停用" - - + "總覽" "允許旋轉主畫面" "當裝置旋轉時" "目前的顯示設定不允許旋轉畫面" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 8417cf680b..ec201da47b 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -72,8 +72,7 @@ "Izithombe zangemuva" "Izilungiselelo" "Kukhutshazwe umlawuli wakho" - - + "Ukubuka konke" "Vumela ukuzungezisa kwesikrini sasekhaya" "Uma idivayisi izungeziswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" From 6ffedc1f62a84d1ae5b667d830a5ccd9f51103c1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 29 Jun 2016 19:38:58 -0700 Subject: [PATCH 019/382] Import translations. DO NOT MERGE Change-Id: I97ce1b4b83620c64a9bbe8ea1acd73c7b28b5a1d Auto-generated-cl: translation import --- res/values-ru/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ef550d797b..6303190245 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -72,8 +72,7 @@ "Обои" "Настройки" "Функция отключена администратором" - - + "Обзор" "Разрешить поворачивать главный экран" "При повороте устройства" "В настройках отключен поворот экрана" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 5e2c44e7c7..d18352c949 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -72,8 +72,7 @@ "壁纸" "设置" "已被您的管理员停用" - - + "概览" "允许旋转主屏幕" "设备旋转时" "当前的显示设置不允许旋转设备" From 7de4cda003f09da0a5b061c9572abe5cc270cc86 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 5 Jul 2016 17:13:33 -0700 Subject: [PATCH 020/382] Import translations. DO NOT MERGE Change-Id: I421aa25d69ee7bd09cd7e0f2182e5210be976baa Auto-generated-cl: translation import --- res/values-af/strings.xml | 10 +--------- res/values-am/strings.xml | 10 +--------- res/values-ar/strings.xml | 10 +--------- res/values-az-rAZ/strings.xml | 10 +--------- res/values-bg/strings.xml | 10 +--------- res/values-bn-rBD/strings.xml | 10 +--------- res/values-ca/strings.xml | 10 +--------- res/values-cs/strings.xml | 10 +--------- res/values-da/strings.xml | 10 +--------- res/values-de/strings.xml | 10 +--------- res/values-el/strings.xml | 10 +--------- res/values-en-rAU/strings.xml | 10 +--------- res/values-en-rGB/strings.xml | 10 +--------- res/values-en-rIN/strings.xml | 10 +--------- res/values-es-rUS/strings.xml | 10 +--------- res/values-es/strings.xml | 10 +--------- res/values-et-rEE/strings.xml | 10 +--------- res/values-eu-rES/strings.xml | 10 +--------- res/values-fa/strings.xml | 10 +--------- res/values-fi/strings.xml | 10 +--------- res/values-fr-rCA/strings.xml | 10 +--------- res/values-fr/strings.xml | 10 +--------- res/values-gl-rES/strings.xml | 10 +--------- res/values-gu-rIN/strings.xml | 10 +--------- res/values-hi/strings.xml | 10 +--------- res/values-hr/strings.xml | 10 +--------- res/values-hu/strings.xml | 10 +--------- res/values-hy-rAM/strings.xml | 12 ++---------- res/values-in/strings.xml | 10 +--------- res/values-is-rIS/strings.xml | 10 +--------- res/values-it/strings.xml | 10 +--------- res/values-iw/strings.xml | 10 +--------- res/values-ja/strings.xml | 10 +--------- res/values-ka-rGE/strings.xml | 10 +--------- res/values-kk-rKZ/strings.xml | 10 +--------- res/values-km-rKH/strings.xml | 10 +--------- res/values-kn-rIN/strings.xml | 10 +--------- res/values-ko/strings.xml | 10 +--------- res/values-ky-rKG/strings.xml | 10 +--------- res/values-lo-rLA/strings.xml | 10 +--------- res/values-lt/strings.xml | 10 +--------- res/values-lv/strings.xml | 10 +--------- res/values-mk-rMK/strings.xml | 10 +--------- res/values-ml-rIN/strings.xml | 10 +--------- res/values-mn-rMN/strings.xml | 10 +--------- res/values-mr-rIN/strings.xml | 10 +--------- res/values-ms-rMY/strings.xml | 10 +--------- res/values-my-rMM/strings.xml | 22 +++++++--------------- res/values-nb/strings.xml | 10 +--------- res/values-ne-rNP/strings.xml | 10 +--------- res/values-nl/strings.xml | 10 +--------- res/values-pa-rIN/strings.xml | 10 +--------- res/values-pl/strings.xml | 10 +--------- res/values-pt-rPT/strings.xml | 10 +--------- res/values-pt/strings.xml | 10 +--------- res/values-ro/strings.xml | 10 +--------- res/values-ru/strings.xml | 10 +--------- res/values-si-rLK/strings.xml | 10 +--------- res/values-sk/strings.xml | 10 +--------- res/values-sl/strings.xml | 10 +--------- res/values-sq-rAL/strings.xml | 10 +--------- res/values-sr/strings.xml | 10 +--------- res/values-sv/strings.xml | 10 +--------- res/values-sw/strings.xml | 10 +--------- res/values-ta-rIN/strings.xml | 10 +--------- res/values-te-rIN/strings.xml | 10 +--------- res/values-th/strings.xml | 10 +--------- res/values-tl/strings.xml | 10 +--------- res/values-tr/strings.xml | 10 +--------- res/values-uk/strings.xml | 10 +--------- res/values-ur-rPK/strings.xml | 10 +--------- res/values-uz-rUZ/strings.xml | 10 +--------- res/values-vi/strings.xml | 10 +--------- res/values-zh-rCN/strings.xml | 10 +--------- res/values-zh-rHK/strings.xml | 10 +--------- res/values-zh-rTW/strings.xml | 10 +--------- res/values-zu/strings.xml | 10 +--------- 77 files changed, 84 insertions(+), 700 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 68020918d9..1f719c7164 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -29,7 +29,7 @@ "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" - "Deursoek programme …" + "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" "Soek meer programme" @@ -54,14 +54,6 @@ "Bladsy %1$d van %2$d" "Tuisskerm %1$d van %2$d" "Nuwe tuisskermbladsy" - "Welkom" - "Kopieer jou program-ikone" - "Voer ikone en vouers vanaf jou ou tuisskerms in?" - "KOPIEER IKONE" - "BEGIN VAN NUUTS AF" - "Muurpapiere, legstukke en instellings" - "Raak en hou agtergrond om te pasmaak" - "HET DIT" "Vouer oopgemaak, %1$d by %2$d" "Tik om die vouer toe te maak" "Tik om nuwe naam te stoor" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 2429d1fe0c..8f3f07a224 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -29,7 +29,7 @@ "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" - "መተግበሪያዎችን ይፈልጉ…" + "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" "ተጨማሪ መተግበሪያዎች ይፈልጉ" @@ -54,14 +54,6 @@ "ገጽ %1$d ከ%2$d" "መነሻ ማያ ገጽ %1$d ከ%2$d" "አዲስ የመነሻ ማያ ገጽ" - "እንኳን በደህና መጡ" - "የመተግበሪያ አዶዎችዎን ይቅዱ" - "አዶዎች እና አቃፊዎች ከድሮው የመነሻ ማያ ገጾችዎ ይምጡ?" - "አዶዎችን ይቅዱ" - "እንደ አዲስ ይጀምሩ" - "የግድግዳ ወረቀቶች፣ ንዑስ ፕሮግራሞች እና ቅንብሮች" - "ለማበጀት ጀርባውን ነክተው ይያዙት" - "ገባኝ" "አቃፊ ተከፍቷል፣ %1$d%2$d" "አቃፊን ለመዝጋት መታ ያድርጉ" "ዳግም የተሰጠውን ስም ለማስቀመጥ መታ ያድርጉ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c19569cc06..ad56c3aa1e 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -29,7 +29,7 @@ "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" - "البحث في التطبيقات…" + "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" "البحث عن مزيد من التطبيقات" @@ -54,14 +54,6 @@ "‏الصفحة %1$d من %2$d" "‏الشاشة الرئيسية %1$d من %2$d" "صفحة الشاشة الرئيسية الجديدة" - "مرحبًا" - "نسخ رموز التطبيقات" - "هل تريد استيراد رموز ومجلدات من الشاشات الرئيسية القديمة؟" - "نسخ الرموز" - "بداية جديدة" - "الخلفيات والأدوات والإعدادات" - "المس مع الاستمرار الخلفية لتخصيصها" - "حسنًا" "تم فتح المجلد، بمقاس %1$d في %2$d" "انقر لإغلاق المجلد" "انقر لحفظ الاسم الجديد" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 1e5dfedf50..99a0b6ae51 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -29,7 +29,7 @@ "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" - "Tətbiqləri Axtarın..." + "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" "Daha çox tətbiq üçün axtarış edin" @@ -54,14 +54,6 @@ "Səhifə %1$d of %2$d" "Əsas Səhifə ekranı %1$d of %2$d" "Yeni əsas ekran səhifəsi" - "Xoş gəlmisiniz" - "Tətbiq ikonalarınızı kopyalayın" - "Köhnə Əsas ekranınızda olan ikonalar və qovluqlar import edilsin?" - "İKONALARI KOPYALA" - "YENİDƏN BAŞLA" - "Divar kağızları, vidcetlər və ayarlar" - "Fərdiləşdirmək üçün arxa fona toxunaraq saxlayın" - "ANLADIM" "Qovluq açıldı, %2$d hündürlük ilə %1$d enində" "Qovluq bağlamaq üçün toxunun" "Ad dəyişikliyini yadda saxlamaq üçün toxunun" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index a325d14b44..0edb495e14 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -29,7 +29,7 @@ "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" - "Търсене в приложенията…" + "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" "Търсене на още приложения" @@ -54,14 +54,6 @@ "Страница %1$d от %2$d" "Начален екран %1$d от %2$d" "Нова страница на началния екран" - "Добре дошли" - "Икони на прилож. ви: Копиране" - "Да се импортират ли иконите и папките от старите ви начални екрани?" - "КОПИРАНЕ НА ИКОНИТЕ" - "СТАРТИРАНЕ ОТНАЧАЛО" - "Тапети, приспособления и настройки" - "Докоснете и задръжте фона за персонализиране" - "РАЗБРАХ" "Папката е отворена – %1$d на %2$d" "Докоснете, за да затворите папката" "Докоснете, за да запазите новото име" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 610fa60f0e..4bf6796c4c 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -29,7 +29,7 @@ "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" - "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন..." + "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" "আরো অ্যাপ্লিকেশানের জন্য অনুসন্ধান করুন" @@ -54,14 +54,6 @@ "%2$dটির মধ্যে %1$dটি পৃষ্ঠা" "%2$dটির %1$d নম্বর হোম স্ক্রীন" "নতুন হোম স্ক্রীনের পৃষ্ঠা" - "স্বাগতম" - "আপনার অ্যাপ্লিকেশান আইকনগুলি কপি করুন" - "আপনার পুরানো হোম স্ক্রীন থেকে আইকন এবং ফোল্ডারগুলি আমদানি করবেন?" - "আইকনগুলি কপি করুন" - "নতুন করে শুরু করুন" - "ওয়ালপেপার, উইজেট এবং সেটিংস" - "নিজের পছন্দমত সাজানোর জন্য পটভূমি স্পর্শ করে ধরে থাকুন" - "বুঝেছি" "ফোল্ডার খোলা হয়েছে, %1$d বাই %2$d" "ফোল্ডার বন্ধ করতে আলতো চাপ দিন" "পুনঃনামকরণ সংরক্ষণ করতে আলতো চাপ দিন" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index ac125b76fb..1bc6309263 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -29,7 +29,7 @@ "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" - "Cerca a les aplicacions…" + "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" "Cerca més aplicacions" @@ -54,14 +54,6 @@ "Pàgina %1$d de %2$d" "Pantalla d\'inici %1$d de %2$d" "Pàgina de la pantalla d\'inici nova" - "Et donem la benvinguda" - "Copiar les icones d\'aplicació" - "Importar icones i carpetes de pantalles d\'inici anteriors?" - "COPIA LES ICONES." - "COMENÇA DE ZERO" - "Fons de pantalla, widgets i configuració" - "Mantén premut el fons per fer personalitzacions." - "D\'ACORD" "S\'ha obert la carpeta, %1$d per %2$d" "Toca per tancar la carpeta" "Toca per desar el nom nou" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index ff0de135cf..34818f1a2d 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -29,7 +29,7 @@ "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" - "Hledat v aplikacích…" + "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" "Vyhledat další aplikace" @@ -54,14 +54,6 @@ "Strana %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" - "Vítejte" - "Zkopírování ikon aplikací" - "Chcete importovat ikony a složky ze svých starých ploch?" - "ZKOPÍROVAT IKONY" - "ZAČÍT S VÝCHOZÍM ROZVRŽENÍM" - "Tapety, widgety a nastavení" - "Pozadí můžete přizpůsobit klepnutím a podržením" - "ROZUMÍM" "Složka otevřena, rozměry %1$d x %2$d" "Klepnutím složku zavřete" "Klepnutím změnu názvu uložíte" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index adb598cb20..ca1d5a4b6d 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -29,7 +29,7 @@ "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" - "Søg i Apps…" + "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" "Søg efter flere apps" @@ -54,14 +54,6 @@ "Side %1$d ud af %2$d" "Startskærm %1$d ud af %2$d" "Ny startskærm" - "Velkommen" - "Kopiér dine appikoner" - "Vil du importere ikoner og mapper fra gamle startskærme?" - "KOPIÉR IKONER" - "START PÅ EN FRISK" - "Baggrunde, widgets og indstillinger" - "Tryk på baggrunden, og hold fingeren nede for at tilpasse den" - "OK, FORSTÅET" "Mappen er åben, %1$d gange %2$d" "Tryk for at lukke mappen" "Tryk for at gemme omdøbningen" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index b4807c3f9d..0897861b14 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -29,7 +29,7 @@ "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" - "Apps suchen…" + "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" "Weitere Apps suchen" @@ -54,14 +54,6 @@ "Seite %1$d von %2$d" "Startbildschirm %1$d von %2$d" "Neue Startbildschirmseite" - "Hallo!" - "App-Symbole kopieren" - "Symbole und Ordner alter Startbildschirme importieren?" - "Symbole kopieren" - "Standardübersicht verwenden" - "Hintergründe, Widgets & Einstellungen" - "Berühre und halte den Hintergrund, um ihn anzupassen." - "OK" "Ordner geöffnet, %1$d x %2$d" "Ordner zum Schließen antippen" "Neuen Namen zum Speichern antippen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 88ca32298b..52e868db98 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -29,7 +29,7 @@ "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" - "Αναζήτηση εφαρμογών…" + "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" "Αναζήτηση περισσότερων εφαρμογών" @@ -54,14 +54,6 @@ "Σελίδα %1$d από %2$d" "Αρχική οθόνη %1$d από %2$d" "Νέα σελίδα αρχικής οθόνης" - "Καλώς ορίσατε" - "Αντιγραφή εικονιδίων εφαρμογών" - "Εισαγωγή εικονιδίων και φακέλων από παλιές αρχικές οθόνες;" - "ΑΝΤΙΓΡΑΦΗ ΕΙΚΟΝΙΔΙΩΝ" - "ΝΕΑ ΕΝΑΡΞΗ" - "Ταπετσαρίες, γραφικά στοιχεία και ρυθμίσεις" - "Αγγίξτε παρατεταμένα το παρασκήνιο για προσαρμογή" - "ΤΟ ΚΑΤΑΛΑΒΑ" "Άνοιγμα φακέλου, %1$d επί %2$d" "Πατήστε για να κλείσετε το φάκελο" "Πατήστε για να αποθηκεύσετε τη νέα ονομασία" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 799b8c59d9..31599b927e 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps…" + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" "Search for more apps" @@ -54,14 +54,6 @@ "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" - "Welcome" - "Copy your app icons" - "Import icons and folders from your old Home screens?" - "COPY ICONS" - "START AFRESH" - "Wallpapers, widgets & settings" - "Touch & hold background to customise" - "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" "Tap to save rename" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 799b8c59d9..31599b927e 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps…" + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" "Search for more apps" @@ -54,14 +54,6 @@ "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" - "Welcome" - "Copy your app icons" - "Import icons and folders from your old Home screens?" - "COPY ICONS" - "START AFRESH" - "Wallpapers, widgets & settings" - "Touch & hold background to customise" - "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" "Tap to save rename" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 799b8c59d9..31599b927e 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -29,7 +29,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - "Search Apps…" + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" "Search for more apps" @@ -54,14 +54,6 @@ "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" - "Welcome" - "Copy your app icons" - "Import icons and folders from your old Home screens?" - "COPY ICONS" - "START AFRESH" - "Wallpapers, widgets & settings" - "Touch & hold background to customise" - "GOT IT" "Folder opened, %1$d by %2$d" "Tap to close folder" "Tap to save rename" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 8aada0f8b9..a5bbc7ebee 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -29,7 +29,7 @@ "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" - "Buscar apps…" + "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." "Buscar más apps" @@ -54,14 +54,6 @@ "Página %1$d de %2$d" "Pantalla principal %1$d de %2$d" "Nueva página en la pantalla principal" - "Bienvenido" - "Copiar íconos de aplicaciones" - "¿Importar íconos y carpetas de pant. principales antiguas?" - "COPIAR ÍCONOS" - "EMPEZAR DE CERO" - "Fondos, widgets y configuración" - "Mantén presionado el fondo para personalizarlo" - "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" "Presiona para cerrar la carpeta" "Presiona para guardar el cambio de nombre" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index c31b13faa0..4511810647 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -29,7 +29,7 @@ "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" - "Buscar aplicaciones…" + "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" "Buscar más aplicaciones" @@ -54,14 +54,6 @@ "Página %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nueva página de pantalla de inicio" - "Te damos la bienvenida" - "Copiar iconos de aplicaciones" - "¿Importar iconos y carpetas de pantallas de inicio antiguas?" - "COPIAR ICONOS" - "AJUSTES PREDETERMINADOS" - "Fondos de pantalla, widgets y ajustes" - "Mantén pulsado el fondo para personalizarlo" - "ENTENDIDO" "Carpeta abierta, %1$d por %2$d" "Toca para cerrar la carpeta" "Toca para guardar el nuevo nombre" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index e6e6801cbf..795fea44dc 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -29,7 +29,7 @@ "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" - "Otsimine rakendustest …" + "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" "Otsi rohkem rakendusi" @@ -54,14 +54,6 @@ "Leht %1$d/%2$d" "Avaekraan %1$d/%2$d" "Uus avaekraan" - "Tere tulemast" - "Kopeerige rakenduste ikoonid" - "Kas importida vanade avaekraanide ikoonid ja kaustad?" - "KOPEERI IKOONID" - "ALUSTA ALGUSEST" - "Taustapildid, vidinad ja seaded" - "Kohandamiseks puudutage ja hoidke tausta all" - "SELGE" "Kaust on avatud, %1$d x %2$d" "Puudutage kausta sulgemiseks" "Puudutage ümbernimetamise salvestamiseks" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 3e6dee6fab..358d8682a3 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -29,7 +29,7 @@ "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" - "Bilatu aplikazioetan…" + "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" "Bilatu aplikazio gehiago" @@ -54,14 +54,6 @@ "%1$d/%2$d orria" "%1$d/%2$d hasierako pantaila" "Hasierako pantailaren orri berria" - "Ongi etorri" - "Kopiatu aplikazioen ikonoak" - "Ikonoak eta karpetak aurreko hasierako pantailatik inportatu?" - "KOPIATU IKONOAK" - "HASI HUTSETIK" - "Horma-paperak, widgetak eta ezarpenak" - "Pertsonalizatzeko, eduki sakatuta atzeko planoa" - "ADOS" "Karpeta ireki da: %1$d x %2$d" "Karpeta ixteko, sakatu hau" "Izen berria gordetzeko, sakatu hau" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index bbfcfe5cb6..2d55c83dca 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -29,7 +29,7 @@ "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" - "جستجوی برنامه‌ها…‏‏" + "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" "جستجوی برنامه‌های بیشتر" @@ -54,14 +54,6 @@ "‏صفحه %1$d از %2$d" "‏صفحه اصلی %1$d از %2$d" "صفحه اصلی جدید" - "خوش آمدید" - "کپی کردن نمادهای برنامه شما" - "نمادها و پوشه‌ها از صفحه‌های اصلی قدیمی شما وارد شوند؟" - "کپی نمادها" - "شروع تازه" - "کاغذدیواری‌ها، ابزارک‌ها و تنظیمات" - "برای سفارشی کردن، پس‌زمینه را لمس کنید و نگه‌دارید" - "متوجه شدم" "پوشه باز شده، %1$d در %2$d" "برای بستن پوشه، ضربه بزنید" "برای ذخیره تغییر نام، ضربه بزنید" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 90985b9e7d..69146242ef 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -29,7 +29,7 @@ "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" - "Hae sovelluksia…" + "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." "Hae lisää sovelluksia" @@ -54,14 +54,6 @@ "Sivu %1$d / %2$d" "Aloitusruutu %1$d/%2$d" "Uusi aloitusnäytön sivu" - "Tervetuloa" - "Kopioi sovelluskuvakkeet" - "Tuodaanko kuvakkeet ja kansiot vanhoista aloitusruuduista?" - "KOPIOI KUVAKKEET" - "ALOITA ALUSTA" - "Taustakuvat, widgetit ja asetukset" - "Muokkaa taustaa koskettamalla ja painamalla pitkään." - "SELVÄ" "Kansio avattu, koko %1$d x %2$d" "Sulje kansio koskettamalla." "Tallenna uusi nimi koskettamalla." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 9dd19efaeb..9299be32c8 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -29,7 +29,7 @@ "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" - "Rechercher des applications..." + "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" "Rechercher plus d\'applications" @@ -54,14 +54,6 @@ "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" - "Bienvenue" - "Copier les icônes de vos applis" - "Importer les icônes et dossiers des anciens écrans d\'accueil?" - "COPIER LES ICÔNES" - "DISPOSITION PAR DÉFAUT" - "Fonds d\'écran, widgets et paramètres" - "Maintenez le doigt sur le fond d\'écran pour le personnaliser" - "J\'ai compris" "Dossier ouvert, %1$d par %2$d" "Touchez pour fermer le dossier" "Touchez pour enregistrer le nouveau nom" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index db6b0dda5e..bc7707405c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -29,7 +29,7 @@ "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" - "Rechercher des applications…" + "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." "Rechercher plus d\'applications" @@ -54,14 +54,6 @@ "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" - "Bienvenue" - "Copier les icônes de vos applis" - "Importer les icônes et dossiers des anciens écrans d\'accueil ?" - "COPIER LES ICÔNES" - "DISPOSITION PAR DÉFAUT" - "Fonds d\'écran, widgets et paramètres" - "Appuyez de manière prolongée sur l\'arrière-plan pour le personnaliser." - "OK" "Dossier ouvert, %1$d par %2$d" "Appuyez pour fermer le dossier." "Appuyez pour enregistrer le nouveau nom du dossier." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 26f248b41d..cadfdc4a5f 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -29,7 +29,7 @@ "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" - "Buscar aplicacións..." + "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" "Buscar máis aplicacións" @@ -54,14 +54,6 @@ "Páxina %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nova páxina da pantalla de inicio" - "Dámosche a benvida" - "Copiar iconas das aplicacións" - "Queres importar as iconas e os cartafoles doutras pantallas de inicio?" - "COPIAR ICONAS" - "COMEZAR DE CERO" - "Fondos de pantalla, widgets e configuración" - "Mantén premido o fondo para personalizalo" - "DE ACORDO" "Abriuse o cartafol, %1$d por %2$d" "Toca fóra para pechar o cartafol" "Toca fóra para cambiar o nome do cartafol" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 8184d1e714..56e5adcd2c 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -29,7 +29,7 @@ "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" - "ઍપ્લિકેશનોમાં શોધો…" + "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" "વધુ ઍપ્લિકેશનો શોધો" @@ -54,14 +54,6 @@ "%2$d માંથી %1$d પૃષ્ઠ" "%2$d માંથી %1$d હોમ સ્ક્રીન" "નવું હોમ સ્ક્રીન પૃષ્ઠ" - "સ્વાગત છે" - "તમારા ઍપ્લિકેશન આયકન્સને કૉપિ કરો" - "તમારી જૂની હોમ સ્ક્રીન્સથી આયકન્સ અને ફોલ્ડર્સને આયાત કરીએ?" - "આયકન્સને કૉપિ કરો" - "નવેસરથી પ્રારંભ કરો" - "વૉલપેપર્સ, વિજેટ્સ અને સેટિંગ્સ" - "પૃષ્ઠભૂમિને કસ્ટમાઇઝ કરવા માટે ટચ કરો અને પકડી રાખો" - "સમજાઈ ગયું" "%1$d બાય %2$d નું ફોલ્ડર ખોલ્યું" "ફોલ્ડર બંધ કરવા માટે ટૅપ કરો" "નામ બદલવાનું સાચવવા માટે ટૅપ કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 01bf960edd..c786ff5f27 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -29,7 +29,7 @@ "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" - "ऐप्स खोजें…" + "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" "अधिक ऐप्लिकेशन खोजें" @@ -54,14 +54,6 @@ "पृष्ठ %2$d में से %1$d" "होम स्क्रीन %2$d में से %1$d" "नया होम स्‍क्रीन पृष्‍ठ" - "स्वागत है" - "ऐप्स आइकन की प्रतिलिपि बनाएं" - "अपनी पुरानी होम स्क्रीन से आइकन और फ़ोल्डर आयात करें?" - "आइकन की प्रतिलिपि बनाएं" - "फिर से शुरू करें" - "वॉलपेपर, शॉर्टकट और सेटिंग" - "पृष्ठभूमि कस्टमाइज़ करने के लिए स्पर्श करके रखें" - "समझ लिया" "फ़ोल्डर खोला गया, %1$d गुणा %2$d" "फ़ोल्डर बंद करने के लिए टैप करें" "नाम बदलना सहेजने के लिए टैप करें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 9e1370d138..1d2d7c37de 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -29,7 +29,7 @@ "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" - "Pretraživanje aplikacija…" + "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" "Traži više aplikacija" @@ -54,14 +54,6 @@ "Stranica %1$d od %2$d" "Početni zaslon %1$d od %2$d" "Nova stranica početnog zaslona" - "Dobro došli" - "Kopiranje ikona aplikacija" - "Želite li uvesti ikone i mape sa starih početnih zaslona?" - "KOPIRAJ IKONE" - "POKRENI NOVO" - "Pozadine, widgeti i postavke" - "Dodirnite i zadržite pozadinu radi prilagodbe" - "SHVAĆAM" "Mapa je otvorena, %1$d x %2$d" "Dodirnite da biste zatvorili mapu" "Dodirnite da biste spremili promijenjeni naziv" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 5cc090ee11..f479c30f37 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -29,7 +29,7 @@ "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" - "Alkalmazások keresése…" + "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." "További alkalmazások keresése" @@ -54,14 +54,6 @@ "%2$d/%1$d. oldal" "%2$d/%1$d. kezdőképernyő" "Új kezdőképernyő oldal" - "Üdvözöljük!" - "Alkalmazásikonok másolása" - "Importálja ikonjait és mappáit régi kezdőképernyőiről?" - "IKONOK MÁSOLÁSA" - "TELJESEN ÚJ" - "Háttérképek, modulok és beállítások" - "Érintse meg és tartsa lenyomva a személyre szabáshoz" - "MEGÉRTETTEM" "Mappa megnyitva – szélesség: %1$d; magasság: %2$d" "Érintse meg a mappa bezárásához" "Koppintson ide az átnevezés mentéséhez" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 32b83e3c1b..58d1e203f5 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -29,13 +29,13 @@ "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" - "Հավելվածների որոնում…" + "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" "Որոնել այլ հավելվածներ" "Այլևս տեղ չկա այս հիմնական էկրանին:" "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" - "Ծրագրեր" + "Հավելվածներ" "Հիմնական" "Հեռացնել" "Հեռացնել" @@ -54,14 +54,6 @@ "Էջ %1$d՝ %2$d-ից" "Հիմնական էկրան %1$d` %2$d-ից" "Հիմնական էկրանի նոր էջ" - "Բարի գալուստ" - "Պատճենել ձեր ծրագրի պատկերակները" - "Ներմուծե՞լ պատկերակները և պանակները ձեր նախկին Հիմնական էկրանից" - "ՊԱՏՃԵՆԵԼ ՊԱՏԿԵՐԱԿՆԵՐԸ" - "ՄԵԿՆԱՐԿԵԼ ԸՍՏ ԿԱՆԽԱԴՐՎԱԾԻ" - "Պաստառներ, վիջեթներ և կարգավորումներ" - "Հարմարեցնելու համար հպեք և պահեք հետնաշերտի վրա" - "ՀԱՍԿԱՆԱԼԻ Է" "Պանակը բաց է, %1$d-ից %2$d" "Հպեք՝ պանակը փակելու համար" "Հպեք՝ նոր անվանումը պահելու համար" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index b841fc4a69..44e72e13db 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -29,7 +29,7 @@ "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" - "Telusuri Aplikasi..." + "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" "Telusuri aplikasi lainnya" @@ -54,14 +54,6 @@ "Laman %1$d dari %2$d" "Layar utama %1$d dari %2$d" "Laman layar utama baru" - "Selamat Datang" - "Salin ikon aplikasi Anda" - "Impor ikon dan folder dari layar Utama lama Anda?" - "IKON SALIN" - "MULAI DARI AWAL" - "Wallpaper, widget, & setelan" - "Sentuh & tahan latar belakang untuk menyesuaikan" - "MENGERTI" "Folder dibuka, %1$d x %2$d" "Ketuk untuk menutup folder" "Ketuk untuk menyimpan ganti nama" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index d8d350ad92..ea172bd84d 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -29,7 +29,7 @@ "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" - "Leita í forritum…" + "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" "Leita að fleiri forritum" @@ -54,14 +54,6 @@ "Síða %1$d af %2$d" "Heimaskjár %1$d af %2$d" "Ný síða á heimaskjá" - "Komdu fagnandi" - "Afritaðu forritatáknin þín" - "Flytja inn tákn og möppur af eldri heimaskjáum?" - "AFRITA TÁKN" - "BYRJA UPP Á NÝTT" - "Veggfóður, græjur og stillingar" - "Haltu fingri á bakgrunninum til að sérsníða hann" - "ÉG SKIL" "Mappa opnuð, %1$d sinnum %2$d" "Ýttu til að loka möppunni" "Ýttu til að vista breytt heiti" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 0c0b3eae67..14367ed7a4 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -29,7 +29,7 @@ "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" - "Ricerca app…" + "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" "Cerca altre app" @@ -54,14 +54,6 @@ "Pagina %1$d di %2$d" "Schermata Home %1$d di %2$d" "Nuova pagina Schermata Home" - "Benvenuto" - "Copia le icone delle tue app" - "Importare icone e cartelle dalle schermate Home precedenti?" - "COPIA ICONE" - "RICOMINCIA" - "Sfondi, widget e impostazioni" - "Tieni premuto un dito sullo sfondo per personalizzare" - "OK" "Cartella aperta, %1$d per %2$d" "Tocca per chiudere la cartella" "Tocca per salvare il nuovo nome" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 4fb24d207c..e3d0bd0535 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -29,7 +29,7 @@ "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" - "חיפוש אפליקציות..." + "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" "חפש אפליקציות נוספות" @@ -54,14 +54,6 @@ "‏דף %1$d מתוך %2$d" "‏מסך דף הבית %1$d מתוך %2$d" "מסך דף הבית חדש" - "ברוכים הבאים" - "העתקת סמלי האפליקציות שלך" - "האם לייבא סמלים ותיקיות ממסכי דף הבית הישנים שלך?" - "העתק סמלים" - "התחל דף חדש" - "טפטים, ווידג\'טים והגדרות" - "גע והחזק ברקע כדי לבצע התאמה אישית" - "הבנתי" "תיקיה פתוחה, %1$d על %2$d" "הקש כדי לסגור את התיקייה" "הקש כדי לשמור שינוי שם" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 2015f80dba..30789ccbc7 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -29,7 +29,7 @@ "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" - "アプリを検索…" + "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" "他のアプリを検索" @@ -54,14 +54,6 @@ "%1$d/%2$dページ" "ホーム画面: %1$d/%2$d" "新しいホーム画面ページ" - "ようこそ" - "アプリのアイコンをコピー" - "古いホーム画面からアイコンとフォルダをインポートしますか?" - "アイコンをコピー" - "初期状態にリセットする" - "壁紙、ウィジェット、設定" - "カスタマイズするには背景を押し続けます" - "OK" "フォルダが開いています。%1$dx%2$dの大きさです" "タップしてフォルダを閉じます" "タップして変更後の名前を保存します" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 82e49677dd..df33b11620 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -29,7 +29,7 @@ "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" - "აპების ძიება…" + "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" "მეტი აპის პოვნა" @@ -54,14 +54,6 @@ "გვერდი %1$d %2$d-დან" "მთავარი ეკრანი %1$d, %2$d-დან" "მთავარი ეკრანის ახალი გვერდი" - "მოგესალმებით" - "თქვენი აპის ხატულების კოპირება" - "გსურთ, ძველი მთავარი ეკრანიდან ხატულების და საქაღ. იმპორტი?" - "ხატულების კოპირება" - "სტანდარტული განლაგება" - "ფონები, ვიჯეტები & პარამეტრები" - "მოსარგებად შეეხეთ & დააყოვნეთ ფონზე" - "გასაგებია" "საქაღალდე გახსნილია, %1$d x %2$d" "შეეხეთ საქაღალდის დასახურად" "შეეხეთ გადარქმეული სახელის შესანახად" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 9116eeaf9d..d92b67e036 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -29,7 +29,7 @@ "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" - "Қолданбаларды іздеу…" + "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" "Қосымша қолданбалар іздеу" @@ -54,14 +54,6 @@ "%1$d бет, барлығы %2$d" "%1$d негізгі экран, барлығы %2$d" "Жаңа негізгі экран беті" - "Қош келдіңіз" - "Қолданба таңбаларын көшіру" - "Бұрынғы негізгі экрандарыңыздағы таңбалар мен қалталар импортталсын ба?" - "ТАҢБАЛАРДЫ КӨШІРУ" - "ЖАҢАДАН БАСТАУ" - "Тұсқағаздар, виджеттер және параметрлер" - "Реттеу үшін фонды саусағыңызбен басып тұрыңыз" - "ТҮСІНДІМ" "Қалта ашылды, %1$d және %2$d" "Қалтаны жабу үшін түртіңіз" "Қайта атауды сақтау үшін түртіңіз" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index a7cb66ec65..63033582a9 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -29,7 +29,7 @@ "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" - "ស្វែងរកកម្មវិធី…" + "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" "ស្វែងរកកម្មវិធីច្រើនទៀត" @@ -54,14 +54,6 @@ "ទំព័រ %1$d នៃ %2$d" "អេក្រង់​ដើម %1$d នៃ %2$d" "ទំព័រអេក្រង់ដើមថ្មី" - "សូម​ស្វាគមន៍​" - "ចម្លង​រូបតំណាង​កម្មវិធី​របស់​អ្នក" - "នាំចូល​រូបតំណាង និង​ថត​ពី​អេក្រង់​ដើម​ចាស់​របស់​អ្នក?" - "រូប​តំណាង​ច្បាប់​ចម្លង" - "ចាប់ផ្ដើម​ធ្វើ​ឲ្យ​ស្រស់" - "ផ្ទាំងរូបភាព,ធាតុក្រាហ្វិក & ការកំណត់" - "ប៉ះ & សង្កត់​ផ្ទៃ​ខាង​ក្រោយ​ឲ្យជាប់ ដើម្បី​ប្ដូរ​តាមបំណង" - "យល់​ហើយ" "បាន​បើក​ថត %1$d ដោយ %2$d" "ប៉ះ ដើម្បីបិទថត" "ប៉ះដើម្បីរក្សាទុកឈ្មោះដែលបានប្តូរ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index b628f5ed49..71ca1fb25a 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -29,7 +29,7 @@ "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" - "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ..." + "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" "ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕು" @@ -54,14 +54,6 @@ "%2$d ರಲ್ಲಿ %1$d ಪುಟ" "%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ" "ಹೊಸ ಮುಖಪುಟ ಪರದೆ" - "ಸುಸ್ವಾಗತ" - "ಅಪ್ಲಿಕೇಶನ್‌ ಐಕಾನ್‌ ನಕಲಿಸು" - "ನಿಮ್ಮ ಹಳೆಯ ಮುಖಪುಟದ ಪರದೆಗಳಿಂದ ಐಕಾನ್‌ಗಳು ಮತ್ತು ಫೋಲ್ಡರ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳುವುದೇ?" - "ಐಕಾನ್‌ಗಳನ್ನು ನಕಲಿಸು" - "ಹೊಸದಾಗಿ ಪ್ರಾರಂಭಿಸು" - "ವಾಲ್‌ಪೇಪರ್‌ಗಳು, ವಿಜೆಟ್‌ಗಳು, & ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - "ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹಿನ್ನೆಲೆಯನ್ನು ಸ್ಪರ್ಶಿಸಿ & ಒತ್ತಿ ಹಿಡಿಯಿರಿ" - "ಅರ್ಥವಾಯಿತು" "ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, %1$d ಬೈ %2$d" "ಫೋಲ್ಡರ್‌ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index d55d8cb2a3..fc024b1241 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -29,7 +29,7 @@ "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" - "앱 검색..." + "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." "더 많은 앱 검색" @@ -54,14 +54,6 @@ "페이지 %1$d/%2$d" "홈 화면 %1$d/%2$d" "새로운 메인 스크린 페이지" - "환영합니다." - "앱 아이콘 복사" - "이전 메인 스크린에서 아이콘과 폴더를 가져오시겠습니까?" - "아이콘 복사" - "새로 시작" - "배경화면, 위젯, 설정" - "백그라운드를 길게 터치하여 맞춤설정합니다." - "확인" "폴더 열림(%1$dX%2$d)" "탭하여 폴더 닫기" "탭하여 변경된 이름 저장" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 5394223c52..e9b7446075 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -29,7 +29,7 @@ "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" - "Колдонмолорду издөө…" + "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" "Көбүрөөк колдонмолорду издөө" @@ -54,14 +54,6 @@ "%2$d ичинен %1$d барак" "Үй экраны %2$d ичинен %1$d" "Жаңы башкы экран барагы" - "Кош келиңиз" - "Колдонмоңуздун сүрөтчөлөрүн көчүрүү" - "Эски үй экрандарыңыздан сүрөтчөлөр жана фолдерлер импорттолсунбу?" - "СҮРӨТЧӨЛӨРДҮ КӨЧҮРҮҮ" - "ТАЗАСЫН БАШТОО" - "Тушкагаздар, виджеттер жана жөндөөлөр" - "Өзгөчөлөштүрүү үчүн фонго тийип коё бербей басып туруңуз" - "ТҮШҮНДҮМ" "Фолдер ачылды, туурасы %1$d, бийиктиги %2$d" "Куржунду жабуу үчүн таптаңыз" "Өзгөртүлгөн аталышын сактоо үчүн таптаңыз" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index b03f5fb2fa..e2e65978f5 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -29,7 +29,7 @@ "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" - "ຄົ້ນຫາແອັບ" + "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" "ຊອກຫາແອັບເພີ່ມເຕີມ" @@ -54,14 +54,6 @@ "ໜ້າ %1$d ຈາກ %2$d" "ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d" "ໜ້າ​ຂອງ​ໜ້າ​ຈໍ​ຫຼັກ​ໃໝ່" - "ຍິນດີຕ້ອນຮັບ" - "ສຳເນົາໄອຄອນແອັບຯຂອງທ່ານ" - "ນຳເຂົ້າໄອຄອນ ແລະ ໂຟນເດີຈາກໂຮມສະກຣີນອັນເກົ່າຂອງທ່ານບໍ່?" - "ສຳເນົາໄອຄອນ" - "ເລີ່ມຕົ້ນໃໝ່" - "ຮູບພາບພື້ນຫຼັງ, ວິດເຈັດ ແລະ ການຕັ້ງຄ່າ" - "ແຕະທີ່​ພາບ​ພື້ນ​ຫລັງ​ຄ້າງ​ໄວ້​ເພື່ອ​ປັບ​ແຕ່ງ" - "ເຂົ້າໃຈແລ້ວ" "ເປີດໂຟນເດີແລ້ວ, %1$d ຄູນ %2$d" "ແຕະເພື່ອປິດໂຟນເດີ" "ແຕະເພື່ອບັນທຶກການປ່ຽນຊື່" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index e2c35e321a..de23877164 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -29,7 +29,7 @@ "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" - "Ieškoti programų..." + "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" "Ieškoti daugiau programų" @@ -54,14 +54,6 @@ "%1$d psl. iš %2$d" "%1$d pagrindinis ekranas iš %2$d" "Naujas pagrindinio ekrano puslapis" - "Sveiki" - "Programų piktogramų kopij." - "Importuoti piktogramas ir aplankus iš senų pagr. ekranų?" - "KOPIJUOTI PIKTOGRAMAS" - "PRADĖTI IŠ NAUJO" - "Ekrano fonai, valdikliai ir nustatymai" - "Jei norite tinkinti, palieskite ir palaikykite foną" - "SUPRATAU" "Atidarytas aplankas, %1$d ir %2$d" "Palieskite, kad uždarytumėte aplanką" "Palieskite, kad išsaugotumėte pakeistą pavadinimą" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index b5468c4e26..6ac778ad39 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -29,7 +29,7 @@ "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" - "Meklēt lietotnes…" + "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." "Meklēt citas lietotnes" @@ -54,14 +54,6 @@ "%1$d. lapa no %2$d" "Sākuma ekrāns: %1$d no %2$d" "Jauna sākuma ekrāna lapa" - "Laipni lūdzam!" - "Lietotņu ikonu kopēšana" - "Vai importēt ikonas, mapes no iepriekšējiem sākuma ekrāniem?" - "KOPĒT IKONAS" - "SĀKT NO SĀKUMA" - "Fona tapetes, logrīki un iestatījumi" - "Lai pielāgotu, pieskarieties fonam un turiet to nospiestu." - "SAPRATU!" "Atvērta mape: %1$d x %2$d" "Pieskarieties, lai aizvērtu mapi." "Pieskarieties, lai saglabātu jauno nosaukumu." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 009c2225d7..abef64908d 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -29,7 +29,7 @@ "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" - "Пребарувај апликации…" + "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" "Пребарај други апликации" @@ -54,14 +54,6 @@ "Страница %1$d од %2$d" "Екран на почетна страница %1$d од %2$d" "Нова страница на почетен екран" - "Добре дојдовте" - "Копирај икони за апликација" - "Зачувај икони и папки од твоите стари почетни страни?" - "КОПИРАЈ ИКОНИ" - "СТАРТУВАЈ ОД ПОЧЕТОК" - "Позадини, додатоци и поставки" - "Допрете и задржете на заднината за да приспособите" - "СФАТИВ" "Отворена е папка, %1$d на %2$d" "Допрете за да ја затворите папката" "Допрете за да го зачувате преименувањето" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index cb78905d16..fab5d653d3 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -29,7 +29,7 @@ "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" - "ആപ്പ്‌സ് തിരയുക…" + "ആപ്പ്‌സ് തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" @@ -54,14 +54,6 @@ "പേജ് %1$d / %2$d" "ഹോം സ്‌ക്രീൻ %1$d / %2$d" "പുതിയ ഹോം സ്ക്രീൻ പേജ്" - "സ്വാഗതം" - "നിങ്ങളുടെ അപ്ലിക്കേഷൻ ഐക്കണുകൾ പകർത്തുക" - "നിങ്ങളുടെ പഴയ ഹോം സ്ക്രീനുകളിൽ നിന്ന് ഐക്കണുകളും ഫോൾഡറുകളും ഇമ്പോർട്ടുചെയ്യണോ?" - "ഐക്കണുകൾ പകർത്തുക" - "പുതുതായി ആരംഭിക്കുക" - "വാൾപേപ്പറുകൾ, വിജറ്റുകൾ, ക്രമീകരണങ്ങൾ" - "ഇഷ്‌ടാനുസൃതമാക്കുന്നതിന് പശ്‌ചാത്തലം സ്‌പർശിച്ചുപിടിക്കുക" - "മനസ്സിലായി" "ഫോൾഡർ തുറന്നു, %1$d / %2$d" "ഫോൾഡർ അടയ്ക്കുന്നതിന് ടാപ്പുചെയ്യുക" "പേരുമാറ്റം സംരക്ഷിക്കുന്നതിന് ടാപ്പുചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 70296ad494..5f92fd3a21 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -29,7 +29,7 @@ "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" - "Апп хайх..." + "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" "Бусад апп-г хайх" @@ -54,14 +54,6 @@ "%2$d-н %1$d хуудас" "%2$d-н Нүүр дэлгэц %1$d" "Шинэ үндсэн нүүр хуудас" - "Тавтай морилно уу" - "Таны апп дүрсүүдийг хуулах" - "Таны хуучин Үндсэн дэлгэц дээрх дүрсүүдийг импорт хийх үү?" - "ДҮРСҮҮДИЙГ ХУУЛАХ" - "ШИНЭЭР ЭХЛЭХ" - "Дэвсгэр зураг, виджет, & тохиргоо" - "Тааруулахын тулд арын дэлгэцэнд хүрээд & барина уу" - "Ойлголоо" "%1$d %2$d фолдер нээгдэв" "Фолдерийг хаахын тулд дарна уу" "Шинэ нэрийг хадгалахын тулд дарна уу." diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 9402104055..89d4833fc9 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -29,7 +29,7 @@ "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" - "अॅप्स शोधा..." + "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" "अधिक अॅप्स शोधा" @@ -54,14 +54,6 @@ "%2$d पैकी %1$d पृष्ठ" "%2$d पैकी %1$d मुख्य स्क्रीन" "नवीन मुख्य स्क्रीन पृष्ठ" - "सुस्वागतम" - "आपली अॅप चिन्हे कॉपी करा" - "आपल्या जुन्या मुख्य स्क्रीनवरून चिन्हे आणि फोल्डर आयात करायची?" - "चिन्हे कॉपी करा" - "नव्याने प्रारंभ करा" - "वॉलपेपर, विजेट आणि सेटिंग्ज" - "सानुकूल करण्यासाठी पार्श्वभूमीस स्पर्श करा आणि धरुन ठेवा" - "समजले" "फोल्डर उघडले, %1$d बाय %2$d" "फोल्डर बंद करण्यासाठी टॅप करा" "पुनर्नामित करणे जतन करण्यासाठी टॅप करा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index d5a3fa3d24..759d8e9268 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -29,7 +29,7 @@ "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" - "Cari Apl..." + "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" "Cari lagi apl" @@ -54,14 +54,6 @@ "Halaman %1$d daripada %2$d" "Skrin Laman Utama %1$d daripada %2$d" "Halaman skrin utama baharu" - "Selamat datang" - "Salin ikon apl anda" - "Import ikon dan folder dari skrin Laman Utama lama anda?" - "SALIN IKON" - "MULAKAN YANG BAHARU" - "Kertas dinding, widget & tetapan" - "Sentuh & tahan latar belakang untuk memperibadikan" - "FAHAM" "Folder dibuka, %1$d kali %2$d" "Ketik untuk menutup folder" "Ketik untuk menyimpan penamaan semula" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index e6a46894fd..d1d975767e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -22,15 +22,15 @@ "ဖွင့်တင်စက်၃" "အလုပ်" - "အပ်ပလီကေးရှင်း မထည့်သွင်းထားပါ" - "App လက်လှမ်း မမှီပါ" + "အက်ပ်မထည့်သွင်းထားပါ" + "အက်ပ်လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" - "အက်ပ်များကို ရှာဖွေပါ…" - "App များ ရယူနေစဉ်..." + "ရှာဖွေမှု အက်ပ်များ" + "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" "နောက်ထပ် အက်ပ်များကို ရှာပါ" "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" @@ -39,7 +39,7 @@ "ပင်မစာမျက်နှာ" "ဖယ်ရှားမည်" "ဖယ်ထုတ်မည်" - "အက်ပ် အချက်အလက်များ" + "အက်ပ်အချက်အလက်များ" "အတိုကောက်မှတ်သားမှုများအား ထည့်သွင်းခြင်း" "အသုံးပြုသူ လုပ်ဆောင်မှုမရှိပဲ အပ်ပလီကေးရှင်းကို အတိုကောက်မှတ်သားမှုများ ပြုလုပ်ခွင့် ပေးခြင်း" "ပင်မမျက်နှာစာ အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများအား ဖတ်ခြင်း" @@ -54,14 +54,6 @@ "စာမျက်နှာ %1$d မှ %2$d" "ပင်မစာမျက်နှာ %1$d မှ %2$d" "ပင်မမျက်နှာပြင် စာမျက်နှာသစ်" - "မင်္ဂလာပါ" - "အပ်ပလီကေးရှင်းပုံညွှန်းများကို ကူးယူပါ" - "ပင်မစာမျက်နှာအဟောင်းမှ ပုံညွှန်းများ နှင့် အကန့်များကို ယူလာပါမလား" - "COPY ICONS" - "START FRESH" - "နောက်ခံများ၊ ဝိဂျက်များ& ဆက်တင်များ" - "နောက်ခံကို စိတ်တိုင်းကျ ပြုလုပ်ရန် ထိလျက် & ကိုင်ထားပါ" - "ရပါပြီ" "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" "ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ" "အမည်ပြောင်းခြင်းကို သိမ်းဆည်းရန် တို့ပါ" @@ -79,8 +71,8 @@ "မသိရ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" - "App မတပ်ဆင်ရသေးပါ" - "ဤအိုင်ကွန်အတွက် အက်ပ် အားမထည့်သွင်းထားပါ။ You can remove it, or search for the အက်ပ် and install it manually." + "အက်ပ်မတပ်ဆင်ရသေးပါ" + "ဤအိုင်ကွန်အတွက် အက်ပ်အားမထည့်သွင်းထားပါ။ You can remove it, or search for the အက်ပ်and install it manually." "%1$s ဒေါင်းလုဒ်လုပ်နေသည်၊ %2$s ပြီးပါပြီ" "%1$s ကိုထည့်သွင်းရန်စောင့်နေသည်" "ပင်မမျက်နှာစာသို့ ထည့်ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index db99da5883..e19c0d8890 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -29,7 +29,7 @@ "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" - "Søk i apper" + "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" "Søk etter flere apper" @@ -54,14 +54,6 @@ "Side %1$d av %2$d" "Startside %1$d av %2$d" "Ny side på startskjermen" - "Velkommen" - "Kopiér appikonene dine" - "Vil du importere ikoner og mapper fra dine gamle startsider?" - "KOPIÉR IKONENE" - "START PÅ NYTT" - "Bakgrunner, moduler og innstillinger" - "Trykk og hold på bakgrunnen for å tilpasse den" - "SKJØNNER" "Mappen er åpnet – %1$d ganger %2$d" "Trykk for å lukke mappen" "Trykk for å lagre det nye navnet" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index fc3c4a8cc4..6ff94f907a 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -29,7 +29,7 @@ "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" - "अनुप्रयोगहरू खोज्नुहोस्..." + "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" "थप अनुप्रयोगहरू खोज्नुहोस्" @@ -54,14 +54,6 @@ "पृष्ठ %2$d को %1$d" "गृह स्क्रिन %1$d को %2$d" "नयाँ गृह स्क्रिन पृष्ठ" - "स्वागतम्" - "तपाईँको अनुप्रयोग आईकनको प्रतिलिप गर्नुहोस्" - "आफ्नो पुरानो गृह स्क्रीनबाट अाईकन र फोल्डरहरू आयात गर्नुहोस्?" - "ICONS प्रतिलिप गर्नुहोस्" - "START FRESH" - "वालपेपर, विजेट तथा सेटिङहरू" - "अनुकूलन गर्न पृष्ठभूमिलाई छुनुहोस् र होल्ड गर्नुहोस्" - "बुँझें" "फोल्डर खुल्यो %1$d बाट %2$d" "फोल्डरलाई बन्द गर्न ट्याप गर्नुहोस्" "पुनःनामाकरणलाई सुरक्षित गर्न ट्याप गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 13b6effa91..e27ba283ab 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -29,7 +29,7 @@ "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" - "Apps zoeken…" + "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" "Zoeken naar meer apps" @@ -54,14 +54,6 @@ "Pagina %1$d van %2$d" "Startscherm %1$d van %2$d" "Nieuwe startschermpagina" - "Welkom" - "Je app-pictogrammen kopiëren" - "Pictogrammen en mappen importeren uit je oude startschermen?" - "PICTOGRAMMEN KOPIËREN" - "OPNIEUW BEGINNEN" - "Achtergronden, widgets en instellingen" - "Blijf de achtergrond aanraken om deze aan te passen" - "OK" "Map geopend, %1$d bij %2$d" "Tik om de map te sluiten" "Tik om de gewijzigde naam op te slaan" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 3f82acdb2f..5dbd4e7b83 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -29,7 +29,7 @@ "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" - "ਐਪਾਂ ਖੋਜੋ…" + "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" "ਹੋਰ ਐਪਾਂ ਖੋਜੋ" @@ -54,14 +54,6 @@ "ਸਫ਼ਾ %2$d ਦਾ %1$d" "ਹੋਮ ਸਕ੍ਰੀਨ %2$d ਦੀ %1$d" "ਨਵਾਂ ਹੋਮ ਸਕ੍ਰੀਨ ਸਫ਼ਾ" - "ਸੁਆਗਤ ਹੈ" - "ਆਪਣੇ ਐਪ ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" - "ਕੀ ਆਪਣੀਆਂ ਪੁਰਾਣੀਆਂ ਹੋਮ ਸਕ੍ਰੀਨਾਂ ਤੋਂ ਆਈਕਨਾਂ ਅਤੇ ਫੋਲਡਰ ਆਯਾਤ ਕਰਨੇ ਹਨ?" - "ਆਈਕਨਾਂ ਨੂੰ ਕਾਪੀ ਕਰੋ" - "ਤਾਜ਼ਾ ਸ਼ੁਰੂ ਕਰੋ" - "ਵਾਲਪੇਪਰ, ਵਿਜਿਟ, ਅਤੇ ਸੈਟਿੰਗਾਂ" - "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਪਿੱਠਭੂਮੀ ਨੂੰ ਛੂਹੋ ਅਤੇ ਛੂਹੀ ਰੱਖੋ" - "ਸਮਝ ਲਿਆ" "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %2$d" "ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਬਦਲੇ ਗਏ ਨਾਮ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index ff38a1c3fb..0829e600e9 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -29,7 +29,7 @@ "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" - "Szukaj w aplikacjach…" + "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" "Wyszukaj więcej aplikacji" @@ -54,14 +54,6 @@ "Strona %1$d z %2$d" "Ekran główny %1$d z %2$d" "Nowa strona ekranu głównego" - "Witamy" - "Kopiuj ikony aplikacji" - "Zaimportować ikony i foldery ze starych ekranów głównych?" - "KOPIUJ IKONY" - "ZACZNIJ OD NOWA" - "Tapety, widżety i ustawienia" - "Kliknij i przytrzymaj tło, by dostosować" - "OK" "Folder otwarty, %1$d na %2$d" "Kliknij, by zamknąć folder" "Kliknij, by zapisać nową nazwę" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 81b14d9dd6..8b0250da8c 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -29,7 +29,7 @@ "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" - "Pesquisar aplicações..." + "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" "Pesquisar mais aplicações" @@ -54,14 +54,6 @@ "Página %1$d de %2$d" "Ecrã principal %1$d de %2$d" "Nova página do ecrã principal" - "Bem-vindo(a)" - "Copiar ícones das aplicações" - "Importar ícones e pastas dos ecrãs principais antigos?" - "COPIAR ÍCONES" - "COMEÇAR DO INÍCIO" - "Imagens de fundo, widgets e definições" - "Toque sem soltar no fundo para personalizar" - "COMPREENDI" "Pasta aberta, %1$d por %2$d" "Tocar para fechar a pasta" "Tocar para guardar o nome novo" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index fff859e3ba..8ee4619da5 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -29,7 +29,7 @@ "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" - "Pesquisar apps..." + "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" "Pesquisar mais apps" @@ -54,14 +54,6 @@ "Página %1$d de %2$d" "Tela inicial %1$d de %2$d" "Nova página na tela inicial" - "Bem-vindo" - "Copiar ícones de apps" - "Importar ícones e pastas de suas telas iniciais antigas?" - "COPIAR ÍCONES" - "COMEÇAR DO ZERO" - "Plano de fundo, widgets e configurações" - "Toque no segundo plano e mantenha pressionado para personalizar" - "ENTENDI" "Pasta aberta, %1$d por %2$d" "Toque para fechar a pasta" "Toque para salvar o novo nome" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 8f3630f158..2e7759eedb 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -29,7 +29,7 @@ "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" - "Căutați aplicații…" + "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" "Căutați mai multe aplicații" @@ -54,14 +54,6 @@ "Pagina %1$d din %2$d" "Ecranul de pornire %1$d din %2$d" "Pagină nouă pe ecranul de pornire" - "Bun venit" - "Copiați pictogr. aplicațiilor" - "Import. pictogr. și dosare de pe ecranele de pornire anter.?" - "COPIAȚI PICTOGRAMELE" - "REÎNCEPEȚI" - "Imagini de fundal, widgeturi și setări" - "Atingeți lung fundalul pentru a-l personaliza" - "AM ÎNȚELES" "Dosar deschis, %1$d pe %2$d" "Atingeți pentru a închide dosarul" "Atingeți pentru a salva noul nume" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6303190245..4dade601b4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -29,7 +29,7 @@ "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" - "Поиск приложений" + "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" "Искать другие приложения" @@ -54,14 +54,6 @@ "Стр. %1$d из %2$d" "Главные экран %1$d из %2$d" "Новый экран" - "Добро пожаловать!" - "Копировать значки приложений" - "Импортировать значки и папки со старого главного экрана?" - "КОПИРОВАТЬ ЗНАЧКИ" - "ИСПОЛЬЗОВАТЬ СТАНДАРТНЫЙ МАКЕТ" - "Обои, виджеты и настройки" - "Чтобы выполнить настройку, коснитесь фона и удерживайте его." - "ОК" "Папка открыта, %1$d x %2$d" "Нажмите, чтобы закрыть папку" "Нажмите, чтобы подтвердить переименование" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index e74bbe5c13..548931a83a 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -29,7 +29,7 @@ "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" - "යෙදුම් සොයන්න..." + "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" "තව යෙදුම් සඳහා සොයන්න" @@ -54,14 +54,6 @@ "%2$d හි %1$d පිටුව" "මුල් පිටු තිරය %2$d හි %1$d" "නව මුල් පිටුව" - "සාදරයෙන් පිළිගනිමු" - "ඔබේ යෙදුම් නිරූපක පිටපත් කිරීම" - "ඔබගේ පැරණි මුල් තිර වල නිරූපක සහ ෆෝල්ඩර ආයාත කරන්නද?" - "නිරූපක පිටපත් කරන්න" - "අලුතින් පටන්ගන්න" - "වෝල්පේපර, විජට්, සහ සැකසීම්" - "පසුබිම අභිරුචිකරණය කිරීමට ස්පර්ශ කර අල්ලා සිටින්න" - "තේරුණා" "ෆෝල්ඩරය විවෘත විය, %1$d හි %2$d" "ෆෝල්ඩරය වැසීමට තට්ටු කරන්න" "යළි නම් කිරීම සුරැකීමට තට්ටු කරන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 9183ffc457..631c30d20c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -29,7 +29,7 @@ "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" - "Hľadať aplikácie…" + "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" "Hľadať ďalšie aplikácie" @@ -54,14 +54,6 @@ "Stránka %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" - "Vitajte!" - "Kopírovanie ikon aplikácií" - "Chcete importovať ikony a priečinky zo starých plôch?" - "SKOPÍROVAŤ IKONY" - "ZAČAŤ ODZNOVA" - "Tapety, miniaplikácie a nastavenia" - "Pozadie môžete prispôsobiť jeho pridržaním" - "DOBRE" "Otvorený priečinok, %1$d x %2$d" "Priečinok zavriete klepnutím" "Nový názov uložíte klepnutím" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 3e33bca4e5..293e98065e 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -29,7 +29,7 @@ "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" - "Iskanje po aplikacijah …" + "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" "Iskanje več aplikacij" @@ -54,14 +54,6 @@ "Stran %1$d od %2$d" "Začetni zaslon %1$d od %2$d" "Nova stran na začetnem zaslonu" - "Pozdravljeni" - "Kopiranje ikon aplikacij" - "Želite uvoziti ikone in mape iz starih začetnih zaslonov?" - "KOPIRAJ IKONE" - "SVEŽ ZAČETEK" - "Ozadja, pripomočki in nastavitve" - "Za prilagajanje se dotaknite ozadja in ga pridržite" - "V REDU" "Mapa je odprta, %1$d krat %2$d" "Dotaknite se, da zaprete mapo" "Dotaknite se, da shranite preimenovanje" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index a3ae0dae9e..6f2e60569b 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -29,7 +29,7 @@ "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" - "Kërko për aplikacione..." + "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" "Kërko për më shumë aplikacione" @@ -54,14 +54,6 @@ "Faqja: %1$d nga gjithsej %2$d" "Ekrani bazë: %1$d nga gjithsej %2$d" "Faqja e ekranit të ri kryesor" - "Mirë se erdhe" - "Kopjo ikonat e aplikacionit" - "Të importohen ikona dhe dosje nga ekranet e vjetra bazë?" - "KOPJO IKONA" - "FILLO NGA E PARA" - "Imazhe në sfond, miniaplikacione dhe cilësime" - "Prek dhe mbaj shtypur sfondin për ta personalizuar." - "E KUPTOVA!" "Dosja u hap, %1$d me %2$d" "Trokit për të mbyllur dosjen" "Trokit për të ruajtur riemërtimin" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 6a2c71f668..62bb011bba 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -29,7 +29,7 @@ "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" - "Претражите апликације..." + "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" "Претражи још апликација" @@ -54,14 +54,6 @@ "%1$d. страница од %2$d" "%1$d. почетни екран од %2$d" "Нова страница почетног екрана" - "Добро дошли" - "Копирајте иконе апликација" - "Увести иконе и директоријуме са старих почетних екрана?" - "КОПИРАЈТЕ ИКОНЕ" - "ПОЧНИТЕ ИСПОЧЕТКА" - "Позадине, виџети и подешавања" - "Додирните и задржите позадину да бисте прилагодили" - "ВАЖИ" "Директоријум је отворен, %1$d пута %2$d" "Додирните да бисте затворили директоријум" "Додирните да бисте сачували преименовање" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 856b664432..f57925c7d4 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -29,7 +29,7 @@ "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" - "Sök efter appar …" + "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" "Sök efter fler appar" @@ -54,14 +54,6 @@ "Sidan %1$d av %2$d" "Startskärmen %1$d av %2$d" "Ny sida på startskärmen" - "Välkommen" - "Kopiera appikoner" - "Vill du importera ikoner och mappar från gamla startskärmar?" - "KOPIERA IKONER" - "BÖRJA OM" - "Bakgrunder, widgetar och inställningar" - "Tryck länge på bakgrunden om du vill anpassa den" - "OK" "Mappen är öppen, %1$d gånger %2$d" "Tryck om du vill stänga mappen" "Tryck om du vill spara namnändringen" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 5ce90e096e..3b058d7ad3 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -29,7 +29,7 @@ "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" - "Tafuta Programu..." + "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" "Tafuta programu zaidi" @@ -56,14 +56,6 @@ "Ukurasa mpya wa skrini ya kwanza" - "Karibu" - "Nakili ikoni za programu yako" - "Je, ungependa kuingiza ikoni na folda kutoka kwenye skrini zako za Mwanzo za zamani?" - "NAKILI IKONI" - "ANZA UPYA" - "Mandhari, wijeti na mipangilio" - "Gusa na ushikilie mandhari ili ubadilishe upendavyo" - "NIMEELEWA" "Folda imefunguliwa, %1$d kwa %2$d" "Gonga ili ufunge folda" "Gonga ili ubadilishe jina" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index e018ea7fb7..c5c2717395 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -29,7 +29,7 @@ "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" - "பயன்பாடுகளில் தேடுக…" + "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" "கூடுதல் பயன்பாடுகளைத் தேடு" @@ -54,14 +54,6 @@ "பக்கம் %1$d / %2$d" "முகப்புத் திரை %1$d of %2$d" "புதிய முகப்புத் திரை பக்கம்" - "நல்வரவு" - "பயன்பாட்டின் ஐகான்களை நகலெடுக்கவும்" - "பழைய முகப்புத் திரைகளிலிருந்து ஐகான்களையும் கோப்புறைகளையும் இறக்குமதி செய்யவா?" - "ஐகான்களை நகலெடு" - "புதிதாகத் தொடங்கு" - "வால்பேப்பர்கள், விட்ஜெட்கள் & அமைப்புகள்" - "தனிப்பயனாக்க, பின்னணியைத் தொட்டுப் பிடிக்கவும்" - "புரிந்தது" "திறக்கப்பட்டக் கோப்புறை, %1$d x %2$d" "கோப்புறையை மூட, தட்டவும்" "மாற்றிய பெயரைச் சேமிக்க, தட்டவும்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 34ce1b77ec..8ebf8a4f9c 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -29,7 +29,7 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" - "అనువర్తనాల్లో శోధించండి…" + "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" "మరిన్ని అనువర్తనాల కోసం శోధించు" @@ -54,14 +54,6 @@ "%2$dలో %1$dవ పేజీ" "%2$dలో %1$dవ హోమ్ స్క్రీన్" "కొత్త హోమ్ స్క్రీన్ పేజీ" - "స్వాగతం" - "మీ అనువర్తన చిహ్నాలను కాపీ చేయండి" - "మీ పాత హోమ్ స్క్రీన్‌ల నుండి చిహ్నాలు మరియు ఫోల్డర్‌లను దిగుమతి చేయాలా?" - "చిహ్నాలను కాపీ చేయి" - "తాజాగా ప్రారంభించు" - "వాల్‌పేపర్‌లు, విడ్జెట్‌లు & సెట్టింగ్‌లు" - "అనుకూలీకరించడానికి నేపథ్యాన్ని నొక్కి & ఉంచండి" - "అర్థమైంది" "ఫోల్డర్ తెరవబడింది, %1$d X %2$d" "ఫోల్డర్‌ను మూసివేయడానికి నొక్కండి" "పేరు మార్పును సేవ్ చేయడానికి నొక్కండి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 54a1bcf360..680c4c704d 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -29,7 +29,7 @@ "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" - "ค้นหาแอป…" + "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" "ค้นหาแอปเพิ่มเติม" @@ -54,14 +54,6 @@ "หน้า %1$d จาก %2$d" "หน้าจอหลัก %1$d จาก %2$d" "หน้าใหม่ในหน้าจอหลัก" - "ยินดีต้อนรับ" - "คัดลอกไอคอนแอปของคุณ" - "นำเข้าไอคอนและโฟลเดอร์จากหน้าจอหลักเก่าของคุณ" - "คัดลอกไอคอน" - "เริ่มต้นใหม่" - "วอลเปเปอร์ วิดเจ็ต และการตั้งค่า" - "แตะพื้นหลังค้างไว้เพื่อกำหนดค่า" - "รับทราบ" "เปิดโฟลเดอร์ %1$d x %2$d" "แตะเพื่อปิดโฟลเดอร์" "แตะเพื่อบันทึกการเปลี่ยนชื่อ" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index d615706255..b8d54395de 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -29,7 +29,7 @@ "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" - "Maghanap ng Mga App…" + "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" "Maghanap ng higit pang mga app" @@ -54,14 +54,6 @@ "Pahina %1$d ng %2$d" "Home screen %1$d ng %2$d" "Bagong page ng home screen" - "Welcome" - "Kopyahin ang mga icon ng app" - "I-import ang icon at folder mula sa luma mong Home screen?" - "KOPYAHIN ANG MGA ICON" - "MAGSIMULA NANG BAGO" - "Mga wallpaper, widget at setting" - "Pindutin nang matagal ang background upang i-customize" - "NAKUHA KO" "Binuksan ang folder, %1$d by %2$d" "I-tap upang isara ang folder" "I-tap upang i-save ang bagong pangalan" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cee7014b97..cba61afa04 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -29,7 +29,7 @@ "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" - "Uygulamalarda Ara…" + "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" "Başka uygulamalar ara" @@ -54,14 +54,6 @@ "Sayfa %1$d / %2$d" "Ana ekran %1$d / %2$d" "Yeni ana ekran sayfası" - "Hoş geldiniz" - "Uygulama simgelerini kopyala" - "Eski Ana ekranlarınızdaki simgeler ve klasörler içe aktarılsın mı?" - "SİMGELERİ KOPYALA" - "VARSAYILANI KULLAN" - "Duvar kağıtları, widget\'lar ve ayarlar" - "Özelleştirmek için arka plana dokunun ve basılı tutun" - "TAMAM" "Klasör açıldı, %1$d x %2$d" "Klasörü kapatmak için hafifçe dokunun" "Yeni adın kaydedilmesi için hafifçe dokunun" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 401d77186f..fb0e7019f0 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -29,7 +29,7 @@ "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" - "Пошук додатків…" + "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" "Шукати ще додатки" @@ -54,14 +54,6 @@ "Сторінка %1$d з %2$d" "Головний екран %1$d з %2$d" "Нова сторінка головного екрана" - "Вітаємо" - "Копіювати значки програм" - "Імпортувати значки та папки зі старих головних екранів?" - "КОПІЮВАТИ ЗНАЧКИ" - "ПАНЕЛЬ ЗАПУСКУ ЗА УМОВЧАННЯМ" - "Фонові малюнки, віджети й налаштування" - "Натисніть і втримуйте фон, щоб налаштувати робочу область" - "ЗРОЗУМІЛО" "Папку відкрито (%1$d х %2$d)" "Торкніться, щоб закрити папку" "Торкніться, щоб зберегти зміни" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index f4e22aaf51..b5687a1d2e 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -29,7 +29,7 @@ "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" - "ایپس تلاش کریں…" + "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" "مزید ایپس تلاش کریں" @@ -54,14 +54,6 @@ "‏صفحہ ‎%1$d از ‎%2$d" "‏ہوم اسکرین ‎%1$d از ‎%2$d" "نیا ہوم اسکرین صفحہ" - "خوش آمدید" - "اپنے ایپ آئیکنز کو کاپی کریں" - "اپنی پرانی ہوم اسکرینوں سے آئیکنز اور فولڈرز درآمد کریں؟" - "آئیکنز کاپی کریں" - "نئے سرے سے شروع کریں" - "وال پیپرز، ویجیٹس اور ترتیبات" - "حسب ضرورت بنانے کیلئے پس منظر کو ٹچ کریں اور دبائے رکھیں" - "سمجھ آ گئی" "فولڈر کھولا گیا، %1$d × %2$d" "فولڈر کو بند کرنے کیلئے تھپتھپائیں" "نام کی تبدیلی محفوظ کرنے کیلئے تھپتھپائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 20b0863ddd..bff1b1c93c 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -29,7 +29,7 @@ "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" - "Ilovalar ichidan qidirish…" + "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" "Boshqa ilovalarni qidirish" @@ -54,14 +54,6 @@ "%2$ddan %1$d ta sahifa" "Uy ekrani %2$ddan %1$d" "Yangi bosh ekran sahifasi" - "Xush kelibsiz" - "Ilovangiz nishonchalaridan nusxa olish" - "Eski \"Uy\" ekranlaringizdan jildlar va nishonchalar import qilinsinmi?" - "NISHONCHALARNI NUSXALASH" - "YANGIDAN BOSHLASH" - "Fon rasmlari, vidjet va sozlamalar" - "Moslashtirish uchun orqa fon ustiga biroz bosib turing" - "OK" "Jild ochildi, %1$d ga %2$d" "Jildni yopish uchun ustiga bosing" "O‘zgarishni saqlash uchun ustiga bosing" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 7ef588fee1..527e0a9fa7 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -29,7 +29,7 @@ "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" - "Tìm kiếm ứng dụng..." + "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" "Tìm kiếm thêm ứng dụng" @@ -54,14 +54,6 @@ "Trang %1$d / %2$d" "Màn hình chính %1$d / %2$d" "Trang màn hình chính mới" - "Chào mừng" - "Sao chép biểu tượng ứng dụng của bạn" - "Nhập biểu tượng và thư mục từ Màn hình chính cũ của bạn?" - "BIỂU TƯỢNG SAO CHÉP" - "BẮT ĐẦU LÀM MỚI" - "Hình nền, tiện ích và cài đặt" - "Chạm và giữ nền để tùy chỉnh" - "OK" "Đã mở thư mục, %1$d x %2$d" "Nhấn để đóng thư mục" "Nhấn để lưu đổi tên" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index d18352c949..af6fa43a60 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,7 +29,7 @@ "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" - "搜索应用…" + "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" "搜索更多应用" @@ -54,14 +54,6 @@ "第%1$d页,共%2$d页" "主屏幕:第%1$d屏,共%2$d屏" "主屏幕新页面" - "欢迎使用" - "复制应用图标" - "要导入旧的主屏幕中的图标和文件夹吗?" - "复制图标" - "使用全新配置" - "壁纸、小部件和设置" - "触摸并按住背景,即可进行个性化设置" - "知道了" "文件夹已打开,大小为%1$d×%2$d" "点按可关闭文件夹" "点按可保存新名称" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 7507ea5471..ffa3e47061 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -29,7 +29,7 @@ "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" - "搜尋應用程式…" + "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" "搜尋更多應用程式" @@ -54,14 +54,6 @@ "第 %1$d 頁,共 %2$d 頁" "主畫面 %1$d,共 %2$d 個" "新主畫面頁面" - "歡迎" - "複製您的應用程式圖示" - "要從舊主畫面匯入圖示和資料夾嗎?" - "複製圖示" - "重新開始" - "桌布、小工具和設定" - "輕觸並按住背景即可自訂" - "知道了" "資料夾已開啟 (%1$d x %2$d)" "輕按即可關閉資料夾" "輕按即可儲存新名稱" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 727dc9c62e..c45b39b7b9 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -29,7 +29,7 @@ "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" - "搜尋應用程式…" + "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" "搜尋更多應用程式" @@ -54,14 +54,6 @@ "第 %1$d 頁,共 %2$d 頁" "主螢幕:第 %1$d 頁,共 %2$d 頁" "新的主畫面頁面" - "歡迎使用" - "複製您的應用程式圖示" - "要從舊的主螢幕匯入圖示和資料夾嗎?" - "複製圖示" - "重新開始" - "桌布、小工具和設定" - "輕觸並按住背景即可自訂" - "知道了" "資料夾已開啟 (%1$d x %2$d)" "輕觸即可關閉資料夾" "輕觸即可儲存新名稱" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index ec201da47b..a01c78b0be 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -29,7 +29,7 @@ "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" - "Sesha izinhlelo zokusebenza..." + "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" "Sesha izinhlelo zokusebenza eziningi" @@ -54,14 +54,6 @@ "Ikhasi elingu-%1$d kwangu-%2$d" "Isikrini sasekhaya esingu-%1$d se-%2$d" "Ikhasi elisha lesikrini sasekhaya" - "Siyakwamukela" - "Kopisha izithonjana zakho zohlelo lokusebenza" - "Ngenisa izithonjana namafolda kusukela kuzikrini zakho ezindala zasekhaya?" - "KOPISHA IZITHONJANA" - "QALISA KABUSHA" - "Izithombe zangemuva, amawijethi, nezilungiselelo" - "Thinta uphinde ubambe ingemuva ukuze wenze ngokwezifiso" - "NGIYITHOLILE" "Ifolda ivuliwe, %1$d nge-%2$d" "Thepa ukuze uvale ifolda" "Thepha ukuze ulondoloze ukuqamba kabusha" From 537708bd25d2991bfcbfae6688e68ed81c433687 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 12 Jul 2016 00:00:47 -0700 Subject: [PATCH 021/382] Import translations. DO NOT MERGE Change-Id: I4865e6411a1f6a1166f21f6f529ca645696528b3 Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 ++++++--- res/values-am/strings.xml | 9 ++++++--- res/values-ar/strings.xml | 9 ++++++--- res/values-az-rAZ/strings.xml | 9 ++++++--- res/values-bg/strings.xml | 9 ++++++--- res/values-bn-rBD/strings.xml | 9 ++++++--- res/values-ca/strings.xml | 9 ++++++--- res/values-cs/strings.xml | 9 ++++++--- res/values-da/strings.xml | 9 ++++++--- res/values-de/strings.xml | 9 ++++++--- res/values-el/strings.xml | 9 ++++++--- res/values-en-rAU/strings.xml | 9 ++++++--- res/values-en-rGB/strings.xml | 9 ++++++--- res/values-en-rIN/strings.xml | 9 ++++++--- res/values-es-rUS/strings.xml | 9 ++++++--- res/values-es/strings.xml | 9 ++++++--- res/values-et-rEE/strings.xml | 9 ++++++--- res/values-eu-rES/strings.xml | 9 ++++++--- res/values-fa/strings.xml | 9 ++++++--- res/values-fi/strings.xml | 9 ++++++--- res/values-fr-rCA/strings.xml | 9 ++++++--- res/values-fr/strings.xml | 9 ++++++--- res/values-gl-rES/strings.xml | 9 ++++++--- res/values-gu-rIN/strings.xml | 9 ++++++--- res/values-hi/strings.xml | 9 ++++++--- res/values-hr/strings.xml | 9 ++++++--- res/values-hu/strings.xml | 9 ++++++--- res/values-hy-rAM/strings.xml | 9 ++++++--- res/values-in/strings.xml | 9 ++++++--- res/values-is-rIS/strings.xml | 9 ++++++--- res/values-it/strings.xml | 9 ++++++--- res/values-iw/strings.xml | 9 ++++++--- res/values-ja/strings.xml | 9 ++++++--- res/values-ka-rGE/strings.xml | 9 ++++++--- res/values-kk-rKZ/strings.xml | 9 ++++++--- res/values-km-rKH/strings.xml | 9 ++++++--- res/values-kn-rIN/strings.xml | 9 ++++++--- res/values-ko/strings.xml | 9 ++++++--- res/values-ky-rKG/strings.xml | 9 ++++++--- res/values-lo-rLA/strings.xml | 9 ++++++--- res/values-lt/strings.xml | 9 ++++++--- res/values-lv/strings.xml | 9 ++++++--- res/values-mk-rMK/strings.xml | 9 ++++++--- res/values-ml-rIN/strings.xml | 9 ++++++--- res/values-mn-rMN/strings.xml | 9 ++++++--- res/values-mr-rIN/strings.xml | 9 ++++++--- res/values-ms-rMY/strings.xml | 9 ++++++--- res/values-my-rMM/strings.xml | 9 ++++++--- res/values-nb/strings.xml | 9 ++++++--- res/values-ne-rNP/strings.xml | 9 ++++++--- res/values-nl/strings.xml | 9 ++++++--- res/values-pa-rIN/strings.xml | 9 ++++++--- res/values-pl/strings.xml | 9 ++++++--- res/values-pt-rPT/strings.xml | 9 ++++++--- res/values-pt/strings.xml | 9 ++++++--- res/values-ro/strings.xml | 9 ++++++--- res/values-ru/strings.xml | 9 ++++++--- res/values-si-rLK/strings.xml | 9 ++++++--- res/values-sk/strings.xml | 9 ++++++--- res/values-sl/strings.xml | 9 ++++++--- res/values-sq-rAL/strings.xml | 9 ++++++--- res/values-sr/strings.xml | 9 ++++++--- res/values-sv/strings.xml | 9 ++++++--- res/values-sw/strings.xml | 9 ++++++--- res/values-ta-rIN/strings.xml | 9 ++++++--- res/values-te-rIN/strings.xml | 9 ++++++--- res/values-th/strings.xml | 9 ++++++--- res/values-tl/strings.xml | 9 ++++++--- res/values-tr/strings.xml | 9 ++++++--- res/values-uk/strings.xml | 9 ++++++--- res/values-ur-rPK/strings.xml | 9 ++++++--- res/values-uz-rUZ/strings.xml | 9 ++++++--- res/values-vi/strings.xml | 9 ++++++--- res/values-zh-rCN/strings.xml | 9 ++++++--- res/values-zh-rHK/strings.xml | 9 ++++++--- res/values-zh-rTW/strings.xml | 9 ++++++--- res/values-zu/strings.xml | 9 ++++++--- 77 files changed, 462 insertions(+), 231 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 1f719c7164..24f7c9e259 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -35,7 +35,8 @@ "Soek meer programme" "Niks meer spasie op die tuisskerm nie." "Geen plek meer in die Gunstelinge-laai nie" - "Programme" + + "Tuis" "Verwyder" "Deïnstalleer" @@ -65,8 +66,10 @@ "Instellings" "Gedeaktiveer deur jou administrateur" "Oorsig" - "Laat tuisskermrotasie toe" - "Wanneer toestel gedraai word" + + + + "Huidige vertooninstelling laat nie rotasie toe nie" "Onbekend" "Verwyder" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 8f3f07a224..12bc5de8af 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -35,7 +35,8 @@ "ተጨማሪ መተግበሪያዎች ይፈልጉ" "በዚህ መነሻ ማያ ገጽ ላይ ምንም ቦታ የለም።" "በተወዳጆች መሣቢያ ውስጥ ተጨማሪ ቦታ የለም" - "መተግበሪያዎች" + + "መነሻ" "አስወግድ" "አራግፍ" @@ -65,8 +66,10 @@ "ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" - "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" - "መሣሪያው ሲዞር" + + + + "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" "የማይታወቅ" "አስወግድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index ad56c3aa1e..bcb5519baa 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -35,7 +35,8 @@ "البحث عن مزيد من التطبيقات" "ليس هناك مساحة أخرى في هذه الشاشة الرئيسية." "لا يوجد المزيد من الحقول في علبة المفضلة" - "التطبيقات" + + "الرئيسية" "إزالة" "إلغاء التثبيت" @@ -65,8 +66,10 @@ "الإعدادات" "عطَّل المشرف هذه الميزة" "نظرة عامة" - "السماح بتدوير الشاشة الرئيسية" - "أوقات تدوير الجهاز" + + + + "لا يسمح إعداد العرض الحالي بالتدوير" "غير معروفة" "إزالة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 99a0b6ae51..e594d646fa 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -35,7 +35,8 @@ "Daha çox tətbiq üçün axtarış edin" "Bu Əsas ekranda boş yer yoxdur." "Favoritlər-də yer yoxdur" - "Tətbiqlər" + + "Əsas səhifə" "Silin" "Sistemdən sil" @@ -65,8 +66,10 @@ "Ayarlar" "Admininiz tərəfindən deaktiv edilib" "İcmal" - "Əsas ekranın firlanmağına icazə verin" - "Cihaz çevrilən zaman" + + + + "Cari Ekran ayarı fırlatmağa icazə vermir" "Naməlum" "Yığışdır" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 0edb495e14..96c806da50 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -35,7 +35,8 @@ "Търсене на още приложения" "На този начален екран няма повече място." "Няма повече място в областта с любимите" - "Приложения" + + "Начало" "Премахване" "Деинсталиране" @@ -65,8 +66,10 @@ "Настройки" "Деактивирано от администратора ви" "Общ преглед" - "Разрешаване на завъртането на началния екран" - "При завъртане на устройството" + + + + "Текущата настройка на екрана не разрешава завъртане" "Няма информация" "Премахване" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 4bf6796c4c..8b08f05b8a 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -35,7 +35,8 @@ "আরো অ্যাপ্লিকেশানের জন্য অনুসন্ধান করুন" "এই হোম স্ক্রীনে আর কোনো জায়গা নেই৷" "পছন্দসই ট্রে-তে আর কোনো জায়গা নেই" - "অ্যাপ্লিকেশানগুলি" + + "হোম" "সরান" "আনইনস্টল করুন" @@ -65,8 +66,10 @@ "সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" - "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" - "ডিভাইস যখন ঘোরানো হবে" + + + + "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" "অজানা" "সরান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 1bc6309263..66b77eeff8 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -35,7 +35,8 @@ "Cerca més aplicacions" "Ja no queda espai en aquesta pantalla d\'inici." "No hi ha més espai a la safata Preferits." - "Aplicacions" + + "Inici" "Suprimeix" "Desinstal·la" @@ -65,8 +66,10 @@ "Configuració" "Desactivada per l\'administrador" "Visió general" - "Permet la rotació de la pantalla d\'inici" - "En girar el dispositiu" + + + + "La configuració actual de la pantalla no permet la rotació" "Desconegut" "Suprimeix" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 34818f1a2d..8cdb970890 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -35,7 +35,8 @@ "Vyhledat další aplikace" "Na této ploše již není místo." "Na panelu Oblíbené položky již není místo." - "Aplikace" + + "Plocha" "Odstranit" "Odinstalovat" @@ -65,8 +66,10 @@ "Nastavení" "Zakázáno administrátorem" "Přehled" - "Povolit otáčení plochy" - "Při otočení zařízení" + + + + "Aktuální nastavení displeje neumožňuje otáčení" "Neznámé" "Odstranit" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index ca1d5a4b6d..8e9517a63e 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -35,7 +35,8 @@ "Søg efter flere apps" "Der er ikke mere plads på denne startskærm." "Der er ikke mere plads i bakken Foretrukne" - "Apps" + + "Startskærm" "Fjern" "Afinstaller" @@ -65,8 +66,10 @@ "Indstillinger" "Deaktiveret af din administrator" "Oversigt" - "Tillad rotation af startskærmen" - "Når enheden roteres" + + + + "Den aktuelle indstilling for visning tillader ikke rotation" "Ukendt" "Fjern" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 0897861b14..c216b7797e 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -35,7 +35,8 @@ "Weitere Apps suchen" "Auf diesem Startbildschirm ist kein Platz mehr vorhanden." "Ablage \"Favoriten\" ist voll." - "Apps" + + "Startseite" "Entfernen" "Deinstallieren" @@ -65,8 +66,10 @@ "Einstellungen" "Von deinem Administrator deaktiviert" "Übersicht" - "Drehung des Startbildschirms zulassen" - "Bei Drehung des Geräts" + + + + "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" "Unbekannt" "Entfernen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 52e868db98..070678e6cd 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -35,7 +35,8 @@ "Αναζήτηση περισσότερων εφαρμογών" "Δεν υπάρχει χώρος σε αυτήν την αρχική οθόνη." "Δεν υπάρχει επιπλέον χώρος στην περιοχή Αγαπημένα" - "Εφαρμογές" + + "Αρχική οθόνη" "Κατάργηση" "Απεγκατάσταση" @@ -65,8 +66,10 @@ "Ρυθμίσεις" "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" - "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" - "Όταν η συσκευή περιστρέφεται" + + + + "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" "Άγνωστο" "Κατάργηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 31599b927e..4120809bcc 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -35,7 +35,8 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - "Apps" + + "Home" "Remove" "Uninstall" @@ -65,8 +66,10 @@ "Settings" "Disabled by your admin" "Overview" - "Allow homescreen rotation" - "When device is rotated" + + + + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 31599b927e..4120809bcc 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -35,7 +35,8 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - "Apps" + + "Home" "Remove" "Uninstall" @@ -65,8 +66,10 @@ "Settings" "Disabled by your admin" "Overview" - "Allow homescreen rotation" - "When device is rotated" + + + + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 31599b927e..4120809bcc 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -35,7 +35,8 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - "Apps" + + "Home" "Remove" "Uninstall" @@ -65,8 +66,10 @@ "Settings" "Disabled by your admin" "Overview" - "Allow homescreen rotation" - "When device is rotated" + + + + "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index a5bbc7ebee..0804cd3c1e 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -35,7 +35,8 @@ "Buscar más apps" "No hay más espacio en esta pantalla principal." "La bandeja de favoritos está llena." - "Aplicaciones" + + "Pantalla principal" "Quitar" "Desinstalar" @@ -65,8 +66,10 @@ "Configuración" "El administrador inhabilitó esta función" "Recientes" - "Permitir la rotación de la pantalla principal" - "Al rotar el dispositivo" + + + + "La configuración actual no permite la rotación de la pantalla" "Desconocido" "Eliminar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 4511810647..1454f9979d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -35,7 +35,8 @@ "Buscar más aplicaciones" "No queda espacio en la pantalla de inicio." "La bandeja de favoritos está completa" - "Aplicaciones" + + "Inicio" "Quitar" "Desinstalar" @@ -65,8 +66,10 @@ "Ajustes" "Inhabilitada por el administrador" "Visión general" - "Permitir rotación de la pantalla de inicio" - "Al girar el dispositivo" + + + + "La configuración de pantalla actual no permite girar la pantalla" "Desconocido" "Quitar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 795fea44dc..f8ef8da75f 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -35,7 +35,8 @@ "Otsi rohkem rakendusi" "Sellel avaekraanil pole enam ruumi." "Salves Lemmikud pole rohkem ruumi" - "Rakendused" + + "Avaekraan" "Eemalda" "Desinstalli" @@ -65,8 +66,10 @@ "Seaded" "Keelas administraator" "Ülevaade" - "Luba avaekraani pööramine" - "Kui seadet pööratakse" + + + + "Praegune kuvaseade ei luba pööramist" "Teadmata" "Eemalda" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 358d8682a3..2757b2a21f 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -35,7 +35,8 @@ "Bilatu aplikazio gehiago" "Hasierako pantaila honetan ez dago toki gehiago." "Ez dago toki gehiago Gogokoak erretiluan" - "Aplikazioak" + + "Hasiera" "Kendu" "Desinstalatu" @@ -65,8 +66,10 @@ "Ezarpenak" "Administratzaileak desgaitu du" "Ikuspegi orokorra" - "Baimendu hasierako pantaila biratzea" - "Gailua biratzen denean" + + + + "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" "Ezezaguna" "Kendu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 2d55c83dca..b5037cd107 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -35,7 +35,8 @@ "جستجوی برنامه‌های بیشتر" "فضای بیشتری در این صفحه اصلی موجود نیست." "فضای بیشتری در سینی موارد دلخواه وجود ندارد" - "برنامه‌ها" + + "صفحه اصلی" "برداشتن" "حذف نصب" @@ -65,8 +66,10 @@ "تنظیمات" "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" - "مجاز کردن چرخش صفحه‌اصلی" - "وقتی دستگاه چرخانده می‌شود" + + + + "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" "نامشخص" "حذف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 69146242ef..f30e0a1f72 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -35,7 +35,8 @@ "Hae lisää sovelluksia" "Tässä aloitusruudussa ei ole enää tilaa." "Suosikit-valikossa ei ole enää tilaa" - "Sovellukset" + + "Aloitusruutu" "Poista" "Poista asennus" @@ -65,8 +66,10 @@ "Asetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" - "Salli aloitusnäytön kiertäminen" - "Kun laitetta kierretään" + + + + "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." "Tuntematon" "Poista" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 9299be32c8..2d6c7737e0 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -35,7 +35,8 @@ "Rechercher plus d\'applications" "Pas d\'espace libre sur l\'écran d\'accueil." "Il n\'y a plus d\'espace dans la zone des favoris" - "Applications" + + "Accueil" "Supprimer" "Désinstaller" @@ -65,8 +66,10 @@ "Paramètres" "Cette fonction est désactivée par votre administrateur" "Présentation" - "Autoriser la rotation de l\'écran d\'accueil" - "Lorsque l\'utilisateur pivote l\'appareil" + + + + "Le mode d\'affichage actuel ne permet pas le pivotement" "Inconnu" "Supprimer" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index bc7707405c..16621fa378 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -35,7 +35,8 @@ "Rechercher plus d\'applications" "Pas d\'espace libre sur cet écran d\'accueil." "Plus d\'espace disponible dans la zone de favoris." - "Applications" + + "Accueil" "Supprimer" "Désinstaller" @@ -65,8 +66,10 @@ "Paramètres" "Désactivé par votre administrateur" "Vue d\'ensemble" - "Autoriser la rotation de l\'écran d\'accueil" - "Lorsque l\'utilisateur fait pivoter l\'appareil" + + + + "Le paramètre d\'affichage actuel n\'autorise pas la rotation." "Inconnu" "Supprimer" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index cadfdc4a5f..aa0e6a22c7 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -35,7 +35,8 @@ "Buscar máis aplicacións" "Non hai máis espazo nesta pantalla de inicio." "Non hai máis espazo na bandexa de favoritos" - "Aplicacións" + + "Inicio" "Eliminar" "Desinstalar" @@ -65,8 +66,10 @@ "Configuración" "Función desactivada polo administrador" "Visión xeral" - "Permitir xirar a pantalla de inicio" - "Ao xirar o dispositivo" + + + + "A configuración de visualización actual non permite xirar a pantalla" "Descoñecido" "Eliminar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 56e5adcd2c..3451954152 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -35,7 +35,8 @@ "વધુ ઍપ્લિકેશનો શોધો" "આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી." "મનપસંદ ટ્રે પર વધુ જગ્યા નથી" - "ઍપ્લિકેશનો" + + "હોમ" "દૂર કરો" "અનઇન્સ્ટોલ કરો" @@ -65,8 +66,10 @@ "સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" - "હોમસ્ક્રીનને ફેરવવાની મંજૂરી આપો" - "જ્યારે ઉપકરણ ફેરવેલું હોય ત્યારે" + + + + "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index c786ff5f27..cd65f615c5 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -35,7 +35,8 @@ "अधिक ऐप्लिकेशन खोजें" "इस होम स्‍क्रीन पर स्थान शेष नहीं है." "पसंदीदा ट्रे में और स्थान नहीं है" - "ऐप्लिकेशन" + + "होम" "निकालें" "अनइंस्टॉल करें" @@ -65,8 +66,10 @@ "सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" - "होमस्क्रीन घुमाने की अनुमति दें" - "डिवाइस घुमाए जाने पर" + + + + "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" "अज्ञात" "निकालें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 1d2d7c37de..818ae98af8 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -35,7 +35,8 @@ "Traži više aplikacija" "Na ovom početnom zaslonu više nema mjesta." "Nema više prostora na traci Favoriti" - "Aplikacije" + + "Početna" "Ukloni" "Deinstaliraj" @@ -65,8 +66,10 @@ "Postavke" "Onemogućio administrator" "Pregled" - "Dopusti zakretanje početnog zaslona" - "Kada se uređaj zakrene" + + + + "Trenutačna postavka zaslona ne dopušta zakretanje" "Nepoznato" "Ukloni" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f479c30f37..e829bd89e1 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -35,7 +35,8 @@ "További alkalmazások keresése" "Nincs több hely ezen a kezdőképernyőn." "Nincs több hely a Kedvencek tálcán" - "Alkalmazások" + + "Főoldal" "Törlés" "Eltávolítás" @@ -65,8 +66,10 @@ "Beállítások" "A rendszergazda letiltotta" "Áttekintés" - "Kezdőképernyő elforgatásának engedélyezése" - "Az eszköz forgatásakor" + + + + "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" "Ismeretlen" "Eltávolítás" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 58d1e203f5..9bd7505521 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -35,7 +35,8 @@ "Որոնել այլ հավելվածներ" "Այլևս տեղ չկա այս հիմնական էկրանին:" "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" - "Հավելվածներ" + + "Հիմնական" "Հեռացնել" "Հեռացնել" @@ -65,8 +66,10 @@ "Կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" - "Թույլ տալ գլխավոր էկրանի պտտումը" - "Սարքը պտտելու դեպքում" + + + + "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" "Անհայտ է" "Հեռացնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 44e72e13db..d3a7e316f2 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -35,7 +35,8 @@ "Telusuri aplikasi lainnya" "Tidak ada ruang lagi pada layar Utama ini." "Tidak ada ruang tersisa di baki Favorit" - "Aplikasi" + + "Layar Utama" "Hapus" "Copot pemasangan" @@ -65,8 +66,10 @@ "Setelan" "Dinonaktifkan oleh admin" "Ringkasan" - "Izinkan layar utama diputar" - "Saat perangkat diputar" + + + + "Setelan Tampilan Saat Ini tidak memungkinkan putaran" "Tidak dikenal" "Buang" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index ea172bd84d..6ddf4d9c01 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -35,7 +35,8 @@ "Leita að fleiri forritum" "Ekki meira pláss á þessum heimaskjá." "Ekki meira pláss í bakka fyrir uppáhald" - "Forrit" + + "Heim" "Fjarlægja" "Fjarlægja" @@ -65,8 +66,10 @@ "Stillingar" "Gert óvirkt af kerfisstjóra" "Yfirlit" - "Leyfa snúning fyrir heimaskjá" - "Þegar tækinu er snúið" + + + + "Núverandi skjástilling leyfir ekki snúning" "Óþekkt" "Fjarlægja" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 14367ed7a4..5a967318d0 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -35,7 +35,8 @@ "Cerca altre app" "Spazio nella schermata Home esaurito." "Spazio esaurito nella barra dei Preferiti" - "App" + + "Home page" "Rimuovi" "Disinstalla" @@ -65,8 +66,10 @@ "Impostazioni" "Disattivata dall\'amministratore" "Panoramica" - "Consenti rotazione della schermata Home" - "Quando il dispositivo viene ruotato" + + + + "L\'impostazione corrente del display non consente la rotazione" "Sconosciuto" "Rimuovi" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index e3d0bd0535..6f0f9779ee 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -35,7 +35,8 @@ "חפש אפליקציות נוספות" "אין עוד מקום במסך דף הבית הזה." "אין עוד מקום במגש המועדפים" - "אפליקציות" + + "דף הבית" "הסר" "הסר התקנה" @@ -65,8 +66,10 @@ "הגדרות" "הושבת על ידי מנהל המערכת שלך" "סקירה" - "אפשרות סיבוב של מסך דף הבית" - "בסיבוב המכשיר" + + + + "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" "לא ידוע" "הסר" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 30789ccbc7..3bf8002769 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -35,7 +35,8 @@ "他のアプリを検索" "このホーム画面に空きスペースがありません。" "お気に入りトレイに空きスペースがありません" - "アプリ" + + "ホーム" "削除" "アンインストール" @@ -65,8 +66,10 @@ "設定" "管理者により無効にされています" "概要" - "ホーム画面の回転を許可" - "端末が回転したとき" + + + + "現在の [ディスプレイ] 設定では回転を使用できません" "不明" "削除" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index df33b11620..a29ce32743 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -35,7 +35,8 @@ "მეტი აპის პოვნა" "ამ მთავარ ეკრანზე ადგილი აღარ არის." "რჩეულების თაროზე ადგილი არ არის" - "აპები" + + "მთავარი" "ამოშლა" "დეინსტალაცია" @@ -65,8 +66,10 @@ "პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" - "მთავარი ეკრანის ბრუნვის დაშვება" - "მოწყობილობის ბრუნვისას" + + + + "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" "უცნობი" "ამოშლა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index d92b67e036..1dda5165be 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -35,7 +35,8 @@ "Қосымша қолданбалар іздеу" "Бұл Негізгі экранда орын қалмады." "Қалаулылар науасында орын қалмады" - "Қолданбалар" + + "Негізгі" "Жою" "Жою" @@ -65,8 +66,10 @@ "Параметрлер" "Әкімші өшірді" "Шолу" - "Негізгі экранды айналдыруды рұқсат ету" - "Құрылғы айналғанда" + + + + "Экранның ағымдағы параметрі айналуға рұқсат бермейді" "Белгісіз" "Алып тастау" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 63033582a9..d8e9a0273c 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -35,7 +35,8 @@ "ស្វែងរកកម្មវិធីច្រើនទៀត" "គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។" "គ្មាន​បន្ទប់​​ក្នុង​ថាស​និយម​ប្រើ" - "កម្មវិធី" + + "ដើម" "យកចេញ" "លុបការដំឡើង" @@ -65,8 +66,10 @@ "ការកំណត់" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" - "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" - "នៅ​ពេល​បង្វិល​ឧបករណ៍When device is rotated" + + + + "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" "មិន​ស្គាល់" "លុបចេញ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 71ca1fb25a..a333747c5a 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -35,7 +35,8 @@ "ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕು" "ಈ ಮುಖಪುಟದ ಪರದೆಯಲ್ಲಿ ಹೆಚ್ಚು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ." "ಮೆಚ್ಚಿನವುಗಳ ಟ್ರೇನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ" - "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" + + "ಮುಖಪುಟ" "ತೆಗೆದುಹಾಕಿ" "ಅಸ್ಥಾಪಿಸು" @@ -65,8 +66,10 @@ "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" - "ಮುಖಪರದೆ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" - "ಸಾಧನವನ್ನು ತಿರುಗಿಸಿದಾಗ" + + + + "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index fc024b1241..7293597f31 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -35,7 +35,8 @@ "더 많은 앱 검색" "홈 화면에 더 이상 공간이 없습니다." "즐겨찾기 트레이에 더 이상 공간이 없습니다." - "앱" + + "홈" "삭제" "제거" @@ -65,8 +66,10 @@ "설정" "관리자가 사용 중지함" "개요" - "메인 스크린 회전 허용" - "기기 회전 시" + + + + "현재 표시 설정에는 회전 기능이 허용되지 않습니다." "알 수 없음" "삭제" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index e9b7446075..ddd250c4af 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -35,7 +35,8 @@ "Көбүрөөк колдонмолорду издөө" "Бул Үй экранында бош орун жок." "Тандамалдар тайпасында орун калган жок" - "Колдонмолор" + + "Үйгө" "Алып салуу" "Чыгарып салуу" @@ -65,8 +66,10 @@ "Тууралоолор" "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" - "Башкы экранды айлантууга уруксат берүү" - "Түзмөк айланганда" + + + + "Экранды айлантуу параметри өчүрүлгөн" "Белгисиз" "Алып салуу" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index e2e65978f5..c02d56e50d 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -35,7 +35,8 @@ "ຊອກຫາແອັບເພີ່ມເຕີມ" "ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້." "ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ" - "ແອັບຯ" + + "ໜ້າຫຼັກ" "ເອົາ​ອອກ" "ຖອນ​ການ​ຕິດ​ຕັ້ງ" @@ -65,8 +66,10 @@ "ການຕັ້ງຄ່າ" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" - "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" - "ເມື່ອໝຸນອຸປະກອນ" + + + + "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index de23877164..542028f7d5 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -35,7 +35,8 @@ "Ieškoti daugiau programų" "Šiame pagrindiniame ekrane vietos nebėra." "Mėgstamiausių dėkle nebėra vietos" - "Programos" + + "Pagrindinis" "Ištrinti" "Pašalinti" @@ -65,8 +66,10 @@ "Nustatymai" "Išjungė administratorius" "Apžvalga" - "Leisti pasukti pagrindinį ekraną" - "Kai įrenginys pasukamas" + + + + "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" "Nežinoma" "Pašalinti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 6ac778ad39..353ee96947 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -35,7 +35,8 @@ "Meklēt citas lietotnes" "Šajā sākuma ekrānā vairs nav vietas." "Izlases joslā vairs nav vietas." - "Lietotnes" + + "Sākums" "Noņemt" "Atinstalēt" @@ -65,8 +66,10 @@ "Iestatījumi" "Atspējojis administrators" "Kopsavilkums" - "Atļaut sākuma ekrāna pagriešanu" - "Kad ierīce tiek pagriezta" + + + + "Pašreizējā displeja iestatījumā nav atļauta pagriešana." "Nezināma" "Noņemt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index abef64908d..c23214c386 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -35,7 +35,8 @@ "Пребарај други апликации" "Нема повеќе простор на овој екран на почетната страница." "Нема повеќе простор на лентата „Омилени“" - "Апликации" + + "Почетна страница" "Отстрани" "Деинсталирај" @@ -65,8 +66,10 @@ "Поставки" "Оневозможено од администраторот" "Краток преглед" - "Дозволете ротација на Почетниот екран" - "Кога уредот се ротира" + + + + "Тековната поставка на Екранот не дозволува ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index fab5d653d3..a1c9c45fbc 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -35,7 +35,8 @@ "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" "ഈ ഹോം സ്‌ക്രീനിൽ ഒഴിവൊന്നുമില്ല." "പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല" - "അപ്ലിക്കേഷനുകൾ" + + "ഹോം" "നീക്കംചെയ്യുക" "അൺഇൻസ്റ്റാളുചെയ്യുക" @@ -65,8 +66,10 @@ "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" - "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" - "ഉപകരണം തിരിക്കുമ്പോൾ" + + + + "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 5f92fd3a21..04d40dd477 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -35,7 +35,8 @@ "Бусад апп-г хайх" "Энэ Нүүр дэлгэц зайгүй." "\"Дуртай\" трей дээр өөр зай байхгүй байна" - "Апп" + + "Нүүр" "Арилгах" "Устгах" @@ -65,8 +66,10 @@ "Тохиргоо" "Таны админ идэвхгүй болгосон" "Тойм" - "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" - "Төхөөрөмжийг эргүүлсэн үед" + + + + "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" "Тодорхойгүй" "Устгах" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 89d4833fc9..a92c2396f4 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -35,7 +35,8 @@ "अधिक अॅप्स शोधा" "या मुख्य स्क्रीनवर आणखी जागा नाही." "आवडीच्या ट्रे मध्ये आणखी जागा नाही" - "अॅप्स" + + "मुख्‍यपृष्‍ठ" "काढा" "विस्थापित करा" @@ -65,8 +66,10 @@ "सेटिंग्ज" "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" - "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" - "डिव्हाइस फिरविलेले असताना" + + + + "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" "अज्ञात" "काढा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 759d8e9268..8cfdaadaed 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -35,7 +35,8 @@ "Cari lagi apl" "Tiada lagi ruang pada skrin Laman Utama ini." "Tiada ruang dalam dulang Kegemaran lagi" - "Apl" + + "Laman Utama" "Alih keluar" "Nyahpasang" @@ -65,8 +66,10 @@ "Tetapan" "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" - "Benarkan putaran skrin utama" - "Apabila peranti diputar" + + + + "Tetapan Paparan semasa tidak membenarkan putaran" "Tidak diketahui" "Alih keluar" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index d1d975767e..c8a4690551 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -35,7 +35,8 @@ "နောက်ထပ် အက်ပ်များကို ရှာပါ" "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" - "အက်ပ်များ" + + "ပင်မစာမျက်နှာ" "ဖယ်ရှားမည်" "ဖယ်ထုတ်မည်" @@ -65,8 +66,10 @@ "ဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" - "ပင်မစာမျက်နှာကို လှည့်ခွင့်ပြုပါ" - "စက်ပစ္စည်းကို လှည့်ထားသည့်အခါ" + + + + "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" "မသိရ" "ဖယ်ရှားရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index e19c0d8890..4f590383c9 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -35,7 +35,8 @@ "Søk etter flere apper" "Denne startsiden er full." "Favoritter-skuffen er full" - "Apper" + + "Startside" "Fjern" "Avinstaller" @@ -65,8 +66,10 @@ "Innstillinger" "Administratoren har slått av funksjonen" "Oversikt" - "Tillat rotasjon av startskjermen" - "Når enheten roteres" + + + + "Med den nåværende skjerminnstillingen støttes ikke rotasjon" "Ukjent" "Fjern" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 6ff94f907a..160489958e 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -35,7 +35,8 @@ "थप अनुप्रयोगहरू खोज्नुहोस्" "यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।" "मनपर्ने ट्रे अब कुनै ठाँउ छैन" - "अनुप्रयोगहरू" + + "गृह" "हटाउनुहोस्" "विस्थापित गर्नुहोस्" @@ -65,8 +66,10 @@ "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" - "गृहस्क्रिनलाई घुम्ने अनुमति दिनुहोस्" - "यन्त्रलाई घुमाइँदा" + + + + "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e27ba283ab..e3193c35f6 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -35,7 +35,8 @@ "Zoeken naar meer apps" "Er is geen ruimte meer op dit startscherm." "Geen ruimte meer in het vak \'Favorieten\'" - "Apps" + + "Startpagina" "Verwijderen" "Deïnstalleren" @@ -65,8 +66,10 @@ "Instellingen" "Uitgeschakeld door je beheerder" "Overzicht" - "Draaien van startscherm toestaan" - "Wanneer het apparaat wordt gedraaid" + + + + "Huidige scherminstelling staat draaien niet toe" "Onbekend" "Verwijderen" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 5dbd4e7b83..f1b51afd69 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -35,7 +35,8 @@ "ਹੋਰ ਐਪਾਂ ਖੋਜੋ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" - "ਐਪਾਂ" + + "ਹੋਮ" "ਹਟਾਓ" "ਸਥਾਪਨਾ ਰੱਦ ਕਰੋ" @@ -65,8 +66,10 @@ "ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" - "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" - "ਜਦੋਂ ਡੀਵਾਈਸ ਘੁੰਮਾਈ ਜਾਂਦੀ ਹੈ" + + + + "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0829e600e9..8f3e175a72 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -35,7 +35,8 @@ "Wyszukaj więcej aplikacji" "Brak miejsca na tym ekranie głównym." "Brak miejsca w Ulubionych" - "Aplikacje" + + "Ekran główny" "Usuń" "Odinstaluj" @@ -65,8 +66,10 @@ "Ustawienia" "Funkcja wyłączona przez administratora" "Przegląd" - "Zezwalaj na obrót ekranu głównego" - "Podczas obrotu urządzenia" + + + + "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" "Brak informacji" "Usuń" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8b0250da8c..1ce5664b28 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -35,7 +35,8 @@ "Pesquisar mais aplicações" "Sem espaço suficiente neste Ecrã principal." "Não existe mais espaço no tabuleiro de Favoritos" - "Aplicações" + + "Ecrã principal" "Remover" "Desinstalar" @@ -65,8 +66,10 @@ "Definições" "Desativada pelo administrador" "Vista geral" - "Permitir rotação do ecrã principal" - "Quando o dispositivo é rodado" + + + + "A definição de visualização atual não permite a rotação" "Desconhecido" "Remover" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 8ee4619da5..194b81d977 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -35,7 +35,8 @@ "Pesquisar mais apps" "Não há mais espaço na tela inicial." "Sem espaço na bandeja de favoritos" - "Apps" + + "Início" "Remover" "Desinstalar" @@ -65,8 +66,10 @@ "Configurações" "Desativado pelo administrador" "Visão geral" - "Permitir rotação da tela inicial" - "Quando o dispositivo for girado" + + + + "A configuração atual de exibição não permite rotação" "Desconhecido" "Remover" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 2e7759eedb..0a2ab8a02f 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -35,7 +35,8 @@ "Căutați mai multe aplicații" "Nu mai este loc pe acest Ecran de pornire." "Spațiu epuizat în bara Preferate" - "Aplicații" + + "Ecran de pornire" "Eliminați" "Dezinstalați" @@ -65,8 +66,10 @@ "Setări" "Dezactivată de administrator" "Prezentare generală" - "Permiteți rotirea ecranului de pornire" - "Când dispozitivul este rotit" + + + + "Setarea actuală a afișajului nu permite rotirea" "Necunoscut" "Eliminați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 4dade601b4..8e57dd2e3c 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -35,7 +35,8 @@ "Искать другие приложения" "На этом экране все занято" "В разделе \"Избранное\" больше нет места" - "Приложения" + + "Главный экран" "Убрать" "Удалить" @@ -65,8 +66,10 @@ "Настройки" "Функция отключена администратором" "Обзор" - "Разрешить поворачивать главный экран" - "При повороте устройства" + + + + "В настройках отключен поворот экрана" "Неизвестно" "Удалить" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 548931a83a..4c463d34a7 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -35,7 +35,8 @@ "තව යෙදුම් සඳහා සොයන්න" "මෙම මුල් පිටු තිරය මත තවත් අවසර නැත." "ප්‍රියතම දෑ ඇති තැටියේ තවත් ඉඩ නොමැත" - "යෙදුම්" + + "මුල් පිටුව" "ඉවත් කරන්න" "අස්ථාපනය කරන්න" @@ -65,8 +66,10 @@ "සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" - "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" - "උපංගය කරකැවූ විට" + + + + "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" "නොදනී" "ඉවත් කරන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 631c30d20c..932ae80237 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -35,7 +35,8 @@ "Hľadať ďalšie aplikácie" "Na tejto ploche už nie je miesto" "Na paneli Obľúbené položky už nie je miesto" - "Aplikácie" + + "Domovská stránka" "Odstrániť" "Odinštalovať" @@ -65,8 +66,10 @@ "Nastavenia" "Zakázané vaším správcom" "Prehľad" - "Povoliť otáčanie plochy" - "Pri otočení zariadenia" + + + + "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" "Neznáme" "Odstrániť" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 293e98065e..01f4a337a0 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -35,7 +35,8 @@ "Iskanje več aplikacij" "Na tem začetnem zaslonu ni več prostora." "V vrstici za priljubljene ni več prostora" - "Aplikacije" + + "Začetni zaslon" "Odstrani" "Odstrani" @@ -65,8 +66,10 @@ "Nastavitve" "Onemogočil skrbnik." "Pregled" - "Omogočanje sukanja začetnega zaslona" - "Ko se naprava zasuka" + + + + "Trenutna nastavitev zaslona ne dovoljuje sukanja" "Neznano" "Odstrani" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 6f2e60569b..5c3ffe49d3 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -35,7 +35,8 @@ "Kërko për më shumë aplikacione" "Nuk ka më hapësirë në këtë ekran bazë." "Nuk ka më hapësirë në tabakanë \"Të preferuarat\"" - "Aplikacionet" + + "Faqja kryesore" "Hiqe" "Çinstalo" @@ -65,8 +66,10 @@ "Cilësimet" "Çaktivizuar nga administratori" "Përmbledhje" - "Lejo rrotullimin e ekranit kryesor" - "Kur pajisja rrotullohet" + + + + "Cilësimi aktuali i afishimit nuk lejon rrotullimin" "I panjohur" "Hiq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 62bb011bba..18ca17c499 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -35,7 +35,8 @@ "Претражи још апликација" "Нема више простора на овом почетном екрану." "Нема више простора на траци Омиљено" - "Апликације" + + "Почетна" "Уклони" "Деинсталирај" @@ -65,8 +66,10 @@ "Подешавања" "Администратор је онемогућио" "Преглед" - "Дозволи ротацију почетног екрана" - "Када се уређај ротира" + + + + "Актуелно подешавање приказа не дозвољава ротацију" "Непознато" "Уклони" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index f57925c7d4..755294d1d6 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -35,7 +35,8 @@ "Sök efter fler appar" "Det finns inte plats för mer på den här startskärmen." "Favoritfältet är fullt" - "Appar" + + "Startskärm" "Ta bort" "Avinstallera" @@ -65,8 +66,10 @@ "Inställningar" "Inaktiverat av administratören" "Översikt" - "Tillåt rotering av startskärmen" - "När enheten roterar" + + + + "Rotering tillåts inte i de nuvarande skärminställningarna" "Okänt" "Ta bort" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 3b058d7ad3..40b7c0772b 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -35,7 +35,8 @@ "Tafuta programu zaidi" "Hakuna nafasi katika skrini hii ya Mwanzo." "Hakuna nafasi zaidi katika treya ya Vipendeleo" - "Programu" + + "Mwanzo" "Ondoa" "Ondoa" @@ -67,8 +68,10 @@ "Mipangilio" "Imezimwa na msimamizi wako" "Muhtasari" - "Ruhusu kuzungusha skrini ya kwanza" - "Kifaa kinapozungushwa" + + + + "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" "Yasiyojulikana" "Ondoa" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index c5c2717395..e28c94aea2 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -35,7 +35,8 @@ "கூடுதல் பயன்பாடுகளைத் தேடு" "முகப்புத் திரையில் இடமில்லை." "பிடித்தவை ட்ரேயில் இடமில்லை" - "பயன்பாடுகள்" + + "முகப்பு" "அகற்று" "நிறுவல் நீக்கு" @@ -65,8 +66,10 @@ "அமைப்பு" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" - "முகப்புத் திரை சுழற்சியை அனுமதி" - "சாதனத்தைச் சுழற்றும் போது" + + + + "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" "தெரியாதது" "அகற்று" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 8ebf8a4f9c..1c3ef146d9 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -35,7 +35,8 @@ "మరిన్ని అనువర్తనాల కోసం శోధించు" "ఈ హోమ్ స్క్రీన్‌లో ఖాళీ లేదు." "ఇష్టమైనవి ట్రేలో ఖాళీ లేదు" - "అనువర్తనాలు" + + "హోమ్" "తీసివేయి" "అన్ఇన్‌స్టాల్ చేయి" @@ -65,8 +66,10 @@ "సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" - "హోమ్‌స్క్రీన్ భ్రమణాన్ని అనుమతించండి" - "పరికరాన్ని తిప్పినప్పుడు" + + + + "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 680c4c704d..7d58ba6c72 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -35,7 +35,8 @@ "ค้นหาแอปเพิ่มเติม" "ไม่มีที่ว่างในหน้าจอหลักนี้" "ไม่มีพื้นที่เหลือในถาดรายการโปรด" - "แอป" + + "หน้าแรก" "นำออก" "ถอนการติดตั้ง" @@ -65,8 +66,10 @@ "การตั้งค่า" "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" - "อนุญาตให้หมุนหน้าจอหลัก" - "เมื่อหมุนอุปกรณ์" + + + + "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" "ไม่รู้จัก" "ลบ" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index b8d54395de..6a000640b1 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -35,7 +35,8 @@ "Maghanap ng higit pang mga app" "Wala nang lugar sa Home screen na ito." "Wala nang lugar sa tray ng Mga Paborito" - "Apps" + + "Home" "Alisin" "I-uninstall" @@ -65,8 +66,10 @@ "Mga Setting" "Na-disable ng iyong admin" "Pangkalahatang-ideya" - "Payagan ang pag-rotate ng homescreen" - "Kapag na-rotate ang device" + + + + "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" "Hindi kilala" "Alisin" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cba61afa04..76814109ae 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -35,7 +35,8 @@ "Başka uygulamalar ara" "Bu Ana ekranda yer kalmadı." "Favoriler tepsisinde başka yer kalmadı" - "Uygulamalar" + + "Ana ekran" "Kaldır" "Yüklemeyi kaldır" @@ -65,8 +66,10 @@ "Ayarlar" "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" - "Ana ekranı döndürmeye izin ver" - "Cihaz döndürüldüğünde" + + + + "Mevcut Ekran ayarı, döndürmeye izin vermiyor" "Bilinmiyor" "Kaldır" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index fb0e7019f0..82251bc1e8 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -35,7 +35,8 @@ "Шукати ще додатки" "На цьому головному екрані більше немає місця." "В області \"Вибране\" немає місця" - "Додатки" + + "Головний екран" "Видалити" "Видалити" @@ -65,8 +66,10 @@ "Налаштування" "Вимкнув адміністратор" "Огляд" - "Дозволити обертання головного екрана" - "Коли пристрій обертається" + + + + "Поточні налаштування дисплея не підтримують обертання" "Невідомо" "Видалити" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index b5687a1d2e..1390cbe722 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -35,7 +35,8 @@ "مزید ایپس تلاش کریں" "اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔" "پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے" - "ایپس" + + "ہوم" "ہٹائیں" "اَن انسٹال کریں" @@ -65,8 +66,10 @@ "ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" - "ہوم اسکرین گھمانے کی اجازت دیں" - "جب آلہ گھمایا جائے" + + + + "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index bff1b1c93c..7f7233e7ce 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -35,7 +35,8 @@ "Boshqa ilovalarni qidirish" "Uy ekranida bitta ham xona yo‘q." "Ajratilganlarda birorta ham xona yo‘q" - "Ilovalar" + + "Bosh sahifa" "Olib tashlash" "O‘chirib tashlash" @@ -65,8 +66,10 @@ "Sozlamalar" "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" - "Asosiy ekranni aylantirishga ruxsat berish" - "Qurilma burilganda" + + + + "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" "Noma’lum" "O‘chirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 527e0a9fa7..deed0f7fc1 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -35,7 +35,8 @@ "Tìm kiếm thêm ứng dụng" "Không còn chỗ trên Màn hình chính này." "Không còn chỗ trong khay Mục yêu thích" - "Ứng dụng" + + "Màn hình chính" "Xóa" "Gỡ cài đặt" @@ -65,8 +66,10 @@ "Cài đặt" "Bị tắt bởi quản trị viên của bạn" "Tổng quan" - "Cho phép xoay màn hình chính" - "Khi xoay thiết bị" + + + + "Cài đặt Hiển thị hiện tại không cho phép xoay" "Không xác định" "Xóa" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index af6fa43a60..0d47bbb85d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -35,7 +35,8 @@ "搜索更多应用" "此主屏幕上已没有空间。" "收藏栏已满" - "应用" + + "主屏幕" "移除" "卸载" @@ -65,8 +66,10 @@ "设置" "已被您的管理员停用" "概览" - "允许旋转主屏幕" - "设备旋转时" + + + + "当前的显示设置不允许旋转设备" "未知" "移除" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index ffa3e47061..4ff4f538fe 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -35,7 +35,8 @@ "搜尋更多應用程式" "主畫面已無空間。" "我的收藏寄存區沒有足夠空間" - "應用程式" + + "主畫面" "移除" "解除安裝" @@ -65,8 +66,10 @@ "設定" "已由您的管理員停用" "概覽" - "允許主畫面旋轉" - "當裝置旋轉時" + + + + "「目前顯示屏」設定不允許旋轉" "不明" "移除" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c45b39b7b9..a8f4949e91 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -35,7 +35,8 @@ "搜尋更多應用程式" "這個主螢幕已無空間。" "「我的最愛」匣已無可用空間" - "應用程式" + + "主螢幕" "移除" "解除安裝" @@ -65,8 +66,10 @@ "設定" "已由您的管理員停用" "總覽" - "允許旋轉主畫面" - "當裝置旋轉時" + + + + "目前的顯示設定不允許旋轉畫面" "不明" "移除" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index a01c78b0be..93a764ef0d 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -35,7 +35,8 @@ "Sesha izinhlelo zokusebenza eziningi" "Asisekho isikhala kulesi sikrini Sasekhaya." "Asisekho isikhala kwitreyi lezintandokazi" - "Izinhlelo zokusebenza" + + "Ikhaya" "Susa" "Khipha" @@ -65,8 +66,10 @@ "Izilungiselelo" "Kukhutshazwe umlawuli wakho" "Ukubuka konke" - "Vumela ukuzungezisa kwesikrini sasekhaya" - "Uma idivayisi izungeziswa" + + + + "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" "Akwaziwa" "Susa" From 28ea09bc8d10d0263233884c9965b140061b09db Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 13 Jul 2016 20:33:43 -0700 Subject: [PATCH 022/382] Import translations. DO NOT MERGE Change-Id: Idc9fd91a39bdaa1298896f4d1808b305ac4a943f Auto-generated-cl: translation import --- res/values-af/strings.xml | 11 +++++------ res/values-am/strings.xml | 11 +++++------ res/values-ar/strings.xml | 11 +++++------ res/values-az-rAZ/strings.xml | 11 +++++------ res/values-bg/strings.xml | 11 +++++------ res/values-bn-rBD/strings.xml | 11 +++++------ res/values-ca/strings.xml | 11 +++++------ res/values-cs/strings.xml | 11 +++++------ res/values-da/strings.xml | 11 +++++------ res/values-de/strings.xml | 11 +++++------ res/values-el/strings.xml | 11 +++++------ res/values-en-rAU/strings.xml | 11 +++++------ res/values-en-rGB/strings.xml | 11 +++++------ res/values-en-rIN/strings.xml | 11 +++++------ res/values-es-rUS/strings.xml | 11 +++++------ res/values-es/strings.xml | 11 +++++------ res/values-et-rEE/strings.xml | 11 +++++------ res/values-eu-rES/strings.xml | 11 +++++------ res/values-fa/strings.xml | 11 +++++------ res/values-fi/strings.xml | 11 +++++------ res/values-fr-rCA/strings.xml | 11 +++++------ res/values-fr/strings.xml | 11 +++++------ res/values-gl-rES/strings.xml | 11 +++++------ res/values-gu-rIN/strings.xml | 11 +++++------ res/values-hi/strings.xml | 11 +++++------ res/values-hr/strings.xml | 11 +++++------ res/values-hu/strings.xml | 11 +++++------ res/values-hy-rAM/strings.xml | 11 +++++------ res/values-in/strings.xml | 11 +++++------ res/values-is-rIS/strings.xml | 11 +++++------ res/values-it/strings.xml | 11 +++++------ res/values-iw/strings.xml | 11 +++++------ res/values-ja/strings.xml | 11 +++++------ res/values-ka-rGE/strings.xml | 11 +++++------ res/values-kk-rKZ/strings.xml | 11 +++++------ res/values-km-rKH/strings.xml | 11 +++++------ res/values-kn-rIN/strings.xml | 11 +++++------ res/values-ko/strings.xml | 11 +++++------ res/values-ky-rKG/strings.xml | 11 +++++------ res/values-lo-rLA/strings.xml | 11 +++++------ res/values-lt/strings.xml | 11 +++++------ res/values-lv/strings.xml | 2 ++ res/values-mk-rMK/strings.xml | 11 +++++------ res/values-ml-rIN/strings.xml | 11 +++++------ res/values-mn-rMN/strings.xml | 11 +++++------ res/values-mr-rIN/strings.xml | 11 +++++------ res/values-ms-rMY/strings.xml | 11 +++++------ res/values-my-rMM/strings.xml | 11 +++++------ res/values-nb/strings.xml | 11 +++++------ res/values-ne-rNP/strings.xml | 11 +++++------ res/values-nl/strings.xml | 11 +++++------ res/values-pa-rIN/strings.xml | 11 +++++------ res/values-pl/strings.xml | 11 +++++------ res/values-pt-rPT/strings.xml | 11 +++++------ res/values-pt/strings.xml | 11 +++++------ res/values-ro/strings.xml | 11 +++++------ res/values-ru/strings.xml | 11 +++++------ res/values-si-rLK/strings.xml | 11 +++++------ res/values-sk/strings.xml | 11 +++++------ res/values-sl/strings.xml | 11 +++++------ res/values-sq-rAL/strings.xml | 11 +++++------ res/values-sr/strings.xml | 11 +++++------ res/values-sv/strings.xml | 11 +++++------ res/values-sw/strings.xml | 11 +++++------ res/values-ta-rIN/strings.xml | 11 +++++------ res/values-te-rIN/strings.xml | 11 +++++------ res/values-th/strings.xml | 11 +++++------ res/values-tl/strings.xml | 11 +++++------ res/values-tr/strings.xml | 11 +++++------ res/values-uk/strings.xml | 11 +++++------ res/values-ur-rPK/strings.xml | 11 +++++------ res/values-uz-rUZ/strings.xml | 11 +++++------ res/values-vi/strings.xml | 11 +++++------ res/values-zh-rCN/strings.xml | 2 ++ res/values-zh-rHK/strings.xml | 11 +++++------ res/values-zh-rTW/strings.xml | 11 +++++------ res/values-zu/strings.xml | 11 +++++------ 77 files changed, 379 insertions(+), 450 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 24f7c9e259..4ffb771226 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -35,8 +35,7 @@ "Soek meer programme" "Niks meer spasie op die tuisskerm nie." "Geen plek meer in die Gunstelinge-laai nie" - - + "Programmelys" "Tuis" "Verwyder" "Deïnstalleer" @@ -52,6 +51,8 @@ "Stel op" "Dit is \'n stelselprogram en kan nie gedeïnstalleer word nie." "Naamlose vouer" + + "Bladsy %1$d van %2$d" "Tuisskerm %1$d van %2$d" "Nuwe tuisskermbladsy" @@ -66,10 +67,8 @@ "Instellings" "Gedeaktiveer deur jou administrateur" "Oorsig" - - - - + "Laat toe dat tuisskerm gedraai word" + "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" "Onbekend" "Verwyder" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 12bc5de8af..3397aca7d7 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -35,8 +35,7 @@ "ተጨማሪ መተግበሪያዎች ይፈልጉ" "በዚህ መነሻ ማያ ገጽ ላይ ምንም ቦታ የለም።" "በተወዳጆች መሣቢያ ውስጥ ተጨማሪ ቦታ የለም" - - + "የመተግበሪያዎች ዝርዝር" "መነሻ" "አስወግድ" "አራግፍ" @@ -52,6 +51,8 @@ "ማዋቀሪያ" "ይህ የስርዓት መተግበሪያ ነው እና ማራገፍ አይቻልም።" "ስም-አልባ አቃፊ" + + "ገጽ %1$d ከ%2$d" "መነሻ ማያ ገጽ %1$d ከ%2$d" "አዲስ የመነሻ ማያ ገጽ" @@ -66,10 +67,8 @@ "ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" - - - - + "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" + "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" "የማይታወቅ" "አስወግድ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index bcb5519baa..e7cd610f29 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -35,8 +35,7 @@ "البحث عن مزيد من التطبيقات" "ليس هناك مساحة أخرى في هذه الشاشة الرئيسية." "لا يوجد المزيد من الحقول في علبة المفضلة" - - + "قائمة التطبيقات" "الرئيسية" "إزالة" "إلغاء التثبيت" @@ -52,6 +51,8 @@ "الإعداد" "هذا تطبيق نظام وتتعذر إزالته." "مجلد بدون اسم" + + "‏الصفحة %1$d من %2$d" "‏الشاشة الرئيسية %1$d من %2$d" "صفحة الشاشة الرئيسية الجديدة" @@ -66,10 +67,8 @@ "الإعدادات" "عطَّل المشرف هذه الميزة" "نظرة عامة" - - - - + "السماح بتدوير الشاشة الرئيسية" + "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" "غير معروفة" "إزالة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index e594d646fa..556ee6e6a6 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -35,8 +35,7 @@ "Daha çox tətbiq üçün axtarış edin" "Bu Əsas ekranda boş yer yoxdur." "Favoritlər-də yer yoxdur" - - + "Tətbiq siyahısı" "Əsas səhifə" "Silin" "Sistemdən sil" @@ -52,6 +51,8 @@ "Quraşdırma" "Bu sistem tətbiqi olduğu üçün sistemdən silinə bilməz." "Adsız Qovluq" + + "Səhifə %1$d of %2$d" "Əsas Səhifə ekranı %1$d of %2$d" "Yeni əsas ekran səhifəsi" @@ -66,10 +67,8 @@ "Ayarlar" "Admininiz tərəfindən deaktiv edilib" "İcmal" - - - - + "Əsas ekranın firlanmağına icazə verin" + "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" "Naməlum" "Yığışdır" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 96c806da50..5a91a70fc6 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -35,8 +35,7 @@ "Търсене на още приложения" "На този начален екран няма повече място." "Няма повече място в областта с любимите" - - + "Списък с приложения" "Начало" "Премахване" "Деинсталиране" @@ -52,6 +51,8 @@ "Настройване" "Това е системно приложение и не може да се деинсталира." "Папка без име" + + "Страница %1$d от %2$d" "Начален екран %1$d от %2$d" "Нова страница на началния екран" @@ -66,10 +67,8 @@ "Настройки" "Деактивирано от администратора ви" "Общ преглед" - - - - + "Разрешаване на завъртането на началния екран" + "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" "Няма информация" "Премахване" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 8b08f05b8a..d00af245ac 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -35,8 +35,7 @@ "আরো অ্যাপ্লিকেশানের জন্য অনুসন্ধান করুন" "এই হোম স্ক্রীনে আর কোনো জায়গা নেই৷" "পছন্দসই ট্রে-তে আর কোনো জায়গা নেই" - - + "অ্যাপ্লিকেশানগুলির তালিকা" "হোম" "সরান" "আনইনস্টল করুন" @@ -52,6 +51,8 @@ "সেটআপ" "এটি একটি সিস্টেম অ্যাপ্লিকেশান এবং আনইনস্টল করা যাবে না৷" "নামবিহীন ফোল্ডার" + + "%2$dটির মধ্যে %1$dটি পৃষ্ঠা" "%2$dটির %1$d নম্বর হোম স্ক্রীন" "নতুন হোম স্ক্রীনের পৃষ্ঠা" @@ -66,10 +67,8 @@ "সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" - - - - + "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" + "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" "অজানা" "সরান" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 66b77eeff8..0f09c91892 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -35,8 +35,7 @@ "Cerca més aplicacions" "Ja no queda espai en aquesta pantalla d\'inici." "No hi ha més espai a la safata Preferits." - - + "Llista d\'aplicacions" "Inici" "Suprimeix" "Desinstal·la" @@ -52,6 +51,8 @@ "Configuració" "Aquesta aplicació és una aplicació del sistema i no es pot desinstal·lar." "Carpeta sense nom" + + "Pàgina %1$d de %2$d" "Pantalla d\'inici %1$d de %2$d" "Pàgina de la pantalla d\'inici nova" @@ -66,10 +67,8 @@ "Configuració" "Desactivada per l\'administrador" "Visió general" - - - - + "Permet la rotació de la pantalla d\'inici" + "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" "Desconegut" "Suprimeix" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 8cdb970890..91e4aa0935 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -35,8 +35,7 @@ "Vyhledat další aplikace" "Na této ploše již není místo." "Na panelu Oblíbené položky již není místo." - - + "Seznam aplikací" "Plocha" "Odstranit" "Odinstalovat" @@ -52,6 +51,8 @@ "Nastavení" "Toto je systémová aplikace a nelze ji odinstalovat." "Složka bez názvu" + + "Strana %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" @@ -66,10 +67,8 @@ "Nastavení" "Zakázáno administrátorem" "Přehled" - - - - + "Povolit otáčení plochy" + "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" "Neznámé" "Odstranit" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 8e9517a63e..6829c88c33 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -35,8 +35,7 @@ "Søg efter flere apps" "Der er ikke mere plads på denne startskærm." "Der er ikke mere plads i bakken Foretrukne" - - + "Liste med apps" "Startskærm" "Fjern" "Afinstaller" @@ -52,6 +51,8 @@ "Konfigurer" "Dette er en systemapp, som ikke kan afinstalleres." "Unavngiven mappe" + + "Side %1$d ud af %2$d" "Startskærm %1$d ud af %2$d" "Ny startskærm" @@ -66,10 +67,8 @@ "Indstillinger" "Deaktiveret af din administrator" "Oversigt" - - - - + "Tillad rotation af startskærmen" + "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" "Ukendt" "Fjern" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c216b7797e..20f54846f6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -35,8 +35,7 @@ "Weitere Apps suchen" "Auf diesem Startbildschirm ist kein Platz mehr vorhanden." "Ablage \"Favoriten\" ist voll." - - + "Liste der Apps" "Startseite" "Entfernen" "Deinstallieren" @@ -52,6 +51,8 @@ "Einrichten" "Dies ist eine Systemanwendung, die nicht deinstalliert werden kann." "Unbenannter Ordner" + + "Seite %1$d von %2$d" "Startbildschirm %1$d von %2$d" "Neue Startbildschirmseite" @@ -66,10 +67,8 @@ "Einstellungen" "Von deinem Administrator deaktiviert" "Übersicht" - - - - + "Drehung des Startbildschirms zulassen" + "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" "Unbekannt" "Entfernen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 070678e6cd..90633eb86a 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -35,8 +35,7 @@ "Αναζήτηση περισσότερων εφαρμογών" "Δεν υπάρχει χώρος σε αυτήν την αρχική οθόνη." "Δεν υπάρχει επιπλέον χώρος στην περιοχή Αγαπημένα" - - + "Λίστα εφαρμογών" "Αρχική οθόνη" "Κατάργηση" "Απεγκατάσταση" @@ -52,6 +51,8 @@ "Ρύθμιση" "Αυτή είναι μια εφαρμογή συστήματος και δεν είναι δυνατή η κατάργηση της εγκατάστασής της." "Φάκελος χωρίς όνομα" + + "Σελίδα %1$d από %2$d" "Αρχική οθόνη %1$d από %2$d" "Νέα σελίδα αρχικής οθόνης" @@ -66,10 +67,8 @@ "Ρυθμίσεις" "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" - - - - + "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" + "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" "Άγνωστο" "Κατάργηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 4120809bcc..4507b7d8bc 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -35,8 +35,7 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - - + "Apps list" "Home" "Remove" "Uninstall" @@ -52,6 +51,8 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" + + "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" @@ -66,10 +67,8 @@ "Settings" "Disabled by your admin" "Overview" - - - - + "Allow Homescreen rotation" + "When phone is rotated" "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 4120809bcc..4507b7d8bc 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -35,8 +35,7 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - - + "Apps list" "Home" "Remove" "Uninstall" @@ -52,6 +51,8 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" + + "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" @@ -66,10 +67,8 @@ "Settings" "Disabled by your admin" "Overview" - - - - + "Allow Homescreen rotation" + "When phone is rotated" "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 4120809bcc..4507b7d8bc 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -35,8 +35,7 @@ "Search for more apps" "No more room on this Home screen." "No more room in the Favourites tray" - - + "Apps list" "Home" "Remove" "Uninstall" @@ -52,6 +51,8 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" + + "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" @@ -66,10 +67,8 @@ "Settings" "Disabled by your admin" "Overview" - - - - + "Allow Homescreen rotation" + "When phone is rotated" "Current display setting doesn\'t permit rotation" "Unknown" "Remove" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 0804cd3c1e..aac937508c 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -35,8 +35,7 @@ "Buscar más apps" "No hay más espacio en esta pantalla principal." "La bandeja de favoritos está llena." - - + "Lista de apps" "Pantalla principal" "Quitar" "Desinstalar" @@ -52,6 +51,8 @@ "Configuración" "Esta es una aplicación del sistema y no se puede desinstalar." "Carpeta sin nombre" + + "Página %1$d de %2$d" "Pantalla principal %1$d de %2$d" "Nueva página en la pantalla principal" @@ -66,10 +67,8 @@ "Configuración" "El administrador inhabilitó esta función" "Recientes" - - - - + "Permitir la rotación de la pantalla principal" + "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" "Desconocido" "Eliminar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1454f9979d..367c9b085d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -35,8 +35,7 @@ "Buscar más aplicaciones" "No queda espacio en la pantalla de inicio." "La bandeja de favoritos está completa" - - + "Lista de aplicaciones" "Inicio" "Quitar" "Desinstalar" @@ -52,6 +51,8 @@ "Configuración" "Esta aplicación es del sistema y no se puede desinstalar." "Carpeta sin nombre" + + "Página %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nueva página de pantalla de inicio" @@ -66,10 +67,8 @@ "Ajustes" "Inhabilitada por el administrador" "Visión general" - - - - + "Permitir rotación de la pantalla de inicio" + "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" "Desconocido" "Quitar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index f8ef8da75f..5f810c9af2 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -35,8 +35,7 @@ "Otsi rohkem rakendusi" "Sellel avaekraanil pole enam ruumi." "Salves Lemmikud pole rohkem ruumi" - - + "Rakenduste loend" "Avaekraan" "Eemalda" "Desinstalli" @@ -52,6 +51,8 @@ "Seadistamine" "See on süsteemirakendus ja seda ei saa desinstallida." "Nimetu kaust" + + "Leht %1$d/%2$d" "Avaekraan %1$d/%2$d" "Uus avaekraan" @@ -66,10 +67,8 @@ "Seaded" "Keelas administraator" "Ülevaade" - - - - + "Luba avaekraani pööramine" + "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" "Teadmata" "Eemalda" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 2757b2a21f..8fe826dea8 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -35,8 +35,7 @@ "Bilatu aplikazio gehiago" "Hasierako pantaila honetan ez dago toki gehiago." "Ez dago toki gehiago Gogokoak erretiluan" - - + "Aplikazioen zerrenda" "Hasiera" "Kendu" "Desinstalatu" @@ -52,6 +51,8 @@ "Konfigurazioa" "Sistema-aplikazioa da hau eta ezin da desinstalatu." "Izenik gabeko karpeta" + + "%1$d/%2$d orria" "%1$d/%2$d hasierako pantaila" "Hasierako pantailaren orri berria" @@ -66,10 +67,8 @@ "Ezarpenak" "Administratzaileak desgaitu du" "Ikuspegi orokorra" - - - - + "Baimendu hasierako pantaila biratzea" + "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" "Ezezaguna" "Kendu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index b5037cd107..5fdf04131c 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -35,8 +35,7 @@ "جستجوی برنامه‌های بیشتر" "فضای بیشتری در این صفحه اصلی موجود نیست." "فضای بیشتری در سینی موارد دلخواه وجود ندارد" - - + "فهرست برنامه‌ها" "صفحه اصلی" "برداشتن" "حذف نصب" @@ -52,6 +51,8 @@ "تنظیم" "این برنامه سیستمی است و حذف نصب نمی‌شود." "پوشه بی‌نام" + + "‏صفحه %1$d از %2$d" "‏صفحه اصلی %1$d از %2$d" "صفحه اصلی جدید" @@ -66,10 +67,8 @@ "تنظیمات" "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" - - - - + "امکان دادن به چرخش صفحه اصلی" + "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" "نامشخص" "حذف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f30e0a1f72..75951e22cd 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -35,8 +35,7 @@ "Hae lisää sovelluksia" "Tässä aloitusruudussa ei ole enää tilaa." "Suosikit-valikossa ei ole enää tilaa" - - + "Sovellusluettelo" "Aloitusruutu" "Poista" "Poista asennus" @@ -52,6 +51,8 @@ "Asetus" "Tämä on järjestelmäsovellus, eikä sitä voi poistaa." "Nimetön kansio" + + "Sivu %1$d / %2$d" "Aloitusruutu %1$d/%2$d" "Uusi aloitusnäytön sivu" @@ -66,10 +67,8 @@ "Asetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" - - - - + "Salli aloitusnäytön kiertäminen" + "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." "Tuntematon" "Poista" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 2d6c7737e0..422308b28d 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -35,8 +35,7 @@ "Rechercher plus d\'applications" "Pas d\'espace libre sur l\'écran d\'accueil." "Il n\'y a plus d\'espace dans la zone des favoris" - - + "Liste des applications" "Accueil" "Supprimer" "Désinstaller" @@ -52,6 +51,8 @@ "Configuration" "Impossible de désinstaller cette application, car il s\'agit d\'une application système." "Dossier sans nom" + + "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" @@ -66,10 +67,8 @@ "Paramètres" "Cette fonction est désactivée par votre administrateur" "Présentation" - - - - + "Autoriser la rotation de l\'écran d\'accueil" + "Quand le téléphone est pivoté" "Le mode d\'affichage actuel ne permet pas le pivotement" "Inconnu" "Supprimer" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 16621fa378..310e9335ec 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -35,8 +35,7 @@ "Rechercher plus d\'applications" "Pas d\'espace libre sur cet écran d\'accueil." "Plus d\'espace disponible dans la zone de favoris." - - + "Liste d\'applications" "Accueil" "Supprimer" "Désinstaller" @@ -52,6 +51,8 @@ "Configuration" "Impossible de désinstaller cette application, car il s\'agit d\'une application système." "Dossier sans nom" + + "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" @@ -66,10 +67,8 @@ "Paramètres" "Désactivé par votre administrateur" "Vue d\'ensemble" - - - - + "Autoriser la rotation de l\'écran d\'accueil" + "Lorsque l\'utilisateur fait pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." "Inconnu" "Supprimer" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index aa0e6a22c7..21b7e01917 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -35,8 +35,7 @@ "Buscar máis aplicacións" "Non hai máis espazo nesta pantalla de inicio." "Non hai máis espazo na bandexa de favoritos" - - + "Lista de aplicacións" "Inicio" "Eliminar" "Desinstalar" @@ -52,6 +51,8 @@ "Configuración" "Esta aplicación é do sistema e non se pode desinstalar." "Cartafol sen nome" + + "Páxina %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nova páxina da pantalla de inicio" @@ -66,10 +67,8 @@ "Configuración" "Función desactivada polo administrador" "Visión xeral" - - - - + "Permitir xirar a pantalla de inicio" + "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" "Descoñecido" "Eliminar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 3451954152..6cc387ba97 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -35,8 +35,7 @@ "વધુ ઍપ્લિકેશનો શોધો" "આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી." "મનપસંદ ટ્રે પર વધુ જગ્યા નથી" - - + "ઍપ્લિકેશનોની સૂચિ" "હોમ" "દૂર કરો" "અનઇન્સ્ટોલ કરો" @@ -52,6 +51,8 @@ "સેટઅપ" "આ એક સિસ્ટમ ઍપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી." "અનામી ફોલ્ડર" + + "%2$d માંથી %1$d પૃષ્ઠ" "%2$d માંથી %1$d હોમ સ્ક્રીન" "નવું હોમ સ્ક્રીન પૃષ્ઠ" @@ -66,10 +67,8 @@ "સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" - - - - + "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" + "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index cd65f615c5..0a40726bf9 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -35,8 +35,7 @@ "अधिक ऐप्लिकेशन खोजें" "इस होम स्‍क्रीन पर स्थान शेष नहीं है." "पसंदीदा ट्रे में और स्थान नहीं है" - - + "ऐप्लिकेशन सूची" "होम" "निकालें" "अनइंस्टॉल करें" @@ -52,6 +51,8 @@ "सेटअप" "यह एक सिस्टम ऐप्लिकेशन है और इसे अनइंस्टॉल नहीं किया जा सकता." "अनामित फ़ोल्डर" + + "पृष्ठ %2$d में से %1$d" "होम स्क्रीन %2$d में से %1$d" "नया होम स्‍क्रीन पृष्‍ठ" @@ -66,10 +67,8 @@ "सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" - - - - + "होमस्क्रीन घुमाने की अनुमति दें" + "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" "अज्ञात" "निकालें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 818ae98af8..6e5f1235f4 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -35,8 +35,7 @@ "Traži više aplikacija" "Na ovom početnom zaslonu više nema mjesta." "Nema više prostora na traci Favoriti" - - + "Popis aplikacija" "Početna" "Ukloni" "Deinstaliraj" @@ -52,6 +51,8 @@ "Postavljanje" "Ovo je aplikacija sustava i ne može se ukloniti." "Neimenovana mapa" + + "Stranica %1$d od %2$d" "Početni zaslon %1$d od %2$d" "Nova stranica početnog zaslona" @@ -66,10 +67,8 @@ "Postavke" "Onemogućio administrator" "Pregled" - - - - + "Dopusti zakretanje početnog zaslona" + "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" "Nepoznato" "Ukloni" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index e829bd89e1..db5ff86b19 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -35,8 +35,7 @@ "További alkalmazások keresése" "Nincs több hely ezen a kezdőképernyőn." "Nincs több hely a Kedvencek tálcán" - - + "Alkalmazások listája" "Főoldal" "Törlés" "Eltávolítás" @@ -52,6 +51,8 @@ "Beállítás" "Ez egy rendszeralkalmazás, és nem lehet eltávolítani." "Névtelen mappa" + + "%2$d/%1$d. oldal" "%2$d/%1$d. kezdőképernyő" "Új kezdőképernyő oldal" @@ -66,10 +67,8 @@ "Beállítások" "A rendszergazda letiltotta" "Áttekintés" - - - - + "A kezdőképernyő elforgatásának engedélyezése" + "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" "Ismeretlen" "Eltávolítás" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 9bd7505521..00b1bed21d 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -35,8 +35,7 @@ "Որոնել այլ հավելվածներ" "Այլևս տեղ չկա այս հիմնական էկրանին:" "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" - - + "Հավելվածների ցանկ" "Հիմնական" "Հեռացնել" "Հեռացնել" @@ -52,6 +51,8 @@ "Կարգավորում" "Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:" "Անանուն պանակ" + + "Էջ %1$d՝ %2$d-ից" "Հիմնական էկրան %1$d` %2$d-ից" "Հիմնական էկրանի նոր էջ" @@ -66,10 +67,8 @@ "Կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" - - - - + "Թույլ տալ հիմնական էկրանի պտտումը" + "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" "Անհայտ է" "Հեռացնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index d3a7e316f2..f48278f0a4 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -35,8 +35,7 @@ "Telusuri aplikasi lainnya" "Tidak ada ruang lagi pada layar Utama ini." "Tidak ada ruang tersisa di baki Favorit" - - + "Daftar aplikasi" "Layar Utama" "Hapus" "Copot pemasangan" @@ -52,6 +51,8 @@ "Siapkan" "Ini adalah aplikasi sistem dan tidak dapat dicopot pemasangannya." "Folder Tanpa Nama" + + "Laman %1$d dari %2$d" "Layar utama %1$d dari %2$d" "Laman layar utama baru" @@ -66,10 +67,8 @@ "Setelan" "Dinonaktifkan oleh admin" "Ringkasan" - - - - + "Izinkan layar Utama diputar" + "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" "Tidak dikenal" "Buang" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 6ddf4d9c01..e97c1b7d04 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -35,8 +35,7 @@ "Leita að fleiri forritum" "Ekki meira pláss á þessum heimaskjá." "Ekki meira pláss í bakka fyrir uppáhald" - - + "Forritalisti" "Heim" "Fjarlægja" "Fjarlægja" @@ -52,6 +51,8 @@ "Uppsetning" "Þetta er kerfisforrit sem ekki er hægt að fjarlægja." "Ónefnd mappa" + + "Síða %1$d af %2$d" "Heimaskjár %1$d af %2$d" "Ný síða á heimaskjá" @@ -66,10 +67,8 @@ "Stillingar" "Gert óvirkt af kerfisstjóra" "Yfirlit" - - - - + "Leyfa snúning fyrir heimaskjá" + "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" "Óþekkt" "Fjarlægja" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 5a967318d0..d03ece9b8c 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -35,8 +35,7 @@ "Cerca altre app" "Spazio nella schermata Home esaurito." "Spazio esaurito nella barra dei Preferiti" - - + "Elenco di app" "Home page" "Rimuovi" "Disinstalla" @@ -52,6 +51,8 @@ "Configurazione" "Questa è un\'app di sistema e non può essere disinstallata." "Cartella senza nome" + + "Pagina %1$d di %2$d" "Schermata Home %1$d di %2$d" "Nuova pagina Schermata Home" @@ -66,10 +67,8 @@ "Impostazioni" "Disattivata dall\'amministratore" "Panoramica" - - - - + "Consenti rotazione della schermata Home" + "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" "Sconosciuto" "Rimuovi" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 6f0f9779ee..fdf5cc53fe 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -35,8 +35,7 @@ "חפש אפליקציות נוספות" "אין עוד מקום במסך דף הבית הזה." "אין עוד מקום במגש המועדפים" - - + "רשימת אפליקציות" "דף הבית" "הסר" "הסר התקנה" @@ -52,6 +51,8 @@ "הגדר" "זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה." "תיקיה ללא שם" + + "‏דף %1$d מתוך %2$d" "‏מסך דף הבית %1$d מתוך %2$d" "מסך דף הבית חדש" @@ -66,10 +67,8 @@ "הגדרות" "הושבת על ידי מנהל המערכת שלך" "סקירה" - - - - + "אפשרות סיבוב של מסך דף הבית" + "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" "לא ידוע" "הסר" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 3bf8002769..8368042584 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -35,8 +35,7 @@ "他のアプリを検索" "このホーム画面に空きスペースがありません。" "お気に入りトレイに空きスペースがありません" - - + "アプリのリスト" "ホーム" "削除" "アンインストール" @@ -52,6 +51,8 @@ "セットアップ" "このシステムアプリはアンインストールできません。" "名前のないフォルダ" + + "%1$d/%2$dページ" "ホーム画面: %1$d/%2$d" "新しいホーム画面ページ" @@ -66,10 +67,8 @@ "設定" "管理者により無効にされています" "概要" - - - - + "ホーム画面の回転を許可" + "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" "不明" "削除" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index a29ce32743..64f5fb0b52 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -35,8 +35,7 @@ "მეტი აპის პოვნა" "ამ მთავარ ეკრანზე ადგილი აღარ არის." "რჩეულების თაროზე ადგილი არ არის" - - + "აპების სია" "მთავარი" "ამოშლა" "დეინსტალაცია" @@ -52,6 +51,8 @@ "დაყენება" "ეს სისტემური აპია და მისი წაშლა შეუძლებელია." "უსახელო საქაღალდე" + + "გვერდი %1$d %2$d-დან" "მთავარი ეკრანი %1$d, %2$d-დან" "მთავარი ეკრანის ახალი გვერდი" @@ -66,10 +67,8 @@ "პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" - - - - + "მთავარი ეკრანის შეტრიალების დაშვება" + "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" "უცნობი" "ამოშლა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 1dda5165be..26b1dafc1a 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -35,8 +35,7 @@ "Қосымша қолданбалар іздеу" "Бұл Негізгі экранда орын қалмады." "Қалаулылар науасында орын қалмады" - - + "Қолданбалар тізімі" "Негізгі" "Жою" "Жою" @@ -52,6 +51,8 @@ "Орнату" "Бұл жүйе қолданбасы, сондықтан оны алу мүмкін емес." "Атауы жоқ қалта" + + "%1$d бет, барлығы %2$d" "%1$d негізгі экран, барлығы %2$d" "Жаңа негізгі экран беті" @@ -66,10 +67,8 @@ "Параметрлер" "Әкімші өшірді" "Шолу" - - - - + "Негізгі экранның бұрылуына рұқсат ету" + "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" "Белгісіз" "Алып тастау" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index d8e9a0273c..bcb1eee5e5 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -35,8 +35,7 @@ "ស្វែងរកកម្មវិធីច្រើនទៀត" "គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។" "គ្មាន​បន្ទប់​​ក្នុង​ថាស​និយម​ប្រើ" - - + "បញ្ជីកម្មវិធី" "ដើម" "យកចេញ" "លុបការដំឡើង" @@ -52,6 +51,8 @@ "រៀបចំ" "នេះ​​​ជា​កម្មវិធី​ប្រព័ន្ធ មិន​អាច​លុប​បាន​ទេ។" "ថត​គ្មាន​ឈ្មោះ" + + "ទំព័រ %1$d នៃ %2$d" "អេក្រង់​ដើម %1$d នៃ %2$d" "ទំព័រអេក្រង់ដើមថ្មី" @@ -66,10 +67,8 @@ "ការកំណត់" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" - - - - + "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" + "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" "មិន​ស្គាល់" "លុបចេញ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index a333747c5a..9b50fe8540 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -35,8 +35,7 @@ "ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕು" "ಈ ಮುಖಪುಟದ ಪರದೆಯಲ್ಲಿ ಹೆಚ್ಚು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ." "ಮೆಚ್ಚಿನವುಗಳ ಟ್ರೇನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ" - - + "ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಪಟ್ಟಿ" "ಮುಖಪುಟ" "ತೆಗೆದುಹಾಕಿ" "ಅಸ್ಥಾಪಿಸು" @@ -52,6 +51,8 @@ "ಸೆಟಪ್" "ಇದೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಗಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಹೆಸರಿಲ್ಲದ ಫೋಲ್ಡರ್" + + "%2$d ರಲ್ಲಿ %1$d ಪುಟ" "%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ" "ಹೊಸ ಮುಖಪುಟ ಪರದೆ" @@ -66,10 +67,8 @@ "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" - - - - + "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" + "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ಅಜ್ಞಾತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 7293597f31..19ec6ebf1f 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -35,8 +35,7 @@ "더 많은 앱 검색" "홈 화면에 더 이상 공간이 없습니다." "즐겨찾기 트레이에 더 이상 공간이 없습니다." - - + "앱 목록" "홈" "삭제" "제거" @@ -52,6 +51,8 @@ "설정" "시스템 앱은 제거할 수 없습니다." "이름이 없는 폴더" + + "페이지 %1$d/%2$d" "홈 화면 %1$d/%2$d" "새로운 메인 스크린 페이지" @@ -66,10 +67,8 @@ "설정" "관리자가 사용 중지함" "개요" - - - - + "메인 스크린 회전 허용" + "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." "알 수 없음" "삭제" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index ddd250c4af..25c4672de3 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -35,8 +35,7 @@ "Көбүрөөк колдонмолорду издөө" "Бул Үй экранында бош орун жок." "Тандамалдар тайпасында орун калган жок" - - + "Колдонмолор тизмеси" "Үйгө" "Алып салуу" "Чыгарып салуу" @@ -52,6 +51,8 @@ "Орнотуу" "Бул системдик колдонмо жана аны чечкенге болбойт." "Аты жок фолдер" + + "%2$d ичинен %1$d барак" "Үй экраны %2$d ичинен %1$d" "Жаңы башкы экран барагы" @@ -66,10 +67,8 @@ "Тууралоолор" "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" - - - - + "Башкы экранды айлантууга уруксат берүү" + "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" "Белгисиз" "Алып салуу" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index c02d56e50d..37dd3e04ef 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -35,8 +35,7 @@ "ຊອກຫາແອັບເພີ່ມເຕີມ" "ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້." "ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ" - - + "ລາຍຊື່ແອັບ" "ໜ້າຫຼັກ" "ເອົາ​ອອກ" "ຖອນ​ການ​ຕິດ​ຕັ້ງ" @@ -52,6 +51,8 @@ "ຕິດຕັ້ງ" "ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້." "ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່" + + "ໜ້າ %1$d ຈາກ %2$d" "ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d" "ໜ້າ​ຂອງ​ໜ້າ​ຈໍ​ຫຼັກ​ໃໝ່" @@ -66,10 +67,8 @@ "ການຕັ້ງຄ່າ" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" - - - - + "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" + "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 542028f7d5..83ca1817da 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -35,8 +35,7 @@ "Ieškoti daugiau programų" "Šiame pagrindiniame ekrane vietos nebėra." "Mėgstamiausių dėkle nebėra vietos" - - + "Programų sąrašas" "Pagrindinis" "Ištrinti" "Pašalinti" @@ -52,6 +51,8 @@ "Sąranka" "Tai sistemos programa ir jos negalima pašalinti." "Aplankas be pavadinimo" + + "%1$d psl. iš %2$d" "%1$d pagrindinis ekranas iš %2$d" "Naujas pagrindinio ekrano puslapis" @@ -66,10 +67,8 @@ "Nustatymai" "Išjungė administratorius" "Apžvalga" - - - - + "Leisti pasukti pagrindinį ekraną" + "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" "Nežinoma" "Pašalinti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 353ee96947..2b199636e8 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -52,6 +52,8 @@ "Notiek iestatīšana" "Šī ir sistēmas lietotne, un to nevar atinstalēt." "Mape bez nosaukuma" + + "%1$d. lapa no %2$d" "Sākuma ekrāns: %1$d no %2$d" "Jauna sākuma ekrāna lapa" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index c23214c386..62f6dbe892 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -35,8 +35,7 @@ "Пребарај други апликации" "Нема повеќе простор на овој екран на почетната страница." "Нема повеќе простор на лентата „Омилени“" - - + "Список со апликации" "Почетна страница" "Отстрани" "Деинсталирај" @@ -52,6 +51,8 @@ "Поставување" "Ова е системска апликација и не може да се деинсталира." "Неименувана папка" + + "Страница %1$d од %2$d" "Екран на почетна страница %1$d од %2$d" "Нова страница на почетен екран" @@ -66,10 +67,8 @@ "Поставки" "Оневозможено од администраторот" "Краток преглед" - - - - + "Дозволете ротација на Почетниот екран" + "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" "Непознато" "Отстрани" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index a1c9c45fbc..2db9c236f8 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -35,8 +35,7 @@ "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" "ഈ ഹോം സ്‌ക്രീനിൽ ഒഴിവൊന്നുമില്ല." "പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല" - - + "അപ്ലിക്കേഷനുകളുടെ ലിസ്‌റ്റ്" "ഹോം" "നീക്കംചെയ്യുക" "അൺഇൻസ്റ്റാളുചെയ്യുക" @@ -52,6 +51,8 @@ "സജ്ജീകരിക്കുക" "ഇതൊരു സിസ്‌റ്റം അപ്ലിക്കേഷനായതിനാൽ അൺഇൻസ്‌റ്റാളുചെയ്യാനാവില്ല." "പേരുനൽകാത്ത ഫോൾഡർ" + + "പേജ് %1$d / %2$d" "ഹോം സ്‌ക്രീൻ %1$d / %2$d" "പുതിയ ഹോം സ്ക്രീൻ പേജ്" @@ -66,10 +67,8 @@ "ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" - - - - + "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" + "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 04d40dd477..95add4c2a6 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -35,8 +35,7 @@ "Бусад апп-г хайх" "Энэ Нүүр дэлгэц зайгүй." "\"Дуртай\" трей дээр өөр зай байхгүй байна" - - + "Апп-н жагсаалт" "Нүүр" "Арилгах" "Устгах" @@ -52,6 +51,8 @@ "Тохируулга" "Энэ апп нь системийн апп ба устгах боломжгүй." "Нэргүй фолдер" + + "%2$d-н %1$d хуудас" "%2$d-н Нүүр дэлгэц %1$d" "Шинэ үндсэн нүүр хуудас" @@ -66,10 +67,8 @@ "Тохиргоо" "Таны админ идэвхгүй болгосон" "Тойм" - - - - + "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" + "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" "Тодорхойгүй" "Устгах" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index a92c2396f4..98d0d441be 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -35,8 +35,7 @@ "अधिक अॅप्स शोधा" "या मुख्य स्क्रीनवर आणखी जागा नाही." "आवडीच्या ट्रे मध्ये आणखी जागा नाही" - - + "अॅप्स सूची" "मुख्‍यपृष्‍ठ" "काढा" "विस्थापित करा" @@ -52,6 +51,8 @@ "सेटअप" "हा सिस्टम अॅप आहे आणि विस्थापित केला जाऊ शकत नाही." "अनामित फोल्डर" + + "%2$d पैकी %1$d पृष्ठ" "%2$d पैकी %1$d मुख्य स्क्रीन" "नवीन मुख्य स्क्रीन पृष्ठ" @@ -66,10 +67,8 @@ "सेटिंग्ज" "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" - - - - + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" + "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" "अज्ञात" "काढा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 8cfdaadaed..7c3af151e3 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -35,8 +35,7 @@ "Cari lagi apl" "Tiada lagi ruang pada skrin Laman Utama ini." "Tiada ruang dalam dulang Kegemaran lagi" - - + "Senarai apl" "Laman Utama" "Alih keluar" "Nyahpasang" @@ -52,6 +51,8 @@ "Persediaan" "Ini ialah apl sistem dan tidak boleh dinyahpasang." "Folder Tanpa Nama" + + "Halaman %1$d daripada %2$d" "Skrin Laman Utama %1$d daripada %2$d" "Halaman skrin utama baharu" @@ -66,10 +67,8 @@ "Tetapan" "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" - - - - + "Benarkan putaran Skrin Utama" + "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" "Tidak diketahui" "Alih keluar" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index c8a4690551..373a7ed9bb 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -35,8 +35,7 @@ "နောက်ထပ် အက်ပ်များကို ရှာပါ" "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" - - + "အက်ပ်စာရင်း" "ပင်မစာမျက်နှာ" "ဖယ်ရှားမည်" "ဖယ်ထုတ်မည်" @@ -52,6 +51,8 @@ "စဖွင့်သတ်မှတ်ရန်" "ဤအပ်ပလီကေးရှင်းမှာ စစ်စတန်ပိုင်းဆိုင်ရာ အပ်ပလီကေးရှင်းဖြစ်ပါသည်။ ထုတ်ပစ်၍ မရပါ" "အမည်မရှိအကန့်" + + "စာမျက်နှာ %1$d မှ %2$d" "ပင်မစာမျက်နှာ %1$d မှ %2$d" "ပင်မမျက်နှာပြင် စာမျက်နှာသစ်" @@ -66,10 +67,8 @@ "ဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" - - - - + "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" + "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" "မသိရ" "ဖယ်ရှားရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 4f590383c9..6db69f47a6 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -35,8 +35,7 @@ "Søk etter flere apper" "Denne startsiden er full." "Favoritter-skuffen er full" - - + "App-liste" "Startside" "Fjern" "Avinstaller" @@ -52,6 +51,8 @@ "Konfigurering" "Dette er en systemapp som ikke kan avinstalleres." "Mappe uten navn" + + "Side %1$d av %2$d" "Startside %1$d av %2$d" "Ny side på startskjermen" @@ -66,10 +67,8 @@ "Innstillinger" "Administratoren har slått av funksjonen" "Oversikt" - - - - + "Tillat rotasjon av startskjermen" + "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" "Ukjent" "Fjern" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 160489958e..f670fb1114 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -35,8 +35,7 @@ "थप अनुप्रयोगहरू खोज्नुहोस्" "यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।" "मनपर्ने ट्रे अब कुनै ठाँउ छैन" - - + "अनुप्रयोगको सूची" "गृह" "हटाउनुहोस्" "विस्थापित गर्नुहोस्" @@ -52,6 +51,8 @@ "सेटअप" "यो प्रणाली अनुप्रयोग हो र यसलाई स्थापना रद्द गर्न सकिँदैन।" "बेनाम फोल्डर" + + "पृष्ठ %2$d को %1$d" "गृह स्क्रिन %1$d को %2$d" "नयाँ गृह स्क्रिन पृष्ठ" @@ -66,10 +67,8 @@ "सेटिंङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" - - - - + "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" + "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e3193c35f6..077a968162 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -35,8 +35,7 @@ "Zoeken naar meer apps" "Er is geen ruimte meer op dit startscherm." "Geen ruimte meer in het vak \'Favorieten\'" - - + "Lijst met apps" "Startpagina" "Verwijderen" "Deïnstalleren" @@ -52,6 +51,8 @@ "Configuratie" "Dit is een systeemapp die niet kan worden verwijderd." "Naamloze map" + + "Pagina %1$d van %2$d" "Startscherm %1$d van %2$d" "Nieuwe startschermpagina" @@ -66,10 +67,8 @@ "Instellingen" "Uitgeschakeld door je beheerder" "Overzicht" - - - - + "Draaien van startscherm toestaan" + "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" "Onbekend" "Verwijderen" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index f1b51afd69..d2b827e36c 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -35,8 +35,7 @@ "ਹੋਰ ਐਪਾਂ ਖੋਜੋ" "ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।" "ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।" - - + "ਐਪ ਸੂਚੀ" "ਹੋਮ" "ਹਟਾਓ" "ਸਥਾਪਨਾ ਰੱਦ ਕਰੋ" @@ -52,6 +51,8 @@ "ਸਥਾਪਤ ਕਰੋ" "ਇਹ ਇੱਕ ਸਿਸਟਮ ਐਪ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" "ਬਿਨਾਂ ਨਾਮ ਦਿੱਤਾ ਫੋਲਡਰ" + + "ਸਫ਼ਾ %2$d ਦਾ %1$d" "ਹੋਮ ਸਕ੍ਰੀਨ %2$d ਦੀ %1$d" "ਨਵਾਂ ਹੋਮ ਸਕ੍ਰੀਨ ਸਫ਼ਾ" @@ -66,10 +67,8 @@ "ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" - - - - + "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" + "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 8f3e175a72..9011a47f1f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -35,8 +35,7 @@ "Wyszukaj więcej aplikacji" "Brak miejsca na tym ekranie głównym." "Brak miejsca w Ulubionych" - - + "Lista aplikacji" "Ekran główny" "Usuń" "Odinstaluj" @@ -52,6 +51,8 @@ "Konfiguracja" "To aplikacja systemowa i nie można jej odinstalować." "Folder bez nazwy" + + "Strona %1$d z %2$d" "Ekran główny %1$d z %2$d" "Nowa strona ekranu głównego" @@ -66,10 +67,8 @@ "Ustawienia" "Funkcja wyłączona przez administratora" "Przegląd" - - - - + "Zezwalaj na obrót ekranu głównego" + "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" "Brak informacji" "Usuń" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 1ce5664b28..33740de38f 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -35,8 +35,7 @@ "Pesquisar mais aplicações" "Sem espaço suficiente neste Ecrã principal." "Não existe mais espaço no tabuleiro de Favoritos" - - + "Lista de aplicações" "Ecrã principal" "Remover" "Desinstalar" @@ -52,6 +51,8 @@ "Configuração" "É uma aplicação de sistema e não pode ser desinstalada." "Pasta sem nome" + + "Página %1$d de %2$d" "Ecrã principal %1$d de %2$d" "Nova página do ecrã principal" @@ -66,10 +67,8 @@ "Definições" "Desativada pelo administrador" "Vista geral" - - - - + "Permitir rotação do ecrã principal" + "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" "Desconhecido" "Remover" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 194b81d977..0a0dc46775 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -35,8 +35,7 @@ "Pesquisar mais apps" "Não há mais espaço na tela inicial." "Sem espaço na bandeja de favoritos" - - + "Lista de apps" "Início" "Remover" "Desinstalar" @@ -52,6 +51,8 @@ "Configuração" "Este é um app do sistema e não pode ser desinstalado." "Pasta sem nome" + + "Página %1$d de %2$d" "Tela inicial %1$d de %2$d" "Nova página na tela inicial" @@ -66,10 +67,8 @@ "Configurações" "Desativado pelo administrador" "Visão geral" - - - - + "Permitir rotação da tela inicial" + "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" "Desconhecido" "Remover" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 0a2ab8a02f..0d84e0d048 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -35,8 +35,7 @@ "Căutați mai multe aplicații" "Nu mai este loc pe acest Ecran de pornire." "Spațiu epuizat în bara Preferate" - - + "Lista de aplicații" "Ecran de pornire" "Eliminați" "Dezinstalați" @@ -52,6 +51,8 @@ "Configurați" "Aceasta este o aplicație de sistem și nu poate fi dezinstalată." "Dosar fără nume" + + "Pagina %1$d din %2$d" "Ecranul de pornire %1$d din %2$d" "Pagină nouă pe ecranul de pornire" @@ -66,10 +67,8 @@ "Setări" "Dezactivată de administrator" "Prezentare generală" - - - - + "Permiteți rotirea ecranului de pornire" + "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" "Necunoscut" "Eliminați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 8e57dd2e3c..b56b184385 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -35,8 +35,7 @@ "Искать другие приложения" "На этом экране все занято" "В разделе \"Избранное\" больше нет места" - - + "Список приложений" "Главный экран" "Убрать" "Удалить" @@ -52,6 +51,8 @@ "Настройка" "Это системное приложение, его нельзя удалить." "Папка без названия" + + "Стр. %1$d из %2$d" "Главные экран %1$d из %2$d" "Новый экран" @@ -66,10 +67,8 @@ "Настройки" "Функция отключена администратором" "Обзор" - - - - + "Разрешить поворачивать главный экран" + "Когда телефон повернут" "В настройках отключен поворот экрана" "Неизвестно" "Удалить" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 4c463d34a7..a9d11662a1 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -35,8 +35,7 @@ "තව යෙදුම් සඳහා සොයන්න" "මෙම මුල් පිටු තිරය මත තවත් අවසර නැත." "ප්‍රියතම දෑ ඇති තැටියේ තවත් ඉඩ නොමැත" - - + "යෙදුම් ලැයිස්තුව" "මුල් පිටුව" "ඉවත් කරන්න" "අස්ථාපනය කරන්න" @@ -52,6 +51,8 @@ "ස්ථාපනය කරන්න" "මෙය පද්ධති යෙදුමක් වන අතර අස්ථාපනය කළ නොහැක." "නම් නොකළ ෆෝල්ඩරය" + + "%2$d හි %1$d පිටුව" "මුල් පිටු තිරය %2$d හි %1$d" "නව මුල් පිටුව" @@ -66,10 +67,8 @@ "සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" - - - - + "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" + "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" "නොදනී" "ඉවත් කරන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 932ae80237..dfcc79084f 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -35,8 +35,7 @@ "Hľadať ďalšie aplikácie" "Na tejto ploche už nie je miesto" "Na paneli Obľúbené položky už nie je miesto" - - + "Zoznam aplikácií" "Domovská stránka" "Odstrániť" "Odinštalovať" @@ -52,6 +51,8 @@ "Nastavenie" "Toto je systémová aplikácia a nedá sa odinštalovať." "Nepomenovaný priečinok" + + "Stránka %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" @@ -66,10 +67,8 @@ "Nastavenia" "Zakázané vaším správcom" "Prehľad" - - - - + "Povoliť otáčanie plochy" + "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" "Neznáme" "Odstrániť" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 01f4a337a0..0a481ee052 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -35,8 +35,7 @@ "Iskanje več aplikacij" "Na tem začetnem zaslonu ni več prostora." "V vrstici za priljubljene ni več prostora" - - + "Seznam aplikacij" "Začetni zaslon" "Odstrani" "Odstrani" @@ -52,6 +51,8 @@ "Nastavitev" "To je sistemska aplikacija in je ni mogoče odstraniti." "Neimenovana mapa" + + "Stran %1$d od %2$d" "Začetni zaslon %1$d od %2$d" "Nova stran na začetnem zaslonu" @@ -66,10 +67,8 @@ "Nastavitve" "Onemogočil skrbnik." "Pregled" - - - - + "Omogočanje sukanja začetnega zaslona" + "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" "Neznano" "Odstrani" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 5c3ffe49d3..1a72965f02 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -35,8 +35,7 @@ "Kërko për më shumë aplikacione" "Nuk ka më hapësirë në këtë ekran bazë." "Nuk ka më hapësirë në tabakanë \"Të preferuarat\"" - - + "Lista e aplikacioneve" "Faqja kryesore" "Hiqe" "Çinstalo" @@ -52,6 +51,8 @@ "Konfiguro" "Ky është aplikacion sistemi dhe nuk mund të çinstalohet." "Dosje e paemërtuar" + + "Faqja: %1$d nga gjithsej %2$d" "Ekrani bazë: %1$d nga gjithsej %2$d" "Faqja e ekranit të ri kryesor" @@ -66,10 +67,8 @@ "Cilësimet" "Çaktivizuar nga administratori" "Përmbledhje" - - - - + "Lejo rrotullimin e ekranit kryesor" + "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" "I panjohur" "Hiq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 18ca17c499..5a9c89af4e 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -35,8 +35,7 @@ "Претражи још апликација" "Нема више простора на овом почетном екрану." "Нема више простора на траци Омиљено" - - + "Листа апликација" "Почетна" "Уклони" "Деинсталирај" @@ -52,6 +51,8 @@ "Подешавање" "Ово је системска апликација и не може да се деинсталира." "Неименовани директоријум" + + "%1$d. страница од %2$d" "%1$d. почетни екран од %2$d" "Нова страница почетног екрана" @@ -66,10 +67,8 @@ "Подешавања" "Администратор је онемогућио" "Преглед" - - - - + "Дозволи ротацију почетног екрана" + "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" "Непознато" "Уклони" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 755294d1d6..6b68c83312 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -35,8 +35,7 @@ "Sök efter fler appar" "Det finns inte plats för mer på den här startskärmen." "Favoritfältet är fullt" - - + "Applista" "Startskärm" "Ta bort" "Avinstallera" @@ -52,6 +51,8 @@ "Konfiguration" "Det här är en systemapp som inte kan avinstalleras." "Namnlös mapp" + + "Sidan %1$d av %2$d" "Startskärmen %1$d av %2$d" "Ny sida på startskärmen" @@ -66,10 +67,8 @@ "Inställningar" "Inaktiverat av administratören" "Översikt" - - - - + "Tillåt rotering av startskärmen" + "När mobilen roterar" "Rotering tillåts inte i de nuvarande skärminställningarna" "Okänt" "Ta bort" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 40b7c0772b..a0f4c77fd2 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -35,8 +35,7 @@ "Tafuta programu zaidi" "Hakuna nafasi katika skrini hii ya Mwanzo." "Hakuna nafasi zaidi katika treya ya Vipendeleo" - - + "Orodha ya programu" "Mwanzo" "Ondoa" "Ondoa" @@ -52,6 +51,8 @@ "Sanidi" "Hii ni programu ya mfumo na haiwezi kuondolewa." "Folda isiyo na jina" + + "Ukurasa%1$d wa %2$d" @@ -68,10 +69,8 @@ "Mipangilio" "Imezimwa na msimamizi wako" "Muhtasari" - - - - + "Ruhusu kuzungusha skrini ya Kwanza" + "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" "Yasiyojulikana" "Ondoa" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index e28c94aea2..203d1273f4 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -35,8 +35,7 @@ "கூடுதல் பயன்பாடுகளைத் தேடு" "முகப்புத் திரையில் இடமில்லை." "பிடித்தவை ட்ரேயில் இடமில்லை" - - + "பயன்பாடுகளின் பட்டியல்" "முகப்பு" "அகற்று" "நிறுவல் நீக்கு" @@ -52,6 +51,8 @@ "அமைவு" "இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது." "பெயரிடப்படாத கோப்புறை" + + "பக்கம் %1$d / %2$d" "முகப்புத் திரை %1$d of %2$d" "புதிய முகப்புத் திரை பக்கம்" @@ -66,10 +67,8 @@ "அமைப்பு" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" - - - - + "முகப்புத் திரை சுழற்சியை அனுமதி" + "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" "தெரியாதது" "அகற்று" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 1c3ef146d9..1e9dd6b1df 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -35,8 +35,7 @@ "మరిన్ని అనువర్తనాల కోసం శోధించు" "ఈ హోమ్ స్క్రీన్‌లో ఖాళీ లేదు." "ఇష్టమైనవి ట్రేలో ఖాళీ లేదు" - - + "అనువర్తనాల జాబితా" "హోమ్" "తీసివేయి" "అన్ఇన్‌స్టాల్ చేయి" @@ -52,6 +51,8 @@ "సెటప్ చేయి" "ఇది సిస్టమ్ అనువర్తనం మరియు దీన్ని అన్‌ఇన్‌స్టాల్ చేయడం సాధ్యపడదు." "పేరు లేని ఫోల్డర్" + + "%2$dలో %1$dవ పేజీ" "%2$dలో %1$dవ హోమ్ స్క్రీన్" "కొత్త హోమ్ స్క్రీన్ పేజీ" @@ -66,10 +67,8 @@ "సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" - - - - + "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" + "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 7d58ba6c72..4372b17e32 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -35,8 +35,7 @@ "ค้นหาแอปเพิ่มเติม" "ไม่มีที่ว่างในหน้าจอหลักนี้" "ไม่มีพื้นที่เหลือในถาดรายการโปรด" - - + "รายชื่อแอป" "หน้าแรก" "นำออก" "ถอนการติดตั้ง" @@ -52,6 +51,8 @@ "ตั้งค่า" "นี่เป็นแอประบบและไม่สามารถถอนการติดตั้งได้" "โฟลเดอร์ที่ไม่มีชื่อ" + + "หน้า %1$d จาก %2$d" "หน้าจอหลัก %1$d จาก %2$d" "หน้าใหม่ในหน้าจอหลัก" @@ -66,10 +67,8 @@ "การตั้งค่า" "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" - - - - + "อนุญาตให้หมุนหน้าจอหลัก" + "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" "ไม่รู้จัก" "ลบ" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 6a000640b1..99cab072da 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -35,8 +35,7 @@ "Maghanap ng higit pang mga app" "Wala nang lugar sa Home screen na ito." "Wala nang lugar sa tray ng Mga Paborito" - - + "Listahan ng mga app" "Home" "Alisin" "I-uninstall" @@ -52,6 +51,8 @@ "I-setup" "Isa itong app ng system at hindi maaaring i-uninstall." "Walang Pangalang Folder" + + "Pahina %1$d ng %2$d" "Home screen %1$d ng %2$d" "Bagong page ng home screen" @@ -66,10 +67,8 @@ "Mga Setting" "Na-disable ng iyong admin" "Pangkalahatang-ideya" - - - - + "Payagan ang pag-rotate ng Home screen" + "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" "Hindi kilala" "Alisin" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 76814109ae..c52bad8283 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -35,8 +35,7 @@ "Başka uygulamalar ara" "Bu Ana ekranda yer kalmadı." "Favoriler tepsisinde başka yer kalmadı" - - + "Uygulamalar listesi" "Ana ekran" "Kaldır" "Yüklemeyi kaldır" @@ -52,6 +51,8 @@ "Kurulum" "Bu bir sistem uygulamasıdır ve yüklemesi kaldırılamaz." "Adsız Klasör" + + "Sayfa %1$d / %2$d" "Ana ekran %1$d / %2$d" "Yeni ana ekran sayfası" @@ -66,10 +67,8 @@ "Ayarlar" "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" - - - - + "Ana ekranı döndürmeye izin ver" + "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" "Bilinmiyor" "Kaldır" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 82251bc1e8..ebbf2795e5 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -35,8 +35,7 @@ "Шукати ще додатки" "На цьому головному екрані більше немає місця." "В області \"Вибране\" немає місця" - - + "Список додатків" "Головний екран" "Видалити" "Видалити" @@ -52,6 +51,8 @@ "Налаштування" "Це системна програма, її неможливо видалити." "Папка без назви" + + "Сторінка %1$d з %2$d" "Головний екран %1$d з %2$d" "Нова сторінка головного екрана" @@ -66,10 +67,8 @@ "Налаштування" "Вимкнув адміністратор" "Огляд" - - - - + "Дозволити обертання головного екрана" + "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" "Невідомо" "Видалити" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 1390cbe722..32ed80ca8b 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -35,8 +35,7 @@ "مزید ایپس تلاش کریں" "اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔" "پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے" - - + "ایپس کی فہرست" "ہوم" "ہٹائیں" "اَن انسٹال کریں" @@ -52,6 +51,8 @@ "ترتیب دیں" "یہ ایک سسٹم ایپ ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔" "بلا نام فولڈر" + + "‏صفحہ ‎%1$d از ‎%2$d" "‏ہوم اسکرین ‎%1$d از ‎%2$d" "نیا ہوم اسکرین صفحہ" @@ -66,10 +67,8 @@ "ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" - - - - + "ہوم اسکرین گھمانے کی اجازت دیں" + "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 7f7233e7ce..019f410e57 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -35,8 +35,7 @@ "Boshqa ilovalarni qidirish" "Uy ekranida bitta ham xona yo‘q." "Ajratilganlarda birorta ham xona yo‘q" - - + "Ilovalar ro‘yxati" "Bosh sahifa" "Olib tashlash" "O‘chirib tashlash" @@ -52,6 +51,8 @@ "Sozlash" "Bu tizim ilovasi, shuning uchun o‘chirib bo‘lmaydi." "Nomsiz jild" + + "%2$ddan %1$d ta sahifa" "Uy ekrani %2$ddan %1$d" "Yangi bosh ekran sahifasi" @@ -66,10 +67,8 @@ "Sozlamalar" "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" - - - - + "Asosiy ekranni aylantirishga ruxsat berish" + "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" "Noma’lum" "O‘chirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index deed0f7fc1..ed2a1de9ee 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -35,8 +35,7 @@ "Tìm kiếm thêm ứng dụng" "Không còn chỗ trên Màn hình chính này." "Không còn chỗ trong khay Mục yêu thích" - - + "Danh sách ứng dụng" "Màn hình chính" "Xóa" "Gỡ cài đặt" @@ -52,6 +51,8 @@ "Thiết lập" "Đây là ứng dụng hệ thống và không thể gỡ cài đặt." "Thư mục chưa đặt tên" + + "Trang %1$d / %2$d" "Màn hình chính %1$d / %2$d" "Trang màn hình chính mới" @@ -66,10 +67,8 @@ "Cài đặt" "Bị tắt bởi quản trị viên của bạn" "Tổng quan" - - - - + "Cho phép xoay Màn hình chính" + "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" "Không xác định" "Xóa" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 0d47bbb85d..c25047d047 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -52,6 +52,8 @@ "设置" "这是系统应用,无法卸载。" "未命名文件夹" + + "第%1$d页,共%2$d页" "主屏幕:第%1$d屏,共%2$d屏" "主屏幕新页面" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 4ff4f538fe..f2d699936e 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -35,8 +35,7 @@ "搜尋更多應用程式" "主畫面已無空間。" "我的收藏寄存區沒有足夠空間" - - + "應用程式清單" "主畫面" "移除" "解除安裝" @@ -52,6 +51,8 @@ "設定" "這是系統應用程式,無法將其解除安裝。" "未命名的資料夾" + + "第 %1$d 頁,共 %2$d 頁" "主畫面 %1$d,共 %2$d 個" "新主畫面頁面" @@ -66,10 +67,8 @@ "設定" "已由您的管理員停用" "概覽" - - - - + "允許主畫面旋轉" + "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" "不明" "移除" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index a8f4949e91..37548e4cd3 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -35,8 +35,7 @@ "搜尋更多應用程式" "這個主螢幕已無空間。" "「我的最愛」匣已無可用空間" - - + "應用程式清單" "主螢幕" "移除" "解除安裝" @@ -52,6 +51,8 @@ "設定" "這是系統應用程式,不可解除安裝。" "未命名的資料夾" + + "第 %1$d 頁,共 %2$d 頁" "主螢幕:第 %1$d 頁,共 %2$d 頁" "新的主畫面頁面" @@ -66,10 +67,8 @@ "設定" "已由您的管理員停用" "總覽" - - - - + "允許旋轉主螢幕" + "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" "不明" "移除" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 93a764ef0d..017dcd49c3 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -35,8 +35,7 @@ "Sesha izinhlelo zokusebenza eziningi" "Asisekho isikhala kulesi sikrini Sasekhaya." "Asisekho isikhala kwitreyi lezintandokazi" - - + "Uhlu lwezinhlelo zokusebenza" "Ikhaya" "Susa" "Khipha" @@ -52,6 +51,8 @@ "Ukumisa" "Lolu uhlelo lokusebenza lwesistimu futhi alikwazi ukukhishwa." "Ifolda engenagama" + + "Ikhasi elingu-%1$d kwangu-%2$d" "Isikrini sasekhaya esingu-%1$d se-%2$d" "Ikhasi elisha lesikrini sasekhaya" @@ -66,10 +67,8 @@ "Izilungiselelo" "Kukhutshazwe umlawuli wakho" "Ukubuka konke" - - - - + "Vumela ukuphendukiswa kwesikrini sasekhaya" + "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" "Akwaziwa" "Susa" From 96a4525b1ec2df6d81006bf6dc2cb9e450d53a76 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 19 Jul 2016 01:07:11 -0700 Subject: [PATCH 023/382] Import translations. DO NOT MERGE Change-Id: I15b9d9f301f377a5e1f7fed17dfbbff6d842cfce Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-az-rAZ/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-en-rAU/strings.xml | 3 +-- res/values-en-rGB/strings.xml | 3 +-- res/values-en-rIN/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-et-rEE/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-km-rKH/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lo-rLA/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 12 ++++-------- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-mn-rMN/strings.xml | 3 +-- res/values-mr-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-ne-rNP/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pa-rIN/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-si-rLK/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-te-rIN/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-vi/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 12 ++++-------- res/values-zh-rHK/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 77 files changed, 83 insertions(+), 166 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 4ffb771226..0a9aa4f59b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -51,8 +51,7 @@ "Stel op" "Dit is \'n stelselprogram en kan nie gedeïnstalleer word nie." "Naamlose vouer" - - + "Het %1$s gedeaktiveer" "Bladsy %1$d van %2$d" "Tuisskerm %1$d van %2$d" "Nuwe tuisskermbladsy" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3397aca7d7..fbf16b4077 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -51,8 +51,7 @@ "ማዋቀሪያ" "ይህ የስርዓት መተግበሪያ ነው እና ማራገፍ አይቻልም።" "ስም-አልባ አቃፊ" - - + "%1$s ተሰናክሏል" "ገጽ %1$d ከ%2$d" "መነሻ ማያ ገጽ %1$d ከ%2$d" "አዲስ የመነሻ ማያ ገጽ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index e7cd610f29..0b81d7d8ae 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -51,8 +51,7 @@ "الإعداد" "هذا تطبيق نظام وتتعذر إزالته." "مجلد بدون اسم" - - + "تم تعطيل %1$s" "‏الصفحة %1$d من %2$d" "‏الشاشة الرئيسية %1$d من %2$d" "صفحة الشاشة الرئيسية الجديدة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 556ee6e6a6..4c107224bc 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -51,8 +51,7 @@ "Quraşdırma" "Bu sistem tətbiqi olduğu üçün sistemdən silinə bilməz." "Adsız Qovluq" - - + "%1$s deaktiv edildi" "Səhifə %1$d of %2$d" "Əsas Səhifə ekranı %1$d of %2$d" "Yeni əsas ekran səhifəsi" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 5a91a70fc6..795ad8d660 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -51,8 +51,7 @@ "Настройване" "Това е системно приложение и не може да се деинсталира." "Папка без име" - - + "Деактивирахте %1$s" "Страница %1$d от %2$d" "Начален екран %1$d от %2$d" "Нова страница на началния екран" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index d00af245ac..c3179bcff0 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -51,8 +51,7 @@ "সেটআপ" "এটি একটি সিস্টেম অ্যাপ্লিকেশান এবং আনইনস্টল করা যাবে না৷" "নামবিহীন ফোল্ডার" - - + "%1$s অক্ষম করা হয়েছে" "%2$dটির মধ্যে %1$dটি পৃষ্ঠা" "%2$dটির %1$d নম্বর হোম স্ক্রীন" "নতুন হোম স্ক্রীনের পৃষ্ঠা" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 0f09c91892..31402b43af 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -51,8 +51,7 @@ "Configuració" "Aquesta aplicació és una aplicació del sistema i no es pot desinstal·lar." "Carpeta sense nom" - - + "S\'ha desactivat %1$s" "Pàgina %1$d de %2$d" "Pantalla d\'inici %1$d de %2$d" "Pàgina de la pantalla d\'inici nova" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 91e4aa0935..2c492cf9de 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -51,8 +51,7 @@ "Nastavení" "Toto je systémová aplikace a nelze ji odinstalovat." "Složka bez názvu" - - + "Aplikace %1$s je zakázána" "Strana %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 6829c88c33..133ec75e02 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -51,8 +51,7 @@ "Konfigurer" "Dette er en systemapp, som ikke kan afinstalleres." "Unavngiven mappe" - - + "%1$s er deaktiveret" "Side %1$d ud af %2$d" "Startskærm %1$d ud af %2$d" "Ny startskærm" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 20f54846f6..6a461f9d64 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -51,8 +51,7 @@ "Einrichten" "Dies ist eine Systemanwendung, die nicht deinstalliert werden kann." "Unbenannter Ordner" - - + "%1$s deaktiviert" "Seite %1$d von %2$d" "Startbildschirm %1$d von %2$d" "Neue Startbildschirmseite" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 90633eb86a..1399279c16 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -51,8 +51,7 @@ "Ρύθμιση" "Αυτή είναι μια εφαρμογή συστήματος και δεν είναι δυνατή η κατάργηση της εγκατάστασής της." "Φάκελος χωρίς όνομα" - - + "Η εφαρμογή %1$s είναι απενεργοποιημένη" "Σελίδα %1$d από %2$d" "Αρχική οθόνη %1$d από %2$d" "Νέα σελίδα αρχικής οθόνης" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 4507b7d8bc..c70e0debe9 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -51,8 +51,7 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" - - + "Disabled %1$s" "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 4507b7d8bc..c70e0debe9 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -51,8 +51,7 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" - - + "Disabled %1$s" "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 4507b7d8bc..c70e0debe9 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -51,8 +51,7 @@ "Setup" "This is a system app and can\'t be uninstalled." "Unnamed Folder" - - + "Disabled %1$s" "Page %1$d of %2$d" "Home screen %1$d of %2$d" "New home screen page" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index aac937508c..c6d12aad0c 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -51,8 +51,7 @@ "Configuración" "Esta es una aplicación del sistema y no se puede desinstalar." "Carpeta sin nombre" - - + "Se inhabilitó %1$s" "Página %1$d de %2$d" "Pantalla principal %1$d de %2$d" "Nueva página en la pantalla principal" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 367c9b085d..a200e92f21 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -51,8 +51,7 @@ "Configuración" "Esta aplicación es del sistema y no se puede desinstalar." "Carpeta sin nombre" - - + "Se ha inhabilitado %1$s" "Página %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nueva página de pantalla de inicio" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5f810c9af2..6e90d86ee9 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -51,8 +51,7 @@ "Seadistamine" "See on süsteemirakendus ja seda ei saa desinstallida." "Nimetu kaust" - - + "Rakendus %1$s on keelatud" "Leht %1$d/%2$d" "Avaekraan %1$d/%2$d" "Uus avaekraan" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 8fe826dea8..29356be88c 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -51,8 +51,7 @@ "Konfigurazioa" "Sistema-aplikazioa da hau eta ezin da desinstalatu." "Izenik gabeko karpeta" - - + "%1$s desgaituta dago" "%1$d/%2$d orria" "%1$d/%2$d hasierako pantaila" "Hasierako pantailaren orri berria" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 5fdf04131c..2e2acf133c 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -51,8 +51,7 @@ "تنظیم" "این برنامه سیستمی است و حذف نصب نمی‌شود." "پوشه بی‌نام" - - + "%1$s غیرفعال شد" "‏صفحه %1$d از %2$d" "‏صفحه اصلی %1$d از %2$d" "صفحه اصلی جدید" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 75951e22cd..c5e012344a 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -51,8 +51,7 @@ "Asetus" "Tämä on järjestelmäsovellus, eikä sitä voi poistaa." "Nimetön kansio" - - + "%1$s poistettiin käytöstä" "Sivu %1$d / %2$d" "Aloitusruutu %1$d/%2$d" "Uusi aloitusnäytön sivu" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 422308b28d..21b1afab8b 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -51,8 +51,7 @@ "Configuration" "Impossible de désinstaller cette application, car il s\'agit d\'une application système." "Dossier sans nom" - - + "L\'application %1$s est désactivée" "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 310e9335ec..d94954b08a 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -51,8 +51,7 @@ "Configuration" "Impossible de désinstaller cette application, car il s\'agit d\'une application système." "Dossier sans nom" - - + "%1$s est désactivé." "Page %1$d sur %2$d" "Écran d\'accueil %1$d sur %2$d" "Nouvelle page d\'écran d\'accueil" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 21b7e01917..efd5ec1ccb 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -51,8 +51,7 @@ "Configuración" "Esta aplicación é do sistema e non se pode desinstalar." "Cartafol sen nome" - - + "Desactivouse %1$s" "Páxina %1$d de %2$d" "Pantalla de inicio %1$d de %2$d" "Nova páxina da pantalla de inicio" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 6cc387ba97..55b7bb0c98 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -51,8 +51,7 @@ "સેટઅપ" "આ એક સિસ્ટમ ઍપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી." "અનામી ફોલ્ડર" - - + "%1$s અક્ષમ કરી" "%2$d માંથી %1$d પૃષ્ઠ" "%2$d માંથી %1$d હોમ સ્ક્રીન" "નવું હોમ સ્ક્રીન પૃષ્ઠ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 0a40726bf9..c86e1b2ec4 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -51,8 +51,7 @@ "सेटअप" "यह एक सिस्टम ऐप्लिकेशन है और इसे अनइंस्टॉल नहीं किया जा सकता." "अनामित फ़ोल्डर" - - + "%1$s अक्षम है" "पृष्ठ %2$d में से %1$d" "होम स्क्रीन %2$d में से %1$d" "नया होम स्‍क्रीन पृष्‍ठ" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 6e5f1235f4..303c4dd371 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -51,8 +51,7 @@ "Postavljanje" "Ovo je aplikacija sustava i ne može se ukloniti." "Neimenovana mapa" - - + "Aplikacija %1$s onemogućena" "Stranica %1$d od %2$d" "Početni zaslon %1$d od %2$d" "Nova stranica početnog zaslona" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index db5ff86b19..addf97702c 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -51,8 +51,7 @@ "Beállítás" "Ez egy rendszeralkalmazás, és nem lehet eltávolítani." "Névtelen mappa" - - + "A(z) %1$s letiltva" "%2$d/%1$d. oldal" "%2$d/%1$d. kezdőképernyő" "Új kezdőképernyő oldal" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 00b1bed21d..0502c14a26 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -51,8 +51,7 @@ "Կարգավորում" "Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:" "Անանուն պանակ" - - + "%1$s հավելվածն անջատված է" "Էջ %1$d՝ %2$d-ից" "Հիմնական էկրան %1$d` %2$d-ից" "Հիմնական էկրանի նոր էջ" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index f48278f0a4..464c99d490 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -51,8 +51,7 @@ "Siapkan" "Ini adalah aplikasi sistem dan tidak dapat dicopot pemasangannya." "Folder Tanpa Nama" - - + "%1$s dinonaktifkan" "Laman %1$d dari %2$d" "Layar utama %1$d dari %2$d" "Laman layar utama baru" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index e97c1b7d04..756d058f3e 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -51,8 +51,7 @@ "Uppsetning" "Þetta er kerfisforrit sem ekki er hægt að fjarlægja." "Ónefnd mappa" - - + "Óvirkt %1$s" "Síða %1$d af %2$d" "Heimaskjár %1$d af %2$d" "Ný síða á heimaskjá" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index d03ece9b8c..37fd3136ee 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -51,8 +51,7 @@ "Configurazione" "Questa è un\'app di sistema e non può essere disinstallata." "Cartella senza nome" - - + "App %1$s disattivata" "Pagina %1$d di %2$d" "Schermata Home %1$d di %2$d" "Nuova pagina Schermata Home" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index fdf5cc53fe..db2470b14c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -51,8 +51,7 @@ "הגדר" "זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה." "תיקיה ללא שם" - - + "%1$s מושבתת" "‏דף %1$d מתוך %2$d" "‏מסך דף הבית %1$d מתוך %2$d" "מסך דף הבית חדש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 8368042584..b638f03380 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -51,8 +51,7 @@ "セットアップ" "このシステムアプリはアンインストールできません。" "名前のないフォルダ" - - + "「%1$s」は無効です" "%1$d/%2$dページ" "ホーム画面: %1$d/%2$d" "新しいホーム画面ページ" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 64f5fb0b52..ac1ada2c80 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -51,8 +51,7 @@ "დაყენება" "ეს სისტემური აპია და მისი წაშლა შეუძლებელია." "უსახელო საქაღალდე" - - + "%1$s გაითიშა" "გვერდი %1$d %2$d-დან" "მთავარი ეკრანი %1$d, %2$d-დან" "მთავარი ეკრანის ახალი გვერდი" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 26b1dafc1a..c88a8b6a83 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -51,8 +51,7 @@ "Орнату" "Бұл жүйе қолданбасы, сондықтан оны алу мүмкін емес." "Атауы жоқ қалта" - - + "%1$s өшірілді" "%1$d бет, барлығы %2$d" "%1$d негізгі экран, барлығы %2$d" "Жаңа негізгі экран беті" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index bcb1eee5e5..ce2f501a2c 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -51,8 +51,7 @@ "រៀបចំ" "នេះ​​​ជា​កម្មវិធី​ប្រព័ន្ធ មិន​អាច​លុប​បាន​ទេ។" "ថត​គ្មាន​ឈ្មោះ" - - + "បានបិទដំណើរការ %1$s" "ទំព័រ %1$d នៃ %2$d" "អេក្រង់​ដើម %1$d នៃ %2$d" "ទំព័រអេក្រង់ដើមថ្មី" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 9b50fe8540..c5d7e09c7f 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -51,8 +51,7 @@ "ಸೆಟಪ್" "ಇದೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಗಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಹೆಸರಿಲ್ಲದ ಫೋಲ್ಡರ್" - - + "%1$s ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "%2$d ರಲ್ಲಿ %1$d ಪುಟ" "%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ" "ಹೊಸ ಮುಖಪುಟ ಪರದೆ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 19ec6ebf1f..49d685165a 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -51,8 +51,7 @@ "설정" "시스템 앱은 제거할 수 없습니다." "이름이 없는 폴더" - - + "%1$s 사용 안함" "페이지 %1$d/%2$d" "홈 화면 %1$d/%2$d" "새로운 메인 스크린 페이지" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 25c4672de3..a9b7ec0466 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -51,8 +51,7 @@ "Орнотуу" "Бул системдик колдонмо жана аны чечкенге болбойт." "Аты жок фолдер" - - + "%1$s өчүрүлгөн" "%2$d ичинен %1$d барак" "Үй экраны %2$d ичинен %1$d" "Жаңы башкы экран барагы" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 37dd3e04ef..323408920a 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -51,8 +51,7 @@ "ຕິດຕັ້ງ" "ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້." "ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່" - - + "ປິດການນຳໃຊ້ %1$s ແລ້ວ" "ໜ້າ %1$d ຈາກ %2$d" "ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d" "ໜ້າ​ຂອງ​ໜ້າ​ຈໍ​ຫຼັກ​ໃໝ່" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 83ca1817da..e0cced5b59 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -51,8 +51,7 @@ "Sąranka" "Tai sistemos programa ir jos negalima pašalinti." "Aplankas be pavadinimo" - - + "„%1$s“ išjungta" "%1$d psl. iš %2$d" "%1$d pagrindinis ekranas iš %2$d" "Naujas pagrindinio ekrano puslapis" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 2b199636e8..4fb61644ac 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -35,8 +35,7 @@ "Meklēt citas lietotnes" "Šajā sākuma ekrānā vairs nav vietas." "Izlases joslā vairs nav vietas." - - + "Lietotņu saraksts" "Sākums" "Noņemt" "Atinstalēt" @@ -52,8 +51,7 @@ "Notiek iestatīšana" "Šī ir sistēmas lietotne, un to nevar atinstalēt." "Mape bez nosaukuma" - - + "Lietotne %1$s ir atspējota" "%1$d. lapa no %2$d" "Sākuma ekrāns: %1$d no %2$d" "Jauna sākuma ekrāna lapa" @@ -68,10 +66,8 @@ "Iestatījumi" "Atspējojis administrators" "Kopsavilkums" - - - - + "Atļaut sākuma ekrāna pagriešanu" + "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." "Nezināma" "Noņemt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 62f6dbe892..2c2c8e9b40 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -51,8 +51,7 @@ "Поставување" "Ова е системска апликација и не може да се деинсталира." "Неименувана папка" - - + "%1$s е оневозможена" "Страница %1$d од %2$d" "Екран на почетна страница %1$d од %2$d" "Нова страница на почетен екран" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 2db9c236f8..9cf75f3b2b 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -51,8 +51,7 @@ "സജ്ജീകരിക്കുക" "ഇതൊരു സിസ്‌റ്റം അപ്ലിക്കേഷനായതിനാൽ അൺഇൻസ്‌റ്റാളുചെയ്യാനാവില്ല." "പേരുനൽകാത്ത ഫോൾഡർ" - - + "%1$s പ്രവർത്തനരഹിതമാക്കി" "പേജ് %1$d / %2$d" "ഹോം സ്‌ക്രീൻ %1$d / %2$d" "പുതിയ ഹോം സ്ക്രീൻ പേജ്" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 95add4c2a6..de4258aa85 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -51,8 +51,7 @@ "Тохируулга" "Энэ апп нь системийн апп ба устгах боломжгүй." "Нэргүй фолдер" - - + "%1$s-г идэвхгүй болгосон" "%2$d-н %1$d хуудас" "%2$d-н Нүүр дэлгэц %1$d" "Шинэ үндсэн нүүр хуудас" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 98d0d441be..3a8ab8ab49 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -51,8 +51,7 @@ "सेटअप" "हा सिस्टम अॅप आहे आणि विस्थापित केला जाऊ शकत नाही." "अनामित फोल्डर" - - + "%1$s अक्षम केला आहे" "%2$d पैकी %1$d पृष्ठ" "%2$d पैकी %1$d मुख्य स्क्रीन" "नवीन मुख्य स्क्रीन पृष्ठ" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 7c3af151e3..9c7c609fd2 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -51,8 +51,7 @@ "Persediaan" "Ini ialah apl sistem dan tidak boleh dinyahpasang." "Folder Tanpa Nama" - - + "Melumpuhkan %1$s" "Halaman %1$d daripada %2$d" "Skrin Laman Utama %1$d daripada %2$d" "Halaman skrin utama baharu" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 373a7ed9bb..4bf15e7fea 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -51,8 +51,7 @@ "စဖွင့်သတ်မှတ်ရန်" "ဤအပ်ပလီကေးရှင်းမှာ စစ်စတန်ပိုင်းဆိုင်ရာ အပ်ပလီကေးရှင်းဖြစ်ပါသည်။ ထုတ်ပစ်၍ မရပါ" "အမည်မရှိအကန့်" - - + "%1$s ကို ပိတ်ထားသည်" "စာမျက်နှာ %1$d မှ %2$d" "ပင်မစာမျက်နှာ %1$d မှ %2$d" "ပင်မမျက်နှာပြင် စာမျက်နှာသစ်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 6db69f47a6..57d12f7e19 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -51,8 +51,7 @@ "Konfigurering" "Dette er en systemapp som ikke kan avinstalleres." "Mappe uten navn" - - + "Slo av %1$s" "Side %1$d av %2$d" "Startside %1$d av %2$d" "Ny side på startskjermen" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index f670fb1114..aa971e8fc7 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -51,8 +51,7 @@ "सेटअप" "यो प्रणाली अनुप्रयोग हो र यसलाई स्थापना रद्द गर्न सकिँदैन।" "बेनाम फोल्डर" - - + "असक्षम पारिएको %1$s" "पृष्ठ %2$d को %1$d" "गृह स्क्रिन %1$d को %2$d" "नयाँ गृह स्क्रिन पृष्ठ" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 077a968162..8d0854fcda 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -51,8 +51,7 @@ "Configuratie" "Dit is een systeemapp die niet kan worden verwijderd." "Naamloze map" - - + "%1$s is uitgeschakeld" "Pagina %1$d van %2$d" "Startscherm %1$d van %2$d" "Nieuwe startschermpagina" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index d2b827e36c..14d2ed89bb 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -51,8 +51,7 @@ "ਸਥਾਪਤ ਕਰੋ" "ਇਹ ਇੱਕ ਸਿਸਟਮ ਐਪ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" "ਬਿਨਾਂ ਨਾਮ ਦਿੱਤਾ ਫੋਲਡਰ" - - + "%1$s ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ" "ਸਫ਼ਾ %2$d ਦਾ %1$d" "ਹੋਮ ਸਕ੍ਰੀਨ %2$d ਦੀ %1$d" "ਨਵਾਂ ਹੋਮ ਸਕ੍ਰੀਨ ਸਫ਼ਾ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 9011a47f1f..b83fecf215 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -51,8 +51,7 @@ "Konfiguracja" "To aplikacja systemowa i nie można jej odinstalować." "Folder bez nazwy" - - + "Aplikacja %1$s jest wyłączona" "Strona %1$d z %2$d" "Ekran główny %1$d z %2$d" "Nowa strona ekranu głównego" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 33740de38f..da907aa789 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -51,8 +51,7 @@ "Configuração" "É uma aplicação de sistema e não pode ser desinstalada." "Pasta sem nome" - - + "%1$s desativado" "Página %1$d de %2$d" "Ecrã principal %1$d de %2$d" "Nova página do ecrã principal" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 0a0dc46775..94bba0155a 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -51,8 +51,7 @@ "Configuração" "Este é um app do sistema e não pode ser desinstalado." "Pasta sem nome" - - + "%1$s desativado" "Página %1$d de %2$d" "Tela inicial %1$d de %2$d" "Nova página na tela inicial" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 0d84e0d048..c6b470c38c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -51,8 +51,7 @@ "Configurați" "Aceasta este o aplicație de sistem și nu poate fi dezinstalată." "Dosar fără nume" - - + "S-a dezactivat %1$s" "Pagina %1$d din %2$d" "Ecranul de pornire %1$d din %2$d" "Pagină nouă pe ecranul de pornire" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b56b184385..b814a27c36 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -51,8 +51,7 @@ "Настройка" "Это системное приложение, его нельзя удалить." "Папка без названия" - - + "Приложение %1$s отключено" "Стр. %1$d из %2$d" "Главные экран %1$d из %2$d" "Новый экран" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index a9d11662a1..966d019174 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -51,8 +51,7 @@ "ස්ථාපනය කරන්න" "මෙය පද්ධති යෙදුමක් වන අතර අස්ථාපනය කළ නොහැක." "නම් නොකළ ෆෝල්ඩරය" - - + "%1$s අබල කෙරිණි" "%2$d හි %1$d පිටුව" "මුල් පිටු තිරය %2$d හි %1$d" "නව මුල් පිටුව" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index dfcc79084f..9a403a7a4f 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -51,8 +51,7 @@ "Nastavenie" "Toto je systémová aplikácia a nedá sa odinštalovať." "Nepomenovaný priečinok" - - + "Aplikácia %1$s je zakázaná" "Stránka %1$d z %2$d" "Plocha %1$d z %2$d" "Nová stránka plochy" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 0a481ee052..0cb91900aa 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -51,8 +51,7 @@ "Nastavitev" "To je sistemska aplikacija in je ni mogoče odstraniti." "Neimenovana mapa" - - + "Aplikacija %1$s je onemogočena" "Stran %1$d od %2$d" "Začetni zaslon %1$d od %2$d" "Nova stran na začetnem zaslonu" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 1a72965f02..0850c55edd 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -51,8 +51,7 @@ "Konfiguro" "Ky është aplikacion sistemi dhe nuk mund të çinstalohet." "Dosje e paemërtuar" - - + "%1$s u çaktivizua" "Faqja: %1$d nga gjithsej %2$d" "Ekrani bazë: %1$d nga gjithsej %2$d" "Faqja e ekranit të ri kryesor" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 5a9c89af4e..bac6ab1da3 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -51,8 +51,7 @@ "Подешавање" "Ово је системска апликација и не може да се деинсталира." "Неименовани директоријум" - - + "Апликација %1$s је онемогућена" "%1$d. страница од %2$d" "%1$d. почетни екран од %2$d" "Нова страница почетног екрана" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6b68c83312..40c5a2563a 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -51,8 +51,7 @@ "Konfiguration" "Det här är en systemapp som inte kan avinstalleras." "Namnlös mapp" - - + "%1$s har inaktiverats" "Sidan %1$d av %2$d" "Startskärmen %1$d av %2$d" "Ny sida på startskärmen" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index a0f4c77fd2..75b29524b6 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -51,8 +51,7 @@ "Sanidi" "Hii ni programu ya mfumo na haiwezi kuondolewa." "Folda isiyo na jina" - - + "%1$s imezimwa" "Ukurasa%1$d wa %2$d" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 203d1273f4..4413cc7c7e 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -51,8 +51,7 @@ "அமைவு" "இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது." "பெயரிடப்படாத கோப்புறை" - - + "%1$s முடக்கப்பட்டது" "பக்கம் %1$d / %2$d" "முகப்புத் திரை %1$d of %2$d" "புதிய முகப்புத் திரை பக்கம்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 1e9dd6b1df..3951fff2f6 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -51,8 +51,7 @@ "సెటప్ చేయి" "ఇది సిస్టమ్ అనువర్తనం మరియు దీన్ని అన్‌ఇన్‌స్టాల్ చేయడం సాధ్యపడదు." "పేరు లేని ఫోల్డర్" - - + "%1$s నిలిపివేయబడింది" "%2$dలో %1$dవ పేజీ" "%2$dలో %1$dవ హోమ్ స్క్రీన్" "కొత్త హోమ్ స్క్రీన్ పేజీ" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 4372b17e32..90e9bcaf3a 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -51,8 +51,7 @@ "ตั้งค่า" "นี่เป็นแอประบบและไม่สามารถถอนการติดตั้งได้" "โฟลเดอร์ที่ไม่มีชื่อ" - - + "ปิดใช้ %1$s" "หน้า %1$d จาก %2$d" "หน้าจอหลัก %1$d จาก %2$d" "หน้าใหม่ในหน้าจอหลัก" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 99cab072da..997a4eb546 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -51,8 +51,7 @@ "I-setup" "Isa itong app ng system at hindi maaaring i-uninstall." "Walang Pangalang Folder" - - + "Naka-disable ang %1$s" "Pahina %1$d ng %2$d" "Home screen %1$d ng %2$d" "Bagong page ng home screen" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index c52bad8283..6f7a19c4c4 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -51,8 +51,7 @@ "Kurulum" "Bu bir sistem uygulamasıdır ve yüklemesi kaldırılamaz." "Adsız Klasör" - - + "%1$s devre dışı" "Sayfa %1$d / %2$d" "Ana ekran %1$d / %2$d" "Yeni ana ekran sayfası" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index ebbf2795e5..5f240fe888 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -51,8 +51,7 @@ "Налаштування" "Це системна програма, її неможливо видалити." "Папка без назви" - - + "%1$s вимкнено" "Сторінка %1$d з %2$d" "Головний екран %1$d з %2$d" "Нова сторінка головного екрана" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 32ed80ca8b..9bb683cacb 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -51,8 +51,7 @@ "ترتیب دیں" "یہ ایک سسٹم ایپ ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔" "بلا نام فولڈر" - - + "%1$s غیر فعال ہے" "‏صفحہ ‎%1$d از ‎%2$d" "‏ہوم اسکرین ‎%1$d از ‎%2$d" "نیا ہوم اسکرین صفحہ" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 019f410e57..5e76c6fb64 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -51,8 +51,7 @@ "Sozlash" "Bu tizim ilovasi, shuning uchun o‘chirib bo‘lmaydi." "Nomsiz jild" - - + "%1$s ilovasi o‘chirib qo‘yildi" "%2$ddan %1$d ta sahifa" "Uy ekrani %2$ddan %1$d" "Yangi bosh ekran sahifasi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index ed2a1de9ee..82e463f4d6 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -51,8 +51,7 @@ "Thiết lập" "Đây là ứng dụng hệ thống và không thể gỡ cài đặt." "Thư mục chưa đặt tên" - - + "Đã vô hiệu hóa %1$s" "Trang %1$d / %2$d" "Màn hình chính %1$d / %2$d" "Trang màn hình chính mới" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index c25047d047..d46585a9c5 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -35,8 +35,7 @@ "搜索更多应用" "此主屏幕上已没有空间。" "收藏栏已满" - - + "应用列表" "主屏幕" "移除" "卸载" @@ -52,8 +51,7 @@ "设置" "这是系统应用,无法卸载。" "未命名文件夹" - - + "已停用%1$s" "第%1$d页,共%2$d页" "主屏幕:第%1$d屏,共%2$d屏" "主屏幕新页面" @@ -68,10 +66,8 @@ "设置" "已被您的管理员停用" "概览" - - - - + "允许旋转主屏幕" + "手机旋转时" "当前的显示设置不允许旋转设备" "未知" "移除" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index f2d699936e..d72865b82e 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -51,8 +51,7 @@ "設定" "這是系統應用程式,無法將其解除安裝。" "未命名的資料夾" - - + "「%1$s」已停用" "第 %1$d 頁,共 %2$d 頁" "主畫面 %1$d,共 %2$d 個" "新主畫面頁面" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 37548e4cd3..ae9816326a 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -51,8 +51,7 @@ "設定" "這是系統應用程式,不可解除安裝。" "未命名的資料夾" - - + "已停用 %1$s" "第 %1$d 頁,共 %2$d 頁" "主螢幕:第 %1$d 頁,共 %2$d 頁" "新的主畫面頁面" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 017dcd49c3..991056a434 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -51,8 +51,7 @@ "Ukumisa" "Lolu uhlelo lokusebenza lwesistimu futhi alikwazi ukukhishwa." "Ifolda engenagama" - - + "Kukhutshaziwe %1$s" "Ikhasi elingu-%1$d kwangu-%2$d" "Isikrini sasekhaya esingu-%1$d se-%2$d" "Ikhasi elisha lesikrini sasekhaya" From 7fa62449ac0b6dc32755a91e94d83ba4a0e9f49c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 25 Jul 2016 08:59:21 -0700 Subject: [PATCH 024/382] Import translations. DO NOT MERGE Change-Id: Ie2f60d888224a30b2a3590131b09a4f1241dad59 Auto-generated-cl: translation import --- res/values-ms-rMY/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 9c7c609fd2..073a9db08e 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -51,7 +51,7 @@ "Persediaan" "Ini ialah apl sistem dan tidak boleh dinyahpasang." "Folder Tanpa Nama" - "Melumpuhkan %1$s" + "%1$s dilumpuhkan" "Halaman %1$d daripada %2$d" "Skrin Laman Utama %1$d daripada %2$d" "Halaman skrin utama baharu" From a21401ad9eca04a607f871bcb5fffd08c44aa935 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 28 Jul 2016 18:58:07 -0700 Subject: [PATCH 025/382] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 30413963 Change-Id: Ia648babe5145a5d82113993a4bc408e4e0b8c23f --- res/values-af/strings.xml | 4 ++++ res/values-am/strings.xml | 4 ++++ res/values-ar/strings.xml | 4 ++++ res/values-az-rAZ/strings.xml | 4 ++++ res/values-bg/strings.xml | 4 ++++ res/values-bn-rBD/strings.xml | 4 ++++ res/values-ca/strings.xml | 4 ++++ res/values-cs/strings.xml | 4 ++++ res/values-da/strings.xml | 4 ++++ res/values-de/strings.xml | 4 ++++ res/values-el/strings.xml | 4 ++++ res/values-en-rAU/strings.xml | 4 ++++ res/values-en-rGB/strings.xml | 4 ++++ res/values-en-rIN/strings.xml | 4 ++++ res/values-es-rUS/strings.xml | 4 ++++ res/values-es/strings.xml | 4 ++++ res/values-et-rEE/strings.xml | 4 ++++ res/values-eu-rES/strings.xml | 4 ++++ res/values-fa/strings.xml | 4 ++++ res/values-fi/strings.xml | 4 ++++ res/values-fr-rCA/strings.xml | 4 ++++ res/values-fr/strings.xml | 4 ++++ res/values-gl-rES/strings.xml | 4 ++++ res/values-gu-rIN/strings.xml | 4 ++++ res/values-hi/strings.xml | 4 ++++ res/values-hr/strings.xml | 4 ++++ res/values-hu/strings.xml | 4 ++++ res/values-hy-rAM/strings.xml | 4 ++++ res/values-in/strings.xml | 4 ++++ res/values-is-rIS/strings.xml | 4 ++++ res/values-it/strings.xml | 4 ++++ res/values-iw/strings.xml | 4 ++++ res/values-ja/strings.xml | 4 ++++ res/values-ka-rGE/strings.xml | 4 ++++ res/values-kk-rKZ/strings.xml | 4 ++++ res/values-km-rKH/strings.xml | 4 ++++ res/values-kn-rIN/strings.xml | 4 ++++ res/values-ko/strings.xml | 4 ++++ res/values-ky-rKG/strings.xml | 4 ++++ res/values-lo-rLA/strings.xml | 4 ++++ res/values-lt/strings.xml | 4 ++++ res/values-lv/strings.xml | 4 ++++ res/values-mk-rMK/strings.xml | 4 ++++ res/values-ml-rIN/strings.xml | 4 ++++ res/values-mn-rMN/strings.xml | 4 ++++ res/values-mr-rIN/strings.xml | 4 ++++ res/values-ms-rMY/strings.xml | 4 ++++ res/values-my-rMM/strings.xml | 4 ++++ res/values-nb/strings.xml | 4 ++++ res/values-ne-rNP/strings.xml | 4 ++++ res/values-nl/strings.xml | 4 ++++ res/values-pa-rIN/strings.xml | 4 ++++ res/values-pl/strings.xml | 4 ++++ res/values-pt-rPT/strings.xml | 4 ++++ res/values-pt/strings.xml | 4 ++++ res/values-ro/strings.xml | 4 ++++ res/values-ru/strings.xml | 4 ++++ res/values-si-rLK/strings.xml | 4 ++++ res/values-sk/strings.xml | 4 ++++ res/values-sl/strings.xml | 4 ++++ res/values-sq-rAL/strings.xml | 4 ++++ res/values-sr/strings.xml | 4 ++++ res/values-sv/strings.xml | 4 ++++ res/values-sw/strings.xml | 4 ++++ res/values-ta-rIN/strings.xml | 4 ++++ res/values-te-rIN/strings.xml | 4 ++++ res/values-th/strings.xml | 4 ++++ res/values-tl/strings.xml | 4 ++++ res/values-tr/strings.xml | 4 ++++ res/values-uk/strings.xml | 4 ++++ res/values-ur-rPK/strings.xml | 4 ++++ res/values-uz-rUZ/strings.xml | 4 ++++ res/values-vi/strings.xml | 4 ++++ res/values-zh-rCN/strings.xml | 4 ++++ res/values-zh-rHK/strings.xml | 4 ++++ res/values-zh-rTW/strings.xml | 4 ++++ res/values-zu/strings.xml | 4 ++++ 77 files changed, 308 insertions(+) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 0a9aa4f59b..90dc094c30 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -26,6 +26,8 @@ "Program is nie beskikbaar nie" "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" + + "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Verminder breedte" "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" + + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index fbf16b4077..fa4e7d2633 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -26,6 +26,8 @@ "መተግበሪያ አይገኝም" "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" + + "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" @@ -100,4 +102,6 @@ "ስፋት ይቀንሱ" "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 0b81d7d8ae..f8057cea6c 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -26,6 +26,8 @@ "التطبيق ليس متاحًا" "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" + + "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" @@ -100,4 +102,6 @@ "تقليل العرض" "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" + + diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 4c107224bc..0de22e054e 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -26,6 +26,8 @@ "Tətbiq əlçatmazdır" "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" + + "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Eni azaldın" "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" + + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 795ad8d660..00c8db84a4 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -26,6 +26,8 @@ "Приложението не е налично" "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" + + "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Намаляване на ширината" "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" + + diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index c3179bcff0..9ad21d4ac8 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -26,6 +26,8 @@ "অ্যাপ্লিকেশান অনুপলব্ধ" "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" + + "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" @@ -100,4 +102,6 @@ "প্রস্থ কমান" "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 31402b43af..a54af03b8c 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -26,6 +26,8 @@ "L\'aplicació no està disponible." "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." + + "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Redueix l\'amplada" "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 2c492cf9de..fdb83229df 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -26,6 +26,8 @@ "Aplikace není k dispozici." "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." + + "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Snížit šířku" "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 133ec75e02..839a985ab8 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -26,6 +26,8 @@ "Appen er ikke tilgængelig" "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" + + "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reducer bredden" "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 6a461f9d64..0c1c435f01 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -26,6 +26,8 @@ "App nicht verfügbar" "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" + + "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Breite verringern" "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 1399279c16..786cf251de 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,6 +26,8 @@ "Η εφαρμογή δεν είναι διαθέσιμη" "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" + + "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" @@ -100,4 +102,6 @@ "μείωση του πλάτους" "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" + + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c70e0debe9..dcd394aa22 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -26,6 +26,8 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" + + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index c70e0debe9..dcd394aa22 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -26,6 +26,8 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" + + diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index c70e0debe9..dcd394aa22 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -26,6 +26,8 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" + + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c6d12aad0c..304eab9b1d 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -26,6 +26,8 @@ "La aplicación no está disponible." "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" + + "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reducir el ancho" "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index a200e92f21..5f5f728964 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -26,6 +26,8 @@ "La aplicación no está disponible" "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" + + "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reducir ancho" "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" + + diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 6e90d86ee9..7e21c81dac 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -26,6 +26,8 @@ "Rakendus ei ole saadaval" "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" + + "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Vähenda laiust" "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" + + diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 29356be88c..441f1516b8 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -26,6 +26,8 @@ "Ez dago erabilgarri aplikazioa" "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" + + "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Txikitu zabalera" "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 2e2acf133c..24ecc7e89b 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -26,6 +26,8 @@ "برنامه در دسترس نیست" "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" + + "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" @@ -100,4 +102,6 @@ "کاهش عرض" "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index c5e012344a..ccc5c9f58a 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -26,6 +26,8 @@ "Sovellus ei ole käytettävissä" "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" + + "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Vähennä leveyttä" "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." + + diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 21b1afab8b..f8a656316b 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -26,6 +26,8 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" + + "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" @@ -100,4 +102,6 @@ "Diminuer la largeur" "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index d94954b08a..980737053d 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -26,6 +26,8 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." + + "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" @@ -100,4 +102,6 @@ "Diminuer la largeur" "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." + + diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index efd5ec1ccb..7387d082c5 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -26,6 +26,8 @@ "A aplicación non está dispoñible" "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" + + "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reducir ancho" "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" + + diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 55b7bb0c98..06775ffda1 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -26,6 +26,8 @@ "ઍપ્લિકેશન ઉપલબ્ધ નથી" "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" + + "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" @@ -100,4 +102,6 @@ "પહોળાઈ ઘટાડો" "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index c86e1b2ec4..754d820702 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -26,6 +26,8 @@ "ऐप्स उपलब्ध नहीं है" "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" + + "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" @@ -100,4 +102,6 @@ "चौड़ाई घटाएं" "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" + + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 303c4dd371..c64a39d0aa 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -26,6 +26,8 @@ "Aplikacija nije dostupna" "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" + + "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Smanjenje širine" "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index addf97702c..198fcab13f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -26,6 +26,8 @@ "Az alkalmazás nem érhető el" "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" + + "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Szélesség csökkentése" "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" + + diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 0502c14a26..6c6a9c95b5 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -26,6 +26,8 @@ "Հավելվածը հասանելի չէ" "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" + + "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" @@ -100,4 +102,6 @@ "Նվազեցնել լայնությունը" "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 464c99d490..581b825379 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -26,6 +26,8 @@ "Aplikasi tidak tersedia" "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" + + "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Kurangi lebar" "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" + + diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 756d058f3e..f35f187a0f 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -26,6 +26,8 @@ "Forritið er ekki í boði" "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" + + "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Minnka breidd" "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" + + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 37fd3136ee..78cb918ddc 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -26,6 +26,8 @@ "App non disponibile" "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" + + "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Riduci larghezza" "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index db2470b14c..97cb59af9f 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -26,6 +26,8 @@ "האפליקציה אינה זמינה" "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" + + "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" @@ -100,4 +102,6 @@ "הקטן רוחב" "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index b638f03380..c7eeae5042 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -26,6 +26,8 @@ "このアプリは使用できません" "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" + + "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" @@ -100,4 +102,6 @@ "幅を狭くする" "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" + + diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index ac1ada2c80..bdb52ed25d 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -26,6 +26,8 @@ "აპი მიუწვდომელია" "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" + + "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" @@ -100,4 +102,6 @@ "სიგანის შემცირება" "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" + + diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index c88a8b6a83..d459789763 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -26,6 +26,8 @@ "Қолданба қол жетімді емес" "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" + + "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Енін азайту" "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" + + diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index ce2f501a2c..a66e66a451 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -26,6 +26,8 @@ "មិន​មាន​កម្មវិធី" "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" + + "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" @@ -100,4 +102,6 @@ "បន្ថយទទឹង" "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" + + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index c5d7e09c7f..9b8680e4a8 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -26,6 +26,8 @@ "ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ" "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + + "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" @@ -100,4 +102,6 @@ "ಅಗಲವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" + + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 49d685165a..0e7dc11eb4 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -26,6 +26,8 @@ "앱을 사용할 수 없음" "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" + + "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" @@ -100,4 +102,6 @@ "폭 줄이기" "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" + + diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index a9b7ec0466..62b828e739 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -26,6 +26,8 @@ "Колдонмо жеткиликтүү эмес" "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" + + "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Ичкертүү" "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" + + diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 323408920a..07aa0aaa73 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -26,6 +26,8 @@ "ແອັບຯ​ໃຊ້​ບໍ່​ໄດ້" "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" + + "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" @@ -100,4 +102,6 @@ "ຫຼຸດ​ລວງ​ກ້​ວາງ​ລົງ" "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index e0cced5b59..0269ff65ec 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -26,6 +26,8 @@ "Programa nepasiekiama" "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" + + "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Sumažinti plotį" "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 4fb61644ac..849355d649 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -26,6 +26,8 @@ "Lietotne nav pieejama." "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" + + "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Samazināt platumu" "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." + + diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 2c2c8e9b40..84c52ce037 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -26,6 +26,8 @@ "Апликацијата не е достапна" "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" + + "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Намали ширина" "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" + + diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 9cf75f3b2b..eada1cab83 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -26,6 +26,8 @@ "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" + + "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" @@ -100,4 +102,6 @@ "വീതി കുറയ്‌ക്കുക" "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" + + diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index de4258aa85..7680c6d787 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -26,6 +26,8 @@ "Апп-г ашиглах боломжгүй" "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" + + "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Нарийсгах" "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" + + diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 3a8ab8ab49..7d88d2e816 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -26,6 +26,8 @@ "अॅप उपलब्ध नाही" "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" + + "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" @@ -100,4 +102,6 @@ "रुंदी कमी करा" "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" + + diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 073a9db08e..1c93fb69ed 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -26,6 +26,8 @@ "Apl tidak tersedia" "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" + + "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" @@ -100,4 +102,6 @@ "Kurangkan kelebaran" "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" + + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 4bf15e7fea..81013672b2 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -26,6 +26,8 @@ "အက်ပ်လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" + + "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" @@ -100,4 +102,6 @@ "အကျယ်အား လျှော့ပါ" "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 57d12f7e19..7487ad606c 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -26,6 +26,8 @@ "Appen er ikke tilgjengelig" "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" + + "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reduser bredden" "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" + + diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index aa971e8fc7..5df3d1fd48 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -26,6 +26,8 @@ "अनुप्रयोग उपलब्ध छैन" "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" + + "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" @@ -100,4 +102,6 @@ "चौडाइ घटाउनुहोस्" "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 8d0854fcda..cfaa8b4ca3 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -26,6 +26,8 @@ "App is niet beschikbaar" "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" + + "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Breedte verkleinen" "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" + + diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 14d2ed89bb..3cf6094a73 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -26,6 +26,8 @@ "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" + + "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" @@ -100,4 +102,6 @@ "ਚੌੜਾਈ ਘਟਾਓ" "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" + + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index b83fecf215..139872b45c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -26,6 +26,8 @@ "Aplikacja niedostępna" "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" + + "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Zmniejsz szerokość" "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index da907aa789..20a2a8c499 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -26,6 +26,8 @@ "A aplicação não está disponível" "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" + + "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Diminuir largura" "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" + + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 94bba0155a..9f98d0384c 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -26,6 +26,8 @@ "O app não está disponível" "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" + + "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Diminuir largura" "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c6b470c38c..f4857667e4 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -26,6 +26,8 @@ "Aplicația nu este disponibilă" "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" + + "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Reduceți lățimea" "Reduceți înălțimea" "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b814a27c36..a5cc5c468b 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -26,6 +26,8 @@ "Приложение недоступно" "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" + + "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" @@ -100,4 +102,6 @@ "Уменьшить ширину" "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" + + diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 966d019174..f3e60a6ff1 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -26,6 +26,8 @@ "යෙදුම නොතිබේ" "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" + + "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" @@ -100,4 +102,6 @@ "පළල අඩු කරන්න" "උස අඩු කරන්න" "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 9a403a7a4f..1d9134ff72 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -26,6 +26,8 @@ "Aplikácia nie je k dispozícii" "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" + + "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Znížiť šírku" "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 0cb91900aa..cbb1561120 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -26,6 +26,8 @@ "Aplikacija ni na voljo" "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" + + "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Zmanjšanje širine" "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" + + diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 0850c55edd..4fc313c863 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -26,6 +26,8 @@ "Aplikacioni nuk mundësohet" "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" + + "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Zvogëlo gjerësinë" "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index bac6ab1da3..3b7ecc6d06 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -26,6 +26,8 @@ "Апликација није доступна" "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" + + "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" @@ -100,4 +102,6 @@ "Смањи ширину" "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 40c5a2563a..2416012ac7 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -26,6 +26,8 @@ "Appen är inte tillgänglig" "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" + + "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Minska bredden" "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" + + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 75b29524b6..7cd656df1e 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -26,6 +26,8 @@ "Programu haipatikani" "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" + + "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" @@ -102,4 +104,6 @@ "Punguza upana" "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" + + diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 4413cc7c7e..bd9801f065 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -26,6 +26,8 @@ "பயன்பாடு இல்லை" "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" + + "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" @@ -100,4 +102,6 @@ "அகலத்தைக் குறை" "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" + + diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 3951fff2f6..e8c38608cc 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -26,6 +26,8 @@ "అనువర్తనం అందుబాటులో లేదు" "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" + + "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" @@ -100,4 +102,6 @@ "వెడల్పును తగ్గించు" "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 90e9bcaf3a..07d94113d3 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -26,6 +26,8 @@ "แอปไม่พร้อมใช้งาน" "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" + + "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" @@ -100,4 +102,6 @@ "ลดความกว้าง" "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" + + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 997a4eb546..b1642a30a6 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -26,6 +26,8 @@ "Hindi available ang app" "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" + + "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Bawasan ang lapad" "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 6f7a19c4c4..979fc8a57a 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -26,6 +26,8 @@ "Uygulama kullanılamıyor" "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" + + "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Genişliği azalt" "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 5f240fe888..6f24508610 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -26,6 +26,8 @@ "Додаток недоступний" "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" + + "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Зменшити ширину" "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" + + diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 9bb683cacb..7bf3e413fb 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -26,6 +26,8 @@ "ایپ دستیاب نہیں ہے" "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" + + "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" @@ -100,4 +102,6 @@ "چوڑائی کم کریں" "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" + + diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 5e76c6fb64..f3e5c6e485 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,6 +26,8 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" + + "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Enini kichraytirish" "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 82e463f4d6..eb601bcb72 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -26,6 +26,8 @@ "Ứng dụng không có sẵn" "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" + + "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Giảm chiều rộng" "Giảm chiều cao" "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index d46585a9c5..00a8caba17 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -26,6 +26,8 @@ "应用不可用" "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" + + "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" @@ -100,4 +102,6 @@ "减小宽度" "减小高度" "小部件尺寸已调整为:宽度 %1$s,高度 %2$s" + + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index d72865b82e..2d7912eded 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -26,6 +26,8 @@ "目前無法使用這個應用程式" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" + + "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" @@ -100,4 +102,6 @@ "減少闊度" "減少高度" "已調整小工具的大小至闊 %1$s%2$s" + + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ae9816326a..8023418fcb 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -26,6 +26,8 @@ "應用程式目前無法使用" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" + + "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" @@ -100,4 +102,6 @@ "減少寬度" "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" + + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 991056a434..e1399789f0 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -26,6 +26,8 @@ "Uhlelo lokusebenza alutholakali" "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" + + "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" @@ -100,4 +102,6 @@ "Nciphisa ububanzi" "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" + + From a8bf0434c9b62ab8ae8d29c937cd91ed5a49fc52 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 1 Aug 2016 18:27:06 -0700 Subject: [PATCH 026/382] Import translations. DO NOT MERGE Change-Id: I66f83332bff8966941998be370eeb821d145a5e5 Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 +- res/values-am/strings.xml | 6 +- res/values-ar/strings.xml | 6 +- res/values-az-rAZ/strings.xml | 6 +- res/values-b+sr+Latn/strings.xml | 105 +++++++++++++++++++++++++++++++ res/values-be-rBY/strings.xml | 105 +++++++++++++++++++++++++++++++ res/values-bg/strings.xml | 6 +- res/values-bn-rBD/strings.xml | 6 +- res/values-bs-rBA/strings.xml | 105 +++++++++++++++++++++++++++++++ res/values-ca/strings.xml | 6 +- res/values-cs/strings.xml | 6 +- res/values-da/strings.xml | 6 +- res/values-de/strings.xml | 6 +- res/values-el/strings.xml | 6 +- res/values-en-rAU/strings.xml | 6 +- res/values-en-rGB/strings.xml | 6 +- res/values-en-rIN/strings.xml | 6 +- res/values-es-rUS/strings.xml | 6 +- res/values-es/strings.xml | 6 +- res/values-et-rEE/strings.xml | 6 +- res/values-eu-rES/strings.xml | 6 +- res/values-fa/strings.xml | 6 +- res/values-fi/strings.xml | 6 +- res/values-fr-rCA/strings.xml | 6 +- res/values-fr/strings.xml | 6 +- res/values-gl-rES/strings.xml | 6 +- res/values-gu-rIN/strings.xml | 6 +- res/values-hi/strings.xml | 6 +- res/values-hr/strings.xml | 6 +- res/values-hu/strings.xml | 6 +- res/values-hy-rAM/strings.xml | 6 +- res/values-in/strings.xml | 6 +- res/values-is-rIS/strings.xml | 6 +- res/values-it/strings.xml | 6 +- res/values-iw/strings.xml | 6 +- res/values-ja/strings.xml | 6 +- res/values-ka-rGE/strings.xml | 6 +- res/values-kk-rKZ/strings.xml | 6 +- res/values-km-rKH/strings.xml | 6 +- res/values-kn-rIN/strings.xml | 6 +- res/values-ko/strings.xml | 6 +- res/values-ky-rKG/strings.xml | 6 +- res/values-lo-rLA/strings.xml | 6 +- res/values-lt/strings.xml | 6 +- res/values-lv/strings.xml | 6 +- res/values-mk-rMK/strings.xml | 6 +- res/values-ml-rIN/strings.xml | 6 +- res/values-mn-rMN/strings.xml | 6 +- res/values-mr-rIN/strings.xml | 6 +- res/values-ms-rMY/strings.xml | 6 +- res/values-my-rMM/strings.xml | 6 +- res/values-nb/strings.xml | 6 +- res/values-ne-rNP/strings.xml | 6 +- res/values-nl/strings.xml | 6 +- res/values-pa-rIN/strings.xml | 6 +- res/values-pl/strings.xml | 6 +- res/values-pt-rPT/strings.xml | 6 +- res/values-pt/strings.xml | 6 +- res/values-ro/strings.xml | 6 +- res/values-ru/strings.xml | 6 +- res/values-si-rLK/strings.xml | 6 +- res/values-sk/strings.xml | 6 +- res/values-sl/strings.xml | 6 +- res/values-sq-rAL/strings.xml | 6 +- res/values-sr/strings.xml | 6 +- res/values-sv/strings.xml | 6 +- res/values-sw/strings.xml | 6 +- res/values-ta-rIN/strings.xml | 6 +- res/values-te-rIN/strings.xml | 6 +- res/values-th/strings.xml | 6 +- res/values-tl/strings.xml | 6 +- res/values-tr/strings.xml | 6 +- res/values-uk/strings.xml | 6 +- res/values-ur-rPK/strings.xml | 6 +- res/values-uz-rUZ/strings.xml | 6 +- res/values-vi/strings.xml | 6 +- res/values-zh-rHK/strings.xml | 6 +- res/values-zh-rTW/strings.xml | 6 +- res/values-zu/strings.xml | 6 +- 79 files changed, 467 insertions(+), 304 deletions(-) create mode 100644 res/values-b+sr+Latn/strings.xml create mode 100644 res/values-be-rBY/strings.xml create mode 100644 res/values-bs-rBA/strings.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 90dc094c30..584d7df4fb 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -26,8 +26,7 @@ "Program is nie beskikbaar nie" "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" - - + "Kortpad is nie beskikbaar nie" "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Verminder breedte" "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" - - + "Kortpaaie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index fa4e7d2633..3773411096 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -26,8 +26,7 @@ "መተግበሪያ አይገኝም" "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" - - + "አቋራጭ አይገኝም" "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" @@ -102,6 +101,5 @@ "ስፋት ይቀንሱ" "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" - - + "አቋራጮች" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index f8057cea6c..26396d7cd0 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -26,8 +26,7 @@ "التطبيق ليس متاحًا" "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" - - + "الاختصار غير متاح" "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" @@ -102,6 +101,5 @@ "تقليل العرض" "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" - - + "الاختصارات" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 0de22e054e..5118974a8e 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -26,8 +26,7 @@ "Tətbiq əlçatmazdır" "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" - - + "Qısayol əlçatan deyil" "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Eni azaldın" "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" - - + "Qısa yollar" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml new file mode 100644 index 0000000000..d324c6ee71 --- /dev/null +++ b/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,105 @@ + + + + + "Launcher3" + + "Work" + "Aplikacija nije instalirana." + "Aplikacija nije dostupna" + "Preuzeta aplikacija je onemogućena u Bezbednom režimu" + "Vidžeti su onemogućeni u Bezbednom režimu" + "Prečica nije dostupna" + "Dodirnite i zadržite da biste izabrali vidžet." + "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." + "%1$d×%2$d" + "Pretražite aplikacije" + "Aplikacije se učitavaju..." + "Nije pronađena nijedna aplikacija za „%1$s“" + "Pretraži još aplikacija" + "Nema više prostora na ovom početnom ekranu." + "Nema više prostora na traci Omiljeno" + "Lista aplikacija" + "Početna" + "Ukloni" + "Deinstaliraj" + "Inform. o aplikaciji" + "instaliranje prečica" + "Dozvoljava aplikaciji da dodaje prečice bez intervencije korisnika." + "čitanje podešavanja i prečica na početnom ekranu" + "Dozvoljava aplikaciji da čita podešavanja i prečice na početnom ekranu." + "upisivanje podešavanja i prečica na početnom ekranu" + "Dozvoljava aplikaciji da menja podešavanja i prečice na početnom ekranu." + "%1$s nema dozvolu za upućivanje telefonskih poziva" + "Problem pri učitavanju vidžeta" + "Podešavanje" + "Ovo je sistemska aplikacija i ne može da se deinstalira." + "Neimenovani direktorijum" + "Aplikacija %1$s je onemogućena" + "%1$d. stranica od %2$d" + "%1$d. početni ekran od %2$d" + "Nova stranica početnog ekrana" + "Direktorijum je otvoren, %1$d puta %2$d" + "Dodirnite da biste zatvorili direktorijum" + "Dodirnite da biste sačuvali preimenovanje" + "Direktorijum je zatvoren" + "Direktorijum je preimenovan u %1$s" + "Direktorijum: %1$s" + "Vidžeti" + "Pozadine" + "Podešavanja" + "Administrator je onemogućio" + "Pregled" + "Dozvoli rotaciju početnog ekrana" + "Kada se telefon rotira" + "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" + "Nepoznato" + "Ukloni" + "Pretraži" + "Ova aplikacija nije instalirana" + "Aplikacija za ovu ikonu nije instalirana. Možete da je uklonite ili da potražite aplikaciju i instalirate je ručno." + "%1$s se preuzima, završeno je %2$s" + "%1$s čeka na instaliranje" + "Dodaj na početni ekran" + "Premesti stavku ovde" + "Stavka je dodata na početni ekran" + "Stavka je uklonjena" + "Premesti stavku" + "Premesti u red %1$s i kolonu %2$s" + "Premesti na %1$s. poziciju" + "Premesti na %1$s. poziciju u omiljenim" + "Stavka je premeštena" + "Dodaj u direktorijum: %1$s" + "Dodaj u direktorijum u kome je %1$s" + "Stavka je dodata u direktorijum" + "Napravite direktorijum sa: %1$s" + "Direktorijum je napravljen" + "Premesti na početni ekran" + "Pomeri ekran ulevo" + "Pomeri ekran udesno" + "Ekran je pomeren" + "Promeni veličinu" + "Povećaj širinu" + "Povećaj visinu" + "Smanji širinu" + "Smanji visinu" + "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" + "Prečice" + diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml new file mode 100644 index 0000000000..b7d5bfd320 --- /dev/null +++ b/res/values-be-rBY/strings.xml @@ -0,0 +1,105 @@ + + + + + "Launcher3" + + "Працоўная" + "Праграма не ўсталявана." + "Праграма недаступная" + "Спампаваная праграма адключана ў Бяспечным рэжыме" + "Віджэты адключаны ў Бяспечным рэжыме" + "Ярлык недаступны" + "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." + "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." + "%1$d × %2$d" + "Пошук у Праграмах" + "Ідзе загрузка праграм…" + "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" + "Шукаць іншыя праграмы" + "На гэтым Галоўным экране больш няма месца." + "У латку \"Абранае\" больш няма месца" + "Спіс праграм" + "Галоўная" + "Выдаліць" + "Выдаліць" + "Звесткі пра праграму" + "усталёўваць ярлыкі" + "Дазваляе праграмам дадаваць ярлыкі без умяшання карыстальніка." + "счытваць налады і ярлыкі на Галоўнай старонцы" + "Дазваляе праграме счытваць налады і ярлыкі на Галоўнай старонцы." + "запісваць налады і ярлыкі на галоўнай старонцы" + "Дазваляе праграме змяняць налады і ярлыкі на Галоўнай старонцы." + "%1$s не мае дазволу на здзяйсненне тэлефонных званкоў" + "Праблема загрузкі віджэта" + "Наладжванне" + "Гэта сістэмная праграма, яе нельга выдаліць." + "Папка без назвы" + "%1$s адключана" + "Старонка %1$d з %2$d" + "Галоўны экран %1$d з %2$d" + "Новая старонка галоўнага экрана" + "Папка адкрыта, %1$d на %2$d" + "Краніце, каб закрыць папку" + "Краніце, каб захаваць новую назву" + "Папка закрыта" + "Папка перайменавана ў %1$s" + "Папка: %1$s" + "Віджэты" + "Шпалеры" + "Налады" + "Адключаная адміністратарам" + "Агляд" + "Дазволіць паварот галоўнага экрана" + "Пры павароце тэлефона" + "Бягучая налада дысплэя не прадугледжвае паварот" + "Невядома" + "Выдаліць" + "Шукаць" + "Гэта праграма не ўсталявана" + "Праграма для гэтага значка не ўсталявана. Вы можаце выдаліць яе або выканаць пошук і ўсталяваць яе ўручную." + "Ідзе спампоўка %1$s, %2$s завершана" + "%1$s чакае ўсталёўкі" + "Дадаць на Галоўны экран" + "Перамясціць элемент сюды" + "Элемент дададзены на галоўны экран" + "Элемент выдалены" + "Перамясціць элемент" + "Перамясціць у радок %1$s слупок %2$s" + "Перамясціць у пазіцыю %1$s" + "Перамясціць у абранае, у пазіцыю %1$s" + "Элемент перамешчаны" + "Дадаць у папку: %1$s" + "Дадаць у папку з %1$s" + "Элемент дададзены ў папку" + "Стварыць папку з: %1$s" + "Папка створана" + "Перамясціць на Галоўны экран" + "Перамясціць экран налева" + "Перамясціць экран направа" + "Экран перамешчаны" + "Змяніць памер" + "Павялічыць шырыню" + "Павялічыць вышыню" + "Паменшыць шырыню" + "Паменшыць вышыню" + "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" + "Ярлыкі" + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 00c8db84a4..2654cb0aac 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -26,8 +26,7 @@ "Приложението не е налично" "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" - - + "Няма достъп до прекия път" "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Намаляване на ширината" "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" - - + "Преки пътища" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 9ad21d4ac8..05149a7a6a 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -26,8 +26,7 @@ "অ্যাপ্লিকেশান অনুপলব্ধ" "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" - - + "শর্টকাটগুলি অনুপলব্ধ" "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" @@ -102,6 +101,5 @@ "প্রস্থ কমান" "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" - - + "শর্টকাট" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml new file mode 100644 index 0000000000..922eb6da4b --- /dev/null +++ b/res/values-bs-rBA/strings.xml @@ -0,0 +1,105 @@ + + + + + "Launcher3" + + "Posao" + "Aplikacija nije instalirana." + "Aplikacija nije dostupna" + "Preuzeta aplikacija je onemogućena u sigurnom načinu rada" + "Vidžeti su onemogućeni u sigurnom načinu rada." + "Prečica nije dostupna" + "Dodirnite & i držite da biste uzeli dodatak." + "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." + "%1$d × %2$d" + "Pretraži aplikacije" + "Aplikacije se učitavaju…" + "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" + "Pretraži više aplikacija" + "Na ovom početnom ekranu nema više prostora." + "Nema više prostora u ladici Favoriti" + "Spisak aplikacija" + "Tipka za početak" + "Ukloni" + "Deinstaliraj" + "Informacije o aplikaciji" + "instaliraj prečice" + "Dopušta aplikaciji dodavanje prečica bez posredovanja korisnika." + "čitaj postavke na početnom ekranu i prečice" + "Dopušta aplikaciji čitanje postavki i prečica na početnom ekranu." + "zapisuj postavke na početnom ekranu i prečice" + "Dopušta aplikaciji promjenu postavki i prečica na početnom ekranu." + "%1$s nema dozvolu da uspostavlja telefonske pozive" + "Problem pri učitavanju dodatka" + "Postavljanje" + "Ovo je sistemska aplikacija i ne može se deinstalirati." + "Neimenovana fascikla" + "Aplikacija %1$s je onemogućena" + "Strana %1$d od %2$d" + "Početni ekran %1$d od %2$d" + "Nova stranica početnog ekrana" + "Fascikla je otvorena, (š) %1$d (v) %2$d" + "Dodirnite da zatvorite folder" + "Dodirnite da sačuvate promjenu imena" + "Fascikla je zatvorena" + "Ime fascikle je promijenjeno u %1$s" + "Fascikla: %1$s" + "Dodaci" + "Pozadine" + "Postavke" + "Onemogućio vaš administrator" + "Pregled" + "Dozvoli rotiranje početnog ekrana" + "Kada se telefon zarotira" + "Trenutne postavke ekrana ne dozvoljavaju rotiranje" + "Nepoznato" + "Ukloni" + "Traži" + "Ova aplikacija nije instalirana" + "Aplikacija za ovu ikonu nije instalirana. Možete je ukloniti ili potražiti aplikaciju i ručno je instalirati." + "%1$s se preuzima, završeno %2$s" + "%1$s čeka da se instalira" + "Dodaj na početni ekran" + "Premjesti stavku ovdje" + "Stavka je dodana na Početni ekran." + "Stavka je uklonjena" + "Premjesti stavku" + "Pomjeri stavku u red %1$s kolonu %2$s" + "Pomjeri stavku na poziciju %1$s" + "Pomjeri stavku na poziciju %1$s među favoritima" + "Stavka je premještena" + "Dodaj u folder: %1$s" + "Dodaj u folder sa aplikacijom %1$s" + "Stavka je dodana u folder" + "Kreirajte folder sa stavkom: %1$s" + "Folder je kreiran" + "Pomjeri na početni ekran" + "Pomjeri ekran ulijevo" + "Pomjeri ekran udesno" + "Ekran je pomjeren" + "Promijeni veličinu" + "Povećaj širinu" + "Povećaj visinu" + "Smanji širinu" + "Smanji visinu" + "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" + "Prečice" + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a54af03b8c..291440d6a4 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -26,8 +26,7 @@ "L\'aplicació no està disponible." "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." - - + "La drecera no està disponible" "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Redueix l\'amplada" "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" - - + "Dreceres" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index fdb83229df..f684e89df2 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -26,8 +26,7 @@ "Aplikace není k dispozici." "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." - - + "Zkratka není k dispozici" "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Snížit šířku" "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" - - + "Zkratky" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 839a985ab8..42cfea91ca 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -26,8 +26,7 @@ "Appen er ikke tilgængelig" "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" - - + "Genvejen er ikke tilgængelig" "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reducer bredden" "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" - - + "Genveje" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 0c1c435f01..ba59175e4e 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -26,8 +26,7 @@ "App nicht verfügbar" "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" - - + "Verknüpfung nicht verfügbar" "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Breite verringern" "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" - - + "Verknüpfungen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 786cf251de..ada8d5ebb5 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -26,8 +26,7 @@ "Η εφαρμογή δεν είναι διαθέσιμη" "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" - - + "Η συντόμευση δεν είναι διαθέσιμη" "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" @@ -102,6 +101,5 @@ "μείωση του πλάτους" "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" - - + "Συντομεύσεις" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index dcd394aa22..3163f16fdb 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -26,8 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - - + "Shortcut isn\'t available" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" - - + "Short cuts" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index dcd394aa22..3163f16fdb 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -26,8 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - - + "Shortcut isn\'t available" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" - - + "Short cuts" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index dcd394aa22..3163f16fdb 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -26,8 +26,7 @@ "App isn\'t available" "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" - - + "Shortcut isn\'t available" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Decrease width" "Decrease height" "Widget re-sized to width %1$s height %2$s" - - + "Short cuts" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 304eab9b1d..c7809b6fe3 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -26,8 +26,7 @@ "La aplicación no está disponible." "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - - + "El acceso directo no está disponible" "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reducir el ancho" "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." - - + "Accesos directos" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5f5f728964..0d9333c78d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -26,8 +26,7 @@ "La aplicación no está disponible" "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" - - + "Acceso directo no disponible" "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reducir ancho" "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" - - + "Accesos directos" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 7e21c81dac..35077c3199 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -26,8 +26,7 @@ "Rakendus ei ole saadaval" "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" - - + "Otsetee pole saadaval" "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Vähenda laiust" "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" - - + "Otseteed" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 441f1516b8..be1576d159 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -26,8 +26,7 @@ "Ez dago erabilgarri aplikazioa" "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" - - + "Lasterbideak ez daude erabilgarri" "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Txikitu zabalera" "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." - - + "Lasterbideak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 24ecc7e89b..15843fac37 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -26,8 +26,7 @@ "برنامه در دسترس نیست" "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" - - + "میان‌بر دردسترس نیست" "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" @@ -102,6 +101,5 @@ "کاهش عرض" "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" - - + "میان‌برها" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index ccc5c9f58a..2495abbad3 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -26,8 +26,7 @@ "Sovellus ei ole käytettävissä" "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" - - + "Pikakuvake ei ole käytettävissä." "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Vähennä leveyttä" "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." - - + "Pikakuvakkeet" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index f8a656316b..35bc7c4ef1 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -26,8 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" - - + "Le raccourci n\'est pas disponible" "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" @@ -102,6 +101,5 @@ "Diminuer la largeur" "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" - - + "Raccourcis" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 980737053d..3635f18893 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -26,8 +26,7 @@ "Application indisponible" "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." - - + "Raccourci non disponible" "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" @@ -102,6 +101,5 @@ "Diminuer la largeur" "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." - - + "Raccourcis" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 7387d082c5..02131d49fb 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -26,8 +26,7 @@ "A aplicación non está dispoñible" "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" - - + "O atallo non está dispoñible" "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reducir ancho" "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" - - + "Atallos" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 06775ffda1..be1f1c91c8 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -26,8 +26,7 @@ "ઍપ્લિકેશન ઉપલબ્ધ નથી" "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" - - + "શૉર્ટકટ ઉપલબ્ધ નથી" "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" @@ -102,6 +101,5 @@ "પહોળાઈ ઘટાડો" "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" - - + "શૉર્ટકટ્સ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 754d820702..669aaba3de 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -26,8 +26,7 @@ "ऐप्स उपलब्ध नहीं है" "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" - - + "शॉर्टकट उपलब्ध नहीं है" "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" @@ -102,6 +101,5 @@ "चौड़ाई घटाएं" "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" - - + "शॉर्टकट" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index c64a39d0aa..1697ec07a3 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -26,8 +26,7 @@ "Aplikacija nije dostupna" "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" - - + "Prečac nije dostupan" "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Smanjenje širine" "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" - - + "Prečaci" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 198fcab13f..e54b45df40 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -26,8 +26,7 @@ "Az alkalmazás nem érhető el" "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" - - + "A gyorsparancs nem áll rendelkezésre" "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Szélesség csökkentése" "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" - - + "Gyorsparancsok" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 6c6a9c95b5..6cad89f10d 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -26,8 +26,7 @@ "Հավելվածը հասանելի չէ" "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" - - + "Դյուրանցումն անհասանելի է" "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" @@ -102,6 +101,5 @@ "Նվազեցնել լայնությունը" "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" - - + "Դյուրանցումներ" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 581b825379..fe5ae310e9 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -26,8 +26,7 @@ "Aplikasi tidak tersedia" "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" - - + "Pintasan tidak tersedia" "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Kurangi lebar" "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" - - + "Pintasan" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index f35f187a0f..9a66bebeb2 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -26,8 +26,7 @@ "Forritið er ekki í boði" "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" - - + "Flýtileið er ekki tiltæk" "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Minnka breidd" "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" - - + "Flýtileiðir" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 78cb918ddc..77c1ee05b3 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -26,8 +26,7 @@ "App non disponibile" "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" - - + "La scorciatoia non è disponibile" "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Riduci larghezza" "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" - - + "Scorciatoie" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 97cb59af9f..b541ce2184 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -26,8 +26,7 @@ "האפליקציה אינה זמינה" "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" - - + "קיצור הדרך אינו זמין" "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" @@ -102,6 +101,5 @@ "הקטן רוחב" "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" - - + "קיצורי דרך" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c7eeae5042..ea30738e48 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -26,8 +26,7 @@ "このアプリは使用できません" "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" - - + "ショートカットは使用できません" "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" @@ -102,6 +101,5 @@ "幅を狭くする" "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" - - + "ショートカット" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index bdb52ed25d..e7d78d73c5 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -26,8 +26,7 @@ "აპი მიუწვდომელია" "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" - - + "მალსახმობი მიუწვდომელია" "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" @@ -102,6 +101,5 @@ "სიგანის შემცირება" "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" - - + "მალსახმობები" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index d459789763..27d8df2308 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -26,8 +26,7 @@ "Қолданба қол жетімді емес" "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" - - + "Таңбаша қолжетімді емес" "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Енін азайту" "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" - - + "Таңбашалар" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index a66e66a451..117a42d8c8 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -26,8 +26,7 @@ "មិន​មាន​កម្មវិធី" "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" - - + "ផ្លូវកាត់មិនអាចប្រើបានទេ" "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" @@ -102,6 +101,5 @@ "បន្ថយទទឹង" "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" - - + "ផ្លូវកាត់" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 9b8680e4a8..09cfa030d7 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -26,8 +26,7 @@ "ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ" "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" - - + "ಶಾರ್ಟ್‌ಕಟ್ ಲಭ್ಯವಿಲ್ಲ" "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" @@ -102,6 +101,5 @@ "ಅಗಲವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" - - + "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 0e7dc11eb4..9ffe58ea9f 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -26,8 +26,7 @@ "앱을 사용할 수 없음" "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" - - + "바로가기를 사용할 수 없음" "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" @@ -102,6 +101,5 @@ "폭 줄이기" "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" - - + "바로가기" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 62b828e739..d6785c50b5 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -26,8 +26,7 @@ "Колдонмо жеткиликтүү эмес" "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" - - + "Кыска жол жок" "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Ичкертүү" "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" - - + "Кыска жолдор" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 07aa0aaa73..b88cd65e81 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -26,8 +26,7 @@ "ແອັບຯ​ໃຊ້​ບໍ່​ໄດ້" "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" - - + "ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້" "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" @@ -102,6 +101,5 @@ "ຫຼຸດ​ລວງ​ກ້​ວາງ​ລົງ" "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" - - + "ທາງລັດ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 0269ff65ec..a813698c56 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -26,8 +26,7 @@ "Programa nepasiekiama" "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" - - + "Sparčiojo klavišo negalima naudoti" "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Sumažinti plotį" "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" - - + "Spartieji klavišai" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 849355d649..2dffe2d7bd 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -26,8 +26,7 @@ "Lietotne nav pieejama." "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" - - + "Saīsne nav pieejama." "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Samazināt platumu" "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." - - + "Saīsnes" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 84c52ce037..b1097b698f 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -26,8 +26,7 @@ "Апликацијата не е достапна" "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" - - + "Кратенката не е достапна" "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Намали ширина" "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" - - + "Кратенки" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index eada1cab83..ea869d3801 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -26,8 +26,7 @@ "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" - - + "കുറുക്കുവഴി ലഭ്യമല്ല" "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" @@ -102,6 +101,5 @@ "വീതി കുറയ്‌ക്കുക" "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" - - + "കുറുക്കുവഴികൾ" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 7680c6d787..2f89f162ae 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -26,8 +26,7 @@ "Апп-г ашиглах боломжгүй" "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" - - + "Товчлол алга" "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Нарийсгах" "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" - - + "Товчлол" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 7d88d2e816..d7c4332563 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -26,8 +26,7 @@ "अॅप उपलब्ध नाही" "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" - - + "शॉर्टकट उपलब्ध नाही" "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" @@ -102,6 +101,5 @@ "रुंदी कमी करा" "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" - - + "शॉर्टकट" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 1c93fb69ed..cc0cff847e 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -26,8 +26,7 @@ "Apl tidak tersedia" "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" - - + "Pintasan tidak tersedia" "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" @@ -102,6 +101,5 @@ "Kurangkan kelebaran" "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" - - + "Pintasan" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 81013672b2..89933aa118 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -26,8 +26,7 @@ "အက်ပ်လက်လှမ်း မမှီပါ" "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" - - + "ဖြတ်လမ်း မရနိုင်ပါ" "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" @@ -102,6 +101,5 @@ "အကျယ်အား လျှော့ပါ" "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" - - + "ဖြတ်လမ်းများ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 7487ad606c..7ca79f2c82 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -26,8 +26,7 @@ "Appen er ikke tilgjengelig" "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" - - + "Snarveien er ikke tilgjengelig" "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reduser bredden" "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" - - + "Snarveier" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 5df3d1fd48..3e3fddff02 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -26,8 +26,7 @@ "अनुप्रयोग उपलब्ध छैन" "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" - - + "सर्टकट उपलब्ध छैन" "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" @@ -102,6 +101,5 @@ "चौडाइ घटाउनुहोस्" "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" - - + "सर्टकटहरू" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index cfaa8b4ca3..e3377fef5a 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -26,8 +26,7 @@ "App is niet beschikbaar" "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" - - + "Snelkoppeling is niet beschikbaar" "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Breedte verkleinen" "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" - - + "Snelkoppelingen" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 3cf6094a73..3a506a15a7 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -26,8 +26,7 @@ "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" - - + "ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" @@ -102,6 +101,5 @@ "ਚੌੜਾਈ ਘਟਾਓ" "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" - - + "ਸ਼ਾਰਟਕੱਟ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 139872b45c..f10f639b14 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -26,8 +26,7 @@ "Aplikacja niedostępna" "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" - - + "Skrót nie jest dostępny" "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Zmniejsz szerokość" "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" - - + "Skróty" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 20a2a8c499..417c2d5c94 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -26,8 +26,7 @@ "A aplicação não está disponível" "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" - - + "Nenhum atalho disponível" "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Diminuir largura" "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" - - + "Atalhos" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 9f98d0384c..c1e5a7f434 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -26,8 +26,7 @@ "O app não está disponível" "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" - - + "O atalho não está disponível" "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Diminuir largura" "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" - - + "Atalhos" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index f4857667e4..c084dd3cfb 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -26,8 +26,7 @@ "Aplicația nu este disponibilă" "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" - - + "Comanda rapidă nu este disponibilă" "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Reduceți lățimea" "Reduceți înălțimea" "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" - - + "Comenzi rapide" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index a5cc5c468b..ea00d603d1 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -26,8 +26,7 @@ "Приложение недоступно" "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" - - + "Ярлык недоступен" "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" @@ -102,6 +101,5 @@ "Уменьшить ширину" "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" - - + "Ярлыки" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index f3e60a6ff1..21edb531d9 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -26,8 +26,7 @@ "යෙදුම නොතිබේ" "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" - - + "කෙටි මග ලබා ගත නොහැකිය" "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" @@ -102,6 +101,5 @@ "පළල අඩු කරන්න" "උස අඩු කරන්න" "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" - - + "කෙටිමං" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 1d9134ff72..85df8623f2 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -26,8 +26,7 @@ "Aplikácia nie je k dispozícii" "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" - - + "Skratky nie sú k dispozícii" "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Znížiť šírku" "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" - - + "Skratky" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index cbb1561120..6dee3d5fcc 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -26,8 +26,7 @@ "Aplikacija ni na voljo" "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" - - + "Bližnjica ni na voljo" "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Zmanjšanje širine" "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" - - + "Bližnjice" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 4fc313c863..8194e62ad0 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -26,8 +26,7 @@ "Aplikacioni nuk mundësohet" "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" - - + "Shkurtorja nuk është e disponueshme" "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Zvogëlo gjerësinë" "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" - - + "Shkurtoret" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3b7ecc6d06..4b188a9541 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -26,8 +26,7 @@ "Апликација није доступна" "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" - - + "Пречица није доступна" "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" @@ -102,6 +101,5 @@ "Смањи ширину" "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" - - + "Пречице" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 2416012ac7..d3a437d06f 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -26,8 +26,7 @@ "Appen är inte tillgänglig" "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" - - + "Genvägen är inte tillgänglig" "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Minska bredden" "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" - - + "Genvägar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 7cd656df1e..9d8f49ddf3 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -26,8 +26,7 @@ "Programu haipatikani" "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" - - + "Hakuna njia ya mkato" "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" @@ -104,6 +103,5 @@ "Punguza upana" "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" - - + "Njia za mkato" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index bd9801f065..05076152a8 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -26,8 +26,7 @@ "பயன்பாடு இல்லை" "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" - - + "குறுக்குவழி இல்லை" "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" @@ -102,6 +101,5 @@ "அகலத்தைக் குறை" "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" - - + "குறுக்குவழிகள்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index e8c38608cc..083088a487 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -26,8 +26,7 @@ "అనువర్తనం అందుబాటులో లేదు" "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" - - + "సత్వరమార్గం అందుబాటులో లేదు" "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" @@ -102,6 +101,5 @@ "వెడల్పును తగ్గించు" "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" - - + "సత్వరమార్గాలు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 07d94113d3..26982a7ca0 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -26,8 +26,7 @@ "แอปไม่พร้อมใช้งาน" "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" - - + "ทางลัดไม่พร้อมใช้งาน" "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" @@ -102,6 +101,5 @@ "ลดความกว้าง" "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" - - + "ทางลัด" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index b1642a30a6..fc83f835e5 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -26,8 +26,7 @@ "Hindi available ang app" "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" - - + "Hindi available ang shortcut" "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Bawasan ang lapad" "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" - - + "Mga Shortcut" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 979fc8a57a..70f09a6a02 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -26,8 +26,7 @@ "Uygulama kullanılamıyor" "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" - - + "Kısayol kullanılamıyor" "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Genişliği azalt" "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" - - + "Kısayollar" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 6f24508610..4722b6c4f5 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -26,8 +26,7 @@ "Додаток недоступний" "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" - - + "Ярлик недоступний" "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Зменшити ширину" "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" - - + "Ярлики" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 7bf3e413fb..952a000153 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -26,8 +26,7 @@ "ایپ دستیاب نہیں ہے" "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" - - + "شارٹ کٹ دستیاب نہیں ہے" "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" @@ -102,6 +101,5 @@ "چوڑائی کم کریں" "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" - - + "شارٹ کٹس" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index f3e5c6e485..784c887140 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,8 +26,7 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" - - + "Yorliqlardan foydalanib bo‘lmaydi" "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Enini kichraytirish" "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" - - + "Yorliqlar" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index eb601bcb72..fc16c66620 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -26,8 +26,7 @@ "Ứng dụng không có sẵn" "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" - - + "Lối tắt không khả dụng" "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Giảm chiều rộng" "Giảm chiều cao" "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" - - + "Lối tắt" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 2d7912eded..89fa039526 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -26,8 +26,7 @@ "目前無法使用這個應用程式" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" - - + "沒有可用的捷徑" "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" @@ -102,6 +101,5 @@ "減少闊度" "減少高度" "已調整小工具的大小至闊 %1$s%2$s" - - + "捷徑" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 8023418fcb..9693a23cde 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -26,8 +26,7 @@ "應用程式目前無法使用" "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" - - + "目前無法使用捷徑" "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" @@ -102,6 +101,5 @@ "減少寬度" "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" - - + "捷徑" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index e1399789f0..bba4c323fc 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -26,8 +26,7 @@ "Uhlelo lokusebenza alutholakali" "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" - - + "Isinqamuleli asitholakali" "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" @@ -102,6 +101,5 @@ "Nciphisa ububanzi" "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" - - + "Izinqamuleli" From 35d5ae1fd112125e38ad7d883132bea470be54ed Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Aug 2016 14:23:13 -0700 Subject: [PATCH 027/382] Import translations. DO NOT MERGE Change-Id: I24a34df718ec8e502c89914b218ec8ae8846b5a4 Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 ++ res/values-am/strings.xml | 2 ++ res/values-ar/strings.xml | 2 ++ res/values-az-rAZ/strings.xml | 2 ++ res/values-b+sr+Latn/strings.xml | 2 ++ res/values-be-rBY/strings.xml | 2 ++ res/values-bg/strings.xml | 2 ++ res/values-bn-rBD/strings.xml | 2 ++ res/values-bs-rBA/strings.xml | 2 ++ res/values-ca/strings.xml | 2 ++ res/values-cs/strings.xml | 2 ++ res/values-da/strings.xml | 2 ++ res/values-de/strings.xml | 2 ++ res/values-el/strings.xml | 2 ++ res/values-en-rAU/strings.xml | 2 ++ res/values-en-rGB/strings.xml | 2 ++ res/values-en-rIN/strings.xml | 2 ++ res/values-es-rUS/strings.xml | 2 ++ res/values-es/strings.xml | 2 ++ res/values-et-rEE/strings.xml | 2 ++ res/values-eu-rES/strings.xml | 2 ++ res/values-fa/strings.xml | 2 ++ res/values-fi/strings.xml | 2 ++ res/values-fr-rCA/strings.xml | 2 ++ res/values-fr/strings.xml | 2 ++ res/values-gl-rES/strings.xml | 2 ++ res/values-gu-rIN/strings.xml | 2 ++ res/values-hi/strings.xml | 2 ++ res/values-hr/strings.xml | 2 ++ res/values-hu/strings.xml | 2 ++ res/values-hy-rAM/strings.xml | 2 ++ res/values-in/strings.xml | 2 ++ res/values-is-rIS/strings.xml | 2 ++ res/values-it/strings.xml | 2 ++ res/values-iw/strings.xml | 2 ++ res/values-ja/strings.xml | 2 ++ res/values-ka-rGE/strings.xml | 2 ++ res/values-kk-rKZ/strings.xml | 2 ++ res/values-km-rKH/strings.xml | 2 ++ res/values-kn-rIN/strings.xml | 2 ++ res/values-ko/strings.xml | 2 ++ res/values-ky-rKG/strings.xml | 2 ++ res/values-lo-rLA/strings.xml | 2 ++ res/values-lt/strings.xml | 2 ++ res/values-lv/strings.xml | 2 ++ res/values-mk-rMK/strings.xml | 2 ++ res/values-ml-rIN/strings.xml | 2 ++ res/values-mn-rMN/strings.xml | 2 ++ res/values-mr-rIN/strings.xml | 2 ++ res/values-ms-rMY/strings.xml | 2 ++ res/values-my-rMM/strings.xml | 2 ++ res/values-nb/strings.xml | 2 ++ res/values-ne-rNP/strings.xml | 2 ++ res/values-nl/strings.xml | 2 ++ res/values-pa-rIN/strings.xml | 2 ++ res/values-pl/strings.xml | 2 ++ res/values-pt-rPT/strings.xml | 4 +++- res/values-pt/strings.xml | 2 ++ res/values-ro/strings.xml | 2 ++ res/values-ru/strings.xml | 2 ++ res/values-si-rLK/strings.xml | 2 ++ res/values-sk/strings.xml | 2 ++ res/values-sl/strings.xml | 2 ++ res/values-sq-rAL/strings.xml | 2 ++ res/values-sr/strings.xml | 2 ++ res/values-sv/strings.xml | 2 ++ res/values-sw/strings.xml | 2 ++ res/values-ta-rIN/strings.xml | 2 ++ res/values-te-rIN/strings.xml | 2 ++ res/values-th/strings.xml | 2 ++ res/values-tl/strings.xml | 2 ++ res/values-tr/strings.xml | 2 ++ res/values-uk/strings.xml | 2 ++ res/values-ur-rPK/strings.xml | 2 ++ res/values-uz-rUZ/strings.xml | 2 ++ res/values-vi/strings.xml | 2 ++ res/values-zh-rCN/strings.xml | 6 +++--- res/values-zh-rHK/strings.xml | 2 ++ res/values-zh-rTW/strings.xml | 2 ++ res/values-zu/strings.xml | 2 ++ 80 files changed, 162 insertions(+), 4 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 584d7df4fb..5aef70a818 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -102,4 +102,6 @@ "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" + + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3773411096..28a55ff18e 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -102,4 +102,6 @@ "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 26396d7cd0..32e8f5a7ba 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -102,4 +102,6 @@ "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" + + diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 5118974a8e..1897a7ceee 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -102,4 +102,6 @@ "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" + + diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index d324c6ee71..e847b053e0 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -102,4 +102,6 @@ "Smanji visinu" "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" + + diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index b7d5bfd320..4d7b66f084 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -102,4 +102,6 @@ "Паменшыць вышыню" "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" + + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 2654cb0aac..b974aca382 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -102,4 +102,6 @@ "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" + + diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 05149a7a6a..4c96c631dd 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -102,4 +102,6 @@ "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" + + diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 922eb6da4b..140d824354 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -102,4 +102,6 @@ "Smanji visinu" "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 291440d6a4..49b9312624 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -102,4 +102,6 @@ "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f684e89df2..6d486ba0d2 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -102,4 +102,6 @@ "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 42cfea91ca..92ebe2861a 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -102,4 +102,6 @@ "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ba59175e4e..a5d932a1db 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -102,4 +102,6 @@ "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index ada8d5ebb5..38b6be41e4 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -102,4 +102,6 @@ "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" + + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 3163f16fdb..6e54bb397d 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -102,4 +102,6 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" + + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 3163f16fdb..6e54bb397d 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -102,4 +102,6 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" + + diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 3163f16fdb..6e54bb397d 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -102,4 +102,6 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" + + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c7809b6fe3..aa7da06953 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -102,4 +102,6 @@ "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 0d9333c78d..b799a54659 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -102,4 +102,6 @@ "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" + + diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 35077c3199..9fe5d4309c 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -102,4 +102,6 @@ "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" + + diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index be1576d159..9fd5e6b915 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -102,4 +102,6 @@ "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 15843fac37..8dc99de493 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -102,4 +102,6 @@ "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 2495abbad3..0ea8a0755f 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -102,4 +102,6 @@ "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" + + diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 35bc7c4ef1..f92d0860d0 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -102,4 +102,6 @@ "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 3635f18893..f5baa65306 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -102,4 +102,6 @@ "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" + + diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 02131d49fb..f24fd7aa24 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -102,4 +102,6 @@ "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" + + diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index be1f1c91c8..14b3eac37e 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -102,4 +102,6 @@ "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 669aaba3de..8ec70504c7 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -102,4 +102,6 @@ "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" + + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 1697ec07a3..e419e1fc8f 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -102,4 +102,6 @@ "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index e54b45df40..708868436f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -102,4 +102,6 @@ "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" + + diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 6cad89f10d..48a40d7d4b 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -102,4 +102,6 @@ "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index fe5ae310e9..bc52470a28 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -102,4 +102,6 @@ "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" + + diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 9a66bebeb2..229eb1040b 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -102,4 +102,6 @@ "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" + + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 77c1ee05b3..40ecaaba15 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -102,4 +102,6 @@ "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index b541ce2184..14eca2e065 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -102,4 +102,6 @@ "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index ea30738e48..920652bdb4 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -102,4 +102,6 @@ "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" + + diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index e7d78d73c5..781685cf26 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -102,4 +102,6 @@ "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" + + diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 27d8df2308..23938dc551 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -102,4 +102,6 @@ "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" + + diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 117a42d8c8..48ed1879dd 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -102,4 +102,6 @@ "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" + + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 09cfa030d7..0c1c10d257 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -102,4 +102,6 @@ "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" + + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9ffe58ea9f..94113eb512 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -102,4 +102,6 @@ "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" + + diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index d6785c50b5..aff64e5904 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -102,4 +102,6 @@ "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" + + diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index b88cd65e81..ffd288c8a0 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -102,4 +102,6 @@ "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index a813698c56..0a904d9a93 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -102,4 +102,6 @@ "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 2dffe2d7bd..71d61470a8 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -102,4 +102,6 @@ "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" + + diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index b1097b698f..714814668a 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -102,4 +102,6 @@ "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" + + diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index ea869d3801..6f3568ceb3 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -102,4 +102,6 @@ "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" + + diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 2f89f162ae..ac0eb9f6f9 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -102,4 +102,6 @@ "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" + + diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index d7c4332563..f6a383e75b 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -102,4 +102,6 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" + + diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index cc0cff847e..8d0354b67d 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -102,4 +102,6 @@ "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" + + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 89933aa118..b1b55fc507 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -102,4 +102,6 @@ "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 7ca79f2c82..9bac25ffa9 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -102,4 +102,6 @@ "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" + + diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 3e3fddff02..4b88653736 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -102,4 +102,6 @@ "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e3377fef5a..a7c29ee5ab 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -102,4 +102,6 @@ "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" + + diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 3a506a15a7..870a505c7b 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -102,4 +102,6 @@ "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" + + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index f10f639b14..49f7c0dd9b 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -102,4 +102,6 @@ "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 417c2d5c94..8bb6115d7a 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -26,7 +26,7 @@ "A aplicação não está disponível" "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" - "Nenhum atalho disponível" + "O atalho não está disponível" "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" @@ -102,4 +102,6 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" + + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index c1e5a7f434..060401e2ce 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -102,4 +102,6 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c084dd3cfb..e6e95b2c44 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -102,4 +102,6 @@ "Reduceți înălțimea" "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ea00d603d1..f8b0c86117 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -102,4 +102,6 @@ "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" + + diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 21edb531d9..53f4f41325 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -102,4 +102,6 @@ "උස අඩු කරන්න" "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 85df8623f2..141456d5c5 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -102,4 +102,6 @@ "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 6dee3d5fcc..f7af3b1169 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -102,4 +102,6 @@ "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" + + diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 8194e62ad0..3f9b3f1219 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -102,4 +102,6 @@ "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 4b188a9541..bc57113b83 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -102,4 +102,6 @@ "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index d3a437d06f..f61769b146 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -102,4 +102,6 @@ "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" + + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 9d8f49ddf3..6a1b1240f0 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -104,4 +104,6 @@ "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" + + diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 05076152a8..42d5c10cb6 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -102,4 +102,6 @@ "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" + + diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 083088a487..7f83b9d534 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -102,4 +102,6 @@ "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 26982a7ca0..3fa4f08366 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -102,4 +102,6 @@ "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" + + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index fc83f835e5..9acf6fe69a 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -102,4 +102,6 @@ "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 70f09a6a02..92dd7be924 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -102,4 +102,6 @@ "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 4722b6c4f5..cde43dbbfc 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -102,4 +102,6 @@ "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" + + diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 952a000153..5a3472fd69 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -102,4 +102,6 @@ "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" + + diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 784c887140..99ebbcbe77 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -102,4 +102,6 @@ "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Yorliqlar" + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index fc16c66620..e6a7800ec1 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -102,4 +102,6 @@ "Giảm chiều cao" "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 00a8caba17..e3a85b0618 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -26,8 +26,7 @@ "应用不可用" "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" - - + "无法使用快捷方式" "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" @@ -102,6 +101,7 @@ "减小宽度" "减小高度" "小部件尺寸已调整为:宽度 %1$s,高度 %2$s" - + "快捷方式" + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 89fa039526..7aab242fb2 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -102,4 +102,6 @@ "減少高度" "已調整小工具的大小至闊 %1$s%2$s" "捷徑" + + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 9693a23cde..4622f42596 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -102,4 +102,6 @@ "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" + + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index bba4c323fc..3f214a20df 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -102,4 +102,6 @@ "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" + + From 0d221d39c566538be1b6b3d04449f2c5bad3fd47 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 7 Aug 2016 22:37:49 -0700 Subject: [PATCH 028/382] Import translations. DO NOT MERGE Change-Id: I4a3d1fd414d50dd077a27893ca9739d43209425d Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-az-rAZ/strings.xml | 3 +-- res/values-b+sr+Latn/strings.xml | 3 +-- res/values-be-rBY/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-bs-rBA/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-en-rAU/strings.xml | 3 +-- res/values-en-rGB/strings.xml | 3 +-- res/values-en-rIN/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-et-rEE/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-km-rKH/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lo-rLA/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-mn-rMN/strings.xml | 3 +-- res/values-mr-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-ne-rNP/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pa-rIN/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-si-rLK/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-te-rIN/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 7 +++---- res/values-vi/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 3 +-- res/values-zh-rHK/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 80 files changed, 82 insertions(+), 162 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 5aef70a818..cde143e7e9 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -102,6 +102,5 @@ "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" - - + "%1$d kortpaaie vir %2$s" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 28a55ff18e..53513a684f 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -102,6 +102,5 @@ "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" - - + "%1$d%2$s አቋራጮች" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 32e8f5a7ba..d7e57c3fb2 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -102,6 +102,5 @@ "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" - - + "%1$d اختصار لتطبيق %2$s" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 1897a7ceee..625fa0cf90 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -102,6 +102,5 @@ "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" - - + "%1$d üçün %2$s qısa yolu" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index e847b053e0..9b0ca96755 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -102,6 +102,5 @@ "Smanji visinu" "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" - - + "%1$d prečice(a) za %2$s" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 4d7b66f084..f450091ee6 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -102,6 +102,5 @@ "Паменшыць вышыню" "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" - - + "Ярлыкі (%1$d) для %2$s" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index b974aca382..04786abfe4 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -102,6 +102,5 @@ "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" - - + "%1$d преки пътища за %2$s" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 4c96c631dd..ca74b7677f 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -102,6 +102,5 @@ "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" - - + "%2$s এর %1$dটি শর্টকার্ট" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 140d824354..560dde0620 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -102,6 +102,5 @@ "Smanji visinu" "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" - - + "%1$d prečica za aplikaciju %2$s" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 49b9312624..4f174ae239 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -102,6 +102,5 @@ "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" - - + "%1$d dreceres per a l\'aplicació %2$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 6d486ba0d2..a6a9dd69a3 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -102,6 +102,5 @@ "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" - - + "Počet zkratek pro aplikaci %2$s: %1$d" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 92ebe2861a..99bc220aa2 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -102,6 +102,5 @@ "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" - - + "%1$d genveje til %2$s" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a5d932a1db..36ac06fdc6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -102,6 +102,5 @@ "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" - - + "%1$d Verknüpfungen für %2$s" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 38b6be41e4..4d3f7084e9 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -102,6 +102,5 @@ "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" - - + "%1$d συντομεύσεις για %2$s" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 6e54bb397d..8c95ae1863 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -102,6 +102,5 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - - + "%1$d shortcuts for %2$s" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 6e54bb397d..8c95ae1863 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -102,6 +102,5 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - - + "%1$d shortcuts for %2$s" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 6e54bb397d..8c95ae1863 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -102,6 +102,5 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - - + "%1$d shortcuts for %2$s" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index aa7da06953..4002b97a64 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -102,6 +102,5 @@ "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" - - + "%1$d accesos directos para %2$s" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index b799a54659..a6340e01e1 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -102,6 +102,5 @@ "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" - - + "%1$d accesos directos de %2$s" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 9fe5d4309c..9deeef9874 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -102,6 +102,5 @@ "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" - - + "%1$d otseteed rakenduse %2$s jaoks" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 9fd5e6b915..9bb9e36ef8 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -102,6 +102,5 @@ "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" - - + "%2$s aplikazioaren %1$d lasterbide" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 8dc99de493..92f80f490a 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -102,6 +102,5 @@ "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" - - + "%1$d میانبر برای %2$s" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 0ea8a0755f..dd90ddc4df 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -102,6 +102,5 @@ "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" - - + "Sovelluksella %2$s on %1$d pikakuvaketta." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index f92d0860d0..a82427ee41 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -102,6 +102,5 @@ "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" - - + "%1$d raccourcis pour %2$s" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f5baa65306..9c5273926d 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -102,6 +102,5 @@ "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" - - + "%1$d raccourcis pour %2$s" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index f24fd7aa24..06d95daae7 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -102,6 +102,5 @@ "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" - - + "%1$d atallos para %2$s" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 14b3eac37e..c5cdad3356 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -102,6 +102,5 @@ "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" - - + "%2$s માટે %1$d શૉર્ટકટ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 8ec70504c7..ee179c1c78 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -102,6 +102,5 @@ "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" - - + "%2$s के लिए %1$d शॉर्टकट" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index e419e1fc8f..00bb190818 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -102,6 +102,5 @@ "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" - - + "Prečaca za aplikaciju %2$s: %1$d" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 708868436f..775365b602 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -102,6 +102,5 @@ "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" - - + "%1$d gyorsparancs a(z) %2$s számára" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 48a40d7d4b..1579614826 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -102,6 +102,5 @@ "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" - - + "%1$d դյուրանցումներ %2$s հավելվածի համար" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index bc52470a28..84f91a5c03 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -102,6 +102,5 @@ "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" - - + "%1$d pintasan untuk %2$s" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 229eb1040b..5937d96c27 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -102,6 +102,5 @@ "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" - - + "%1$d flýtileiðir fyrir %2$s" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 40ecaaba15..5db8c1a4c2 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -102,6 +102,5 @@ "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" - - + "%1$d scorciatoie per %2$s" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 14eca2e065..c9721d8a7d 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -102,6 +102,5 @@ "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" - - + "%1$d קיצורי דרך עבור %2$s" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 920652bdb4..4961433f0f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -102,6 +102,5 @@ "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" - - + "%2$s用の %1$d 件のショートカット" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 781685cf26..cac3b4d02d 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -102,6 +102,5 @@ "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" - - + "%2$s-ს აქვს %1$d მალსახმობი" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 23938dc551..68cd6c6428 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -102,6 +102,5 @@ "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" - - + "%2$s қолданбасына арналған %1$d таңбаша" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 48ed1879dd..87d31d5793 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -102,6 +102,5 @@ "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" - - + "%1$d ផ្លូវកាត់សម្រាប់ %2$s" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 0c1c10d257..eb5e8bd5e8 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -102,6 +102,5 @@ "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - - + "%2$s ಗೆ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 94113eb512..bf8e780ce5 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -102,6 +102,5 @@ "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" - - + "%2$s에 사용 가능한 단축키 %1$d개" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index aff64e5904..817f8cc80b 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -102,6 +102,5 @@ "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" - - + "%2$s колдонмосуна %1$d кыска жол бар" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index ffd288c8a0..8329577138 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -102,6 +102,5 @@ "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" - - + "%1$d ທາງລັດສຳລັບ %2$s" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 0a904d9a93..272c559858 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -102,6 +102,5 @@ "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" - - + "Programos „%2$s“ spartieji klavišai (%1$d)" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 71d61470a8..d60682e9e5 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -102,6 +102,5 @@ "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" - - + "%1$d saīsnes lietotnei %2$s" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 714814668a..7e9abaf901 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -102,6 +102,5 @@ "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" - - + "%1$d кратенки за %2$s" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 6f3568ceb3..607db55f65 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -102,6 +102,5 @@ "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" - - + "%2$s ആപ്പിനുള്ള %1$d കുറുക്കുവഴികൾ" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index ac0eb9f6f9..600b5fcd41 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -102,6 +102,5 @@ "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" - - + "%2$s%1$d товчлол" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index f6a383e75b..6dfa3d8771 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -102,6 +102,5 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" - - + "%2$s साठी %1$d" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 8d0354b67d..6a2b10483d 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -102,6 +102,5 @@ "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" - - + "%1$d pintasan untuk %2$s" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index b1b55fc507..6d3003a68d 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -102,6 +102,5 @@ "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" - - + "%2$s အတွက် အမြန်နည်း %1$d ခု" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 9bac25ffa9..16f22ea8a4 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -102,6 +102,5 @@ "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" - - + "%1$d snarveier for %2$s" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 4b88653736..61d054f345 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -102,6 +102,5 @@ "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" - - + "%2$s का %1$d सर्टकटहरू" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a7c29ee5ab..24ee20d5ee 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -102,6 +102,5 @@ "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" - - + "%1$d snelkoppelingen voor %2$s" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 870a505c7b..e41e46ce25 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -102,6 +102,5 @@ "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" - - + "%2$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 49f7c0dd9b..a2308565e8 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -102,6 +102,5 @@ "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" - - + "Skróty aplikacji %2$s: %1$d" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8bb6115d7a..d1e37c1c97 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -102,6 +102,5 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "%1$d atalhos para a aplicação %2$s" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 060401e2ce..ac0c828083 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -102,6 +102,5 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "%1$d atalhos para %2$s" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index e6e95b2c44..22a2e4ee35 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -102,6 +102,5 @@ "Reduceți înălțimea" "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" - - + "%1$d comenzi rapide pentru %2$s" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index f8b0c86117..73bbbf8566 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -102,6 +102,5 @@ "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" - - + "Количество ярлыков для приложения \"%2$s\": %1$d" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 53f4f41325..82bb226803 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -102,6 +102,5 @@ "උස අඩු කරන්න" "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" - - + "%2$s සඳහා කෙටි මං %1$d" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 141456d5c5..4e541ce8fe 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -102,6 +102,5 @@ "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" - - + "Počet skratiek aplikácie %2$s: %1$d" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index f7af3b1169..c8693b8ab6 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -102,6 +102,5 @@ "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" - - + "Št. bližnjic za aplikacijo %2$s: %1$d" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 3f9b3f1219..caa65b2586 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -102,6 +102,5 @@ "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" - - + "%1$d shkurtesa për %2$s" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index bc57113b83..856f6476a0 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -102,6 +102,5 @@ "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" - - + "%1$d пречице(а) за %2$s" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index f61769b146..c3e60fc593 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -102,6 +102,5 @@ "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" - - + "%1$d genvägar för %2$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 6a1b1240f0..0e7b768b0c 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -104,6 +104,5 @@ "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" - - + "Njia %1$d za mkato za %2$s" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 42d5c10cb6..87081aad0a 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -102,6 +102,5 @@ "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" - - + "%2$sக்கான %1$d குறுக்குவழிகள்" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 7f83b9d534..2fda6a5e73 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -102,6 +102,5 @@ "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" - - + "%2$s కోసం %1$d సత్వరమార్గాలు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 3fa4f08366..8ad5a7c314 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -102,6 +102,5 @@ "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" - - + "%1$d ทางลัดสำหรับ %2$s" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 9acf6fe69a..922cb53c64 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -102,6 +102,5 @@ "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" - - + "%1$d (na) shortcut para sa %2$s" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 92dd7be924..08d5d52950 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -102,6 +102,5 @@ "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" - - + "%2$s için %1$d kısayol" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index cde43dbbfc..c24e02a417 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -102,6 +102,5 @@ "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" - - + "Ярликів для додатка %2$s: %1$d" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 5a3472fd69..5ed9ddbe5b 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -102,6 +102,5 @@ "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" - - + "%2$s کیلئے %1$d شارٹ کٹس" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 99ebbcbe77..a58b57c690 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -26,7 +26,7 @@ "Ilova mavjud emas" "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" - "Yorliqlardan foydalanib bo‘lmaydi" + "Tezkor tugmadan foydalanib bo‘lmaydi" "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" @@ -101,7 +101,6 @@ "Enini kichraytirish" "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" - "Yorliqlar" - - + "Tezkor tugmalar" + "%2$s ilovasi uchun %1$d ta tezkor tugma" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index e6a7800ec1..8440060592 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -102,6 +102,5 @@ "Giảm chiều cao" "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" - - + "%1$d phím tắt cho %2$s" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e3a85b0618..e48722569d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -102,6 +102,5 @@ "减小高度" "小部件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" - - + "%2$s%1$d 个快捷方式" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 7aab242fb2..7b96d658b1 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -102,6 +102,5 @@ "減少高度" "已調整小工具的大小至闊 %1$s%2$s" "捷徑" - - + "「%2$s」嘅 %1$d 個捷徑" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 4622f42596..cf7a86a3af 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -102,6 +102,5 @@ "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" - - + "「%2$s」有 %1$d 個捷徑" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 3f214a20df..06cfa201cd 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -102,6 +102,5 @@ "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" - - + "%1$d izinqamuleli ze-%2$s" From f1c4b0179b5fb44bb9f10aec17bfb0169115b6a9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 10 Aug 2016 08:18:24 -0700 Subject: [PATCH 029/382] Import translations. DO NOT MERGE Change-Id: I59f1660f94c6afcd5ab8cf151301da235be08a19 Auto-generated-cl: translation import --- res/values-mr-rIN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 6dfa3d8771..b680feab1b 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -102,5 +102,5 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" - "%2$s साठी %1$d" + "%2$s साठी %1$d शॉर्टकट" From 52e188f9131186ad498ae3cb3ddcfbcb15f50f60 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Aug 2016 15:05:16 -0700 Subject: [PATCH 030/382] Import translations. DO NOT MERGE Change-Id: Iaea0e6a0d39d1a17db9d2cbbf6563028daa2b9ee Auto-generated-cl: translation import --- res/values-fr/strings.xml | 2 +- res/values-sv/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 9c5273926d..8154c66e38 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -68,7 +68,7 @@ "Désactivé par votre administrateur" "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" - "Lorsque l\'utilisateur fait pivoter le téléphone" + "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." "Inconnu" "Supprimer" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index c3e60fc593..1d405ba19b 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -68,7 +68,7 @@ "Inaktiverat av administratören" "Översikt" "Tillåt rotering av startskärmen" - "När mobilen roterar" + "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" "Okänt" "Ta bort" From d9d73d8aa7dfbcb083a51011df0127488e92cf2f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 15 Aug 2016 18:02:15 -0700 Subject: [PATCH 031/382] Import translations. DO NOT MERGE Change-Id: Ibe236dabffa61ef50952deee1ec1f00ca0f37096 Auto-generated-cl: translation import --- res/values-fr-rCA/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index a82427ee41..1fb2e82cb8 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -68,7 +68,7 @@ "Cette fonction est désactivée par votre administrateur" "Présentation" "Autoriser la rotation de l\'écran d\'accueil" - "Quand le téléphone est pivoté" + "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" "Inconnu" "Supprimer" From c2936bcbdbdfbf3b499b39c65ce1942694f35676 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Sep 2016 15:50:36 -0700 Subject: [PATCH 032/382] Moving AppsAvailabilityCheck into a separate class Change-Id: Ieea1b5100d63752d928049ad9b1d3b4f84234f0d --- src/com/android/launcher3/LauncherModel.java | 66 +++----------- .../model/SdCardAvailableReceiver.java | 88 +++++++++++++++++++ 2 files changed, 102 insertions(+), 52 deletions(-) create mode 100644 src/com/android/launcher3/model/SdCardAvailableReceiver.java diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 68450e7a74..ccde0e9cf1 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -59,6 +59,7 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; +import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.provider.ImportDataTask; import com.android.launcher3.provider.LauncherDbUtils; @@ -188,10 +189,6 @@ public class LauncherModel extends BroadcastReceiver // times it is pinned. static final Map sBgPinnedShortcutCounts = new HashMap<>(); - // sPendingPackages is a set of packages which could be on sdcard and are not available yet - static final HashMap> sPendingPackages = - new HashMap>(); - // private IconCache mIconCache; @@ -1150,9 +1147,12 @@ public class LauncherModel extends BroadcastReceiver @Override public void onPackageRemoved(String packageName, UserHandleCompat user) { + onPackagesRemoved(user, packageName); + } + + public void onPackagesRemoved(UserHandleCompat user, String... packages) { int op = PackageUpdatedTask.OP_REMOVE; - enqueueItemUpdatedTask(new PackageUpdatedTask(op, new String[] { packageName }, - user)); + enqueueItemUpdatedTask(new PackageUpdatedTask(op, packages, user)); } @Override @@ -1663,6 +1663,7 @@ public class LauncherModel extends BroadcastReceiver final boolean isSafeMode = manager.isSafeMode(); final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final boolean isSdCardReady = Utilities.isBootCompleted(); + final MultiHashMap pendingPackages = new MultiHashMap<>(); LauncherAppState app = LauncherAppState.getInstance(); InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); @@ -1901,12 +1902,7 @@ public class LauncherModel extends BroadcastReceiver // SdCard is not ready yet. Package might get available, // once it is ready. Log.d(TAG, "Invalid package: " + cn + " (check again later)"); - HashSet pkgs = sPendingPackages.get(user); - if (pkgs == null) { - pkgs = new HashSet(); - sPendingPackages.put(user, pkgs); - } - pkgs.add(cn.getPackageName()); + pendingPackages.addToList(user, cn.getPackageName()); allowMissingTarget = true; // Add the icon on the workspace anyway. @@ -2298,10 +2294,13 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites._ID, restoredRows), null); } - if (!isSdCardReady && !sPendingPackages.isEmpty()) { - context.registerReceiver(new AppsAvailabilityCheck(), + if (!isSdCardReady && !pendingPackages.isEmpty()) { + context.registerReceiver( + new SdCardAvailableReceiver( + LauncherModel.this, mContext, pendingPackages), new IntentFilter(Intent.ACTION_BOOT_COMPLETED), - null, sWorker); + null, + sWorker); } // Remove any empty screens @@ -2971,43 +2970,6 @@ public class LauncherModel extends BroadcastReceiver sWorker.post(task); } - @Thunk class AppsAvailabilityCheck extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - synchronized (sBgLock) { - final LauncherAppsCompat launcherApps = LauncherAppsCompat - .getInstance(mApp.getContext()); - final PackageManager manager = context.getPackageManager(); - final ArrayList packagesRemoved = new ArrayList(); - final ArrayList packagesUnavailable = new ArrayList(); - for (Entry> entry : sPendingPackages.entrySet()) { - UserHandleCompat user = entry.getKey(); - packagesRemoved.clear(); - packagesUnavailable.clear(); - for (String pkg : entry.getValue()) { - if (!launcherApps.isPackageEnabledForProfile(pkg, user)) { - if (PackageManagerHelper.isAppOnSdcard(manager, pkg)) { - packagesUnavailable.add(pkg); - } else { - packagesRemoved.add(pkg); - } - } - } - if (!packagesRemoved.isEmpty()) { - enqueueItemUpdatedTask(new PackageUpdatedTask(PackageUpdatedTask.OP_REMOVE, - packagesRemoved.toArray(new String[packagesRemoved.size()]), user)); - } - if (!packagesUnavailable.isEmpty()) { - enqueueItemUpdatedTask(new PackageUpdatedTask(PackageUpdatedTask.OP_UNAVAILABLE, - packagesUnavailable.toArray(new String[packagesUnavailable.size()]), user)); - } - } - sPendingPackages.clear(); - } - } - } - private class PackageUpdatedTask implements Runnable { int mOp; String[] mPackages; diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java new file mode 100644 index 0000000000..54260c9153 --- /dev/null +++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2016 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.launcher3.model; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.util.MultiHashMap; +import com.android.launcher3.util.PackageManagerHelper; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Map.Entry; + +/** + * Helper class to re-query app status when SD-card becomes available. + * + * During first load, just after reboot, some apps on sdcard might not be available immediately due + * to some race conditions in the system. We wait for ACTION_BOOT_COMPLETED and process such + * apps again. + */ +public class SdCardAvailableReceiver extends BroadcastReceiver { + + private final LauncherModel mModel; + private final Context mContext; + private final MultiHashMap mPackages; + + public SdCardAvailableReceiver(LauncherModel model, Context context, + MultiHashMap packages) { + mModel = model; + mContext = context; + mPackages = packages; + } + + @Override + public void onReceive(Context context, Intent intent) { + final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); + final PackageManager manager = context.getPackageManager(); + for (Entry> entry : mPackages.entrySet()) { + UserHandleCompat user = entry.getKey(); + + final ArrayList packagesRemoved = new ArrayList<>(); + final ArrayList packagesUnavailable = new ArrayList<>(); + + for (String pkg : new HashSet<>(entry.getValue())) { + if (!launcherApps.isPackageEnabledForProfile(pkg, user)) { + if (PackageManagerHelper.isAppOnSdcard(manager, pkg)) { + packagesUnavailable.add(pkg); + } else { + packagesRemoved.add(pkg); + } + } + } + if (!packagesRemoved.isEmpty()) { + mModel.onPackagesRemoved(user, + packagesRemoved.toArray(new String[packagesRemoved.size()])); + } + if (!packagesUnavailable.isEmpty()) { + mModel.onPackagesUnavailable( + packagesUnavailable.toArray(new String[packagesUnavailable.size()]), + user, false); + } + } + + // Unregister the broadcast receiver, just in case + mContext.unregisterReceiver(this); + } +} From 10629b077c65b648be6a8603a092322d8a2c2c50 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Sep 2016 12:50:11 -0700 Subject: [PATCH 033/382] Moving some image handling classes to .graphics package Change-Id: Id6d3d0b9c345a503ff2e09f073eb4b6449e21c7e --- .../android/launcher3/AutoInstallsLayout.java | 3 +- .../BaseRecyclerViewFastScrollPopup.java | 4 +- src/com/android/launcher3/BubbleTextView.java | 5 +- src/com/android/launcher3/IconCache.java | 11 +- src/com/android/launcher3/LauncherClings.java | 30 -- src/com/android/launcher3/LauncherModel.java | 9 +- .../android/launcher3/LauncherProvider.java | 7 +- src/com/android/launcher3/ShortcutInfo.java | 9 +- src/com/android/launcher3/Utilities.java | 236 ---------------- .../graphics/DragPreviewProvider.java | 3 +- .../HolographicOutlineHelper.java | 12 +- .../{util => graphics}/IconNormalizer.java | 2 +- .../launcher3/graphics/LauncherIcons.java | 258 ++++++++++++++++++ .../shortcuts/DeepShortcutsContainer.java | 3 +- .../ShortcutDragPreviewProvider.java | 4 +- .../launcher3/util/CursorIconInfo.java | 5 +- .../widget/PendingItemPreviewProvider.java | 4 +- .../widget/WidgetsContainerView.java | 3 +- .../com/android/launcher3/BindWidgetTest.java | 1 - .../ui/LauncherInstrumentationTestCase.java | 2 - 20 files changed, 302 insertions(+), 309 deletions(-) delete mode 100644 src/com/android/launcher3/LauncherClings.java rename src/com/android/launcher3/{ => graphics}/HolographicOutlineHelper.java (95%) rename src/com/android/launcher3/{util => graphics}/IconNormalizer.java (99%) create mode 100644 src/com/android/launcher3/graphics/LauncherIcons.java diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index d5309b4f06..8b5a8a863e 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -38,6 +38,7 @@ import android.util.Patterns; import com.android.launcher3.LauncherProvider.SqlArguments; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.Thunk; import org.xmlpull.v1.XmlPullParser; @@ -436,7 +437,7 @@ public class AutoInstallsLayout { return -1; } - ItemInfo.writeBitmap(mValues, Utilities.createIconBitmap(icon, mContext)); + ItemInfo.writeBitmap(mValues, LauncherIcons.createIconBitmap(icon, mContext)); mValues.put(Favorites.ICON_PACKAGE, mIconRes.getResourcePackageName(iconId)); mValues.put(Favorites.ICON_RESOURCE, mIconRes.getResourceName(iconId)); diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java index b9e6277756..b9b044db9d 100644 --- a/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java +++ b/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java @@ -25,6 +25,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import com.android.launcher3.graphics.HolographicOutlineHelper; + /** * The fast scroller popup that shows the section name the list will jump to. */ @@ -116,7 +118,7 @@ public class BaseRecyclerViewFastScrollPopup { mBgBounds.bottom = mBgBounds.top + bgHeight; // Generate a bitmap for a shadow matching these bounds - mShadow = HolographicOutlineHelper.obtain( + mShadow = HolographicOutlineHelper.getInstance( mRv.getContext()).createMediumDropShadow(mBg, false /* shouldCache */); } else { mShadow = null; diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 33b3ad347a..5cb2d4f317 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -42,6 +42,7 @@ import android.widget.TextView; import com.android.launcher3.IconCache.IconLoadRequest; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.model.PackageItemInfo; import java.text.NumberFormat; @@ -148,7 +149,7 @@ public class BubbleTextView extends TextView mLongPressHelper = new CheckLongPressHelper(this); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); - mOutlineHelper = HolographicOutlineHelper.obtain(getContext()); + mOutlineHelper = HolographicOutlineHelper.getInstance(getContext()); setAccessibilityDelegate(mLauncher.getAccessibilityDelegate()); } @@ -326,7 +327,7 @@ public class BubbleTextView extends TextView void setStayPressed(boolean stayPressed) { mStayPressed = stayPressed; if (!stayPressed) { - HolographicOutlineHelper.obtain(getContext()).recycleShadowBitmap(mPressedBackground); + HolographicOutlineHelper.getInstance(getContext()).recycleShadowBitmap(mPressedBackground); mPressedBackground = null; } else { if (mPressedBackground == null) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index a49162c8bf..9ac4847386 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -47,6 +47,7 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.SQLiteCacheHelper; @@ -187,7 +188,7 @@ public class IconCache { private Bitmap makeDefaultIcon(UserHandleCompat user) { Drawable unbadged = getFullResDefaultActivityIcon(); - return Utilities.createBadgedIconBitmap(unbadged, user, mContext); + return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext); } /** @@ -387,7 +388,7 @@ public class IconCache { } if (entry == null) { entry = new CacheEntry(); - entry.icon = Utilities.createBadgedIconBitmap( + entry.icon = LauncherIcons.createBadgedIconBitmap( mIconProvider.getIcon(app, mIconDpi), app.getUser(), mContext); } @@ -555,7 +556,7 @@ public class IconCache { // Check the DB first. if (!getEntryFromDB(cacheKey, entry, useLowResIcon) || DEBUG_IGNORE_CACHE) { if (info != null) { - entry.icon = Utilities.createBadgedIconBitmap( + entry.icon = LauncherIcons.createBadgedIconBitmap( mIconProvider.getIcon(info, mIconDpi), info.getUser(), mContext); } else { @@ -606,7 +607,7 @@ public class IconCache { entry.title = title; } if (icon != null) { - entry.icon = Utilities.createIconBitmap(icon, mContext); + entry.icon = LauncherIcons.createIconBitmap(icon, mContext); } } @@ -641,7 +642,7 @@ public class IconCache { // Load the full res icon for the application, but if useLowResIcon is set, then // only keep the low resolution icon instead of the larger full-sized icon - Bitmap icon = Utilities.createBadgedIconBitmap( + Bitmap icon = LauncherIcons.createBadgedIconBitmap( appInfo.loadIcon(mPackageManager), user, mContext); Bitmap lowResIcon = generateLowResIcon(icon, mPackageBgColor); entry.title = appInfo.loadLabel(mPackageManager); diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java deleted file mode 100644 index c1282b51c1..0000000000 --- a/src/com/android/launcher3/LauncherClings.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2008 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.launcher3; - -import android.content.Context; - -@Deprecated -public class LauncherClings { - private static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed"; - - public static void markFirstRunClingDismissed(Context ctx) { - Utilities.getPrefs(ctx).edit() - .putBoolean(WORKSPACE_CLING_DISMISSED_KEY, true) - .apply(); - } -} diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 68450e7a74..c4987298a5 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -57,6 +57,7 @@ import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.model.WidgetsModel; @@ -3159,7 +3160,7 @@ public class LauncherModel extends BroadcastReceiver // Update shortcuts which use iconResource. if ((si.iconResource != null) && pkgFilter.matches(si.iconResource.packageName)) { - Bitmap icon = Utilities.createIconBitmap( + Bitmap icon = LauncherIcons.createIconBitmap( si.iconResource.packageName, si.iconResource.resourceName, context); if (icon != null) { @@ -3753,17 +3754,15 @@ public class LauncherModel extends BroadcastReceiver } Bitmap icon = null; - boolean customIcon = false; ShortcutIconResource iconResource = null; if (bitmap instanceof Bitmap) { - icon = Utilities.createIconBitmap((Bitmap) bitmap, context); - customIcon = true; + icon = LauncherIcons.createIconBitmap((Bitmap) bitmap, context); } else { Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); if (extra instanceof ShortcutIconResource) { iconResource = (ShortcutIconResource) extra; - icon = Utilities.createIconBitmap(iconResource.packageName, + icon = LauncherIcons.createIconBitmap(iconResource.packageName, iconResource.resourceName, context); } } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index f3d949326c..e1ff6dbc11 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -764,12 +764,7 @@ public class LauncherProvider extends ContentProvider { } } case 16: { - // We use the db version upgrade here to identify users who may not have seen - // clings yet (because they weren't available), but for whom the clings are now - // available (tablet users). Because one of the possible cling flows (migration) - // is very destructive (wipes out workspaces), we want to prevent this from showing - // until clear data. We do so by marking that the clings have been shown. - LauncherClings.markFirstRunClingDismissed(mContext); + // No-op } case 17: { // No-op diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 9d7be1693c..9b4bfbcad5 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -31,6 +31,7 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.ShortcutInfoCompat; /** @@ -323,13 +324,13 @@ public class ShortcutInfo extends ItemInfo { IconCache cache = launcherAppState.getIconCache(); Bitmap unbadgedBitmap = unbadgedDrawable == null ? cache.getDefaultIcon(UserHandleCompat.myUserHandle()) - : Utilities.createScaledBitmapWithoutShadow(unbadgedDrawable, context); + : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); setIcon(getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context)); } protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, IconCache cache, Context context) { - unbadgedBitmap = Utilities.addShadowToIcon(unbadgedBitmap); + unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap); // Get the app info for the source activity. AppInfo appInfo = new AppInfo(); appInfo.user = user; @@ -338,9 +339,9 @@ public class ShortcutInfo extends ItemInfo { cache.getTitleAndIcon(appInfo, shortcutInfo.getActivityInfo(context), false); } catch (NullPointerException e) { // This may happen when we fail to load the activity info. Worst case ignore badging. - return Utilities.badgeIconForUser(unbadgedBitmap, user, context); + return LauncherIcons.badgeIconForUser(unbadgedBitmap, user, context); } - return Utilities.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); + return LauncherIcons.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index e34f509da9..17afe051ad 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -31,19 +31,11 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.content.res.TypedArray; -import android.database.Cursor; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; -import android.graphics.PaintFlagsDrawFilter; import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.PaintDrawable; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; @@ -62,11 +54,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.widget.Toast; -import com.android.launcher3.compat.UserHandleCompat; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; -import com.android.launcher3.graphics.ShadowGenerator; -import com.android.launcher3.util.IconNormalizer; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -90,19 +78,9 @@ public final class Utilities { private static final String TAG = "Launcher.Utilities"; - private static final Rect sOldBounds = new Rect(); - private static final Canvas sCanvas = new Canvas(); - private static final Pattern sTrimPattern = Pattern.compile("^[\\s|\\p{javaSpaceChar}]*(.*)[\\s|\\p{javaSpaceChar}]*$"); - static { - sCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, - Paint.FILTER_BITMAP_FLAG)); - } - static int sColors[] = { 0xffff0000, 0xff00ff00, 0xff0000ff }; - static int sColorIndex = 0; - private static final int[] sLoc0 = new int[2]; private static final int[] sLoc1 = new int[2]; @@ -170,198 +148,6 @@ public final class Utilities { return false; } - public static Bitmap createIconBitmap(Cursor c, int iconIndex, Context context) { - byte[] data = c.getBlob(iconIndex); - try { - return createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length), context); - } catch (Exception e) { - return null; - } - } - - /** - * Returns a bitmap suitable for the all apps view. If the package or the resource do not - * exist, it returns null. - */ - public static Bitmap createIconBitmap(String packageName, String resourceName, - Context context) { - PackageManager packageManager = context.getPackageManager(); - // the resource - try { - Resources resources = packageManager.getResourcesForApplication(packageName); - if (resources != null) { - final int id = resources.getIdentifier(resourceName, null, null); - return createIconBitmap( - resources.getDrawableForDensity(id, LauncherAppState.getInstance() - .getInvariantDeviceProfile().fillResIconDpi), context); - } - } catch (Exception e) { - // Icon not found. - } - return null; - } - - private static int getIconBitmapSize() { - return LauncherAppState.getInstance().getInvariantDeviceProfile().iconBitmapSize; - } - - /** - * Returns a bitmap which is of the appropriate size to be displayed as an icon - */ - public static Bitmap createIconBitmap(Bitmap icon, Context context) { - final int iconBitmapSize = getIconBitmapSize(); - if (iconBitmapSize == icon.getWidth() && iconBitmapSize == icon.getHeight()) { - return icon; - } - return createIconBitmap(new BitmapDrawable(context.getResources(), icon), context); - } - - /** - * Returns a bitmap suitable for the all apps view. The icon is badged for {@param user}. - * The bitmap is also visually normalized with other icons. - */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static Bitmap createBadgedIconBitmap( - Drawable icon, UserHandleCompat user, Context context) { - float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance().getScale(icon, null); - Bitmap bitmap = createIconBitmap(icon, context, scale); - return badgeIconForUser(bitmap, user, context); - } - - /** - * Badges the provided icon with the user badge if required. - */ - public static Bitmap badgeIconForUser(Bitmap icon, UserHandleCompat user, Context context) { - if (Utilities.ATLEAST_LOLLIPOP && user != null - && !UserHandleCompat.myUserHandle().equals(user)) { - BitmapDrawable drawable = new FixedSizeBitmapDrawable(icon); - Drawable badged = context.getPackageManager().getUserBadgedIcon( - drawable, user.getUser()); - if (badged instanceof BitmapDrawable) { - return ((BitmapDrawable) badged).getBitmap(); - } else { - return createIconBitmap(badged, context); - } - } else { - return icon; - } - } - - /** - * Creates a normalized bitmap suitable for the all apps view. The bitmap is also visually - * normalized with other icons and has enough spacing to add shadow. - */ - public static Bitmap createScaledBitmapWithoutShadow(Drawable icon, Context context) { - RectF iconBounds = new RectF(); - float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance().getScale(icon, iconBounds); - scale = Math.min(scale, ShadowGenerator.getScaleForBounds(iconBounds)); - return createIconBitmap(icon, context, scale); - } - - /** - * Adds a shadow to the provided icon. It assumes that the icon has already been scaled using - * {@link #createScaledBitmapWithoutShadow(Drawable, Context)} - */ - public static Bitmap addShadowToIcon(Bitmap icon) { - return ShadowGenerator.getInstance().recreateIcon(icon); - } - - /** - * Adds the {@param badge} on top of {@param srcTgt} using the badge dimensions. - */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static Bitmap badgeWithBitmap(Bitmap srcTgt, Bitmap badge, Context context) { - int badgeSize = context.getResources().getDimensionPixelSize(R.dimen.profile_badge_size); - synchronized (sCanvas) { - sCanvas.setBitmap(srcTgt); - sCanvas.drawBitmap(badge, new Rect(0, 0, badge.getWidth(), badge.getHeight()), - new Rect(srcTgt.getWidth() - badgeSize, - srcTgt.getHeight() - badgeSize, srcTgt.getWidth(), srcTgt.getHeight()), - new Paint(Paint.FILTER_BITMAP_FLAG)); - sCanvas.setBitmap(null); - } - return srcTgt; - } - - /** - * Returns a bitmap suitable for the all apps view. - */ - public static Bitmap createIconBitmap(Drawable icon, Context context) { - return createIconBitmap(icon, context, 1.0f /* scale */); - } - - /** - * @param scale the scale to apply before drawing {@param icon} on the canvas - */ - public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { - synchronized (sCanvas) { - final int iconBitmapSize = getIconBitmapSize(); - - int width = iconBitmapSize; - int height = iconBitmapSize; - - if (icon instanceof PaintDrawable) { - PaintDrawable painter = (PaintDrawable) icon; - painter.setIntrinsicWidth(width); - painter.setIntrinsicHeight(height); - } else if (icon instanceof BitmapDrawable) { - // Ensure the bitmap has a density. - BitmapDrawable bitmapDrawable = (BitmapDrawable) icon; - Bitmap bitmap = bitmapDrawable.getBitmap(); - if (bitmap != null && bitmap.getDensity() == Bitmap.DENSITY_NONE) { - bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics()); - } - } - int sourceWidth = icon.getIntrinsicWidth(); - int sourceHeight = icon.getIntrinsicHeight(); - if (sourceWidth > 0 && sourceHeight > 0) { - // Scale the icon proportionally to the icon dimensions - final float ratio = (float) sourceWidth / sourceHeight; - if (sourceWidth > sourceHeight) { - height = (int) (width / ratio); - } else if (sourceHeight > sourceWidth) { - width = (int) (height * ratio); - } - } - - // no intrinsic size --> use default size - int textureWidth = iconBitmapSize; - int textureHeight = iconBitmapSize; - - final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, - Bitmap.Config.ARGB_8888); - final Canvas canvas = sCanvas; - canvas.setBitmap(bitmap); - - final int left = (textureWidth-width) / 2; - final int top = (textureHeight-height) / 2; - - @SuppressWarnings("all") // suppress dead code warning - final boolean debug = false; - if (debug) { - // draw a big box for the icon for debugging - canvas.drawColor(sColors[sColorIndex]); - if (++sColorIndex >= sColors.length) sColorIndex = 0; - Paint debugPaint = new Paint(); - debugPaint.setColor(0xffcccc00); - canvas.drawRect(left, top, left+width, top+height, debugPaint); - } - - sOldBounds.set(icon.getBounds()); - icon.setBounds(left, top, left+width, top+height); - canvas.save(Canvas.MATRIX_SAVE_FLAG); - canvas.scale(scale, scale, textureWidth / 2, textureHeight / 2); - icon.draw(canvas); - canvas.restore(); - icon.setBounds(sOldBounds); - canvas.setBitmap(null); - - return bitmap; - } - } - /** * Given a coordinate relative to the descendant, find the coordinate in a parent view's * coordinates. @@ -880,28 +666,6 @@ public final class Utilities { return c == null || c.isEmpty(); } - /** - * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. - * This allows the badging to be done based on the action bitmap size rather than - * the scaled bitmap size. - */ - private static class FixedSizeBitmapDrawable extends BitmapDrawable { - - public FixedSizeBitmapDrawable(Bitmap bitmap) { - super(null, bitmap); - } - - @Override - public int getIntrinsicHeight() { - return getBitmap().getWidth(); - } - - @Override - public int getIntrinsicWidth() { - return getBitmap().getWidth(); - } - } - public static int getColorAccent(Context context) { TypedArray ta = context.obtainStyledAttributes(new int[]{android.R.attr.colorAccent}); int colorAccent = ta.getColor(0, 0); diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index bc91c15be9..7ad1e3a430 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; -import com.android.launcher3.HolographicOutlineHelper; import com.android.launcher3.Launcher; import com.android.launcher3.PreloadIconDrawable; import com.android.launcher3.Workspace; @@ -137,7 +136,7 @@ public class DragPreviewProvider { mView.getHeight() + DRAG_BITMAP_PADDING, Bitmap.Config.ALPHA_8); canvas.setBitmap(b); drawDragView(canvas); - HolographicOutlineHelper.obtain(mView.getContext()) + HolographicOutlineHelper.getInstance(mView.getContext()) .applyExpensiveOutlineWithBlur(b, canvas); canvas.setBitmap(null); return b; diff --git a/src/com/android/launcher3/HolographicOutlineHelper.java b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java similarity index 95% rename from src/com/android/launcher3/HolographicOutlineHelper.java rename to src/com/android/launcher3/graphics/HolographicOutlineHelper.java index 9dec7d9e42..0d70bdee1f 100644 --- a/src/com/android/launcher3/HolographicOutlineHelper.java +++ b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3; +package com.android.launcher3.graphics; import android.content.Context; import android.content.res.Resources; @@ -29,6 +29,8 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.SparseArray; +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.R; import com.android.launcher3.config.ProviderConfig; import java.nio.ByteBuffer; @@ -72,9 +74,9 @@ public class HolographicOutlineHelper { mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); } - public static HolographicOutlineHelper obtain(Context context) { + public static HolographicOutlineHelper getInstance(Context context) { if (sInstance == null) { - sInstance = new HolographicOutlineHelper(context); + sInstance = new HolographicOutlineHelper(context.getApplicationContext()); } return sInstance; } @@ -155,11 +157,11 @@ public class HolographicOutlineHelper { thickInnerBlur.recycle(); } - Bitmap createMediumDropShadow(BubbleTextView view) { + public Bitmap createMediumDropShadow(BubbleTextView view) { return createMediumDropShadow(view.getIcon(), view.getScaleX(), view.getScaleY(), true); } - Bitmap createMediumDropShadow(Drawable drawable, boolean shouldCache) { + public Bitmap createMediumDropShadow(Drawable drawable, boolean shouldCache) { return createMediumDropShadow(drawable, 1f, 1f, shouldCache); } diff --git a/src/com/android/launcher3/util/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java similarity index 99% rename from src/com/android/launcher3/util/IconNormalizer.java rename to src/com/android/launcher3/graphics/IconNormalizer.java index 040a1b51a3..f90b2d72e3 100644 --- a/src/com/android/launcher3/util/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3.util; +package com.android.launcher3.graphics; import android.graphics.Bitmap; import android.graphics.Canvas; diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java new file mode 100644 index 0000000000..9f3f3571d2 --- /dev/null +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2016 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.launcher3.graphics; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PaintFlagsDrawFilter; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.PaintDrawable; +import android.os.Build; + +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.config.FeatureFlags; + +/** + * Helper methods for generating various launcher icons + */ +public class LauncherIcons { + + private static final Rect sOldBounds = new Rect(); + private static final Canvas sCanvas = new Canvas(); + + static { + sCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, + Paint.FILTER_BITMAP_FLAG)); + } + + + public static Bitmap createIconBitmap(Cursor c, int iconIndex, Context context) { + byte[] data = c.getBlob(iconIndex); + try { + return createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length), context); + } catch (Exception e) { + return null; + } + } + + /** + * Returns a bitmap suitable for the all apps view. If the package or the resource do not + * exist, it returns null. + */ + public static Bitmap createIconBitmap(String packageName, String resourceName, + Context context) { + PackageManager packageManager = context.getPackageManager(); + // the resource + try { + Resources resources = packageManager.getResourcesForApplication(packageName); + if (resources != null) { + final int id = resources.getIdentifier(resourceName, null, null); + return createIconBitmap( + resources.getDrawableForDensity(id, LauncherAppState.getInstance() + .getInvariantDeviceProfile().fillResIconDpi), context); + } + } catch (Exception e) { + // Icon not found. + } + return null; + } + + private static int getIconBitmapSize() { + return LauncherAppState.getInstance().getInvariantDeviceProfile().iconBitmapSize; + } + + /** + * Returns a bitmap which is of the appropriate size to be displayed as an icon + */ + public static Bitmap createIconBitmap(Bitmap icon, Context context) { + final int iconBitmapSize = getIconBitmapSize(); + if (iconBitmapSize == icon.getWidth() && iconBitmapSize == icon.getHeight()) { + return icon; + } + return createIconBitmap(new BitmapDrawable(context.getResources(), icon), context); + } + + /** + * Returns a bitmap suitable for the all apps view. The icon is badged for {@param user}. + * The bitmap is also visually normalized with other icons. + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public static Bitmap createBadgedIconBitmap( + Drawable icon, UserHandleCompat user, Context context) { + float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? + 1 : IconNormalizer.getInstance().getScale(icon, null); + Bitmap bitmap = createIconBitmap(icon, context, scale); + return badgeIconForUser(bitmap, user, context); + } + + /** + * Badges the provided icon with the user badge if required. + */ + public static Bitmap badgeIconForUser(Bitmap icon, UserHandleCompat user, Context context) { + if (Utilities.ATLEAST_LOLLIPOP && user != null + && !UserHandleCompat.myUserHandle().equals(user)) { + BitmapDrawable drawable = new FixedSizeBitmapDrawable(icon); + Drawable badged = context.getPackageManager().getUserBadgedIcon( + drawable, user.getUser()); + if (badged instanceof BitmapDrawable) { + return ((BitmapDrawable) badged).getBitmap(); + } else { + return createIconBitmap(badged, context); + } + } else { + return icon; + } + } + + /** + * Creates a normalized bitmap suitable for the all apps view. The bitmap is also visually + * normalized with other icons and has enough spacing to add shadow. + */ + public static Bitmap createScaledBitmapWithoutShadow(Drawable icon, Context context) { + RectF iconBounds = new RectF(); + float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? + 1 : IconNormalizer.getInstance().getScale(icon, iconBounds); + scale = Math.min(scale, ShadowGenerator.getScaleForBounds(iconBounds)); + return createIconBitmap(icon, context, scale); + } + + /** + * Adds a shadow to the provided icon. It assumes that the icon has already been scaled using + * {@link #createScaledBitmapWithoutShadow(Drawable, Context)} + */ + public static Bitmap addShadowToIcon(Bitmap icon) { + return ShadowGenerator.getInstance().recreateIcon(icon); + } + + /** + * Adds the {@param badge} on top of {@param srcTgt} using the badge dimensions. + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public static Bitmap badgeWithBitmap(Bitmap srcTgt, Bitmap badge, Context context) { + int badgeSize = context.getResources().getDimensionPixelSize(R.dimen.profile_badge_size); + synchronized (sCanvas) { + sCanvas.setBitmap(srcTgt); + sCanvas.drawBitmap(badge, new Rect(0, 0, badge.getWidth(), badge.getHeight()), + new Rect(srcTgt.getWidth() - badgeSize, + srcTgt.getHeight() - badgeSize, srcTgt.getWidth(), srcTgt.getHeight()), + new Paint(Paint.FILTER_BITMAP_FLAG)); + sCanvas.setBitmap(null); + } + return srcTgt; + } + + /** + * Returns a bitmap suitable for the all apps view. + */ + public static Bitmap createIconBitmap(Drawable icon, Context context) { + return createIconBitmap(icon, context, 1.0f /* scale */); + } + + /** + * @param scale the scale to apply before drawing {@param icon} on the canvas + */ + public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { + synchronized (sCanvas) { + final int iconBitmapSize = getIconBitmapSize(); + + int width = iconBitmapSize; + int height = iconBitmapSize; + + if (icon instanceof PaintDrawable) { + PaintDrawable painter = (PaintDrawable) icon; + painter.setIntrinsicWidth(width); + painter.setIntrinsicHeight(height); + } else if (icon instanceof BitmapDrawable) { + // Ensure the bitmap has a density. + BitmapDrawable bitmapDrawable = (BitmapDrawable) icon; + Bitmap bitmap = bitmapDrawable.getBitmap(); + if (bitmap != null && bitmap.getDensity() == Bitmap.DENSITY_NONE) { + bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics()); + } + } + int sourceWidth = icon.getIntrinsicWidth(); + int sourceHeight = icon.getIntrinsicHeight(); + if (sourceWidth > 0 && sourceHeight > 0) { + // Scale the icon proportionally to the icon dimensions + final float ratio = (float) sourceWidth / sourceHeight; + if (sourceWidth > sourceHeight) { + height = (int) (width / ratio); + } else if (sourceHeight > sourceWidth) { + width = (int) (height * ratio); + } + } + + // no intrinsic size --> use default size + int textureWidth = iconBitmapSize; + int textureHeight = iconBitmapSize; + + final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, + Bitmap.Config.ARGB_8888); + final Canvas canvas = sCanvas; + canvas.setBitmap(bitmap); + + final int left = (textureWidth-width) / 2; + final int top = (textureHeight-height) / 2; + + sOldBounds.set(icon.getBounds()); + icon.setBounds(left, top, left+width, top+height); + canvas.save(Canvas.MATRIX_SAVE_FLAG); + canvas.scale(scale, scale, textureWidth / 2, textureHeight / 2); + icon.draw(canvas); + canvas.restore(); + icon.setBounds(sOldBounds); + canvas.setBitmap(null); + + return bitmap; + } + } + + /** + * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. + * This allows the badging to be done based on the action bitmap size rather than + * the scaled bitmap size. + */ + private static class FixedSizeBitmapDrawable extends BitmapDrawable { + + public FixedSizeBitmapDrawable(Bitmap bitmap) { + super(null, bitmap); + } + + @Override + public int getIntrinsicHeight() { + return getBitmap().getWidth(); + } + + @Override + public int getIntrinsicWidth() { + return getBitmap().getWidth(); + } + } +} diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 3c7ba327b3..38fd9510ad 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -63,6 +63,7 @@ import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -391,7 +392,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC private void showDragView(BubbleTextView originalIcon) { // TODO: implement support for Drawable DragViews so we don't have to create a bitmap here. - Bitmap b = Utilities.createIconBitmap(originalIcon.getIcon(), mLauncher); + Bitmap b = LauncherIcons.createIconBitmap(originalIcon.getIcon(), mLauncher); float scale = mLauncher.getDragLayer().getLocationInDragLayer(originalIcon, mTempXY); int dragLayerX = Math.round(mTempXY[0] - (b.getWidth() - scale * originalIcon.getWidth()) / 2); int dragLayerY = Math.round(mTempXY[1] - (b.getHeight() - scale * b.getHeight()) / 2 diff --git a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java index 2adb82e2d5..fc474f5270 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java +++ b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java @@ -23,7 +23,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.View; -import com.android.launcher3.HolographicOutlineHelper; +import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.Launcher; import com.android.launcher3.Utilities; import com.android.launcher3.graphics.DragPreviewProvider; @@ -44,7 +44,7 @@ public class ShortcutDragPreviewProvider extends DragPreviewProvider { public Bitmap createDragOutline(Canvas canvas) { Bitmap b = drawScaledPreview(canvas, Bitmap.Config.ALPHA_8); - HolographicOutlineHelper.obtain(mView.getContext()) + HolographicOutlineHelper.getInstance(mView.getContext()) .applyExpensiveOutlineWithBlur(b, canvas); canvas.setBitmap(null); return b; diff --git a/src/com/android/launcher3/util/CursorIconInfo.java b/src/com/android/launcher3/util/CursorIconInfo.java index 4fefa986e9..6603ee7658 100644 --- a/src/com/android/launcher3/util/CursorIconInfo.java +++ b/src/com/android/launcher3/util/CursorIconInfo.java @@ -25,6 +25,7 @@ import android.text.TextUtils; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; +import com.android.launcher3.graphics.LauncherIcons; /** * Utility class to load icon from a cursor. @@ -59,7 +60,7 @@ public class CursorIconInfo { info.iconResource = new ShortcutIconResource(); info.iconResource.packageName = packageName; info.iconResource.resourceName = resourceName; - icon = Utilities.createIconBitmap(packageName, resourceName, mContext); + icon = LauncherIcons.createIconBitmap(packageName, resourceName, mContext); } if (icon == null) { // Failed to load from resource, try loading from DB. @@ -72,7 +73,7 @@ public class CursorIconInfo { * Loads the fixed bitmap from the icon if available. */ public Bitmap loadIcon(Cursor c) { - return Utilities.createIconBitmap(c, iconIndex, mContext); + return LauncherIcons.createIconBitmap(c, iconIndex, mContext); } /** diff --git a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java index eaa0bb3d53..7c06701e88 100644 --- a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java +++ b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java @@ -21,7 +21,7 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.view.View; -import com.android.launcher3.HolographicOutlineHelper; +import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.Launcher; import com.android.launcher3.PendingAddItemInfo; import com.android.launcher3.Workspace; @@ -67,7 +67,7 @@ public class PendingItemPreviewProvider extends DragPreviewProvider { // Don't clip alpha values for the drag outline if we're using the default widget preview boolean clipAlpha = !(mAddInfo instanceof PendingAddWidgetInfo && (((PendingAddWidgetInfo) mAddInfo).previewImage == 0)); - HolographicOutlineHelper.obtain(mView.getContext()) + HolographicOutlineHelper.getInstance(mView.getContext()) .applyExpensiveOutlineWithBlur(b, canvas, clipAlpha); canvas.setBitmap(null); diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 70b2945f59..656fba601e 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -45,6 +45,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragController; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -240,7 +241,7 @@ public class WidgetsContainerView extends BaseContainerView } else { PendingAddShortcutInfo createShortcutInfo = (PendingAddShortcutInfo) v.getTag(); Drawable icon = mIconCache.getFullResIcon(createShortcutInfo.activityInfo); - preview = Utilities.createIconBitmap(icon, mLauncher); + preview = LauncherIcons.createIconBitmap(icon, mLauncher); createItemInfo.spanX = createItemInfo.spanY = 1; scale = ((float) mLauncher.getDeviceProfile().iconSizePx) / preview.getWidth(); } diff --git a/tests/src/com/android/launcher3/BindWidgetTest.java b/tests/src/com/android/launcher3/BindWidgetTest.java index 5c5069fea3..c133bf6c85 100644 --- a/tests/src/com/android/launcher3/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/BindWidgetTest.java @@ -232,7 +232,6 @@ public class BindWidgetTest extends LauncherInstrumentationTestCase { runTestOnUiThread(new Runnable() { @Override public void run() { - LauncherClings.markFirstRunClingDismissed(mTargetContext); ManagedProfileHeuristic.markExistingUsersForNoFolderCreation(mTargetContext); LauncherAppState.getInstance().getModel().resetLoadedState(true, true); } diff --git a/tests/src/com/android/launcher3/ui/LauncherInstrumentationTestCase.java b/tests/src/com/android/launcher3/ui/LauncherInstrumentationTestCase.java index e858d17f34..e94fca6ff4 100644 --- a/tests/src/com/android/launcher3/ui/LauncherInstrumentationTestCase.java +++ b/tests/src/com/android/launcher3/ui/LauncherInstrumentationTestCase.java @@ -23,7 +23,6 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.LauncherClings; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -189,7 +188,6 @@ public class LauncherInstrumentationTestCase extends InstrumentationTestCase { LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); LauncherSettings.Settings.call(mTargetContext.getContentResolver(), LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG); - LauncherClings.markFirstRunClingDismissed(mTargetContext); ManagedProfileHeuristic.markExistingUsersForNoFolderCreation(mTargetContext); runTestOnUiThread(new Runnable() { From 40452cf468b44a4173338cc83000b4ad84860ebc Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Sep 2016 15:17:46 -0700 Subject: [PATCH 034/382] Using ItemInfoMatcher in place of similar interfaces and utility methods Change-Id: I7337b819fe8f42f7a5a1481b5ed5d99a8cf583c4 --- src/com/android/launcher3/AllAppsList.java | 9 +- src/com/android/launcher3/Launcher.java | 8 -- src/com/android/launcher3/LauncherModel.java | 128 ++++-------------- src/com/android/launcher3/Workspace.java | 80 ++++------- .../launcher3/util/ItemInfoMatcher.java | 42 ++++++ .../android/launcher3/util/StringFilter.java | 31 ----- 6 files changed, 98 insertions(+), 200 deletions(-) delete mode 100644 src/com/android/launcher3/util/StringFilter.java diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index c4315936cc..c427ddc939 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -23,7 +23,7 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.FlagOp; -import com.android.launcher3.util.StringFilter; +import com.android.launcher3.util.ItemInfoMatcher; import java.util.ArrayList; import java.util.HashSet; @@ -121,14 +121,13 @@ class AllAppsList { } /** - * Updates the apps for the given packageName and user based on {@param op}. + * Updates the disabled flags of apps matching {@param matcher} based on {@param op}. */ - public void updatePackageFlags(StringFilter pkgFilter, UserHandleCompat user, FlagOp op) { + public void updateDisabledFlags(ItemInfoMatcher matcher, FlagOp op) { final List data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); - final ComponentName component = info.intent.getComponent(); - if (info.user.equals(user) && pkgFilter.matches(component.getPackageName())) { + if (matcher.matches(info, info.intent.getComponent())) { info.isDisabled = op.apply(info.isDisabled); modified.add(info); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 901900e0fc..13911b86e1 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4449,14 +4449,6 @@ public class Launcher extends Activity return sCustomAppWidgets; } - public static List getFolderContents(View icon) { - if (icon instanceof FolderIcon) { - return ((FolderIcon) icon).getFolder().getItemsInReadingOrder(); - } else { - return Collections.EMPTY_LIST; - } - } - public static Launcher getLauncher(Context context) { if (context instanceof Launcher) { return (Launcher) context; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2e3d6036a5..5e57aa42a9 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -71,12 +71,12 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.CursorIconInfo; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Preconditions; -import com.android.launcher3.util.StringFilter; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.ViewOnDrawExecutor; @@ -230,10 +230,6 @@ public class LauncherModel extends BroadcastReceiver public void bindDeepShortcutMap(MultiHashMap deepShortcutMap); } - public interface ItemInfoFilter { - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn); - } - LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter, DeepShortcutManager deepShortcutManager) { Context context = app.getContext(); @@ -942,38 +938,26 @@ public class LauncherModel extends BroadcastReceiver runOnWorkerThread(r); } - private static ArrayList getItemsByPackageName( - final String pn, final UserHandleCompat user) { - ItemInfoFilter filter = new ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn) { - return cn.getPackageName().equals(pn) && info.user.equals(user); - } - }; - return filterItemInfos(sBgItemsIdMap, filter); - } - - /** - * Removes all the items from the database corresponding to the specified package. - */ - static void deletePackageFromDatabase(Context context, final String pn, - final UserHandleCompat user) { - deleteItemsFromDatabase(context, getItemsByPackageName(pn, user)); - } - /** * Removes the specified item from the database */ public static void deleteItemFromDatabase(Context context, final ItemInfo item) { - ArrayList items = new ArrayList(); + ArrayList items = new ArrayList<>(); items.add(item); deleteItemsFromDatabase(context, items); } + /** + * Removes all the items from the database matching {@param matcher}. + */ + public static void deleteItemsFromDatabase(Context context, ItemInfoMatcher matcher) { + deleteItemsFromDatabase(context, matcher.filterItemInfos(sBgItemsIdMap)); + } + /** * Removes the specified items from the database */ - static void deleteItemsFromDatabase(Context context, final ArrayList items) { + static void deleteItemsFromDatabase(Context context, final Iterable items) { final ContentResolver cr = context.getContentResolver(); Runnable r = new Runnable() { public void run() { @@ -2972,9 +2956,9 @@ public class LauncherModel extends BroadcastReceiver } private class PackageUpdatedTask implements Runnable { - int mOp; - String[] mPackages; - UserHandleCompat mUser; + final int mOp; + final String[] mPackages; + final UserHandleCompat mUser; public static final int OP_NONE = 0; public static final int OP_ADD = 1; @@ -3001,7 +2985,7 @@ public class LauncherModel extends BroadcastReceiver final String[] packages = mPackages; final int N = packages.length; FlagOp flagOp = FlagOp.NO_OP; - StringFilter pkgFilter = StringFilter.of(new HashSet<>(Arrays.asList(packages))); + final HashSet packageSet = new HashSet<>(Arrays.asList(packages)); switch (mOp) { case OP_ADD: { for (int i=0; i updatedShortcuts = new ArrayList(); - final ArrayList removedShortcuts = new ArrayList(); - final ArrayList widgets = new ArrayList(); + final ArrayList updatedShortcuts = new ArrayList<>(); + final ArrayList removedShortcuts = new ArrayList<>(); + final ArrayList widgets = new ArrayList<>(); synchronized (sBgLock) { for (ItemInfo info : sBgItemsIdMap) { @@ -3121,7 +3105,7 @@ public class LauncherModel extends BroadcastReceiver // Update shortcuts which use iconResource. if ((si.iconResource != null) - && pkgFilter.matches(si.iconResource.packageName)) { + && packageSet.contains(si.iconResource.packageName)) { Bitmap icon = LauncherIcons.createIconBitmap( si.iconResource.packageName, si.iconResource.resourceName, context); @@ -3133,7 +3117,7 @@ public class LauncherModel extends BroadcastReceiver } ComponentName cn = si.getTargetComponent(); - if (cn != null && pkgFilter.matches(cn.getPackageName())) { + if (cn != null && packageSet.contains(cn.getPackageName())) { AppInfo appInfo = addedOrUpdatedApps.get(cn); if (si.isPromise()) { @@ -3198,7 +3182,7 @@ public class LauncherModel extends BroadcastReceiver LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) info; if (mUser.equals(widgetInfo.user) && widgetInfo.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) - && pkgFilter.matches(widgetInfo.providerName.getPackageName())) { + && packageSet.contains(widgetInfo.providerName.getPackageName())) { widgetInfo.restoreStatus &= ~LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY & ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; @@ -3256,12 +3240,10 @@ public class LauncherModel extends BroadcastReceiver } if (!removedPackages.isEmpty() || !removedComponents.isEmpty()) { - for (String pn : removedPackages) { - deletePackageFromDatabase(context, pn, mUser); - } - for (ComponentName cn : removedComponents) { - deleteItemsFromDatabase(context, getItemInfoForComponentName(cn, mUser)); - } + deleteItemsFromDatabase( + context, ItemInfoMatcher.ofPackages(removedPackages, mUser)); + deleteItemsFromDatabase( + context, ItemInfoMatcher.ofComponents(removedComponents, mUser)); // Remove any queued items from the install queue InstallShortcutReceiver.removeFromInstallQueue(context, removedPackages, mUser); @@ -3497,18 +3479,6 @@ public class LauncherModel extends BroadcastReceiver return !launcherApps.isPackageEnabledForProfile(packageName, user); } - public static boolean isValidPackageActivity(Context context, ComponentName cn, - UserHandleCompat user) { - if (cn == null) { - return false; - } - final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - if (!launcherApps.isPackageEnabledForProfile(cn.getPackageName(), user)) { - return false; - } - return launcherApps.isActivityEnabledForProfile(cn, user); - } - public static boolean isValidPackage(Context context, String packageName, UserHandleCompat user) { if (packageName == null) { @@ -3631,50 +3601,6 @@ public class LauncherModel extends BroadcastReceiver return info; } - static ArrayList filterItemInfos(Iterable infos, - ItemInfoFilter f) { - HashSet filtered = new HashSet(); - for (ItemInfo i : infos) { - if (i instanceof ShortcutInfo) { - ShortcutInfo info = (ShortcutInfo) i; - ComponentName cn = info.getTargetComponent(); - if (cn != null && f.filterItem(null, info, cn)) { - filtered.add(info); - } - } else if (i instanceof FolderInfo) { - FolderInfo info = (FolderInfo) i; - for (ShortcutInfo s : info.contents) { - ComponentName cn = s.getTargetComponent(); - if (cn != null && f.filterItem(info, s, cn)) { - filtered.add(s); - } - } - } else if (i instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) i; - ComponentName cn = info.providerName; - if (cn != null && f.filterItem(null, info, cn)) { - filtered.add(info); - } - } - } - return new ArrayList(filtered); - } - - @Thunk ArrayList getItemInfoForComponentName(final ComponentName cname, - final UserHandleCompat user) { - ItemInfoFilter filter = new ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn) { - if (info.user == null) { - return cn.equals(cname); - } else { - return cn.equals(cname) && info.user.equals(user); - } - } - }; - return filterItemInfos(sBgItemsIdMap, filter); - } - /** * Make an ShortcutInfo object for a shortcut that isn't an application. */ diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index d5f1363b43..02c561f918 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -29,7 +29,6 @@ import android.annotation.TargetApi; import android.app.WallpaperManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; -import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -3976,63 +3975,34 @@ public class Workspace extends PagedView for (final CellLayout layoutParent: cellLayouts) { final ViewGroup layout = layoutParent.getShortcutsAndWidgets(); - final HashMap children = new HashMap<>(); + LongArrayMap idToViewMap = new LongArrayMap<>(); + ArrayList items = new ArrayList<>(); for (int j = 0; j < layout.getChildCount(); j++) { final View view = layout.getChildAt(j); - children.put((ItemInfo) view.getTag(), view); + if (view.getTag() instanceof ItemInfo) { + ItemInfo item = (ItemInfo) view.getTag(); + items.add(item); + idToViewMap.put(item.id, view); + } } - final ArrayList childrenToRemove = new ArrayList<>(); - final HashMap> folderAppsToRemove = new HashMap<>(); - LauncherModel.ItemInfoFilter filter = new LauncherModel.ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, - ComponentName cn) { - if (parent instanceof FolderInfo) { - if (matcher.matches(info, cn)) { - FolderInfo folder = (FolderInfo) parent; - ArrayList appsToRemove; - if (folderAppsToRemove.containsKey(folder)) { - appsToRemove = folderAppsToRemove.get(folder); - } else { - appsToRemove = new ArrayList(); - folderAppsToRemove.put(folder, appsToRemove); - } - appsToRemove.add((ShortcutInfo) info); - return true; - } - } else { - if (matcher.matches(info, cn)) { - childrenToRemove.add(children.get(info)); - return true; - } + for (ItemInfo itemToRemove : matcher.filterItemInfos(items)) { + View child = idToViewMap.get(itemToRemove.id); + + if (child != null) { + // Note: We can not remove the view directly from CellLayoutChildren as this + // does not re-mark the spaces as unoccupied. + layoutParent.removeViewInLayout(child); + if (child instanceof DropTarget) { + mDragController.removeDropTarget((DropTarget) child); + } + } else if (itemToRemove.container >= 0) { + // The item may belong to a folder. + View parent = idToViewMap.get(itemToRemove.container); + if (parent != null) { + ((FolderInfo) parent.getTag()).remove((ShortcutInfo) itemToRemove, false); } - return false; } - }; - LauncherModel.filterItemInfos(children.keySet(), filter); - - // Remove all the apps from their folders - for (FolderInfo folder : folderAppsToRemove.keySet()) { - ArrayList appsToRemove = folderAppsToRemove.get(folder); - for (ShortcutInfo info : appsToRemove) { - folder.remove(info, false); - } - } - - // Remove all the other children - for (View child : childrenToRemove) { - // Note: We can not remove the view directly from CellLayoutChildren as this - // does not re-mark the spaces as unoccupied. - layoutParent.removeViewInLayout(child); - if (child instanceof DropTarget) { - mDragController.removeDropTarget((DropTarget) child); - } - } - - if (childrenToRemove.size() > 0) { - layout.requestLayout(); - layout.invalidate(); } } @@ -4133,8 +4103,9 @@ public class Workspace extends PagedView public void removeAbandonedPromise(String packageName, UserHandleCompat user) { HashSet packages = new HashSet<>(1); packages.add(packageName); - LauncherModel.deletePackageFromDatabase(mLauncher, packageName, user); - removeItemsByMatcher(ItemInfoMatcher.ofPackages(packages, user)); + ItemInfoMatcher matcher = ItemInfoMatcher.ofPackages(packages, user); + LauncherModel.deleteItemsFromDatabase(mLauncher, matcher); + removeItemsByMatcher(matcher); } public void updateRestoreItems(final HashSet updates) { @@ -4311,7 +4282,6 @@ public class Workspace extends PagedView @Override public boolean evaluate(ItemInfo info, View view) { if (view instanceof PendingAppWidgetHostView && mInfos.contains(info)) { - PendingAppWidgetHostView hostView = (PendingAppWidgetHostView) view; mLauncher.removeItem(view, info, false /* deleteFromDb */); mLauncher.bindAppWidget((LauncherAppWidgetInfo) info); } diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index 46e9184b48..8f985c344b 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -18,7 +18,9 @@ package com.android.launcher3.util; import android.content.ComponentName; +import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserHandleCompat; @@ -33,6 +35,46 @@ public abstract class ItemInfoMatcher { public abstract boolean matches(ItemInfo info, ComponentName cn); + /** + * Filters {@param infos} to those satisfying the {@link #matches(ItemInfo, ComponentName)}. + */ + public final HashSet filterItemInfos(Iterable infos) { + HashSet filtered = new HashSet<>(); + for (ItemInfo i : infos) { + if (i instanceof ShortcutInfo) { + ShortcutInfo info = (ShortcutInfo) i; + ComponentName cn = info.getTargetComponent(); + if (cn != null && matches(info, cn)) { + filtered.add(info); + } + } else if (i instanceof FolderInfo) { + FolderInfo info = (FolderInfo) i; + for (ShortcutInfo s : info.contents) { + ComponentName cn = s.getTargetComponent(); + if (cn != null && matches(s, cn)) { + filtered.add(s); + } + } + } else if (i instanceof LauncherAppWidgetInfo) { + LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) i; + ComponentName cn = info.providerName; + if (cn != null && matches(info, cn)) { + filtered.add(info); + } + } + } + return filtered; + } + + public static ItemInfoMatcher ofUser(final UserHandleCompat user) { + return new ItemInfoMatcher() { + @Override + public boolean matches(ItemInfo info, ComponentName cn) { + return info.user.equals(user); + } + }; + } + public static ItemInfoMatcher ofComponents( final HashSet components, final UserHandleCompat user) { return new ItemInfoMatcher() { diff --git a/src/com/android/launcher3/util/StringFilter.java b/src/com/android/launcher3/util/StringFilter.java deleted file mode 100644 index f539ad11e8..0000000000 --- a/src/com/android/launcher3/util/StringFilter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.android.launcher3.util; - -import java.util.Set; - -/** - * Abstract class to filter a set of strings. - */ -public abstract class StringFilter { - - private StringFilter() { } - - public abstract boolean matches(String str); - - public static StringFilter matchesAll() { - return new StringFilter() { - @Override - public boolean matches(String str) { - return true; - } - }; - } - - public static StringFilter of(final Set validEntries) { - return new StringFilter() { - @Override - public boolean matches(String str) { - return validEntries.contains(str); - } - }; - } -} From e9956a76c94f2669e92598df0edd3120b85b3be6 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Sep 2016 17:24:47 -0700 Subject: [PATCH 035/382] Separating all the static data in a separate class, BgDataModel. This will allow moving all the Tasks defined in LauncherModel as separate intependent classes Change-Id: I0b2f82b90dc22590eb1cc360a5690e2e7f857b5c --- src/com/android/launcher3/LauncherModel.java | 318 ++++-------------- .../android/launcher3/model/BgDataModel.java | 197 +++++++++++ 2 files changed, 270 insertions(+), 245 deletions(-) create mode 100644 src/com/android/launcher3/model/BgDataModel.java diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 5e57aa42a9..a812317985 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -59,6 +59,7 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.model.BgDataModel; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.WidgetsModel; @@ -161,34 +162,11 @@ public class LauncherModel extends BroadcastReceiver } }; - // The lock that must be acquired before referencing any static bg data structures. Unlike - // other locks, this one can generally be held long-term because we never expect any of these - // static data structures to be referenced outside of the worker thread except on the first - // load after configuration change. - static final Object sBgLock = new Object(); - - // sBgItemsIdMap maps *all* the ItemInfos (shortcuts, folders, and widgets) created by - // LauncherModel to their ids - static final LongArrayMap sBgItemsIdMap = new LongArrayMap<>(); - - // sBgWorkspaceItems is passed to bindItems, which expects a list of all folders and shortcuts - // created by LauncherModel that are directly on the home screen (however, no widgets or - // shortcuts within folders). - static final ArrayList sBgWorkspaceItems = new ArrayList(); - - // sBgAppWidgets is all LauncherAppWidgetInfo created by LauncherModel. Passed to bindAppWidget() - static final ArrayList sBgAppWidgets = - new ArrayList(); - - // sBgFolders is all FolderInfos created by LauncherModel. Passed to bindFolders() - static final LongArrayMap sBgFolders = new LongArrayMap<>(); - - // sBgWorkspaceScreens is the ordered set of workspace screens. - static final ArrayList sBgWorkspaceScreens = new ArrayList(); - - // sBgPinnedShortcutCounts is the ComponentKey representing a pinned shortcut to the number of - // times it is pinned. - static final Map sBgPinnedShortcutCounts = new HashMap<>(); + /** + * All the static data should be accessed on the background thread, A lock should be acquired + * on this object when accessing any data from this model. + */ + static final BgDataModel sBgDataModel = new BgDataModel(); // @@ -270,7 +248,7 @@ public class LauncherModel extends BroadcastReceiver @Override public void run() { - synchronized (sBgLock) { + synchronized (sBgDataModel) { final HashSet updates = new HashSet<>(); if (installInfo.state == PackageInstallerCompat.STATUS_INSTALLED) { @@ -278,7 +256,7 @@ public class LauncherModel extends BroadcastReceiver return; } - for (ItemInfo info : sBgItemsIdMap) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo) { ShortcutInfo si = (ShortcutInfo) info; ComponentName cn = si.getTargetComponent(); @@ -295,7 +273,7 @@ public class LauncherModel extends BroadcastReceiver } } - for (LauncherAppWidgetInfo widget : sBgAppWidgets) { + for (LauncherAppWidgetInfo widget : sBgDataModel.appWidgets) { if (widget.providerName.getPackageName().equals(installInfo.packageName)) { widget.installProgress = installInfo.progress; updates.add(widget); @@ -328,11 +306,11 @@ public class LauncherModel extends BroadcastReceiver @Override public void run() { - synchronized (sBgLock) { + synchronized (sBgDataModel) { ArrayList updates = new ArrayList<>(); UserHandleCompat user = UserHandleCompat.myUserHandle(); - for (ItemInfo info : sBgItemsIdMap) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo) { ShortcutInfo si = (ShortcutInfo) info; ComponentName cn = si.getTargetComponent(); @@ -412,8 +390,8 @@ public class LauncherModel extends BroadcastReceiver // Use sBgItemsIdMap as all the items are already loaded. assertWorkspaceLoaded(); - synchronized (sBgLock) { - for (ItemInfo info : sBgItemsIdMap) { + synchronized (sBgDataModel) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { ArrayList items = screenItems.get(info.screenId); if (items == null) { @@ -490,7 +468,7 @@ public class LauncherModel extends BroadcastReceiver // can not use sBgWorkspaceScreens because loadWorkspace() may not have been // called. ArrayList workspaceScreens = loadWorkspaceScreensDb(context); - synchronized(sBgLock) { + synchronized(sBgDataModel) { for (ItemInfo item : workspaceApps) { if (item instanceof ShortcutInfo) { // Short-circuit this logic if the icon exists somewhere on the workspace @@ -572,7 +550,7 @@ public class LauncherModel extends BroadcastReceiver static void checkItemInfoLocked( final long itemId, final ItemInfo item, StackTraceElement[] stackTrace) { - ItemInfo modelItem = sBgItemsIdMap.get(itemId); + ItemInfo modelItem = sBgDataModel.itemsIdMap.get(itemId); if (modelItem != null && item != modelItem) { // check all the data is consistent if (modelItem instanceof ShortcutInfo && item instanceof ShortcutInfo) { @@ -613,7 +591,7 @@ public class LauncherModel extends BroadcastReceiver final long itemId = item.id; Runnable r = new Runnable() { public void run() { - synchronized (sBgLock) { + synchronized (sBgDataModel) { checkItemInfoLocked(itemId, item, stackTrace); } } @@ -669,13 +647,13 @@ public class LauncherModel extends BroadcastReceiver static void updateItemArrays(ItemInfo item, long itemId, StackTraceElement[] stackTrace) { // Lock on mBgLock *after* the db operation - synchronized (sBgLock) { + synchronized (sBgDataModel) { checkItemInfoLocked(itemId, item, stackTrace); if (item.container != LauncherSettings.Favorites.CONTAINER_DESKTOP && item.container != LauncherSettings.Favorites.CONTAINER_HOTSEAT) { // Item is in a folder, make sure this folder exists - if (!sBgFolders.containsKey(item.container)) { + if (!sBgDataModel.folders.containsKey(item.container)) { // An items container is being set to a that of an item which is not in // the list of Folders. String msg = "item: " + item + " container being set to: " + @@ -687,7 +665,7 @@ public class LauncherModel extends BroadcastReceiver // Items are added/removed from the corresponding FolderInfo elsewhere, such // as in Workspace.onDrop. Here, we just add/remove them from the list of items // that are on the desktop, as appropriate - ItemInfo modelItem = sBgItemsIdMap.get(itemId); + ItemInfo modelItem = sBgDataModel.itemsIdMap.get(itemId); if (modelItem != null && (modelItem.container == LauncherSettings.Favorites.CONTAINER_DESKTOP || modelItem.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT)) { @@ -696,15 +674,15 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - if (!sBgWorkspaceItems.contains(modelItem)) { - sBgWorkspaceItems.add(modelItem); + if (!sBgDataModel.workspaceItems.contains(modelItem)) { + sBgDataModel.workspaceItems.add(modelItem); } break; default: break; } } else { - sBgWorkspaceItems.remove(modelItem); + sBgDataModel.workspaceItems.remove(modelItem); } } } @@ -848,8 +826,8 @@ public class LauncherModel extends BroadcastReceiver intentWithoutPkg = intent.toUri(0); } - synchronized (sBgLock) { - for (ItemInfo item : sBgItemsIdMap) { + synchronized (sBgDataModel) { + for (ItemInfo item : sBgDataModel.itemsIdMap) { if (item instanceof ShortcutInfo) { ShortcutInfo info = (ShortcutInfo) item; Intent targetIntent = info.promisedIntent == null @@ -900,38 +878,9 @@ public class LauncherModel extends BroadcastReceiver public void run() { cr.insert(LauncherSettings.Favorites.CONTENT_URI, values); - // Lock on mBgLock *after* the db operation - synchronized (sBgLock) { + synchronized (sBgDataModel) { checkItemInfoLocked(item.id, item, stackTrace); - sBgItemsIdMap.put(item.id, item); - switch (item.itemType) { - case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - sBgFolders.put(item.id, (FolderInfo) item); - // Fall through - case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP || - item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - sBgWorkspaceItems.add(item); - } else { - if (!sBgFolders.containsKey(item.container)) { - // Adding an item to a folder that doesn't exist. - String msg = "adding item: " + item + " to a folder that " + - " doesn't exist"; - Log.e(TAG, msg); - } - } - if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { - incrementPinnedShortcutCount( - ShortcutKey.fromShortcutInfo((ShortcutInfo) item), - true /* shouldPin */); - } - break; - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - sBgAppWidgets.add((LauncherAppWidgetInfo) item); - break; - } + sBgDataModel.addItem(item, true); } } }; @@ -951,7 +900,7 @@ public class LauncherModel extends BroadcastReceiver * Removes all the items from the database matching {@param matcher}. */ public static void deleteItemsFromDatabase(Context context, ItemInfoMatcher matcher) { - deleteItemsFromDatabase(context, matcher.filterItemInfos(sBgItemsIdMap)); + deleteItemsFromDatabase(context, matcher.filterItemInfos(sBgDataModel.itemsIdMap)); } /** @@ -965,75 +914,13 @@ public class LauncherModel extends BroadcastReceiver final Uri uri = LauncherSettings.Favorites.getContentUri(item.id); cr.delete(uri, null, null); - // Lock on mBgLock *after* the db operation - synchronized (sBgLock) { - switch (item.itemType) { - case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - sBgFolders.remove(item.id); - for (ItemInfo info: sBgItemsIdMap) { - if (info.container == item.id) { - // We are deleting a folder which still contains items that - // think they are contained by that folder. - String msg = "deleting a folder (" + item + ") which still " + - "contains items (" + info + ")"; - Log.e(TAG, msg); - } - } - sBgWorkspaceItems.remove(item); - break; - case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - decrementPinnedShortcutCount(ShortcutKey.fromShortcutInfo( - (ShortcutInfo) item)); - // Fall through. - case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - sBgWorkspaceItems.remove(item); - break; - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - sBgAppWidgets.remove((LauncherAppWidgetInfo) item); - break; - } - sBgItemsIdMap.remove(item.id); - } + sBgDataModel.removeItem(item); } } }; runOnWorkerThread(r); } - /** - * Decrement the count for the given pinned shortcut, unpinning it if the count becomes 0. - */ - private static void decrementPinnedShortcutCount(final ShortcutKey pinnedShortcut) { - synchronized (sBgLock) { - MutableInt count = sBgPinnedShortcutCounts.get(pinnedShortcut); - if (count == null || --count.value == 0) { - LauncherAppState.getInstance().getShortcutManager().unpinShortcut(pinnedShortcut); - } - } - } - - /** - * Increment the count for the given shortcut, pinning it if the count becomes 1. - * - * As an optimization, the caller can pass shouldPin == false to avoid - * unnecessary RPC's if the shortcut is already pinned. - */ - private static void incrementPinnedShortcutCount(ShortcutKey pinnedShortcut, boolean shouldPin) { - synchronized (sBgLock) { - MutableInt count = sBgPinnedShortcutCounts.get(pinnedShortcut); - if (count == null) { - count = new MutableInt(1); - sBgPinnedShortcutCounts.put(pinnedShortcut, count); - } else { - count.value++; - } - if (shouldPin && count.value == 1) { - LauncherAppState.getInstance().getShortcutManager().pinShortcut(pinnedShortcut); - } - } - } - /** * Update the order of the workspace screens in the database. The array list contains * a list of screen ids in the order that they should appear. @@ -1073,9 +960,9 @@ public class LauncherModel extends BroadcastReceiver throw new RuntimeException(ex); } - synchronized (sBgLock) { - sBgWorkspaceScreens.clear(); - sBgWorkspaceScreens.addAll(screensCopy); + synchronized (sBgDataModel) { + sBgDataModel.workspaceScreens.clear(); + sBgDataModel.workspaceScreens.addAll(screensCopy); } } }; @@ -1090,22 +977,13 @@ public class LauncherModel extends BroadcastReceiver Runnable r = new Runnable() { public void run() { - cr.delete(LauncherSettings.Favorites.getContentUri(info.id), null, null); - // Lock on mBgLock *after* the db operation - synchronized (sBgLock) { - sBgItemsIdMap.remove(info.id); - sBgFolders.remove(info.id); - sBgWorkspaceItems.remove(info); - } - cr.delete(LauncherSettings.Favorites.CONTENT_URI, LauncherSettings.Favorites.CONTAINER + "=" + info.id, null); - // Lock on mBgLock *after* the db operation - synchronized (sBgLock) { - for (ItemInfo childInfo : info.contents) { - sBgItemsIdMap.remove(childInfo.id); - } - } + sBgDataModel.removeItem(info.contents); + info.contents.clear(); + + cr.delete(LauncherSettings.Favorites.getContentUri(info.id), null, null); + sBgDataModel.removeItem(info); } }; runOnWorkerThread(r); @@ -1624,18 +1502,6 @@ public class LauncherModel extends BroadcastReceiver } } - /** Clears all the sBg data structures */ - private void clearSBgDataStructures() { - synchronized (sBgLock) { - sBgWorkspaceItems.clear(); - sBgAppWidgets.clear(); - sBgFolders.clear(); - sBgItemsIdMap.clear(); - sBgWorkspaceScreens.clear(); - sBgPinnedShortcutCounts.clear(); - } - } - private void loadWorkspace() { if (LauncherAppState.PROFILE_STARTUP) { Trace.beginSection("Loading Workspace"); @@ -1679,11 +1545,12 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Settings.call(contentResolver, LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES); - synchronized (sBgLock) { - clearSBgDataStructures(); + synchronized (sBgDataModel) { + sBgDataModel.clear(); + final HashMap installingPkgs = PackageInstallerCompat .getInstance(mContext).updateAndGetActiveSessionCache(); - sBgWorkspaceScreens.addAll(loadWorkspaceScreensDb(mContext)); + sBgDataModel.workspaceScreens.addAll(loadWorkspaceScreensDb(mContext)); final ArrayList itemsToRemove = new ArrayList<>(); final ArrayList restoredRows = new ArrayList<>(); @@ -1958,7 +1825,6 @@ public class LauncherModel extends BroadcastReceiver info.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; } - incrementPinnedShortcutCount(key, false /* shouldPin */); } else { // item type == ITEM_TYPE_SHORTCUT info = getShortcutInfo(c, cursorIconInfo); @@ -2000,7 +1866,7 @@ public class LauncherModel extends BroadcastReceiver } // check & update map of what's occupied - if (!checkItemPlacement(occupied, info, sBgWorkspaceScreens)) { + if (!checkItemPlacement(occupied, info, sBgDataModel.workspaceScreens)) { itemsToRemove.add(id); break; } @@ -2017,19 +1883,7 @@ public class LauncherModel extends BroadcastReceiver } } - switch (container) { - case LauncherSettings.Favorites.CONTAINER_DESKTOP: - case LauncherSettings.Favorites.CONTAINER_HOTSEAT: - sBgWorkspaceItems.add(info); - break; - default: - // Item is in a user folder - FolderInfo folderInfo = - findOrMakeFolder(sBgFolders, container); - folderInfo.add(info, false); - break; - } - sBgItemsIdMap.put(info.id, info); + sBgDataModel.addItem(info, false); } else { throw new RuntimeException("Unexpected null ShortcutInfo"); } @@ -2037,7 +1891,7 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: id = c.getLong(idIndex); - FolderInfo folderInfo = findOrMakeFolder(sBgFolders, id); + FolderInfo folderInfo = sBgDataModel.findOrMakeFolder(id); // Do not trim the folder label, as is was set by the user. folderInfo.title = c.getString(cursorIconInfo.titleIndex); @@ -2051,25 +1905,16 @@ public class LauncherModel extends BroadcastReceiver folderInfo.options = c.getInt(optionsIndex); // check & update map of what's occupied - if (!checkItemPlacement(occupied, folderInfo, sBgWorkspaceScreens)) { + if (!checkItemPlacement(occupied, folderInfo, sBgDataModel.workspaceScreens)) { itemsToRemove.add(id); break; } - - switch (container) { - case LauncherSettings.Favorites.CONTAINER_DESKTOP: - case LauncherSettings.Favorites.CONTAINER_HOTSEAT: - sBgWorkspaceItems.add(folderInfo); - break; - } - if (restored) { // no special handling required for restored folders restoredRows.add(id); } - sBgItemsIdMap.put(folderInfo.id, folderInfo); - sBgFolders.put(folderInfo.id, folderInfo); + sBgDataModel.addItem(folderInfo, false); break; case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: @@ -2186,7 +2031,7 @@ public class LauncherModel extends BroadcastReceiver appWidgetInfo.container = container; // check & update map of what's occupied - if (!checkItemPlacement(occupied, appWidgetInfo, sBgWorkspaceScreens)) { + if (!checkItemPlacement(occupied, appWidgetInfo, sBgDataModel.workspaceScreens)) { itemsToRemove.add(id); break; } @@ -2205,8 +2050,7 @@ public class LauncherModel extends BroadcastReceiver updateItem(id, values); } } - sBgItemsIdMap.put(appWidgetInfo.id, appWidgetInfo); - sBgAppWidgets.add(appWidgetInfo); + sBgDataModel.addItem(appWidgetInfo, false); } break; } @@ -2220,7 +2064,7 @@ public class LauncherModel extends BroadcastReceiver // Break early if we've stopped loading if (mStopped) { - clearSBgDataStructures(); + sBgDataModel.clear(); return; } @@ -2240,15 +2084,15 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS) .getSerializable(LauncherSettings.Settings.EXTRA_VALUE); for (long folderId : deletedFolderIds) { - sBgWorkspaceItems.remove(sBgFolders.get(folderId)); - sBgFolders.remove(folderId); - sBgItemsIdMap.remove(folderId); + sBgDataModel.workspaceItems.remove(sBgDataModel.folders.get(folderId)); + sBgDataModel.folders.remove(folderId); + sBgDataModel.itemsIdMap.remove(folderId); } } // Unpin shortcuts that don't exist on the workspace. for (ShortcutKey key : shortcutKeyToPinnedShortcuts.keySet()) { - MutableInt numTimesPinned = sBgPinnedShortcutCounts.get(key); + MutableInt numTimesPinned = sBgDataModel.pinnedShortcutCounts.get(key); if (numTimesPinned == null || numTimesPinned.value == 0) { // Shortcut is pinned but doesn't exist on the workspace; unpin it. mDeepShortcutManager.unpinShortcut(key); @@ -2256,7 +2100,7 @@ public class LauncherModel extends BroadcastReceiver } // Sort all the folder items and make sure the first 3 items are high resolution. - for (FolderInfo folder : sBgFolders) { + for (FolderInfo folder : sBgDataModel.folders) { Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); int pos = 0; for (ShortcutInfo info : folder.contents) { @@ -2289,8 +2133,8 @@ public class LauncherModel extends BroadcastReceiver } // Remove any empty screens - ArrayList unusedScreens = new ArrayList(sBgWorkspaceScreens); - for (ItemInfo item: sBgItemsIdMap) { + ArrayList unusedScreens = new ArrayList(sBgDataModel.workspaceScreens); + for (ItemInfo item: sBgDataModel.itemsIdMap) { long screenId = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && unusedScreens.contains(screenId)) { @@ -2300,8 +2144,8 @@ public class LauncherModel extends BroadcastReceiver // If there are any empty screens remove them, and update. if (unusedScreens.size() != 0) { - sBgWorkspaceScreens.removeAll(unusedScreens); - updateWorkspaceScreenOrder(context, sBgWorkspaceScreens); + sBgDataModel.workspaceScreens.removeAll(unusedScreens); + updateWorkspaceScreenOrder(context, sBgDataModel.workspaceScreens); } if (DEBUG_LOADERS) { @@ -2514,10 +2358,10 @@ public class LauncherModel extends BroadcastReceiver ArrayList appWidgets = new ArrayList<>(); ArrayList orderedScreenIds = new ArrayList<>(); - synchronized (sBgLock) { - workspaceItems.addAll(sBgWorkspaceItems); - appWidgets.addAll(sBgAppWidgets); - orderedScreenIds.addAll(sBgWorkspaceScreens); + synchronized (sBgDataModel) { + workspaceItems.addAll(sBgDataModel.workspaceItems); + appWidgets.addAll(sBgDataModel.appWidgets); + orderedScreenIds.addAll(sBgDataModel.workspaceScreens); } final int currentScreen; @@ -2661,8 +2505,8 @@ public class LauncherModel extends BroadcastReceiver private void updateIconCache() { // Ignore packages which have a promise icon. HashSet packagesToIgnore = new HashSet<>(); - synchronized (sBgLock) { - for (ItemInfo info : sBgItemsIdMap) { + synchronized (sBgDataModel) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo) { ShortcutInfo si = (ShortcutInfo) info; if (si.isPromise() && si.getTargetComponent() != null) { @@ -2825,11 +2669,11 @@ public class LauncherModel extends BroadcastReceiver } public void dumpState() { - synchronized (sBgLock) { + synchronized (sBgDataModel) { Log.d(TAG, "mLoaderTask.mContext=" + mContext); Log.d(TAG, "mLoaderTask.mStopped=" + mStopped); Log.d(TAG, "mLoaderTask.mLoadAndBindStepFinished=" + mLoadAndBindStepFinished); - Log.d(TAG, "mItems size=" + sBgWorkspaceItems.size()); + Log.d(TAG, "mItems size=" + sBgDataModel.workspaceItems.size()); } } } @@ -2898,8 +2742,8 @@ public class LauncherModel extends BroadcastReceiver // If any package icon has changed (app was updated while launcher was dead), // update the corresponding shortcuts. - synchronized (sBgLock) { - for (ItemInfo info : sBgItemsIdMap) { + synchronized (sBgDataModel) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo && user.equals(info.user) && info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { ShortcutInfo si = (ShortcutInfo) info; @@ -3096,8 +2940,8 @@ public class LauncherModel extends BroadcastReceiver final ArrayList removedShortcuts = new ArrayList<>(); final ArrayList widgets = new ArrayList<>(); - synchronized (sBgLock) { - for (ItemInfo info : sBgItemsIdMap) { + synchronized (sBgDataModel) { + for (ItemInfo info : sBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo && mUser.equals(info.user)) { ShortcutInfo si = (ShortcutInfo) info; boolean infoUpdated = false; @@ -3332,7 +3176,7 @@ public class LauncherModel extends BroadcastReceiver // Find ShortcutInfo's that have changed on the workspace. MultiHashMap idsToWorkspaceShortcutInfos = new MultiHashMap<>(); - for (ItemInfo itemInfo : sBgItemsIdMap) { + for (ItemInfo itemInfo : sBgDataModel.itemsIdMap) { if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { ShortcutInfo si = (ShortcutInfo) itemInfo; if (si.getPromisedIntent().getPackage().equals(mPackageName) @@ -3403,7 +3247,7 @@ public class LauncherModel extends BroadcastReceiver // Update the workspace to reflect the changes to updated shortcuts residing on it. ArrayList updatedShortcutInfos = new ArrayList<>(); ArrayList deletedShortcutInfos = new ArrayList<>(); - for (ItemInfo itemInfo : sBgItemsIdMap) { + for (ItemInfo itemInfo : sBgDataModel.itemsIdMap) { if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT && mUser.equals(itemInfo.user)) { ShortcutInfo si = (ShortcutInfo) itemInfo; @@ -3674,22 +3518,6 @@ public class LauncherModel extends BroadcastReceiver return info; } - /** - * Return an existing FolderInfo object if we have encountered this ID previously, - * or make a new one. - */ - @Thunk static FolderInfo findOrMakeFolder(LongArrayMap folders, long id) { - // See if a placeholder was created for us already - FolderInfo folderInfo = folders.get(id); - if (folderInfo == null) { - // No placeholder -- create a new instance - folderInfo = new FolderInfo(); - folders.put(id, folderInfo); - } - return folderInfo; - } - - static boolean isValidProvider(AppWidgetProviderInfo provider) { return (provider != null) && (provider.provider != null) && (provider.provider.getPackageName() != null); @@ -3716,8 +3544,8 @@ public class LauncherModel extends BroadcastReceiver * @return {@link FolderInfo} if its already loaded. */ public FolderInfo findFolderById(Long folderId) { - synchronized (sBgLock) { - return sBgFolders.get(folderId); + synchronized (sBgDataModel) { + return sBgDataModel.folders.get(folderId); } } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java new file mode 100644 index 0000000000..2b7039928d --- /dev/null +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2016 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.launcher3.model; + +import android.util.Log; +import android.util.MutableInt; + +import com.android.launcher3.FolderInfo; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherAppWidgetInfo; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.shortcuts.ShortcutKey; +import com.android.launcher3.util.LongArrayMap; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * All the data stored in-memory and managed by the LauncherModel + */ +public class BgDataModel { + + private static final String TAG = "BgDataModel"; + + /** + * Map of all the ItemInfos (shortcuts, folders, and widgets) created by + * LauncherModel to their ids + */ + public final LongArrayMap itemsIdMap = new LongArrayMap<>(); + + /** + * List of all the folders and shortcuts directly on the home screen (no widgets + * or shortcuts within folders). + */ + public final ArrayList workspaceItems = new ArrayList<>(); + + /** + * All LauncherAppWidgetInfo created by LauncherModel. + */ + public final ArrayList appWidgets = new ArrayList<>(); + + /** + * Map of id to FolderInfos of all the folders created by LauncherModel + */ + public final LongArrayMap folders = new LongArrayMap<>(); + + /** + * Ordered list of workspace screens ids. + */ + public final ArrayList workspaceScreens = new ArrayList<>(); + + /** + * Map of ShortcutKey to the number of times it is pinned. + */ + public final Map pinnedShortcutCounts = new HashMap<>(); + + /** + * Clears all the data + */ + public synchronized void clear() { + workspaceItems.clear(); + appWidgets.clear(); + folders.clear(); + itemsIdMap.clear(); + workspaceScreens.clear(); + pinnedShortcutCounts.clear(); + } + + public synchronized void removeItem(ItemInfo... items) { + removeItem(Arrays.asList(items)); + } + + public synchronized void removeItem(Iterable items) { + for (ItemInfo item : items) { + switch (item.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: + folders.remove(item.id); + if (ProviderConfig.IS_DOGFOOD_BUILD) { + for (ItemInfo info : itemsIdMap) { + if (info.container == item.id) { + // We are deleting a folder which still contains items that + // think they are contained by that folder. + String msg = "deleting a folder (" + item + ") which still " + + "contains items (" + info + ")"; + Log.e(TAG, msg); + } + } + } + workspaceItems.remove(item); + break; + case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: { + // Decrement pinned shortcut count + ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); + MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); + if (count == null || --count.value == 0) { + LauncherAppState.getInstance() + .getShortcutManager().unpinShortcut(pinnedShortcut); + } + // Fall through. + } + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: + workspaceItems.remove(item); + break; + case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: + case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: + appWidgets.remove(item); + break; + } + itemsIdMap.remove(item.id); + } + } + + public synchronized void addItem(ItemInfo item, boolean newItem) { + itemsIdMap.put(item.id, item); + switch (item.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: + folders.put(item.id, (FolderInfo) item); + workspaceItems.add(item); + break; + case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: { + // Increment the count for the given shortcut + ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); + MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); + if (count == null) { + count = new MutableInt(1); + pinnedShortcutCounts.put(pinnedShortcut, count); + } else { + count.value++; + } + + // Since this is a new item, pin the shortcut in the system server. + if (newItem && count.value == 1) { + LauncherAppState.getInstance().getShortcutManager() + .pinShortcut(pinnedShortcut); + } + // Fall through + } + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: + if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP || + item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + workspaceItems.add(item); + } else { + if (newItem) { + if (!folders.containsKey(item.container)) { + // Adding an item to a folder that doesn't exist. + String msg = "adding item: " + item + " to a folder that " + + " doesn't exist"; + Log.e(TAG, msg); + } + } else { + findOrMakeFolder(item.container).add((ShortcutInfo) item, false); + } + + } + break; + case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: + case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: + appWidgets.add((LauncherAppWidgetInfo) item); + break; + } + } + + /** + * Return an existing FolderInfo object if we have encountered this ID previously, + * or make a new one. + */ + public synchronized FolderInfo findOrMakeFolder(long id) { + // See if a placeholder was created for us already + FolderInfo folderInfo = folders.get(id); + if (folderInfo == null) { + // No placeholder -- create a new instance + folderInfo = new FolderInfo(); + folders.put(id, folderInfo); + } + return folderInfo; + } +} From 9d7b94c459dea969765d3d15c6d3ac06675051af Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 12 Sep 2016 15:16:57 -0700 Subject: [PATCH 036/382] Fixing broken build Change-Id: I2429244ff6c9a08ca7c1ab224bb7aad031d76574 --- .../launcher3/dragndrop/ExternalDragPreviewProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java index 6b14be7148..ac50332bf8 100644 --- a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java +++ b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java @@ -23,10 +23,10 @@ import android.graphics.Paint; import android.graphics.Rect; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.HolographicOutlineHelper; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.graphics.DragPreviewProvider; +import com.android.launcher3.graphics.HolographicOutlineHelper; /** * Extension of {@link DragPreviewProvider} which provides a dummy outline when drag starts from @@ -72,7 +72,7 @@ public class ExternalDragPreviewProvider extends DragPreviewProvider { canvas.drawCircle(DRAG_BITMAP_PADDING / 2 + radius, DRAG_BITMAP_PADDING / 2 + radius, radius * 0.9f, paint); - HolographicOutlineHelper.obtain(mLauncher).applyExpensiveOutlineWithBlur(b, canvas); + HolographicOutlineHelper.getInstance(mLauncher).applyExpensiveOutlineWithBlur(b, canvas); canvas.setBitmap(null); return b; } From a9818868216d64c4a8e72d47669198034537a515 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 22 Sep 2016 00:18:16 -0700 Subject: [PATCH 037/382] Import translations. DO NOT MERGE Change-Id: I343b48a459a76f8095562da1d4e6b06ec58acb37 Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 ++ res/values-am/strings.xml | 2 ++ res/values-ar/strings.xml | 2 ++ res/values-az-rAZ/strings.xml | 2 ++ res/values-b+sr+Latn/strings.xml | 2 ++ res/values-be-rBY/strings.xml | 2 ++ res/values-bg/strings.xml | 2 ++ res/values-bn-rBD/strings.xml | 2 ++ res/values-bs-rBA/strings.xml | 2 ++ res/values-ca/strings.xml | 2 ++ res/values-cs/strings.xml | 2 ++ res/values-da/strings.xml | 2 ++ res/values-de/strings.xml | 2 ++ res/values-el/strings.xml | 2 ++ res/values-en-rAU/strings.xml | 2 ++ res/values-en-rGB/strings.xml | 2 ++ res/values-en-rIN/strings.xml | 2 ++ res/values-es-rUS/strings.xml | 2 ++ res/values-es/strings.xml | 2 ++ res/values-et-rEE/strings.xml | 2 ++ res/values-eu-rES/strings.xml | 2 ++ res/values-fa/strings.xml | 2 ++ res/values-fi/strings.xml | 2 ++ res/values-fr-rCA/strings.xml | 2 ++ res/values-fr/strings.xml | 2 ++ res/values-gl-rES/strings.xml | 2 ++ res/values-gu-rIN/strings.xml | 2 ++ res/values-hi/strings.xml | 2 ++ res/values-hr/strings.xml | 2 ++ res/values-hu/strings.xml | 2 ++ res/values-hy-rAM/strings.xml | 2 ++ res/values-in/strings.xml | 2 ++ res/values-is-rIS/strings.xml | 2 ++ res/values-it/strings.xml | 2 ++ res/values-iw/strings.xml | 2 ++ res/values-ja/strings.xml | 2 ++ res/values-ka-rGE/strings.xml | 2 ++ res/values-kk-rKZ/strings.xml | 2 ++ res/values-km-rKH/strings.xml | 2 ++ res/values-kn-rIN/strings.xml | 4 +++- res/values-ko/strings.xml | 2 ++ res/values-ky-rKG/strings.xml | 2 ++ res/values-lo-rLA/strings.xml | 2 ++ res/values-lt/strings.xml | 2 ++ res/values-lv/strings.xml | 2 ++ res/values-mk-rMK/strings.xml | 2 ++ res/values-ml-rIN/strings.xml | 2 ++ res/values-mn-rMN/strings.xml | 2 ++ res/values-mr-rIN/strings.xml | 2 ++ res/values-ms-rMY/strings.xml | 2 ++ res/values-my-rMM/strings.xml | 2 ++ res/values-nb/strings.xml | 2 ++ res/values-ne-rNP/strings.xml | 2 ++ res/values-nl/strings.xml | 2 ++ res/values-pa-rIN/strings.xml | 2 ++ res/values-pl/strings.xml | 2 ++ res/values-pt-rPT/strings.xml | 2 ++ res/values-pt/strings.xml | 2 ++ res/values-ro/strings.xml | 2 ++ res/values-ru/strings.xml | 2 ++ res/values-si-rLK/strings.xml | 2 ++ res/values-sk/strings.xml | 2 ++ res/values-sl/strings.xml | 2 ++ res/values-sq-rAL/strings.xml | 2 ++ res/values-sr/strings.xml | 2 ++ res/values-sv/strings.xml | 2 ++ res/values-sw/strings.xml | 2 ++ res/values-ta-rIN/strings.xml | 2 ++ res/values-te-rIN/strings.xml | 2 ++ res/values-th/strings.xml | 2 ++ res/values-tl/strings.xml | 2 ++ res/values-tr/strings.xml | 2 ++ res/values-uk/strings.xml | 2 ++ res/values-ur-rPK/strings.xml | 2 ++ res/values-uz-rUZ/strings.xml | 2 ++ res/values-vi/strings.xml | 2 ++ res/values-zh-rCN/strings.xml | 2 ++ res/values-zh-rHK/strings.xml | 2 ++ res/values-zh-rTW/strings.xml | 2 ++ res/values-zu/strings.xml | 2 ++ 80 files changed, 161 insertions(+), 1 deletion(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index cde143e7e9..644dcb521f 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -30,6 +30,8 @@ "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" + + "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 53513a684f..7661f9900c 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -30,6 +30,8 @@ "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" + + "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index d7e57c3fb2..c58d20b910 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -30,6 +30,8 @@ "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" + + "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 625fa0cf90..d3928b2571 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -30,6 +30,8 @@ "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" + + "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 9b0ca96755..1e0ed45ec6 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -30,6 +30,8 @@ "Dodirnite i zadržite da biste izabrali vidžet." "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" + + "Pretražite aplikacije" "Aplikacije se učitavaju..." "Nije pronađena nijedna aplikacija za „%1$s“" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index f450091ee6..c3debe9605 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -30,6 +30,8 @@ "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" + + "Пошук у Праграмах" "Ідзе загрузка праграм…" "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 04786abfe4..5158b6ae4d 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -30,6 +30,8 @@ "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" + + "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index ca74b7677f..cb7900b196 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -30,6 +30,8 @@ "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" + + "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 560dde0620..4f10fd2ba6 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -30,6 +30,8 @@ "Dodirnite & i držite da biste uzeli dodatak." "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" + + "Pretraži aplikacije" "Aplikacije se učitavaju…" "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 4f174ae239..c3a32cd564 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -30,6 +30,8 @@ "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" + + "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index a6a9dd69a3..b02e250ff0 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -30,6 +30,8 @@ "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" + + "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 99bc220aa2..e97605d6a9 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -30,6 +30,8 @@ "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" + + "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 36ac06fdc6..9d2670c0a2 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -30,6 +30,8 @@ "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" + + "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 4d3f7084e9..d517af6bc0 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -30,6 +30,8 @@ "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" + + "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 8c95ae1863..9b5231d291 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -30,6 +30,8 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 8c95ae1863..9b5231d291 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -30,6 +30,8 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 8c95ae1863..9b5231d291 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -30,6 +30,8 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4002b97a64..0e1abf12a2 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -30,6 +30,8 @@ "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" + + "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index a6340e01e1..1d7f8241b8 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -30,6 +30,8 @@ "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" + + "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 9deeef9874..31cc0aefba 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -30,6 +30,8 @@ "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" + + "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 9bb9e36ef8..f9265d0121 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -30,6 +30,8 @@ "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" + + "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 92f80f490a..01390c3752 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -30,6 +30,8 @@ "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" + + "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index dd90ddc4df..eb55badf91 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -30,6 +30,8 @@ "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" + + "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 1fb2e82cb8..c9ea37c14c 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -30,6 +30,8 @@ "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" + + "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 8154c66e38..0a60378dc2 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -30,6 +30,8 @@ "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" + + "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 06d95daae7..e678b19a5f 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -30,6 +30,8 @@ "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" + + "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index c5cdad3356..8ad0396322 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -30,6 +30,8 @@ "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" + + "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ee179c1c78..a9de815d22 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -30,6 +30,8 @@ "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" + + "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 00bb190818..10407d1177 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -30,6 +30,8 @@ "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" + + "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 775365b602..2bf1d27abd 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -30,6 +30,8 @@ "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" + + "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 1579614826..b9052e5ea4 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -30,6 +30,8 @@ "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" + + "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 84f91a5c03..bf55bc38e6 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -30,6 +30,8 @@ "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" + + "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 5937d96c27..5d5e894d17 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -30,6 +30,8 @@ "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" + + "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 5db8c1a4c2..a699b9c82e 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -30,6 +30,8 @@ "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" + + "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index c9721d8a7d..2c287331e0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -30,6 +30,8 @@ "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" + + "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 4961433f0f..166ef2d44f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -30,6 +30,8 @@ "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" + + "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index cac3b4d02d..74ab85bd9a 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -30,6 +30,8 @@ "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" + + "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 68cd6c6428..9da9adecd0 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -30,6 +30,8 @@ "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" + + "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 87d31d5793..8fa9179308 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -30,6 +30,8 @@ "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" + + "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index eb5e8bd5e8..2401e41bfe 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -30,6 +30,8 @@ "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" + + "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" @@ -70,7 +72,7 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - "ಅಜ್ಞಾತ" + "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" "ಹುಡುಕು" "ಈ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪನೆಗೊಂಡಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index bf8e780ce5..06b7014e81 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -30,6 +30,8 @@ "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" + + "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 817f8cc80b..734c7b4577 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -30,6 +30,8 @@ "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" + + "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 8329577138..8a26fd676e 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -30,6 +30,8 @@ "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" + + "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 272c559858..210062f68a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -30,6 +30,8 @@ "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" + + "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index d60682e9e5..40746d6b7c 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -30,6 +30,8 @@ "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" + + "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 7e9abaf901..431db0b952 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -30,6 +30,8 @@ "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" + + "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 607db55f65..43a0fe2809 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -30,6 +30,8 @@ "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" + + "ആപ്പ്‌സ് തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 600b5fcd41..df1d7b8942 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -30,6 +30,8 @@ "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" + + "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index b680feab1b..69e20be312 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -30,6 +30,8 @@ "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" + + "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 6a2b10483d..eb80ff97d5 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -30,6 +30,8 @@ "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" + + "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 6d3003a68d..7c978abf19 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -30,6 +30,8 @@ "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" + + "ရှာဖွေမှု အက်ပ်များ" "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 16f22ea8a4..ceb209136f 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -30,6 +30,8 @@ "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" + + "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 61d054f345..434322366c 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -30,6 +30,8 @@ "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" + + "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 24ee20d5ee..64c02b2e58 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -30,6 +30,8 @@ "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" + + "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index e41e46ce25..b5c69e1ee8 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -30,6 +30,8 @@ "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" + + "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index a2308565e8..5b39faf991 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -30,6 +30,8 @@ "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" + + "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d1e37c1c97..cda63eef58 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -30,6 +30,8 @@ "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" + + "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index ac0c828083..6f3e0a09d9 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -30,6 +30,8 @@ "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" + + "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 22a2e4ee35..f2c55ebcd6 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -30,6 +30,8 @@ "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" + + "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 73bbbf8566..d1dfea1cc2 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -30,6 +30,8 @@ "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" + + "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 82bb226803..a91e267e1c 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -30,6 +30,8 @@ "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" + + "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 4e541ce8fe..7d6b5c2019 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -30,6 +30,8 @@ "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" + + "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index c8693b8ab6..c3e1cbdb00 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -30,6 +30,8 @@ "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" + + "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index caa65b2586..fbf08c5744 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -30,6 +30,8 @@ "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" + + "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 856f6476a0..e1dba8070f 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -30,6 +30,8 @@ "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" + + "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 1d405ba19b..6b7d9dcce6 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -30,6 +30,8 @@ "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" + + "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 0e7b768b0c..b5fa1cfc1f 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -30,6 +30,8 @@ "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" + + "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 87081aad0a..4b43e21506 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -30,6 +30,8 @@ "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" + + "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 2fda6a5e73..09d2525c33 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -30,6 +30,8 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" + + "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 8ad5a7c314..b847f75ce3 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -30,6 +30,8 @@ "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" + + "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 922cb53c64..8f251afbc8 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -30,6 +30,8 @@ "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" + + "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 08d5d52950..c91b3dc9ec 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -30,6 +30,8 @@ "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" + + "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index c24e02a417..700775f8c8 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -30,6 +30,8 @@ "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" + + "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 5ed9ddbe5b..c3257839d0 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -30,6 +30,8 @@ "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" + + "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index a58b57c690..4ffd90c90f 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -30,6 +30,8 @@ "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" + + "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 8440060592..e7447935fe 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -30,6 +30,8 @@ "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" + + "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e48722569d..ddd93cf298 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -30,6 +30,8 @@ "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" + + "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 7b96d658b1..2733d7fb04 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -30,6 +30,8 @@ "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" + + "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index cf7a86a3af..5bb9ab9f77 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -30,6 +30,8 @@ "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" + + "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 06cfa201cd..3d624004f2 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -30,6 +30,8 @@ "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" + + "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" From 177ad2bf89f5c0156b8fecfbcdfbd6ddc9f2e936 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 21 Sep 2016 14:27:41 -0700 Subject: [PATCH 038/382] Move TransformingTouchDelegate logic to BaseContainerView. In ag/1460444 we used TransformingTouchDelegate to extend the touch target for the widgets list. Now both WidgetsContainerView and AllAppsContainerView will use the same TransformingTouchDelegate logic to extend the touch target for their respective lists. This is part of a larger refactor where in a follow up CL, we will handle the logic for dismissing WCV and AACV when touching outside of its content in BaseContainerView. (currently broken in WCV). Change-Id: I7fddb456bba34a6533f8824da0481d308a8b715e --- .../android/launcher3/BaseContainerView.java | 39 +++++-- .../allapps/AllAppsContainerView.java | 104 +++--------------- .../widget/WidgetsContainerView.java | 22 +--- 3 files changed, 46 insertions(+), 119 deletions(-) diff --git a/src/com/android/launcher3/BaseContainerView.java b/src/com/android/launcher3/BaseContainerView.java index 96942ee6f8..fe951068a4 100644 --- a/src/com/android/launcher3/BaseContainerView.java +++ b/src/com/android/launcher3/BaseContainerView.java @@ -18,6 +18,7 @@ package com.android.launcher3; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; @@ -27,6 +28,7 @@ import android.widget.FrameLayout; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.util.TransformingTouchDelegate; /** * A base container view, which supports resizing. @@ -39,12 +41,14 @@ public abstract class BaseContainerView extends FrameLayout protected int mContainerPaddingTop; protected int mContainerPaddingBottom; - private InsetDrawable mRevealDrawable; protected final Drawable mBaseDrawable; + private final Rect mBgPaddingRect = new Rect(); private View mRevealView; private View mContent; + private TransformingTouchDelegate mTouchDelegate; + public BaseContainerView(Context context) { this(context, null); } @@ -72,6 +76,12 @@ public abstract class BaseContainerView extends FrameLayout DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile(); grid.addLauncherLayoutChangedListener(this); + + View touchDelegateTargetView = getTouchDelegateTargetView(); + if (touchDelegateTargetView != null) { + mTouchDelegate = new TransformingTouchDelegate(touchDelegateTargetView); + ((View) touchDelegateTargetView.getParent()).setTouchDelegate(mTouchDelegate); + } } @Override @@ -92,6 +102,21 @@ public abstract class BaseContainerView extends FrameLayout updatePaddings(); } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + getRevealView().getBackground().getPadding(mBgPaddingRect); + + View touchDelegateTargetView = getTouchDelegateTargetView(); + if (touchDelegateTargetView != null) { + mTouchDelegate.setBounds( + touchDelegateTargetView.getLeft() - mBgPaddingRect.left, + touchDelegateTargetView.getTop() - mBgPaddingRect.top, + touchDelegateTargetView.getRight() + mBgPaddingRect.right, + touchDelegateTargetView.getBottom() + mBgPaddingRect.bottom); + } + } + @Override public void onLauncherLayoutChanged() { updatePaddings(); @@ -130,14 +155,12 @@ public abstract class BaseContainerView extends FrameLayout } } - mRevealDrawable = new InsetDrawable(mBaseDrawable, + InsetDrawable revealDrawable = new InsetDrawable(mBaseDrawable, mContainerPaddingLeft, mContainerPaddingTop, mContainerPaddingRight, mContainerPaddingBottom); - mRevealView.setBackground(mRevealDrawable); - if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && this instanceof AllAppsContainerView) { - // Skip updating the content background - } else { - mContent.setBackground(mRevealDrawable); - } + mRevealView.setBackground(revealDrawable); + mContent.setBackground(revealDrawable); } + + public abstract View getTouchDelegateTargetView(); } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 290accb1ef..11aa86b44f 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -152,14 +152,12 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private View mSearchContainer; private ExtendedEditText mSearchInput; private HeaderElevationController mElevationController; - private int mSearchContainerOffsetTop; private SpannableStringBuilder mSearchQueryBuilder = null; private int mSectionNamesMargin; private int mNumAppsPerRow; private int mNumPredictedAppsPerRow; - private int mRecyclerViewBottomPadding; // This coordinate is relative to this container view private final Point mBoundsCheckLastTouchDownPos = new Point(-1, -1); @@ -183,13 +181,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mLayoutManager = mAdapter.getLayoutManager(); mItemDecoration = mAdapter.getItemDecoration(); DeviceProfile grid = mLauncher.getDeviceProfile(); - if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && !grid.isVerticalBarLayout()) { - mRecyclerViewBottomPadding = 0; - setPadding(0, 0, 0, 0); - } else { - mRecyclerViewBottomPadding = - res.getDimensionPixelSize(R.dimen.all_apps_list_bottom_padding); - } mSearchQueryBuilder = new SpannableStringBuilder(); Selection.setSelection(mSearchQueryBuilder, 0); } @@ -338,9 +329,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc 0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); mSearchInput.setHint(spanned); - mSearchContainerOffsetTop = getResources().getDimensionPixelSize( - R.dimen.all_apps_search_bar_margin_top); - mElevationController = Utilities.ATLEAST_LOLLIPOP ? new HeaderElevationController.ControllerVL(mSearchContainer) : new HeaderElevationController.ControllerV16(mSearchContainer); @@ -370,6 +358,11 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } } + @Override + public View getTouchDelegateTargetView() { + return mAppsRecyclerView; + } + @Override public void onBoundsChanged(Rect newBounds) { } @@ -377,7 +370,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthPx = MeasureSpec.getSize(widthMeasureSpec); int heightPx = MeasureSpec.getSize(heightMeasureSpec); - updatePaddingsAndMargins(widthPx, heightPx); mContentBounds.set(mContainerPaddingLeft, 0, widthPx - mContainerPaddingRight, heightPx); DeviceProfile grid = mLauncher.getDeviceProfile(); @@ -391,17 +383,14 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mAppsRecyclerView.setNumAppsPerRow(grid, mNumAppsPerRow); mAdapter.setNumAppsPerRow(mNumAppsPerRow); mApps.setNumAppsPerRow(mNumAppsPerRow, mNumPredictedAppsPerRow, new FullMergeAlgorithm()); - if (mNumAppsPerRow > 0) { - int rvPadding = mAppsRecyclerView.getPaddingStart(); // Assumes symmetry - final int thumbMaxWidth = - getResources().getDimensionPixelSize( - R.dimen.container_fastscroll_thumb_max_width); - mSearchContainer.setPadding( - rvPadding - mContainerPaddingLeft + thumbMaxWidth, - mSearchContainer.getPaddingTop(), - rvPadding - mContainerPaddingRight + thumbMaxWidth, - mSearchContainer.getPaddingBottom()); - } + } + + if (!grid.isVerticalBarLayout()) { + View navBarBg = findViewById(R.id.nav_bar_bg); + ViewGroup.LayoutParams params = navBarBg.getLayoutParams(); + params.height = mLauncher.getDragLayer().getInsets().bottom; + navBarBg.setLayoutParams(params); + navBarBg.setVisibility(View.VISIBLE); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; @@ -435,73 +424,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - /** - * Update the background and padding of the Apps view and children. Instead of insetting the - * container view, we inset the background and padding of the recycler view to allow for the - * recycler view to handle touch events (for fast scrolling) all the way to the edge. - */ - private void updatePaddingsAndMargins(int widthPx, int heightPx) { - Rect bgPadding = new Rect(); - getRevealView().getBackground().getPadding(bgPadding); - - mAppsRecyclerView.updateBackgroundPadding(bgPadding); - mAdapter.updateBackgroundPadding(bgPadding); - mElevationController.updateBackgroundPadding(bgPadding); - - // Pad the recycler view by the background padding plus the start margin (for the section - // names) - int maxScrollBarWidth = mAppsRecyclerView.getMaxScrollbarWidth(); - int startInset = Math.max(mSectionNamesMargin, maxScrollBarWidth); - if (Utilities.isRtl(getResources())) { - mAppsRecyclerView.setPadding(bgPadding.left + maxScrollBarWidth, 0, bgPadding.right - + startInset, mRecyclerViewBottomPadding); - } else { - mAppsRecyclerView.setPadding(bgPadding.left + startInset, 0, bgPadding.right + - maxScrollBarWidth, mRecyclerViewBottomPadding); - } - - MarginLayoutParams lp = (MarginLayoutParams) mSearchContainer.getLayoutParams(); - lp.leftMargin = bgPadding.left; - lp.rightMargin = bgPadding.right; - - // Clip the view to the left and right edge of the background to - // to prevent shadows from rendering beyond the edges - final Rect newClipBounds = new Rect( - bgPadding.left, 0, widthPx - bgPadding.right, heightPx); - setClipBounds(newClipBounds); - - // Allow the overscroll effect to reach the edges of the view - mAppsRecyclerView.setClipToPadding(false); - - DeviceProfile grid = mLauncher.getDeviceProfile(); - if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP) { - if (!grid.isVerticalBarLayout()) { - MarginLayoutParams mlp = (MarginLayoutParams) mAppsRecyclerView.getLayoutParams(); - - Rect insets = mLauncher.getDragLayer().getInsets(); - getContentView().setPadding(0, 0, 0, 0); - int height = insets.top + grid.hotseatCellHeightPx; - - mlp.topMargin = height; - mAppsRecyclerView.setLayoutParams(mlp); - - mSearchContainer.setPadding( - mSearchContainer.getPaddingLeft(), - insets.top + mSearchContainerOffsetTop, - mSearchContainer.getPaddingRight(), - mSearchContainer.getPaddingBottom()); - lp.height = height; - - View navBarBg = findViewById(R.id.nav_bar_bg); - ViewGroup.LayoutParams params = navBarBg.getLayoutParams(); - params.height = insets.bottom; - navBarBg.setLayoutParams(params); - navBarBg.setVisibility(View.VISIBLE); - } - } - mSearchContainer.setLayoutParams(lp); - } - @Override public boolean dispatchKeyEvent(KeyEvent event) { // Determine if the key event was actual text, if so, focus the search bar and then dispatch diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 6530c0e5c2..8b72258218 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -21,7 +21,6 @@ import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView.State; import android.util.AttributeSet; import android.util.Log; import android.view.View; @@ -50,7 +49,6 @@ import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.Thunk; -import com.android.launcher3.util.TransformingTouchDelegate; /** * The widgets list view container. @@ -65,12 +63,9 @@ public class WidgetsContainerView extends BaseContainerView private DragController mDragController; private IconCache mIconCache; - private final Rect mTmpBgPaddingRect = new Rect(); - /* Recycler view related member variables */ private WidgetsRecyclerView mRecyclerView; private WidgetsListAdapter mAdapter; - private TransformingTouchDelegate mRecyclerViewTouchDelegate; /* Touch handling related member variables. */ private Toast mWidgetInstructionToast; @@ -98,14 +93,8 @@ public class WidgetsContainerView extends BaseContainerView } @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - getRevealView().getBackground().getPadding(mTmpBgPaddingRect); - mRecyclerViewTouchDelegate.setBounds( - mRecyclerView.getLeft() - mTmpBgPaddingRect.left, - mRecyclerView.getTop() - mTmpBgPaddingRect.top, - mRecyclerView.getRight() + mTmpBgPaddingRect.right, - mRecyclerView.getBottom() + mTmpBgPaddingRect.bottom); + public View getTouchDelegateTargetView() { + return mRecyclerView; } @Override @@ -114,13 +103,6 @@ public class WidgetsContainerView extends BaseContainerView mRecyclerView = (WidgetsRecyclerView) getContentView().findViewById(R.id.widgets_list_view); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - mRecyclerViewTouchDelegate = new TransformingTouchDelegate(mRecyclerView); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - ((View) mRecyclerView.getParent()).setTouchDelegate(mRecyclerViewTouchDelegate); } // From 3298d0ff9b04b9ec386d7c2b587cb78910715b15 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 22 Sep 2016 16:50:17 -0700 Subject: [PATCH 039/382] Move handling touch logic from AllAppsContainerView to BaseContainerView. Now both AllAppsContainerView and WidgetsContainerView will be dismissed when the background is clicked. Bug: 27130340 Change-Id: Ie8446e4b8908742ddc8a227fe71ea56ec11c2457 --- .../android/launcher3/BaseContainerView.java | 53 ++++++++++++++ .../allapps/AllAppsContainerView.java | 70 +------------------ 2 files changed, 54 insertions(+), 69 deletions(-) diff --git a/src/com/android/launcher3/BaseContainerView.java b/src/com/android/launcher3/BaseContainerView.java index fe951068a4..b7321d94fd 100644 --- a/src/com/android/launcher3/BaseContainerView.java +++ b/src/com/android/launcher3/BaseContainerView.java @@ -16,14 +16,19 @@ package com.android.launcher3; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Point; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.util.AttributeSet; +import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.widget.FrameLayout; import com.android.launcher3.allapps.AllAppsContainerView; @@ -49,6 +54,8 @@ public abstract class BaseContainerView extends FrameLayout private TransformingTouchDelegate mTouchDelegate; + private final PointF mLastTouchDownPosPx = new PointF(-1.0f, -1.0f); + public BaseContainerView(Context context) { this(context, null); } @@ -122,6 +129,17 @@ public abstract class BaseContainerView extends FrameLayout updatePaddings(); } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return handleTouchEvent(ev); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent ev) { + return handleTouchEvent(ev); + } + public void setRevealDrawableColor(int color) { ((ColorDrawable) mBaseDrawable).setColor(color); } @@ -162,5 +180,40 @@ public abstract class BaseContainerView extends FrameLayout mContent.setBackground(revealDrawable); } + /** + * Handles the touch events that shows the workspace when clicking outside the bounds of the + * touch delegate target view. + */ + private boolean handleTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + // Check if the touch is outside touch delegate target view + View touchDelegateTargetView = getTouchDelegateTargetView(); + float leftBoundPx = touchDelegateTargetView.getLeft(); + if (ev.getX() < leftBoundPx || + ev.getX() > (touchDelegateTargetView.getWidth() + leftBoundPx)) { + mLastTouchDownPosPx.set((int) ev.getX(), (int) ev.getY()); + } + break; + case MotionEvent.ACTION_UP: + if (mLastTouchDownPosPx.x > -1) { + ViewConfiguration viewConfig = ViewConfiguration.get(getContext()); + float dx = ev.getX() - mLastTouchDownPosPx.x; + float dy = ev.getY() - mLastTouchDownPosPx.y; + float distance = PointF.length(dx, dy); + if (distance < viewConfig.getScaledTouchSlop()) { + // The background was clicked, so just go home + Launcher.getLauncher(getContext()).showWorkspace(true); + return true; + } + } + // Fall through + case MotionEvent.ACTION_CANCEL: + mLastTouchDownPosPx.set(-1, -1); + break; + } + return false; + } + public abstract View getTouchDelegateTargetView(); } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 11aa86b44f..8cb493a48b 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -143,9 +143,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private final RecyclerView.LayoutManager mLayoutManager; private final RecyclerView.ItemDecoration mItemDecoration; - // The computed bounds of the container - private final Rect mContentBounds = new Rect(); - private AllAppsRecyclerView mAppsRecyclerView; private AllAppsSearchBarController mSearchBarController; @@ -158,8 +155,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private int mSectionNamesMargin; private int mNumAppsPerRow; private int mNumPredictedAppsPerRow; - // This coordinate is relative to this container view - private final Point mBoundsCheckLastTouchDownPos = new Point(-1, -1); + public AllAppsContainerView(Context context) { this(context, null); @@ -368,10 +364,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthPx = MeasureSpec.getSize(widthMeasureSpec); - int heightPx = MeasureSpec.getSize(heightMeasureSpec); - mContentBounds.set(mContainerPaddingLeft, 0, widthPx - mContainerPaddingRight, heightPx); - DeviceProfile grid = mLauncher.getDeviceProfile(); grid.updateAppsViewNumCols(); if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP) { @@ -445,17 +437,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc return super.dispatchKeyEvent(event); } - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return handleTouchEvent(ev); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouchEvent(MotionEvent ev) { - return handleTouchEvent(ev); - } - @Override public boolean onLongClick(View v) { // Return early if this is not initiated from a touch @@ -561,55 +542,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } } - /** - * Handles the touch events to dismiss all apps when clicking outside the bounds of the - * recycler view. - */ - private boolean handleTouchEvent(MotionEvent ev) { - DeviceProfile grid = mLauncher.getDeviceProfile(); - int x = (int) ev.getX(); - int y = (int) ev.getY(); - - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: - if (!mContentBounds.isEmpty()) { - // Outset the fixed bounds and check if the touch is outside all apps - Rect tmpRect = new Rect(mContentBounds); - tmpRect.inset(-grid.allAppsIconSizePx / 2, 0); - if (ev.getX() < tmpRect.left || ev.getX() > tmpRect.right) { - mBoundsCheckLastTouchDownPos.set(x, y); - return true; - } - } else { - // Check if the touch is outside all apps - if (ev.getX() < getPaddingLeft() || - ev.getX() > (getWidth() - getPaddingRight())) { - mBoundsCheckLastTouchDownPos.set(x, y); - return true; - } - } - break; - case MotionEvent.ACTION_UP: - if (mBoundsCheckLastTouchDownPos.x > -1) { - ViewConfiguration viewConfig = ViewConfiguration.get(getContext()); - float dx = ev.getX() - mBoundsCheckLastTouchDownPos.x; - float dy = ev.getY() - mBoundsCheckLastTouchDownPos.y; - float distance = (float) Math.hypot(dx, dy); - if (distance < viewConfig.getScaledTouchSlop()) { - // The background was clicked, so just go home - Launcher launcher = (Launcher) getContext(); - launcher.showWorkspace(true); - return true; - } - } - // Fall through - case MotionEvent.ACTION_CANCEL: - mBoundsCheckLastTouchDownPos.set(-1, -1); - break; - } - return false; - } - @Override public void onSearchResult(String query, ArrayList apps) { if (apps != null) { From 66b24572e41a13ba5b85b37cf7be64804299c8f6 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 21 Sep 2016 15:57:55 -0700 Subject: [PATCH 040/382] Exposing custom actions using keyboard shortcut Keyboard shortcuts: ctrl+A => Open all apps ctrl+S => shows deep shortcuts ctrl+O => shows custom actions popup This also removes the direct delete/uninstall key shortcuts, making actidental icon removal less likely Bug: 24065447 Change-Id: Iae63370c0f33620628567cffd4df024064d4d02e --- res/values/strings.xml | 4 + src/com/android/launcher3/FocusHelper.java | 34 ------- src/com/android/launcher3/Launcher.java | 63 +++++++++++++ .../LauncherAccessibilityDelegate.java | 16 ++-- .../ShortcutMenuAccessibilityDelegate.java | 6 +- .../keyboard/CustomActionsPopup.java | 93 +++++++++++++++++++ .../keyboard/FocusIndicatorHelper.java | 2 +- .../shortcuts/DeepShortcutsContainer.java | 4 + .../android/launcher3/util/FocusLogic.java | 3 +- .../launcher3/util/FocusLogicTest.java | 2 - 10 files changed, 180 insertions(+), 47 deletions(-) create mode 100644 src/com/android/launcher3/keyboard/CustomActionsPopup.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 60a37e5ef1..a9c970d6d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -37,6 +37,10 @@ Widgets disabled in Safe mode Shortcut isn\'t available + + Home screen + + Custom actions diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java index c73ceea14a..de079fedae 100644 --- a/src/com/android/launcher3/FocusHelper.java +++ b/src/com/android/launcher3/FocusHelper.java @@ -250,14 +250,6 @@ public class FocusHelper { } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && profile.isVerticalBarLayout()) { keyCode = KeyEvent.KEYCODE_PAGE_DOWN; - } else if (isUninstallKeyChord(e)) { - matrix = FocusLogic.createSparseMatrix(iconLayout); - if (UninstallDropTarget.supportsDrop(launcher, itemInfo)) { - UninstallDropTarget.startUninstallActivity(launcher, itemInfo); - } - } else if (isDeleteKeyChord(e)) { - matrix = FocusLogic.createSparseMatrix(iconLayout); - launcher.removeItem(v, itemInfo, true /* deleteFromDb */); } else { // For other KEYCODE_DPAD_LEFT and KEYCODE_DPAD_RIGHT navigation, do not use the // matrix extended with hotseat. @@ -374,14 +366,6 @@ public class FocusHelper { } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && profile.isVerticalBarLayout()) { matrix = FocusLogic.createSparseMatrixWithHotseat(iconLayout, hotseatLayout, profile); - } else if (isUninstallKeyChord(e)) { - matrix = FocusLogic.createSparseMatrix(iconLayout); - if (UninstallDropTarget.supportsDrop(launcher, itemInfo)) { - UninstallDropTarget.startUninstallActivity(launcher, itemInfo); - } - } else if (isDeleteKeyChord(e)) { - matrix = FocusLogic.createSparseMatrix(iconLayout); - launcher.removeItem(v, itemInfo, true /* deleteFromDb */); } else { matrix = FocusLogic.createSparseMatrix(iconLayout); } @@ -532,24 +516,6 @@ public class FocusHelper { } } - /** - * Returns whether the key event represents a valid uninstall key chord. - */ - private static boolean isUninstallKeyChord(KeyEvent event) { - int keyCode = event.getKeyCode(); - return (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) && - event.hasModifiers(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON); - } - - /** - * Returns whether the key event represents a valid delete key chord. - */ - private static boolean isDeleteKeyChord(KeyEvent event) { - int keyCode = event.getKeyCode(); - return (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) && - event.hasModifiers(KeyEvent.META_CTRL_ON); - } - private static View handlePreviousPageLastItem(Workspace workspace, CellLayout hotseatLayout, int pageIndex, boolean isRtl) { if (pageIndex - 1 < 0) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index dc71d0ca1e..5a25069e70 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -69,6 +69,8 @@ import android.util.Log; import android.view.Display; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; +import android.view.KeyboardShortcutGroup; +import android.view.KeyboardShortcutInfo; import android.view.Menu; import android.view.MotionEvent; import android.view.Surface; @@ -79,6 +81,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.Advanceable; @@ -106,6 +109,7 @@ import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dynamicui.ExtractedColors; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.keyboard.CustomActionsPopup; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.UserEventDispatcher; @@ -4422,6 +4426,65 @@ public class Launcher extends Activity } } + @Override + @TargetApi(Build.VERSION_CODES.N) + public void onProvideKeyboardShortcuts( + List data, Menu menu, int deviceId) { + + ArrayList shortcutInfos = new ArrayList<>(); + if (mState == State.WORKSPACE) { + shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.all_apps_button_label), + KeyEvent.KEYCODE_A, KeyEvent.META_CTRL_ON)); + } + View currentFocus = getCurrentFocus(); + if (new CustomActionsPopup(this, currentFocus).canShow()) { + shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.custom_actions), + KeyEvent.KEYCODE_O, KeyEvent.META_CTRL_ON)); + } + if (currentFocus instanceof BubbleTextView && + ((BubbleTextView) currentFocus).hasDeepShortcuts()) { + shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.action_deep_shortcut), + KeyEvent.KEYCODE_S, KeyEvent.META_CTRL_ON)); + } + if (!shortcutInfos.isEmpty()) { + data.add(new KeyboardShortcutGroup(getString(R.string.home_screen), shortcutInfos)); + } + + super.onProvideKeyboardShortcuts(data, menu, deviceId); + } + + @Override + public boolean onKeyShortcut(int keyCode, KeyEvent event) { + if (event.hasModifiers(KeyEvent.META_CTRL_ON)) { + switch (keyCode) { + case KeyEvent.KEYCODE_A: + if (mState == State.WORKSPACE) { + showAppsView(true, true, false); + return true; + } + break; + case KeyEvent.KEYCODE_S: { + View focusedView = getCurrentFocus(); + if (focusedView instanceof BubbleTextView + && focusedView.getTag() instanceof ItemInfo + && mAccessibilityDelegate.performAction(focusedView, + (ItemInfo) focusedView.getTag(), + LauncherAccessibilityDelegate.DEEP_SHORTCUTS)) { + getOpenShortcutsContainer().requestFocus(); + return true; + } + break; + } + case KeyEvent.KEYCODE_O: + if (new CustomActionsPopup(this, getCurrentFocus()).show()) { + return true; + } + break; + } + } + return super.onKeyShortcut(keyCode, event); + } + public static CustomAppWidget getCustomAppWidget(String name) { return sCustomAppWidgets.get(name); } diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index 173aad044e..439e3145e8 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -57,7 +57,7 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme protected static final int MOVE = R.id.action_move; protected static final int MOVE_TO_WORKSPACE = R.id.action_move_to_workspace; protected static final int RESIZE = R.id.action_resize; - protected static final int DEEP_SHORTCUTS = R.id.action_deep_shortcuts; + public static final int DEEP_SHORTCUTS = R.id.action_deep_shortcuts; public enum DragType { ICON, @@ -100,14 +100,17 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); - addActions(host, info); + addSupportedActions(host, info, false); } - protected void addActions(View host, AccessibilityNodeInfo info) { + public void addSupportedActions(View host, AccessibilityNodeInfo info, boolean fromKeyboard) { if (!(host.getTag() instanceof ItemInfo)) return; ItemInfo item = (ItemInfo) host.getTag(); - if (host instanceof BubbleTextView && ((BubbleTextView) host).hasDeepShortcuts()) { + // If the request came from keyboard, do not add custom shortcuts as that is already + // exposed as a direct shortcut + if (!fromKeyboard && host instanceof BubbleTextView + && ((BubbleTextView) host).hasDeepShortcuts()) { info.addAction(mActions.get(DEEP_SHORTCUTS)); } @@ -121,9 +124,10 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme info.addAction(mActions.get(INFO)); } - if ((item instanceof ShortcutInfo) + // Do not add move actions for keyboard request as this uses virtual nodes. + if (!fromKeyboard && ((item instanceof ShortcutInfo) || (item instanceof LauncherAppWidgetInfo) - || (item instanceof FolderInfo)) { + || (item instanceof FolderInfo))) { info.addAction(mActions.get(MOVE)); if (item.container >= 0) { diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index 0baa8f3db7..5baa7b59e8 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -40,8 +40,10 @@ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDele } @Override - protected void addActions(View host, AccessibilityNodeInfo info) { - info.addAction(mActions.get(ADD_TO_WORKSPACE)); + public void addSupportedActions(View host, AccessibilityNodeInfo info, boolean fromKeyboard) { + if ((host.getParent() instanceof DeepShortcutView)) { + info.addAction(mActions.get(ADD_TO_WORKSPACE)); + } } @Override diff --git a/src/com/android/launcher3/keyboard/CustomActionsPopup.java b/src/com/android/launcher3/keyboard/CustomActionsPopup.java new file mode 100644 index 0000000000..6056f4c109 --- /dev/null +++ b/src/com/android/launcher3/keyboard/CustomActionsPopup.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 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.launcher3.keyboard; + +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnMenuItemClickListener; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.Launcher; +import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; +import com.android.launcher3.shortcuts.DeepShortcutsContainer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Handles showing a popup menu with available custom actions for a launcher icon. + * This allows exposing various custom actions using keyboard shortcuts. + */ +public class CustomActionsPopup implements OnMenuItemClickListener { + + private final Launcher mLauncher; + private final LauncherAccessibilityDelegate mDelegate; + private final View mIcon; + + public CustomActionsPopup(Launcher launcher, View icon) { + mLauncher = launcher; + mIcon = icon; + DeepShortcutsContainer container = launcher.getOpenShortcutsContainer(); + if (container != null) { + mDelegate = container.getAccessibilityDelegate(); + } else { + mDelegate = launcher.getAccessibilityDelegate(); + } + } + + private List getActionList() { + if (mIcon == null || !(mIcon.getTag() instanceof ItemInfo)) { + return Collections.EMPTY_LIST; + } + + AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); + mDelegate.addSupportedActions(mIcon, info, true); + List result = new ArrayList<>(info.getActionList()); + info.recycle(); + return result; + } + + public boolean canShow() { + return !getActionList().isEmpty(); + } + + public boolean show() { + List actions = getActionList(); + if (actions.isEmpty()) { + return false; + } + + PopupMenu popup = new PopupMenu(mLauncher, mIcon); + popup.setOnMenuItemClickListener(this); + Menu menu = popup.getMenu(); + for (AccessibilityAction action : actions) { + menu.add(Menu.NONE, action.getId(), Menu.NONE, action.getLabel()); + } + popup.show(); + return true; + } + + @Override + public boolean onMenuItemClick(MenuItem menuItem) { + return mDelegate.performAction(mIcon, (ItemInfo) mIcon.getTag(), menuItem.getItemId()); + } +} diff --git a/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java b/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java index 7672f5a79e..b0d6b2dbfd 100644 --- a/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java +++ b/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java @@ -143,7 +143,7 @@ public abstract class FocusIndicatorHelper implements } private Rect getDrawRect() { - if (mCurrentView != null) { + if (mCurrentView != null && mCurrentView.isAttachedToWindow()) { viewToRect(mCurrentView, sTempRect1); if (mShift > 0 && mTargetView != null) { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index b02e8abda3..19624fec62 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -677,6 +677,10 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC shortcutAnims.start(); } + public ShortcutMenuAccessibilityDelegate getAccessibilityDelegate() { + return mAccessibilityDelegate; + } + /** * Closes the folder without animation. */ diff --git a/src/com/android/launcher3/util/FocusLogic.java b/src/com/android/launcher3/util/FocusLogic.java index 163c953bb6..afc45fe35b 100644 --- a/src/com/android/launcher3/util/FocusLogic.java +++ b/src/com/android/launcher3/util/FocusLogic.java @@ -79,8 +79,7 @@ public class FocusLogic { return (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_UP || keyCode == KeyEvent.KEYCODE_DPAD_DOWN || keyCode == KeyEvent.KEYCODE_MOVE_HOME || keyCode == KeyEvent.KEYCODE_MOVE_END || - keyCode == KeyEvent.KEYCODE_PAGE_UP || keyCode == KeyEvent.KEYCODE_PAGE_DOWN || - keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL); + keyCode == KeyEvent.KEYCODE_PAGE_UP || keyCode == KeyEvent.KEYCODE_PAGE_DOWN); } public static int handleKeyEvent(int keyCode, int [][] map, int iconIdx, int pageIndex, diff --git a/tests/src/com/android/launcher3/util/FocusLogicTest.java b/tests/src/com/android/launcher3/util/FocusLogicTest.java index eee567fb80..79aed806c5 100644 --- a/tests/src/com/android/launcher3/util/FocusLogicTest.java +++ b/tests/src/com/android/launcher3/util/FocusLogicTest.java @@ -49,8 +49,6 @@ public final class FocusLogicTest extends AndroidTestCase { assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_END)); assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_UP)); assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_DOWN)); - assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DEL)); - assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_FORWARD_DEL)); } public void testCreateSparseMatrix() { From 6ad72f02fd233f2294222477102e83d721100493 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 23 Sep 2016 11:01:10 -0700 Subject: [PATCH 041/382] Resize only one widget at a time > Removing logic to have multiple widgets in resize mode > Making ResizeFrame a touch controller, so that it fits well with other touch interaction in drag layer > Chaning the method names in touch controller, so that it do not overlaps with the default View methods Change-Id: I85d4dbdfc82d078781adbce137dfaaea59c9c83d --- .../launcher3/AppWidgetResizeFrame.java | 59 +++++++++++- src/com/android/launcher3/Launcher.java | 2 +- .../launcher3/PinchToOverviewListener.java | 4 +- src/com/android/launcher3/Workspace.java | 6 +- .../allapps/AllAppsTransitionController.java | 4 +- .../launcher3/dragndrop/DragController.java | 4 +- .../launcher3/dragndrop/DragLayer.java | 91 +++++-------------- .../shortcuts/DeepShortcutsContainer.java | 2 +- .../launcher3/util/TouchController.java | 28 +++++- 9 files changed, 113 insertions(+), 87 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index daeca3bef0..f0ec50343a 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -15,14 +15,17 @@ import android.graphics.Point; import android.graphics.Rect; import android.view.Gravity; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import com.android.launcher3.accessibility.DragViewStateAnnouncer; import com.android.launcher3.util.FocusLogic; +import com.android.launcher3.util.TouchController; -public class AppWidgetResizeFrame extends FrameLayout implements View.OnKeyListener { +public class AppWidgetResizeFrame extends FrameLayout + implements View.OnKeyListener, TouchController { private static final int SNAP_DURATION = 150; private static final float DIMMED_HANDLE_ALPHA = 0f; private static final float RESIZE_THRESHOLD = 0.66f; @@ -76,6 +79,8 @@ public class AppWidgetResizeFrame extends FrameLayout implements View.OnKeyListe private int mTopTouchRegionAdjustment = 0; private int mBottomTouchRegionAdjustment = 0; + private int mXDown, mYDown; + public AppWidgetResizeFrame(Context context, LauncherAppWidgetHostView widgetView, CellLayout cellLayout, DragLayer dragLayer) { @@ -205,7 +210,7 @@ public class AppWidgetResizeFrame extends FrameLayout implements View.OnKeyListe } } - public void visualizeResizeForDelta(int deltaX, int deltaY) { + private void visualizeResizeForDelta(int deltaX, int deltaY) { visualizeResizeForDelta(deltaX, deltaY, false); } @@ -398,7 +403,7 @@ public class AppWidgetResizeFrame extends FrameLayout implements View.OnKeyListe requestLayout(); } - public void onTouchUp() { + private void onTouchUp() { int xThreshold = mCellLayout.getCellWidth() + mCellLayout.getWidthGap(); int yThreshold = mCellLayout.getCellHeight() + mCellLayout.getHeightGap(); @@ -493,10 +498,56 @@ public class AppWidgetResizeFrame extends FrameLayout implements View.OnKeyListe public boolean onKey(View v, int keyCode, KeyEvent event) { // Clear the frame and give focus to the widget host view when a directional key is pressed. if (FocusLogic.shouldConsume(keyCode)) { - mDragLayer.clearAllResizeFrames(); + mDragLayer.clearResizeFrame(); mWidgetView.requestFocus(); return true; } return false; } + + private boolean handleTouchDown(MotionEvent ev) { + Rect hitRect = new Rect(); + int x = (int) ev.getX(); + int y = (int) ev.getY(); + + getHitRect(hitRect); + if (hitRect.contains(x, y)) { + if (beginResizeIfPointInRegion(x - getLeft(), y - getTop())) { + mXDown = x; + mYDown = y; + return true; + } + } + return false; + } + + @Override + public boolean onControllerTouchEvent(MotionEvent ev) { + int action = ev.getAction(); + int x = (int) ev.getX(); + int y = (int) ev.getY(); + + switch (action) { + case MotionEvent.ACTION_DOWN: + return handleTouchDown(ev); + case MotionEvent.ACTION_MOVE: + visualizeResizeForDelta(x - mXDown, y - mYDown); + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + visualizeResizeForDelta(x - mXDown, y - mYDown); + onTouchUp(); + mXDown = mYDown = 0; + break; + } + return true; + } + + @Override + public boolean onControllerInterceptTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN && handleTouchDown(ev)) { + return true; + } + return false; + } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index dc71d0ca1e..1c549e82a9 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1565,7 +1565,7 @@ public class Launcher extends Activity final String action = intent.getAction(); if (Intent.ACTION_SCREEN_OFF.equals(action)) { mUserPresent = false; - mDragLayer.clearAllResizeFrames(); + mDragLayer.clearResizeFrame(); updateAutoAdvanceState(); // Reset AllApps to its initial state only if we are not in the middle of diff --git a/src/com/android/launcher3/PinchToOverviewListener.java b/src/com/android/launcher3/PinchToOverviewListener.java index 48a75d111c..bc5ac24569 100644 --- a/src/com/android/launcher3/PinchToOverviewListener.java +++ b/src/com/android/launcher3/PinchToOverviewListener.java @@ -61,12 +61,12 @@ public class PinchToOverviewListener extends ScaleGestureDetector.SimpleOnScaleG mPinchDetector = new ScaleGestureDetector((Context) mLauncher, this); } - public boolean onInterceptTouchEvent(MotionEvent ev) { + public boolean onControllerInterceptTouchEvent(MotionEvent ev) { mPinchDetector.onTouchEvent(ev); return mPinchStarted; } - public boolean onTouchEvent(MotionEvent ev) { + public boolean onControllerTouchEvent(MotionEvent ev) { if (mPinchStarted) { if (ev.getPointerCount() > 2) { // Using more than two fingers causes weird behavior, so just cancel the pinch. diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 3d58fc4521..0681b73230 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -25,7 +25,6 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.app.WallpaperManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; @@ -38,7 +37,6 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Parcelable; @@ -2014,7 +2012,7 @@ public class Workspace extends PagedView public void exitWidgetResizeMode() { DragLayer dragLayer = mLauncher.getDragLayer(); - dragLayer.clearAllResizeFrames(); + dragLayer.clearResizeFrame(); } @Override @@ -2715,7 +2713,7 @@ public class Workspace extends PagedView public void run() { if (!isPageMoving() && !mIsSwitchingState) { DragLayer dragLayer = mLauncher.getDragLayer(); - dragLayer.addResizeFrame(info, hostView, cellLayout); + dragLayer.addResizeFrame(hostView, cellLayout); } } }; diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 9fcc6a40e7..b27246a7bb 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -106,7 +106,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul } @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { + public boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { mNoIntercept = false; if (mLauncher.getWorkspace().isInOverviewMode() || mLauncher.isWidgetsViewVisible()) { @@ -173,7 +173,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul } @Override - public boolean onTouchEvent(MotionEvent ev) { + public boolean onControllerTouchEvent(MotionEvent ev) { return mDetector.onTouchEvent(ev); } diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index a93ee90194..77a957ac74 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -439,7 +439,7 @@ public class DragController implements DragDriver.EventListener, TouchController /** * Call this from a drag source view. */ - public boolean onInterceptTouchEvent(MotionEvent ev) { + public boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (mOptions != null && mOptions.isAccessibleDrag) { return false; } @@ -582,7 +582,7 @@ public class DragController implements DragDriver.EventListener, TouchController /** * Call this from a drag source view. */ - public boolean onTouchEvent(MotionEvent ev) { + public boolean onControllerTouchEvent(MotionEvent ev) { if (mDragDriver == null || mOptions == null || mOptions.isAccessibleDrag) { return false; } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 016347b179..e1c74bf6d8 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -36,7 +36,6 @@ import android.graphics.Region; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; -import android.util.Log; import android.view.DragEvent; import android.view.KeyEvent; import android.view.MotionEvent; @@ -53,8 +52,6 @@ import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.CellLayout; import com.android.launcher3.DropTargetBar; import com.android.launcher3.InsettableFrameLayout; -import com.android.launcher3.InstallShortcutReceiver; -import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PinchToOverviewListener; @@ -72,7 +69,6 @@ import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TouchController; -import java.net.URISyntaxException; import java.util.ArrayList; /** @@ -90,11 +86,9 @@ public class DragLayer extends InsettableFrameLayout { @Thunk DragController mDragController; - private int mXDown, mYDown; private Launcher mLauncher; // Variables relating to resizing widgets - private final ArrayList mResizeFrames = new ArrayList<>(); private final boolean mIsRtl; private AppWidgetResizeFrame mCurrentResizeFrame; @@ -209,23 +203,6 @@ public class DragLayer extends InsettableFrameLayout { } private boolean handleTouchDown(MotionEvent ev, boolean intercept) { - Rect hitRect = new Rect(); - int x = (int) ev.getX(); - int y = (int) ev.getY(); - - for (AppWidgetResizeFrame child: mResizeFrames) { - child.getHitRect(hitRect); - if (hitRect.contains(x, y)) { - if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) { - mCurrentResizeFrame = child; - mXDown = x; - mYDown = y; - requestDisallowInterceptTouchEvent(true); - return true; - } - } - } - // Remove the shortcuts container when touching outside of it. DeepShortcutsContainer deepShortcutsContainer = mLauncher.getOpenShortcutsContainer(); if (deepShortcutsContainer != null) { @@ -289,21 +266,27 @@ public class DragLayer extends InsettableFrameLayout { } mTouchCompleteListener = null; } - clearAllResizeFrames(); - mActiveController = null; - if (mDragController.onInterceptTouchEvent(ev)) { + if (mCurrentResizeFrame != null + && mCurrentResizeFrame.onControllerInterceptTouchEvent(ev)) { + mActiveController = mCurrentResizeFrame; + return true; + } else { + clearResizeFrame(); + } + + if (mDragController.onControllerInterceptTouchEvent(ev)) { mActiveController = mDragController; return true; } - if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && mAllAppsController.onInterceptTouchEvent(ev)) { + if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && mAllAppsController.onControllerInterceptTouchEvent(ev)) { mActiveController = mAllAppsController; return true; } - if (mPinchListener != null && mPinchListener.onInterceptTouchEvent(ev)) { + if (mPinchListener != null && mPinchListener.onControllerInterceptTouchEvent(ev)) { // Stop listening for scrolling etc. (onTouchEvent() handles the rest of the pinch.) mActiveController = mPinchListener; return true; @@ -405,12 +388,8 @@ public class DragLayer extends InsettableFrameLayout { @Override public boolean onTouchEvent(MotionEvent ev) { - boolean handled = false; int action = ev.getAction(); - int x = (int) ev.getX(); - int y = (int) ev.getY(); - if (action == MotionEvent.ACTION_DOWN) { if (handleTouchDown(ev, false)) { return true; @@ -422,22 +401,8 @@ public class DragLayer extends InsettableFrameLayout { mTouchCompleteListener = null; } - if (mCurrentResizeFrame != null) { - handled = true; - switch (action) { - case MotionEvent.ACTION_MOVE: - mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown); - break; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown); - mCurrentResizeFrame.onTouchUp(); - mCurrentResizeFrame = null; - } - } - if (handled) return true; if (mActiveController != null) { - return mActiveController.onTouchEvent(ev); + return mActiveController.onControllerTouchEvent(ev); } return false; } @@ -645,36 +610,24 @@ public class DragLayer extends InsettableFrameLayout { } } - public void clearAllResizeFrames() { - if (mResizeFrames.size() > 0) { - for (AppWidgetResizeFrame frame: mResizeFrames) { - frame.commitResize(); - removeView(frame); - } - mResizeFrames.clear(); + public void clearResizeFrame() { + if (mCurrentResizeFrame != null) { + mCurrentResizeFrame.commitResize(); + removeView(mCurrentResizeFrame); + mCurrentResizeFrame = null; } } - public boolean hasResizeFrames() { - return mResizeFrames.size() > 0; - } + public void addResizeFrame(LauncherAppWidgetHostView widget, CellLayout cellLayout) { + clearResizeFrame(); - public boolean isWidgetBeingResized() { - return mCurrentResizeFrame != null; - } - - public void addResizeFrame(ItemInfo itemInfo, LauncherAppWidgetHostView widget, - CellLayout cellLayout) { - AppWidgetResizeFrame resizeFrame = new AppWidgetResizeFrame(getContext(), - widget, cellLayout, this); + mCurrentResizeFrame = new AppWidgetResizeFrame(getContext(), widget, cellLayout, this); LayoutParams lp = new LayoutParams(-1, -1); lp.customPosition = true; - addView(resizeFrame, lp); - mResizeFrames.add(resizeFrame); - - resizeFrame.snapToWidget(false); + addView(mCurrentResizeFrame, lp); + mCurrentResizeFrame.snapToWidget(false); } public void animateViewIntoPosition(DragView dragView, final int[] pos, float alpha, diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index b02e8abda3..5b308feb96 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -447,7 +447,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC cleanupDeferredDrag(true); mDeferredDragIcon.getParent().requestDisallowInterceptTouchEvent(false); mDeferredDragIcon.getOnLongClickListener().onLongClick(mDeferredDragIcon); - mLauncher.getDragController().onTouchEvent(ev); + mLauncher.getDragController().onControllerTouchEvent(ev); return true; } else if (mDistanceDragged > mDragDeadzone) { // After dragging further than a small deadzone, diff --git a/src/com/android/launcher3/util/TouchController.java b/src/com/android/launcher3/util/TouchController.java index d1409c8b9a..3cca215002 100644 --- a/src/com/android/launcher3/util/TouchController.java +++ b/src/com/android/launcher3/util/TouchController.java @@ -1,8 +1,32 @@ +/* + * Copyright (C) 2016 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.launcher3.util; import android.view.MotionEvent; public interface TouchController { - boolean onTouchEvent(MotionEvent ev); - boolean onInterceptTouchEvent(MotionEvent ev); + + /** + * Called when the draglayer receives touch event. + */ + boolean onControllerTouchEvent(MotionEvent ev); + + /** + * Called when the draglayer receives a intercept touch event. + */ + boolean onControllerInterceptTouchEvent(MotionEvent ev); } From d0d1356f7bc6198005a0749fb163dde54bdb7522 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 26 Sep 2016 07:23:20 -0700 Subject: [PATCH 042/382] Import translations. DO NOT MERGE Change-Id: I3d2522be78fb84923918d056b22fa00d2ee612f8 Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-az-rAZ/strings.xml | 3 +-- res/values-b+sr+Latn/strings.xml | 3 +-- res/values-be-rBY/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bn-rBD/strings.xml | 3 +-- res/values-bs-rBA/strings.xml | 3 +-- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-el/strings.xml | 3 +-- res/values-en-rAU/strings.xml | 3 +-- res/values-en-rGB/strings.xml | 3 +-- res/values-en-rIN/strings.xml | 3 +-- res/values-es-rUS/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-et-rEE/strings.xml | 3 +-- res/values-eu-rES/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr-rCA/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-gl-rES/strings.xml | 3 +-- res/values-gu-rIN/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-hy-rAM/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-is-rIS/strings.xml | 3 +-- res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-ka-rGE/strings.xml | 3 +-- res/values-kk-rKZ/strings.xml | 3 +-- res/values-km-rKH/strings.xml | 3 +-- res/values-kn-rIN/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-ky-rKG/strings.xml | 3 +-- res/values-lo-rLA/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-mk-rMK/strings.xml | 3 +-- res/values-ml-rIN/strings.xml | 3 +-- res/values-mn-rMN/strings.xml | 3 +-- res/values-mr-rIN/strings.xml | 3 +-- res/values-ms-rMY/strings.xml | 3 +-- res/values-my-rMM/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-ne-rNP/strings.xml | 3 +-- res/values-nl/strings.xml | 3 +-- res/values-pa-rIN/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-si-rLK/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 3 +-- res/values-sq-rAL/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-ta-rIN/strings.xml | 3 +-- res/values-te-rIN/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-ur-rPK/strings.xml | 3 +-- res/values-uz-rUZ/strings.xml | 3 +-- res/values-vi/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 3 +-- res/values-zh-rHK/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 3 +-- 80 files changed, 80 insertions(+), 160 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 644dcb521f..9152ea54b1 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -30,8 +30,7 @@ "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" - - + "%1$d breed by %2$d hoog" "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 7661f9900c..c20dc12350 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -30,8 +30,7 @@ "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" - - + "%1$d ስፋት በ%2$d ከፍታ" "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c58d20b910..c80d162c5e 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -30,8 +30,7 @@ "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" - - + "‏العرض %1$d الطول %2$d" "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index d3928b2571..1a4f31b074 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -30,8 +30,7 @@ "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" - - + "%2$d hündürlük %1$d enində" "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 1e0ed45ec6..a9344f9ada 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -30,8 +30,7 @@ "Dodirnite i zadržite da biste izabrali vidžet." "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" - - + "širina od %1$d i visina od %2$d" "Pretražite aplikacije" "Aplikacije se učitavaju..." "Nije pronađena nijedna aplikacija za „%1$s“" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index c3debe9605..f5dba2daea 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -30,8 +30,7 @@ "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" - - + "Шырына: %1$d, вышыня: %2$d" "Пошук у Праграмах" "Ідзе загрузка праграм…" "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 5158b6ae4d..2c6d3d4721 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -30,8 +30,7 @@ "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" - - + "Ширина %1$d и височина %2$d" "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index cb7900b196..d5108e9f84 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -30,8 +30,7 @@ "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" - - + "%2$d উচ্চতা অনুযায়ী %1$d প্রস্থ" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 4f10fd2ba6..579b95a692 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -30,8 +30,7 @@ "Dodirnite & i držite da biste uzeli dodatak." "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" - - + "Širina %1$d, visina %2$d" "Pretraži aplikacije" "Aplikacije se učitavaju…" "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index c3a32cd564..4ba0498211 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -30,8 +30,7 @@ "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" - - + "%1$d d\'amplada per %2$d d\'alçada" "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index b02e250ff0..373920cfc8 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -30,8 +30,7 @@ "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" - - + "šířka %1$d, výška %2$d" "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index e97605d6a9..93041408d2 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -30,8 +30,7 @@ "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" - - + "%1$d i bredden og %2$d i højden" "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 9d2670c0a2..e461d46f0a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -30,8 +30,7 @@ "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" - - + "%1$d breit und %2$d hoch" "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index d517af6bc0..119232dab6 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -30,8 +30,7 @@ "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" - - + "Πλάτος %1$d επί ύψος %2$d" "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 9b5231d291..44daaa84f2 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -30,8 +30,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - - + "%1$d wide by %2$d high" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 9b5231d291..44daaa84f2 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -30,8 +30,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - - + "%1$d wide by %2$d high" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 9b5231d291..44daaa84f2 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -30,8 +30,7 @@ "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" - - + "%1$d wide by %2$d high" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 0e1abf12a2..4bd6c88541 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -30,8 +30,7 @@ "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" - - + "%1$d de ancho por %2$d de alto" "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1d7f8241b8..a4fc62038c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -30,8 +30,7 @@ "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" - - + "%1$d de ancho por %2$d de alto" "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 31cc0aefba..feb63ca314 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -30,8 +30,7 @@ "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" - - + "%1$d lai ja %2$d kõrge" "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index f9265d0121..76ef5c689a 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -30,8 +30,7 @@ "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" - - + "%1$d zabal eta %2$d luze" "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 01390c3752..95675a7eb0 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -30,8 +30,7 @@ "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" - - + "‏%1$d عرض در %2$d طول" "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index eb55badf91..40e6d96baa 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -30,8 +30,7 @@ "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" - - + "Leveys: %1$d, korkeus: %2$d" "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index c9ea37c14c..01d6b272dc 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -30,8 +30,7 @@ "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" - - + "%1$d de largeur sur %2$d de hauteur" "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 0a60378dc2..f42748ccb9 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -30,8 +30,7 @@ "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" - - + "%1$d de largeur et %2$d de hauteur" "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index e678b19a5f..62765d538b 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -30,8 +30,7 @@ "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" - - + "%1$d de largo por %2$d alto" "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 8ad0396322..39a176c484 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -30,8 +30,7 @@ "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" - - + "%1$d પહોળાઈ X %2$d ઊંચાઈ" "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index a9de815d22..f534e1e6db 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -30,8 +30,7 @@ "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" - - + "%1$d चौड़ाई गुणा %2$d ऊंचाई" "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 10407d1177..b4fb50eab9 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -30,8 +30,7 @@ "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" - - + "%1$d širine i %2$d visine" "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 2bf1d27abd..279749bac6 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -30,8 +30,7 @@ "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" - - + "%1$d széles és %2$d magas" "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index b9052e5ea4..c7401a991c 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -30,8 +30,7 @@ "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" - - + "Լայնությունը՝ %1$d, բարձրությունը՝ %2$d" "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index bf55bc38e6..00e8d63903 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -30,8 +30,7 @@ "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" - - + "lebar %1$d x tinggi %2$d" "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 5d5e894d17..7586ae37ef 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -30,8 +30,7 @@ "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" - - + "%1$d á breidd og %2$d á hæð" "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index a699b9c82e..b821222378 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -30,8 +30,7 @@ "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" - - + "%1$d di larghezza per %2$d di altezza" "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 2c287331e0..ffea51f1d4 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -30,8 +30,7 @@ "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" - - + "‏רוחב %1$d על גובה %2$d" "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 166ef2d44f..8729abad77 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -30,8 +30,7 @@ "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" - - + "幅 %1$d、高さ %2$d" "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 74ab85bd9a..1a200d710a 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -30,8 +30,7 @@ "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" - - + "სიგრძე: %1$d, სიგანე: %2$d" "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 9da9adecd0..009fa4af00 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -30,8 +30,7 @@ "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" - - + "Ені: %1$d, биіктігі: %2$d" "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 8fa9179308..864c979250 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -30,8 +30,7 @@ "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" - - + "ទទឺង %1$d គុណនឹងកម្ពស់ %2$d" "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 2401e41bfe..befbd9aac6 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -30,8 +30,7 @@ "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" - - + "%1$d ಅಗಲ ಮತ್ತು %2$d ಎತ್ತರ" "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 06b7014e81..1ef438f298 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -30,8 +30,7 @@ "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" - - + "너비 %1$d, 높이 %2$d" "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 734c7b4577..71e02d00a9 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -30,8 +30,7 @@ "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" - - + "Туурасы: %1$d, бийиктиги: %2$d" "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 8a26fd676e..e2311024f7 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -30,8 +30,7 @@ "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" - - + "ກວ້າງ %1$d ຄູນສູງ %2$d" "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 210062f68a..13ebaa3b10 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -30,8 +30,7 @@ "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" - - + "%1$d plotis ir %2$d aukštis" "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 40746d6b7c..924b399a66 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -30,8 +30,7 @@ "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" - - + "%1$d plats un %2$d augsts" "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 431db0b952..7e44707fc4 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -30,8 +30,7 @@ "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" - - + "%1$d широк на %2$d висок" "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 43a0fe2809..941d1acb4f 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -30,8 +30,7 @@ "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" - - + "%1$d വീതിയും %2$d ഉയരവും" "ആപ്പ്‌സ് തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index df1d7b8942..45e1856491 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -30,8 +30,7 @@ "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" - - + "%1$d өргөн %2$d өндөр" "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 69e20be312..1ec443cc0c 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -30,8 +30,7 @@ "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" - - + "%1$d रूंद बाय %2$d उंच" "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index eb80ff97d5..215315ad11 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -30,8 +30,7 @@ "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" - - + "Lebar %1$d kali tinggi %2$d" "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 7c978abf19..bc4e484ce8 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -30,8 +30,7 @@ "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" - - + "အလျား %1$d နှင့် အမြင့် %2$d" "ရှာဖွေမှု အက်ပ်များ" "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index ceb209136f..449094de26 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -30,8 +30,7 @@ "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" - - + "%1$d bredde x %2$d høyde" "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 434322366c..8accfcc720 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -30,8 +30,7 @@ "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" - - + "%1$d चौडाइ गुणा %2$d उचाइ" "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 64c02b2e58..0134ae1c48 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -30,8 +30,7 @@ "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" - - + "%1$d breed en %2$d hoog" "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index b5c69e1ee8..3be9becfce 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -30,8 +30,7 @@ "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" - - + "%1$d ਚੌੜਾਈ ਅਤੇ %2$d ਲੰਬਾਈ" "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 5b39faf991..feb2a36c50 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -30,8 +30,7 @@ "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" - - + "Szerokość %1$d, wysokość %2$d" "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index cda63eef58..6d684fa857 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -30,8 +30,7 @@ "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" - - + "%1$d de largura por %2$d de altura" "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 6f3e0a09d9..82a756f392 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -30,8 +30,7 @@ "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" - - + "%1$d de largura por %2$d de altura" "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index f2c55ebcd6..5905bcfffb 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -30,8 +30,7 @@ "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" - - + "%1$d lățime și %2$d înălțime" "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index d1dfea1cc2..ad30c977d6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -30,8 +30,7 @@ "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" - - + "Ширина %1$d, высота %2$d" "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index a91e267e1c..1e0ed28b82 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -30,8 +30,7 @@ "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" - - + "පළල %1$d උස %2$d" "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 7d6b5c2019..7210d79a83 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -30,8 +30,7 @@ "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" - - + "šírka %1$d, výška %2$d" "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index c3e1cbdb00..b55cb0d0a4 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -30,8 +30,7 @@ "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" - - + "Širina %1$d, višina %2$d" "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index fbf08c5744..c4fbaf3e8a 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -30,8 +30,7 @@ "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" - - + "%1$d i gjerë me %2$d i lartë" "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index e1dba8070f..67a63cff6c 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -30,8 +30,7 @@ "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" - - + "ширина од %1$d и висина од %2$d" "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6b7d9dcce6..dfcc1b03b9 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -30,8 +30,7 @@ "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" - - + "%1$d bred gånger %2$d hög" "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index b5fa1cfc1f..03c8f064f5 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -30,8 +30,7 @@ "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" - - + "Upana wa %1$d na kimo cha %2$d" "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 4b43e21506..7db0ae4652 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -30,8 +30,7 @@ "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" - - + "%1$d அகலத்திற்கு %2$d உயரம்" "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 09d2525c33..4e8b86fd8c 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -30,8 +30,7 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" - - + "%1$d వెడల్పు X %2$d ఎత్తు" "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index b847f75ce3..90dec72264 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -30,8 +30,7 @@ "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" - - + "กว้าง %1$d x สูง %2$d" "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 8f251afbc8..b944ebcd50 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -30,8 +30,7 @@ "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" - - + "%1$d ang lapad at %2$d ang taas" "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index c91b3dc9ec..e95ee2db27 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -30,8 +30,7 @@ "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" - - + "genişlik: %1$d, yükseklik: %2$d" "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 700775f8c8..1f73f0423c 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -30,8 +30,7 @@ "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" - - + "Ширина – %1$d, висота – %2$d" "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index c3257839d0..e4c637d8cb 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -30,8 +30,7 @@ "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" - - + "‏%1$d چوڑا اور ‎%2$d اونچا" "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 4ffd90c90f..a36db9fa6e 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -30,8 +30,7 @@ "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" - - + "eniga %1$d, bo‘yiga %2$d" "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index e7447935fe..2bf5ad6f9f 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -30,8 +30,7 @@ "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" - - + "Rộng %1$d x cao %2$d" "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index ddd93cf298..e3ed354c29 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -30,8 +30,7 @@ "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" - - + "宽 %1$d,高 %2$d" "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 2733d7fb04..ad0f99a018 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -30,8 +30,7 @@ "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" - - + "%1$d 闊,%2$d 高" "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 5bb9ab9f77..24f391d712 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -30,8 +30,7 @@ "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" - - + "寬度為 %1$d,高度為 %2$d" "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 3d624004f2..10fbef4e40 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -30,8 +30,7 @@ "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" - - + "%1$d ububanzi ngokungu-%2$d ukuya phezulu" "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" From 379198ef5bcc68620ab0327edec7e560d893a1a4 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 23 Sep 2016 08:54:40 -0700 Subject: [PATCH 043/382] Ignore long clicks triggered from the edge of screen. Bug: 31572404 Change-Id: Ie531941669549ce84b92302b95be94555ee0bb73 --- res/values/dimens.xml | 2 ++ src/com/android/launcher3/Launcher.java | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 367cee48a0..2db3c89047 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -182,4 +182,6 @@ also happens to equal 19dp--> 19dp + + 8dp diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 99c16e74a6..b18dee327b 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -354,6 +354,9 @@ public class Launcher extends Activity private UserEventDispatcher mUserEventDispatcher; + private float mLastDispatchTouchEventX = 0.0f; + private float mEdgeOfScreenThresholdPx = 0.0f; + public ViewGroupFocusHelper mFocusHandler; private boolean mRotationEnabled = false; @@ -424,6 +427,9 @@ public class Launcher extends Activity setContentView(R.layout.launcher); + mEdgeOfScreenThresholdPx = getResources() + .getDimensionPixelSize(R.dimen.edge_of_screen_threshold); + setupViews(); mDeviceProfile.layout(this, false /* notifyListeners */); mExtractedColors = new ExtractedColors(); @@ -3054,6 +3060,12 @@ public class Launcher extends Activity return null; } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + mLastDispatchTouchEventX = ev.getX(); + return super.dispatchTouchEvent(ev); + } + @Override public boolean onLongClick(View v) { if (!isDraggingEnabled()) return false; @@ -3066,9 +3078,12 @@ public class Launcher extends Activity return true; } + boolean fromEdgeOfScreen = mLastDispatchTouchEventX < mEdgeOfScreenThresholdPx + || mLastDispatchTouchEventX > (mDeviceProfile.widthPx - mEdgeOfScreenThresholdPx); + if (v instanceof Workspace) { if (!mWorkspace.isInOverviewMode()) { - if (!mWorkspace.isTouchActive()) { + if (!mWorkspace.isTouchActive() && !fromEdgeOfScreen) { showOverviewMode(true); mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); @@ -3095,13 +3110,16 @@ public class Launcher extends Activity if (!mDragController.isDragging()) { if (itemUnderLongClick == null) { // User long pressed on empty space - mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); if (mWorkspace.isInOverviewMode()) { mWorkspace.startReordering(v); } else { + if (fromEdgeOfScreen) { + return false; + } showOverviewMode(true); } + mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, + HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); } else { final boolean isAllAppsButton = !FeatureFlags.NO_ALL_APPS_ICON && isHotseatLayout(v) && From aca2145f2aa1a8a5bc6948d6fb501f3dc0ab4391 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 26 Sep 2016 14:01:56 -0700 Subject: [PATCH 044/382] Restore AllAppsContainerView UI to match spec. Did some refactoring with Sunny's help. Change-Id: Ie4c90c316f1e381829836e11c83eaaedfed4d621 --- res/layout-port/launcher.xml | 3 +- res/layout-sw720dp/launcher.xml | 3 +- res/layout/all_apps.xml | 6 +-- res/values/dimens.xml | 2 +- src/com/android/launcher3/DeviceProfile.java | 2 +- .../allapps/AllAppsContainerView.java | 45 ++++++++++++++----- .../AllAppsRecyclerViewContainerView.java | 3 +- 7 files changed, 42 insertions(+), 22 deletions(-) diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index a2e2f9bbab..dd981dd20e 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -77,8 +77,7 @@ android:id="@+id/apps_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="invisible" - launcher:layout_ignoreInsets="true" /> + android:visibility="invisible" /> diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml index 12c01b77d9..06cb550403 100644 --- a/res/layout-sw720dp/launcher.xml +++ b/res/layout-sw720dp/launcher.xml @@ -76,8 +76,7 @@ android:id="@+id/apps_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="invisible" - launcher:layout_ignoreInsets="true" /> + android:visibility="invisible" /> diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 4909eb38bf..926883927f 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -46,10 +46,10 @@ @@ -68,8 +67,9 @@ 0dp 8dp 24sp + 48dp 60dp - 12dp 4dp 1dp 8dp diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index c4e6ed119b..8e4567bd8a 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -104,7 +104,7 @@ public class DeviceProfile { public int hotseatCellWidthPx; public int hotseatCellHeightPx; public int hotseatIconSizePx; - private int hotseatBarHeightPx; + public int hotseatBarHeightPx; private int hotseatBarTopPaddingPx; private int hotseatLandGutterPx; diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 18574aaa72..8fedc96c2c 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -15,10 +15,8 @@ */ package com.android.launcher3.allapps; -import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; -import android.graphics.Point; import android.graphics.Rect; import android.support.v7.widget.RecyclerView; import android.text.Selection; @@ -31,7 +29,6 @@ import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; import android.view.ViewGroup; import com.android.launcher3.AppInfo; @@ -43,6 +40,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; import com.android.launcher3.ExtendedEditText; +import com.android.launcher3.Insettable; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherTransitionable; @@ -134,7 +132,8 @@ final class SimpleSectionMergeAlgorithm implements AlphabeticalAppsList.MergeAlg * The all apps view container. */ public class AllAppsContainerView extends BaseContainerView implements DragSource, - LauncherTransitionable, View.OnLongClickListener, AllAppsSearchBarController.Callbacks { + LauncherTransitionable, View.OnLongClickListener, AllAppsSearchBarController.Callbacks, + Insettable { private static final int MIN_ROWS_IN_MERGED_SECTION_PHONE = 3; private static final int MAX_NUM_MERGES_PHONE = 2; @@ -158,7 +157,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private int mNumAppsPerRow; private int mNumPredictedAppsPerRow; - public AllAppsContainerView(Context context) { this(context, null); } @@ -178,7 +176,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mApps.setAdapter(mAdapter); mLayoutManager = mAdapter.getLayoutManager(); mItemDecoration = mAdapter.getItemDecoration(); - DeviceProfile grid = mLauncher.getDeviceProfile(); mSearchQueryBuilder = new SpannableStringBuilder(); Selection.setSelection(mSearchQueryBuilder, 0); } @@ -354,6 +351,14 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc getContentView().setVisibility(View.VISIBLE); getContentView().setBackground(null); } + + int maxScrollBarWidth = mAppsRecyclerView.getMaxScrollbarWidth(); + int startInset = Math.max(mSectionNamesMargin, maxScrollBarWidth); + if (Utilities.isRtl(getResources())) { + mAppsRecyclerView.setPadding(maxScrollBarWidth, 0, startInset, 0); + } else { + mAppsRecyclerView.setPadding(startInset, 0, maxScrollBarWidth, 0); + } } @Override @@ -378,13 +383,11 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mAdapter.setNumAppsPerRow(mNumAppsPerRow); mApps.setNumAppsPerRow(mNumAppsPerRow, mNumPredictedAppsPerRow, new FullMergeAlgorithm()); } - if (!grid.isVerticalBarLayout()) { - View navBarBg = findViewById(R.id.nav_bar_bg); - ViewGroup.LayoutParams params = navBarBg.getLayoutParams(); - params.height = mLauncher.getDragLayer().getInsets().bottom; - navBarBg.setLayoutParams(params); - navBarBg.setVisibility(View.VISIBLE); + MarginLayoutParams searchContainerLp = + (MarginLayoutParams) mSearchContainer.getLayoutParams(); + searchContainerLp.height = grid.hotseatBarHeightPx; + mSearchContainer.setLayoutParams(searchContainerLp); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; @@ -593,4 +596,22 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc public boolean shouldRestoreImeState() { return !TextUtils.isEmpty(mSearchInput.getText()); } + + @Override + public void setInsets(Rect insets) { + DeviceProfile grid = mLauncher.getDeviceProfile(); + if (grid.isVerticalBarLayout()) { + ViewGroup.MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); + mlp.leftMargin = insets.left; + mlp.topMargin = insets.top; + mlp.rightMargin = insets.right; + setLayoutParams(mlp); + } else { + View navBarBg = findViewById(R.id.nav_bar_bg); + ViewGroup.LayoutParams navBarBgLp = navBarBg.getLayoutParams(); + navBarBgLp.height = insets.bottom; + navBarBg.setLayoutParams(navBarBgLp); + navBarBg.setVisibility(View.VISIBLE); + } + } } diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java index 1d5b209c20..cac388c2b6 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java @@ -21,6 +21,7 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import android.widget.RelativeLayout; import com.android.launcher3.BubbleTextView; import com.android.launcher3.BubbleTextView.BubbleTextShadowHandler; @@ -33,7 +34,7 @@ import com.android.launcher3.R; * A container for RecyclerView to allow for the click shadow view to be shown behind an icon that * is launching. */ -public class AllAppsRecyclerViewContainerView extends FrameLayout +public class AllAppsRecyclerViewContainerView extends RelativeLayout implements BubbleTextShadowHandler { private final ClickShadowView mTouchFeedbackView; From fe770c9feb5f7fc05853f1d3a9eb2c825787b0a5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 27 Sep 2016 14:38:58 -0700 Subject: [PATCH 045/382] Cleaning up restore instance state logic Restore instance state is only used for first binding. But in case of restore, the binding happens synchronously, so there is not need to store the bundle in a global variable Change-Id: Ibc496bcd7c0d171056b8afc69f2c4d9a1270d40c --- src/com/android/launcher3/Launcher.java | 52 +++++++----------------- src/com/android/launcher3/PagedView.java | 19 +-------- src/com/android/launcher3/Workspace.java | 14 ++----- 3 files changed, 19 insertions(+), 66 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index b18dee327b..469e78e719 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -254,7 +254,6 @@ public class Launcher extends Activity @Thunk WidgetsContainerView mWidgetsView; @Thunk WidgetsModel mWidgetsModel; - private Bundle mSavedState; // We set the state in both onCreate and then onNewIntent in some cases, which causes both // scroll issues (because the workspace may not have been measured yet) and extra work. // Instead, just save the state that we need to restore Launcher to, and commit it in onResume. @@ -440,8 +439,7 @@ public class Launcher extends Activity lockAllApps(); - mSavedState = savedInstanceState; - restoreState(mSavedState); + restoreState(savedInstanceState); if (LauncherAppState.PROFILE_STARTUP) { Trace.endSection(); @@ -449,11 +447,18 @@ public class Launcher extends Activity // We only load the page synchronously if the user rotates (or triggers a // configuration change) while launcher is in the foreground - if (!mModel.startLoader(mWorkspace.getRestorePage())) { + int currentScreen = PagedView.INVALID_RESTORE_PAGE; + if (savedInstanceState != null) { + currentScreen = savedInstanceState.getInt(RUNTIME_STATE_CURRENT_SCREEN, currentScreen); + } + if (!mModel.startLoader(currentScreen)) { // If we are not binding synchronously, show a fade in animation when // the first page bind completes. mDragLayer.setAlpha(0); } else { + // Pages bound synchronously. + mWorkspace.setCurrentPage(currentScreen); + setWorkspaceLoading(true); } @@ -594,7 +599,7 @@ public class Launcher extends Activity } /** - * Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to + * Invoked by subclasses to signal a change to the {@link #addToCustomContentPage} value to * ensure the custom content page is added or removed if necessary. */ protected void invalidateHasCustomContentToLeft() { @@ -1245,22 +1250,6 @@ public class Launcher extends Activity Selection.setSelection(mDefaultKeySsb, 0); } - /** - * Given the integer (ordinal) value of a State enum instance, convert it to a variable of type - * State - */ - private static State intToState(int stateOrdinal) { - State state = State.WORKSPACE; - final State[] stateValues = State.values(); - for (int i = 0; i < stateValues.length; i++) { - if (stateValues[i].ordinal() == stateOrdinal) { - state = stateValues[i]; - break; - } - } - return state; - } - /** * Restores the previous state, if it exists. * @@ -1271,17 +1260,14 @@ public class Launcher extends Activity return; } - State state = intToState(savedState.getInt(RUNTIME_STATE, State.WORKSPACE.ordinal())); + int stateOrdinal = savedState.getInt(RUNTIME_STATE, State.WORKSPACE.ordinal()); + State[] stateValues = State.values(); + State state = (stateOrdinal >= 0 && stateOrdinal < stateValues.length) + ? stateValues[stateOrdinal] : State.WORKSPACE; if (state == State.APPS || state == State.WIDGETS) { mOnResumeState = state; } - int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, - PagedView.INVALID_RESTORE_PAGE); - if (currentScreen != PagedView.INVALID_RESTORE_PAGE) { - mWorkspace.setRestorePage(currentScreen); - } - PendingRequestArgs requestArgs = savedState.getParcelable(RUNTIME_STATE_PENDING_REQUEST_ARGS); if (requestArgs != null) { setWaitingForResult(requestArgs); @@ -2761,6 +2747,7 @@ public class Launcher extends Activity } } + @TargetApi(Build.VERSION_CODES.M) private Bundle getActivityLaunchOptions(View v) { if (Utilities.ATLEAST_MARSHMALLOW) { int left = 0, top = 0; @@ -3976,14 +3963,6 @@ public class Launcher extends Activity if (LauncherAppState.PROFILE_STARTUP) { Trace.beginSection("Page bind completed"); } - if (mSavedState != null) { - if (!mWorkspace.hasFocus()) { - mWorkspace.getChildAt(mWorkspace.getCurrentPage()).requestFocus(); - } - - mSavedState = null; - } - mWorkspace.restoreInstanceStateForRemainingPages(); setWorkspaceLoading(false); @@ -4405,7 +4384,6 @@ public class Launcher extends Activity */ public void dumpState() { Log.d(TAG, "BEGIN launcher3 dump state for launcher " + this); - Log.d(TAG, "mSavedState=" + mSavedState); Log.d(TAG, "mWorkspaceLoading=" + mWorkspaceLoading); Log.d(TAG, "mPendingRequestArgs=" + mPendingRequestArgs); Log.d(TAG, "mPendingActivityResult=" + mPendingActivityResult); diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index bea55d215a..0b9bf09dfb 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -98,7 +98,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc @ViewDebug.ExportedProperty(category = "launcher") protected int mCurrentPage; - protected int mRestorePage = INVALID_RESTORE_PAGE; private int mChildCountOnLastLayout; @ViewDebug.ExportedProperty(category = "launcher") @@ -417,17 +416,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc invalidate(); } - /** - * The restore page will be set in place of the current page at the next (likely first) - * layout. - */ - void setRestorePage(int restorePage) { - mRestorePage = restorePage; - } - int getRestorePage() { - return mRestorePage; - } - /** * Should be called whenever the page changes. In the case of a scroll, we wait until the page * has settled. @@ -879,12 +867,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } if (mScroller.isFinished() && mChildCountOnLastLayout != childCount) { - if (mRestorePage != INVALID_RESTORE_PAGE) { - setCurrentPage(mRestorePage); - mRestorePage = INVALID_RESTORE_PAGE; - } else { - setCurrentPage(getNextPage()); - } + setCurrentPage(getNextPage()); } mChildCountOnLastLayout = childCount; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 977395fc7a..af4dc07e64 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -734,11 +734,7 @@ public class Workspace extends PagedView addFullScreenPage(customScreen); // Update the custom content hint - if (mRestorePage != INVALID_RESTORE_PAGE) { - mRestorePage = mRestorePage + 1; - } else { - setCurrentPage(getCurrentPage() + 1); - } + setCurrentPage(getCurrentPage() + 1); } public void removeCustomContentPage() { @@ -759,11 +755,7 @@ public class Workspace extends PagedView mCustomContentCallbacks = null; // Update the custom content hint - if (mRestorePage != INVALID_RESTORE_PAGE) { - mRestorePage = mRestorePage - 1; - } else { - setCurrentPage(getCurrentPage() - 1); - } + setCurrentPage(getCurrentPage() - 1); } public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks, @@ -1753,7 +1745,7 @@ public class Workspace extends PagedView } public boolean isOnOrMovingToCustomContent() { - return hasCustomContent() && getNextPage() == 0 && mRestorePage == INVALID_RESTORE_PAGE; + return hasCustomContent() && getNextPage() == 0; } private void updateStateForCustomContent(int screenCenter) { From 09146cade43db1ad42b6a21eb98cc6b7629e0b55 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 28 Sep 2016 21:51:45 -0700 Subject: [PATCH 046/382] Import translations. DO NOT MERGE Change-Id: Ie8f3d7887e173108cb485370443068a0a346134a Auto-generated-cl: translation import --- res/values-gl-rES/strings.xml | 2 +- res/values-uz-rUZ/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 62765d538b..c03ecdc510 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -30,7 +30,7 @@ "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" - "%1$d de largo por %2$d alto" + "%1$d de largo por %2$d de alto" "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index a36db9fa6e..0e541d37ab 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -30,7 +30,7 @@ "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" - "eniga %1$d, bo‘yiga %2$d" + "Eni %1$d, bo‘yi %2$d" "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" From 1acc56a4eb9a74f28e32eadf62f389d3221b50ff Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sun, 25 Sep 2016 21:23:25 -0700 Subject: [PATCH 047/382] Moving the widget auto-advance logic to AppWidgetHostView instead of handling it in launcher This fixes the bug where launcher ignores auto-advance property changes during app update or widget remote views update as well as simplifies widget management On potential downside of this refactoring is that the auto advance will keep running even when all-apps or widgets tray is open. We could eventually use onVisibilityAggregated to handle visibility changes, but currenly the workspace visibility is not being updated properly in these cases Change-Id: Ie7331fec1877f43ad23e634d37571d8f3ef51e59 --- src/com/android/launcher3/Launcher.java | 118 +----------------- .../launcher3/LauncherAppWidgetHostView.java | 110 +++++++++++++++- 2 files changed, 110 insertions(+), 118 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 0a14c421d5..5428f3314c 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -30,7 +30,6 @@ import android.app.AlertDialog; import android.app.SearchManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProviderInfo; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; @@ -56,7 +55,6 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.os.Message; import android.os.StrictMode; import android.os.SystemClock; import android.os.Trace; @@ -81,7 +79,6 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; -import android.widget.Advanceable; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -274,27 +271,16 @@ public class Launcher extends Activity private IconCache mIconCache; private ExtractedColors mExtractedColors; private LauncherAccessibilityDelegate mAccessibilityDelegate; + private Handler mHandler = new Handler(); private boolean mIsResumeFromActionScreenOff; - @Thunk boolean mUserPresent = true; - private boolean mVisible; - private boolean mHasFocus; - private boolean mAttached; + private boolean mHasFocus = false; + private boolean mAttached = false; /** Maps launcher activity components to their list of shortcut ids. */ private MultiHashMap mDeepShortcutMap = new MultiHashMap<>(); private View.OnTouchListener mHapticFeedbackTouchListener; - // Related to the auto-advancing of widgets - private final int ADVANCE_MSG = 1; - private static final int ADVANCE_INTERVAL = 20000; - private static final int ADVANCE_STAGGER = 250; - - private boolean mAutoAdvanceRunning = false; - private long mAutoAdvanceSentTime; - private long mAutoAdvanceTimeLeft = -1; - @Thunk HashMap mWidgetsToAdvance = new HashMap<>(); - // Determines how long to wait after a rotation before restoring the screen orientation to // match the sensor state. private static final int RESTORE_SCREEN_ORIENTATION_DELAY = 500; @@ -1568,10 +1554,6 @@ public class Launcher extends Activity mWorkspace.addInScreen(hostView, item.container, item.screenId, item.cellX, item.cellY, item.spanX, item.spanY, insert); - - if (!item.isCustomWidget()) { - addWidgetToAutoAdvanceIfNeeded(hostView, appWidgetInfo); - } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -1579,9 +1561,7 @@ public class Launcher extends Activity public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (Intent.ACTION_SCREEN_OFF.equals(action)) { - mUserPresent = false; mDragLayer.clearResizeFrame(); - updateAutoAdvanceState(); // Reset AllApps to its initial state only if we are not in the middle of // processing a multi-step drop @@ -1592,9 +1572,6 @@ public class Launcher extends Activity } } mIsResumeFromActionScreenOff = true; - } else if (Intent.ACTION_USER_PRESENT.equals(action)) { - mUserPresent = true; - updateAutoAdvanceState(); } } }; @@ -1606,11 +1583,9 @@ public class Launcher extends Activity // Listen for broadcasts related to user-presence final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(mReceiver, filter); FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView()); mAttached = true; - mVisible = true; if (mLauncherCallbacks != null) { mLauncherCallbacks.onAttachedToWindow(); @@ -1620,13 +1595,10 @@ public class Launcher extends Activity @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); - mVisible = false; - if (mAttached) { unregisterReceiver(mReceiver); mAttached = false; } - updateAutoAdvanceState(); if (mLauncherCallbacks != null) { mLauncherCallbacks.onDetachedFromWindow(); @@ -1634,12 +1606,10 @@ public class Launcher extends Activity } public void onWindowVisibilityChanged(int visibility) { - mVisible = visibility == View.VISIBLE; - updateAutoAdvanceState(); // The following code used to be in onResume, but it turns out onResume is called when // you're in All Apps and click home to go to the workspace. onWindowVisibilityChanged // is a more appropriate event to handle - if (mVisible) { + if (visibility == View.VISIBLE) { if (!mWorkspaceLoading) { final ViewTreeObserver observer = mWorkspace.getViewTreeObserver(); // We want to let Launcher draw itself at least once before we force it to build @@ -1674,72 +1644,6 @@ public class Launcher extends Activity } } - @Thunk void sendAdvanceMessage(long delay) { - mHandler.removeMessages(ADVANCE_MSG); - Message msg = mHandler.obtainMessage(ADVANCE_MSG); - mHandler.sendMessageDelayed(msg, delay); - mAutoAdvanceSentTime = System.currentTimeMillis(); - } - - @Thunk void updateAutoAdvanceState() { - boolean autoAdvanceRunning = mVisible && mUserPresent && !mWidgetsToAdvance.isEmpty(); - if (autoAdvanceRunning != mAutoAdvanceRunning) { - mAutoAdvanceRunning = autoAdvanceRunning; - if (autoAdvanceRunning) { - long delay = mAutoAdvanceTimeLeft == -1 ? ADVANCE_INTERVAL : mAutoAdvanceTimeLeft; - sendAdvanceMessage(delay); - } else { - if (!mWidgetsToAdvance.isEmpty()) { - mAutoAdvanceTimeLeft = Math.max(0, ADVANCE_INTERVAL - - (System.currentTimeMillis() - mAutoAdvanceSentTime)); - } - mHandler.removeMessages(ADVANCE_MSG); - mHandler.removeMessages(0); // Remove messages sent using postDelayed() - } - } - } - - @Thunk final Handler mHandler = new Handler(new Handler.Callback() { - - @Override - public boolean handleMessage(Message msg) { - if (msg.what == ADVANCE_MSG) { - int i = 0; - for (View key: mWidgetsToAdvance.keySet()) { - final View v = key.findViewById(mWidgetsToAdvance.get(key).autoAdvanceViewId); - final int delay = ADVANCE_STAGGER * i; - if (v instanceof Advanceable) { - mHandler.postDelayed(new Runnable() { - public void run() { - ((Advanceable) v).advance(); - } - }, delay); - } - i++; - } - sendAdvanceMessage(ADVANCE_INTERVAL); - } - return true; - } - }); - - private void addWidgetToAutoAdvanceIfNeeded(View hostView, AppWidgetProviderInfo appWidgetInfo) { - if (appWidgetInfo == null || appWidgetInfo.autoAdvanceViewId == -1) return; - View v = hostView.findViewById(appWidgetInfo.autoAdvanceViewId); - if (v instanceof Advanceable) { - mWidgetsToAdvance.put(hostView, appWidgetInfo); - ((Advanceable) v).fyiWillBeAdvancedByHostKThx(); - updateAutoAdvanceState(); - } - } - - private void removeWidgetToAutoAdvance(View hostView) { - if (mWidgetsToAdvance.containsKey(hostView)) { - mWidgetsToAdvance.remove(hostView); - updateAutoAdvanceState(); - } - } - public void showOutOfSpaceMessage(boolean isHotseatLayout) { int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space); Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT).show(); @@ -1934,9 +1838,6 @@ public class Launcher extends Activity public void onDestroy() { super.onDestroy(); - // Remove all pending runnables - mHandler.removeMessages(ADVANCE_MSG); - mHandler.removeMessages(0); mWorkspace.removeCallbacks(mBuildLayersRunnable); mWorkspace.removeFolderListeners(); @@ -1959,8 +1860,6 @@ public class Launcher extends Activity } mAppWidgetHost = null; - mWidgetsToAdvance.clear(); - TextKeyListener.getInstance().release(); ((AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE)) @@ -2280,7 +2179,6 @@ public class Launcher extends Activity } else if (itemInfo instanceof LauncherAppWidgetInfo) { final LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) itemInfo; mWorkspace.removeWorkspaceItem(v); - removeWidgetToAutoAdvance(v); if (deleteFromDb) { deleteWidgetInfo(widgetInfo); } @@ -3229,10 +3127,6 @@ public class Launcher extends Activity // Change the state *after* we've called all the transition code mState = State.WORKSPACE; - // Resume the auto-advance of widgets - mUserPresent = true; - updateAutoAdvanceState(); - if (changed) { // Send an accessibility event to announce the context change getWindow().getDecorView() @@ -3338,9 +3232,6 @@ public class Launcher extends Activity // Change the state *after* we've called all the transition code mState = toState; - // Pause the auto-advance of widgets until we are out of AllApps - mUserPresent = false; - updateAutoAdvanceState(); closeFolder(); closeShortcutsContainer(); @@ -3566,7 +3457,6 @@ public class Launcher extends Activity mWorkspace.clearDropTargets(); mWorkspace.removeAllWorkspaceScreens(); - mWidgetsToAdvance.clear(); if (mHotseat != null) { mHotseat.resetLayout(); } diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index ed1079ff33..fa5e519b10 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -20,6 +20,9 @@ import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.graphics.Rect; +import android.os.Handler; +import android.os.SystemClock; +import android.util.SparseBooleanArray; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -28,6 +31,7 @@ import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.Advanceable; import android.widget.RemoteViews; import com.android.launcher3.dragndrop.DragLayer.TouchCompleteListener; @@ -39,6 +43,13 @@ import java.util.ArrayList; */ public class LauncherAppWidgetHostView extends AppWidgetHostView implements TouchCompleteListener { + // Related to the auto-advancing of widgets + private static final long ADVANCE_INTERVAL = 20000; + private static final long ADVANCE_STAGGER = 250; + + // Maintains a list of widget ids which are supposed to be auto advanced. + private static final SparseBooleanArray sAutoAdvanceWidgetIds = new SparseBooleanArray(); + LayoutInflater mInflater; private CheckLongPressHelper mLongPressHelper; @@ -54,6 +65,10 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc protected int mErrorViewId = R.layout.appwidget_error; + private boolean mIsAttachedToWindow; + private boolean mIsAutoAdvanceRegistered; + private Runnable mAutoAdvanceRunnable; + public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; @@ -78,6 +93,9 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc // Store the orientation in which the widget was inflated updateLastInflationOrientation(); super.updateAppWidget(remoteViews); + + // The provider info or the views might have changed. + checkIfAutoAdvance(); } public boolean isReinflateRequired() { @@ -153,6 +171,19 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc protected void onAttachedToWindow() { super.onAttachedToWindow(); mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + + mIsAttachedToWindow = true; + checkIfAutoAdvance(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // We can't directly use isAttachedToWindow() here, as this is called before the internal + // state is updated. So isAttachedToWindow() will return true until next frame. + mIsAttachedToWindow = false; + checkIfAutoAdvance(); } @Override @@ -171,10 +202,6 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc return info; } - public LauncherAppWidgetProviderInfo getLauncherAppWidgetProviderInfo() { - return (LauncherAppWidgetProviderInfo) getAppWidgetInfo(); - } - @Override public void onTouchComplete() { if (!mLongPressHelper.hasPerformedLongPress()) { @@ -296,4 +323,79 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc super.onInitializeAccessibilityNodeInfo(info); info.setClassName(getClass().getName()); } + + @Override + protected void onWindowVisibilityChanged(int visibility) { + super.onWindowVisibilityChanged(visibility); + maybeRegisterAutoAdvance(); + } + + private void checkIfAutoAdvance() { + boolean isAutoAdvance = false; + Advanceable target = getAdvanceable(); + if (target != null) { + isAutoAdvance = true; + target.fyiWillBeAdvancedByHostKThx(); + } + + boolean wasAutoAdvance = sAutoAdvanceWidgetIds.indexOfKey(getAppWidgetId()) >= 0; + if (isAutoAdvance != wasAutoAdvance) { + if (isAutoAdvance) { + sAutoAdvanceWidgetIds.put(getAppWidgetId(), true); + } else { + sAutoAdvanceWidgetIds.delete(getAppWidgetId()); + } + maybeRegisterAutoAdvance(); + } + } + + private Advanceable getAdvanceable() { + AppWidgetProviderInfo info = getAppWidgetInfo(); + if (info == null || info.autoAdvanceViewId == NO_ID || !mIsAttachedToWindow) { + return null; + } + View v = findViewById(info.autoAdvanceViewId); + return (v instanceof Advanceable) ? (Advanceable) v : null; + } + + private void maybeRegisterAutoAdvance() { + Handler handler = getHandler(); + boolean shouldRegisterAutoAdvance = getWindowVisibility() == VISIBLE && handler != null + && (sAutoAdvanceWidgetIds.indexOfKey(getAppWidgetId()) >= 0); + if (shouldRegisterAutoAdvance != mIsAutoAdvanceRegistered) { + mIsAutoAdvanceRegistered = shouldRegisterAutoAdvance; + if (mAutoAdvanceRunnable == null) { + mAutoAdvanceRunnable = new Runnable() { + @Override + public void run() { + runAutoAdvance(); + } + }; + } + + handler.removeCallbacks(mAutoAdvanceRunnable); + scheduleNextAdvance(); + } + } + + private void scheduleNextAdvance() { + if (!mIsAutoAdvanceRegistered) { + return; + } + long now = SystemClock.uptimeMillis(); + long advanceTime = now + (ADVANCE_INTERVAL - (now % ADVANCE_INTERVAL)) + + ADVANCE_STAGGER * sAutoAdvanceWidgetIds.indexOfKey(getAppWidgetId()); + Handler handler = getHandler(); + if (handler != null) { + handler.postAtTime(mAutoAdvanceRunnable, advanceTime); + } + } + + private void runAutoAdvance() { + Advanceable target = getAdvanceable(); + if (target != null) { + target.advance(); + } + scheduleNextAdvance(); + } } From b57c893db8c567ffeeb3c61f4fb3545c4a256441 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 30 Sep 2016 12:18:25 -0700 Subject: [PATCH 048/382] Removing some TODOs with proper system API Change-Id: I0d0e667cd6af8a7b9dbf3d0fd417f009ae402519 --- .../launcher3/dynamicui/ExtractionUtils.java | 15 +++++---------- .../launcher3/shortcuts/DeepShortcutManager.java | 13 ++++--------- .../launcher3/util/NoLocaleSqliteContext.java | 5 +---- 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/com/android/launcher3/dynamicui/ExtractionUtils.java b/src/com/android/launcher3/dynamicui/ExtractionUtils.java index 6dc0035ee9..1e663a9ae0 100644 --- a/src/com/android/launcher3/dynamicui/ExtractionUtils.java +++ b/src/com/android/launcher3/dynamicui/ExtractionUtils.java @@ -16,18 +16,18 @@ package com.android.launcher3.dynamicui; +import android.annotation.TargetApi; import android.app.WallpaperManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; +import android.os.Build; import android.support.v4.graphics.ColorUtils; import android.support.v7.graphics.Palette; import com.android.launcher3.Utilities; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.List; /** @@ -37,7 +37,6 @@ public class ExtractionUtils { public static final String EXTRACTED_COLORS_PREFERENCE_KEY = "pref_extractedColors"; public static final String WALLPAPER_ID_PREFERENCE_KEY = "pref_wallpaperId"; - private static final int FLAG_SET_SYSTEM = 1 << 0; // TODO: use WallpaperManager.FLAG_SET_SYSTEM private static final float MIN_CONTRAST_RATIO = 2f; /** @@ -73,14 +72,10 @@ public class ExtractionUtils { return wallpaperId != savedWallpaperId; } + @TargetApi(Build.VERSION_CODES.N) public static int getWallpaperId(WallpaperManager wallpaperManager) { - // TODO: use WallpaperManager#getWallpaperId(WallpaperManager.FLAG_SET_SYSTEM) directly. - try { - Method getWallpaperId = WallpaperManager.class.getMethod("getWallpaperId", int.class); - return (int) getWallpaperId.invoke(wallpaperManager, FLAG_SET_SYSTEM); - } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { - return -1; - } + return Utilities.isNycOrAbove() ? + wallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM) : -1; } public static boolean isSuperLight(Palette p) { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 49d6fa932f..9037af4d2e 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -42,13 +42,8 @@ import java.util.List; public class DeepShortcutManager { private static final String TAG = "DeepShortcutManager"; - // TODO: Replace this with platform constants when the new sdk is available. - public static final int FLAG_MATCH_DYNAMIC = 1 << 0; - public static final int FLAG_MATCH_MANIFEST = 1 << 3; - public static final int FLAG_MATCH_PINNED = 1 << 1; - - private static final int FLAG_GET_ALL = - FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST; + private static final int FLAG_GET_ALL = ShortcutQuery.FLAG_MATCH_DYNAMIC + | ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_PINNED; private final LauncherApps mLauncherApps; private boolean mWasLastCallSuccess; @@ -86,7 +81,7 @@ public class DeepShortcutManager { */ public List queryForShortcutsContainer(ComponentName activity, List ids, UserHandleCompat user) { - return query(FLAG_MATCH_MANIFEST | FLAG_MATCH_DYNAMIC, + return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC, activity.getPackageName(), activity, ids, user); } @@ -172,7 +167,7 @@ public class DeepShortcutManager { */ public List queryForPinnedShortcuts(String packageName, UserHandleCompat user) { - return query(FLAG_MATCH_PINNED, packageName, null, null, user); + return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user); } public List queryForAllShortcuts(UserHandleCompat user) { diff --git a/src/com/android/launcher3/util/NoLocaleSqliteContext.java b/src/com/android/launcher3/util/NoLocaleSqliteContext.java index 3b258e4a56..c8a5ffb1a0 100644 --- a/src/com/android/launcher3/util/NoLocaleSqliteContext.java +++ b/src/com/android/launcher3/util/NoLocaleSqliteContext.java @@ -11,9 +11,6 @@ import android.database.sqlite.SQLiteDatabase.CursorFactory; */ public class NoLocaleSqliteContext extends ContextWrapper { - // TODO: Use the flag defined in Context when the new SDK is available - private static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010; - public NoLocaleSqliteContext(Context context) { super(context); } @@ -22,6 +19,6 @@ public class NoLocaleSqliteContext extends ContextWrapper { public SQLiteDatabase openOrCreateDatabase( String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) { return super.openOrCreateDatabase( - name, mode | MODE_NO_LOCALIZED_COLLATORS, factory, errorHandler); + name, mode | Context.MODE_NO_LOCALIZED_COLLATORS, factory, errorHandler); } } From 10236d6ac7f5f787ca21736494ccb5eaf2bd7c27 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 28 Sep 2016 12:49:25 -0700 Subject: [PATCH 049/382] Update pre-drag lifecycle for apps with shortcuts. - First of all, deferred drag has been renamed to pre-drag to avoid confusion with the existing deferred end drag. - For normal drags, the cycle is still startDrag --> onDragStart --> onDrop --> onDropComplete --> onDragEnd. - Pre-drags have two additional callbacks: onPreDragStart and onPreDragEnd. onPreDragStart is called between startDrag and onDragStart, and onPreDragEnd is called at the same time as onDragStart or onDragEnd. - If the pre-drag has not transitioned to a full drag before onDragEnd, onDragStart and onDropComplete are skipped (onDrop is still called to allow the DragView to animate). Change-Id: Icd7a8f75d5fcc159f9a52758c22ab6eae3edb9e2 --- build.gradle | 2 +- res/values/dimens.xml | 2 +- src/com/android/launcher3/Launcher.java | 12 +-- src/com/android/launcher3/Workspace.java | 8 ++ .../allapps/AllAppsContainerView.java | 35 ++++----- .../launcher3/dragndrop/DragController.java | 77 +++++++++++-------- .../launcher3/dragndrop/DragLayer.java | 2 +- .../launcher3/dragndrop/DragOptions.java | 42 +++++----- src/com/android/launcher3/folder/Folder.java | 20 ++--- .../shortcuts/DeepShortcutsContainer.java | 49 +++++------- 10 files changed, 117 insertions(+), 132 deletions(-) diff --git a/build.gradle b/build.gradle index e103d792f6..0c00da9d3c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 47edadd0d7..12e902ac3b 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -164,7 +164,7 @@ 48dp 24dp 4dp - 6dp + 6dp 16dp 36dp diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 5841bf5b6d..30d5b17c51 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3042,17 +3042,7 @@ public class Launcher extends Activity longClickCellInfo.cellX, longClickCellInfo.cellY)); if (!(itemUnderLongClick instanceof Folder || isAllAppsButton)) { // User long pressed on an item - DragOptions dragOptions = new DragOptions(); - if (itemUnderLongClick instanceof BubbleTextView) { - BubbleTextView icon = (BubbleTextView) itemUnderLongClick; - if (icon.hasDeepShortcuts()) { - DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon(icon); - if (dsc != null) { - dragOptions.deferDragCondition = dsc.createDeferDragCondition(null); - } - } - } - mWorkspace.startDrag(longClickCellInfo, dragOptions); + mWorkspace.startDrag(longClickCellInfo, new DragOptions()); } } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 10fbc8eebe..315e23ad22 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -73,6 +73,7 @@ import com.android.launcher3.dragndrop.SpringLoadedDragController; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; +import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ItemInfoMatcher; @@ -2339,6 +2340,13 @@ public class Workspace extends PagedView mDragSourceInternal = (ShortcutAndWidgetContainer) child.getParent(); } + if (child instanceof BubbleTextView) { + DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon((BubbleTextView) child); + if (dsc != null) { + dragOptions.preDragCondition = dsc.createPreDragCondition(); + } + } + DragView dv = mDragController.startDrag(b, dragLayerX, dragLayerY, source, dragObject, dragVisualizeOffset, dragRect, scale, dragOptions); dv.setIntrinsicIconScaleFactor(source.getIntrinsicIconScaleFactor()); diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 8fedc96c2c..77e8ad17d2 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -33,7 +33,6 @@ import android.view.ViewGroup; import com.android.launcher3.AppInfo; import com.android.launcher3.BaseContainerView; -import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DeviceProfile; @@ -48,11 +47,11 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; import com.android.launcher3.graphics.TintedDrawableSpan; import com.android.launcher3.keyboard.FocusedItemDecorator; -import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -443,7 +442,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } @Override - public boolean onLongClick(View v) { + public boolean onLongClick(final View v) { // Return early if this is not initiated from a touch if (!v.isInTouchMode()) return false; // When we have exited all apps or are in transition, disregard long clicks @@ -455,22 +454,20 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc if (mLauncher.getDragController().isDragging()) return false; // Start the drag - DragOptions dragOptions = new DragOptions(); - if (v instanceof BubbleTextView) { - final BubbleTextView icon = (BubbleTextView) v; - if (icon.hasDeepShortcuts()) { - DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon(icon); - if (dsc != null) { - dragOptions.deferDragCondition = dsc.createDeferDragCondition(new Runnable() { - @Override - public void run() { - icon.setVisibility(VISIBLE); - } - }); - } + final DragController dragController = mLauncher.getDragController(); + dragController.addDragListener(new DragController.DragListener() { + @Override + public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { + v.setVisibility(INVISIBLE); } - } - mLauncher.getWorkspace().beginDragShared(v, this, dragOptions); + + @Override + public void onDragEnd() { + v.setVisibility(VISIBLE); + dragController.removeDragListener(this); + } + }); + mLauncher.getWorkspace().beginDragShared(v, this, new DragOptions()); if (FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { // Enter spring loaded mode (the new workspace does this in // onDragStart(), so we don't want to do it here) @@ -525,7 +522,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc // target layout we were dropping on. if (!success) { boolean showOutOfSpaceMessage = false; - if (target instanceof Workspace && !mLauncher.getDragController().isDeferringDrag()) { + if (target instanceof Workspace) { int currentScreen = mLauncher.getCurrentWorkspaceScreen(); Workspace workspace = (Workspace) target; CellLayout layout = (CellLayout) workspace.getChildAt(currentScreen); diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index c7b66e7bd8..19a47e8738 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -131,7 +131,7 @@ public class DragController implements DragDriver.EventListener, TouchController protected final int mFlingToDeleteThresholdVelocity; private VelocityTracker mVelocityTracker; - private boolean mIsDragDeferred; + private boolean mIsInPreDrag; /** * Interface to receive notifications when a drag starts or stops @@ -230,13 +230,14 @@ public class DragController implements DragDriver.EventListener, TouchController mDragObject = new DropTarget.DragObject(); - mIsDragDeferred = !mOptions.deferDragCondition.shouldStartDeferredDrag(0); + mIsInPreDrag = mOptions.preDragCondition != null + && !mOptions.preDragCondition.shouldStartDrag(0); final Resources res = mLauncher.getResources(); final float scaleDps = FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND ? res.getDimensionPixelSize(R.dimen.dragViewScale) - : mIsDragDeferred - ? res.getDimensionPixelSize(R.dimen.deferred_drag_view_scale) + : mIsInPreDrag + ? res.getDimensionPixelSize(R.dimen.pre_drag_view_scale) : 0f; final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX, registrationY, initialDragViewScale, scaleDps); @@ -271,10 +272,10 @@ public class DragController implements DragDriver.EventListener, TouchController dragView.show(mMotionDownX, mMotionDownY); mDistanceSinceScroll = 0; - if (!mIsDragDeferred) { - startDeferredDrag(); - } else { - mOptions.deferDragCondition.onDeferredDragStart(); + if (!mIsInPreDrag) { + callOnDragStart(); + } else if (mOptions.preDragCondition != null) { + mOptions.preDragCondition.onPreDragStart(); } mLastTouch[0] = mMotionDownX; @@ -284,16 +285,18 @@ public class DragController implements DragDriver.EventListener, TouchController return dragView; } - public boolean isDeferringDrag() { - return mIsDragDeferred; - } - - public void startDeferredDrag() { + private void callOnDragStart() { for (DragListener listener : new ArrayList<>(mListeners)) { listener.onDragStart(mDragObject, mOptions); } - mOptions.deferDragCondition.onDragStart(); - mIsDragDeferred = false; + if (mOptions.preDragCondition != null) { + mOptions.preDragCondition.onPreDragEnd(true /* dragStarted*/); + } + mIsInPreDrag = false; + } + + public boolean isInPreDrag() { + return mIsInPreDrag; } /** @@ -329,7 +332,9 @@ public class DragController implements DragDriver.EventListener, TouchController mDragObject.deferDragViewCleanupPostAnimation = false; mDragObject.cancelled = true; mDragObject.dragComplete = true; - mDragObject.dragSource.onDropCompleted(null, mDragObject, false, false); + if (!mIsInPreDrag) { + mDragObject.dragSource.onDropCompleted(null, mDragObject, false, false); + } } endDrag(); } @@ -350,7 +355,6 @@ public class DragController implements DragDriver.EventListener, TouchController private void endDrag() { if (isDragging()) { mDragDriver = null; - mOptions = null; clearScrollRunnable(); boolean isDeferred = false; if (mDragObject.dragView != null) { @@ -363,15 +367,24 @@ public class DragController implements DragDriver.EventListener, TouchController // Only end the drag if we are not deferred if (!isDeferred) { - for (DragListener listener : new ArrayList<>(mListeners)) { - listener.onDragEnd(); - } + callOnDragEnd(); } } releaseVelocityTracker(); } + private void callOnDragEnd() { + if (mIsInPreDrag && mOptions.preDragCondition != null) { + mOptions.preDragCondition.onPreDragEnd(false /* dragStarted*/); + } + mIsInPreDrag = false; + mOptions = null; + for (DragListener listener : new ArrayList<>(mListeners)) { + listener.onDragEnd(); + } + } + /** * This only gets called as a result of drag view cleanup being deferred in endDrag(); */ @@ -380,9 +393,7 @@ public class DragController implements DragDriver.EventListener, TouchController if (mDragObject.deferDragViewCleanupPostAnimation) { // If we skipped calling onDragEnd() before, do it now - for (DragListener listener : new ArrayList<>(mListeners)) { - listener.onDragEnd(); - } + callOnDragEnd(); } } @@ -536,9 +547,9 @@ public class DragController implements DragDriver.EventListener, TouchController mLastTouch[1] = y; checkScrollState(x, y); - if (mIsDragDeferred && mOptions.deferDragCondition.shouldStartDeferredDrag( - Math.hypot(x - mMotionDownX, y - mMotionDownY))) { - startDeferredDrag(); + if (mIsInPreDrag && mOptions.preDragCondition != null + && mOptions.preDragCondition.shouldStartDrag(mDistanceSinceScroll)) { + callOnDragStart(); } } @@ -701,7 +712,7 @@ public class DragController implements DragDriver.EventListener, TouchController (vec1.length() * vec2.length())); } - void drop(DropTarget dropTarget, float x, float y, PointF flingVel) { + private void drop(DropTarget dropTarget, float x, float y, PointF flingVel) { final int[] coordinates = mCoordinatesTemp; mDragObject.x = coordinates[0]; @@ -734,11 +745,15 @@ public class DragController implements DragDriver.EventListener, TouchController } } final View dropTargetAsView = dropTarget instanceof View ? (View) dropTarget : null; - mDragObject.dragSource.onDropCompleted( - dropTargetAsView, mDragObject, flingVel != null, accepted); mLauncher.getUserEventDispatcher().logDragNDrop(mDragObject, dropTargetAsView); - if (mIsDragDeferred) { - mOptions.deferDragCondition.onDropBeforeDeferredDrag(); + if (!mIsInPreDrag) { + mDragObject.dragSource.onDropCompleted( + dropTargetAsView, mDragObject, flingVel != null, accepted); + } else { + // Only defer the drag view cleanup if the drag source handles the drop. + if (!(mDragObject.dragSource instanceof DropTarget)) { + mDragObject.deferDragViewCleanupPostAnimation = false; + } } } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index e1c74bf6d8..15ee4118d5 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -219,7 +219,7 @@ public class DragLayer extends InsettableFrameLayout { mLauncher.closeShortcutsContainer(); // We let touches on the original icon go through so that users can launch // the app with one tap if they don't find a shortcut they want. - return !isEventOverView(deepShortcutsContainer.getDeferredDragIcon(), ev); + return !isEventOverView(deepShortcutsContainer.getOriginalIcon(), ev); } } } diff --git a/src/com/android/launcher3/dragndrop/DragOptions.java b/src/com/android/launcher3/dragndrop/DragOptions.java index dbf46f338a..906855a7c9 100644 --- a/src/com/android/launcher3/dragndrop/DragOptions.java +++ b/src/com/android/launcher3/dragndrop/DragOptions.java @@ -17,6 +17,8 @@ package com.android.launcher3.dragndrop; import android.graphics.Point; +import android.support.annotation.CallSuper; +import android.view.View; /** * Set of options to control the drag and drop behavior. @@ -29,8 +31,8 @@ public class DragOptions { /** Specifies the start location for the system DnD, null when using internal DnD */ public Point systemDndStartPoint = null; - /** Determines when a deferred drag should start. By default, drags aren't deferred at all. */ - public DeferDragCondition deferDragCondition = new DeferDragCondition(); + /** Determines when a pre-drag should transition to a drag. By default, this is immediate. */ + public PreDragCondition preDragCondition = null; /** * Specifies a condition that must be met before DragListener#onDragStart() is called. @@ -38,34 +40,26 @@ public class DragOptions { * DragController#startDrag(). * * This condition can be overridden, and callbacks are provided for the following cases: - * - The drag starts, but onDragStart() is deferred (onDeferredDragStart()). - * - The drag ends before the condition is met (onDropBeforeDeferredDrag()). - * - The condition is met (onDragStart()). + * - The pre-drag starts, but onDragStart() is deferred (onPreDragStart()). + * - The pre-drag ends before the condition is met (onPreDragEnd(false)). + * - The actual drag starts when the condition is met (onPreDragEnd(true)). */ - public static class DeferDragCondition { - public boolean shouldStartDeferredDrag(double distanceDragged) { - return true; - } + public interface PreDragCondition { + + public boolean shouldStartDrag(double distanceDragged); /** - * The drag has started, but onDragStart() is deferred. - * This happens when shouldStartDeferredDrag() returns true. + * The pre-drag has started, but onDragStart() is + * deferred until shouldStartDrag() returns true. */ - public void onDeferredDragStart() { - // Do nothing. - } + void onPreDragStart(); /** - * User dropped before the deferred condition was met, - * i.e. before shouldStartDeferredDrag() returned true. + * The pre-drag has ended. This gets called at the same time as onDragStart() + * if the condition is met, otherwise at the same time as onDragEnd(). + * @param dragStarted Whether the pre-drag ended because the actual drag started. + * This will be true if the condition was met, otherwise false. */ - public void onDropBeforeDeferredDrag() { - // Do nothing - } - - /** onDragStart() has been called, now we are in a normal drag. */ - public void onDragStart() { - // Do nothing - } + void onPreDragEnd(boolean dragStarted); } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index ebbe64127d..4fe351368c 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -281,17 +281,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList public boolean onLongClick(View v) { // Return if global dragging is not enabled if (!mLauncher.isDraggingEnabled()) return true; - DragOptions dragOptions = new DragOptions(); - if (v instanceof BubbleTextView) { - BubbleTextView icon = (BubbleTextView) v; - if (icon.hasDeepShortcuts()) { - DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon(icon); - if (dsc != null) { - dragOptions.deferDragCondition = dsc.createDeferDragCondition(null); - } - } - } - return startDrag(v, dragOptions); + return startDrag(v, new DragOptions()); } public boolean startDrag(View v, DragOptions options) { @@ -916,7 +906,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList if (mDeleteFolderOnDropCompleted && !mItemAddedBackToSelfViaIcon && target != this) { replaceFolderWithFinalItem(); } - } else if (!mDragController.isDeferringDrag()) { + } else { // The drag failed, we need to return the item to the folder ShortcutInfo info = (ShortcutInfo) d.dragInfo; View icon = (mCurrentDragView != null && mCurrentDragView.getTag() == info) @@ -1309,7 +1299,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mIsExternalDrag = false; } else { currentDragView = mCurrentDragView; - if (!mDragController.isDeferringDrag()) { + // The view was never removed from this folder if we are still in the pre-drag. + if (!mDragController.isInPreDrag()) { mContent.addViewForRank(currentDragView, si, mEmptyCellRank); } } @@ -1332,7 +1323,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mItemsInvalidated = true; rearrangeChildren(); - if (!mDragController.isDeferringDrag()) { + // The ShortcutInfo was never removed if we are still in the pre-drag. + if (!mDragController.isInPreDrag()) { // Temporarily suppress the listener, as we did all the work already here. try (SuppressInfoChanges s = new SuppressInfoChanges()) { mInfo.add(si, false); diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 9ff4721e00..31f382370e 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -62,7 +62,6 @@ import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; -import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -86,7 +85,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC private final ShortcutMenuAccessibilityDelegate mAccessibilityDelegate; private final boolean mIsRtl; - private BubbleTextView mDeferredDragIcon; + private BubbleTextView mOriginalIcon; private final Rect mTempRect = new Rect(); private Point mIconLastTouchPos = new Point(); private boolean mIsLeftAligned; @@ -151,7 +150,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC animateOpen(); - deferDrag(originalIcon); + mOriginalIcon = originalIcon; + mLauncher.getDragController().addDragListener(this); // Load the shortcuts on a background thread and update the container as it animates. final Looper workerLooper = LauncherModel.getWorkerLooper(); @@ -376,13 +376,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC return arrowView; } - private void deferDrag(BubbleTextView originalIcon) { - mDeferredDragIcon = originalIcon; - mLauncher.getDragController().addDragListener(this); - } - - public BubbleTextView getDeferredDragIcon() { - return mDeferredDragIcon; + public BubbleTextView getOriginalIcon() { + return mOriginalIcon; } /** @@ -391,30 +386,26 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC * Current behavior: * - Start the drag if the touch passes a certain distance from the original touch down. */ - public DragOptions.DeferDragCondition createDeferDragCondition(final Runnable onDragStart) { - return new DragOptions.DeferDragCondition() { + public DragOptions.PreDragCondition createPreDragCondition() { + return new DragOptions.PreDragCondition() { @Override - public boolean shouldStartDeferredDrag(double distanceDragged) { + public boolean shouldStartDrag(double distanceDragged) { return distanceDragged > mStartDragThreshold; } @Override - public void onDeferredDragStart() { - mDeferredDragIcon.setVisibility(INVISIBLE); + public void onPreDragStart() { + mOriginalIcon.setVisibility(INVISIBLE); } @Override - public void onDropBeforeDeferredDrag() { - mLauncher.getUserEventDispatcher().logDeepShortcutsOpen(mDeferredDragIcon); - if (!mIsAboveIcon) { - mDeferredDragIcon.setTextVisibility(false); - } - } - - @Override - public void onDragStart() { - if (onDragStart != null) { - onDragStart.run(); + public void onPreDragEnd(boolean dragStarted) { + if (!dragStarted) { + mOriginalIcon.setVisibility(VISIBLE); + mLauncher.getUserEventDispatcher().logDeepShortcutsOpen(mOriginalIcon); + if (!mIsAboveIcon) { + mOriginalIcon.setTextVisibility(false); + } } } }; @@ -512,7 +503,6 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } } } - mDeferredDragIcon.setVisibility(VISIBLE); } @Override @@ -624,9 +614,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } mIsOpen = false; mDeferContainerRemoval = false; - boolean isInHotseat = ((ItemInfo) mDeferredDragIcon.getTag()).container + boolean isInHotseat = ((ItemInfo) mOriginalIcon.getTag()).container == LauncherSettings.Favorites.CONTAINER_HOTSEAT; - mDeferredDragIcon.setTextVisibility(!isInHotseat); + mOriginalIcon.setTextVisibility(!isInHotseat); mLauncher.getDragController().removeDragListener(this); mLauncher.getDragLayer().removeView(this); } @@ -648,7 +638,6 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } List ids = launcher.getShortcutIdsForItem((ItemInfo) icon.getTag()); if (!ids.isEmpty()) { - // There are shortcuts associated with the app, so defer its drag. final DeepShortcutsContainer container = (DeepShortcutsContainer) launcher.getLayoutInflater().inflate( R.layout.deep_shortcuts_container, launcher.getDragLayer(), false); From c39ff736c0e059dbf1a28ea34b4f9ff370682344 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 4 Oct 2016 13:50:45 -0700 Subject: [PATCH 050/382] Fixing creash when binding QSB Change-Id: I0db112e3dc60cb59db10fde3d9088c11a09fae8c --- src/com/android/launcher3/QsbContainerView.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/android/launcher3/QsbContainerView.java b/src/com/android/launcher3/QsbContainerView.java index 7d939a0eb9..65711e127e 100644 --- a/src/com/android/launcher3/QsbContainerView.java +++ b/src/com/android/launcher3/QsbContainerView.java @@ -109,6 +109,8 @@ public class QsbContainerView extends FrameLayout { if (mWidgetInfo == null) { // There is no search provider, just show the default widget. return getDefaultView(inflater, container, false); + } else { + mWidgetInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(launcher, mWidgetInfo); } SharedPreferences prefs = Utilities.getPrefs(launcher); From f3e35d93318190f995e6a0fc9d0441ac844b67e4 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 5 Oct 2016 14:08:11 -0700 Subject: [PATCH 051/382] Add logging for long presses. Reset elapsed timer when changing containers. This is the first CL in a series of logging-related CLs. Upcoming CLs will include using Commands (HOME_INTENT, BACK) and "tapping outside" of a container logic. Change-Id: I62f0a08c7a9d9fce0baa5c12c67e21f63ab16a7c --- src/com/android/launcher3/Launcher.java | 53 +++++++++---------- .../LauncherStateTransitionAnimation.java | 2 + .../OverviewButtonClickListener.java | 51 ++++++++++++++++++ src/com/android/launcher3/Workspace.java | 2 + .../logging/UserEventDispatcher.java | 7 +++ 5 files changed, 86 insertions(+), 29 deletions(-) create mode 100644 src/com/android/launcher3/OverviewButtonClickListener.java diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 30d5b17c51..164dc518b7 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1358,53 +1358,36 @@ public class Launcher extends Activity private void setupOverviewPanel() { mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); - // Long-clicking buttons in the overview panel does the same thing as clicking them. - OnLongClickListener performClickOnLongClick = new OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return v.performClick(); - } - }; - // Bind wallpaper button actions View wallpaperButton = findViewById(R.id.wallpaper_button); - wallpaperButton.setOnClickListener(new OnClickListener() { + new OverviewButtonClickListener(LauncherLogProto.WALLPAPER_BUTTON) { @Override - public void onClick(View view) { - if (!mWorkspace.isSwitchingState()) { - onClickWallpaperPicker(view); - } + public void handleViewClick(View view) { + onClickWallpaperPicker(view); } - }); - wallpaperButton.setOnLongClickListener(performClickOnLongClick); + }.attachTo(wallpaperButton); wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener()); // Bind widget button actions mWidgetsButton = findViewById(R.id.widget_button); - mWidgetsButton.setOnClickListener(new OnClickListener() { + new OverviewButtonClickListener(LauncherLogProto.WIDGETS_BUTTON) { @Override - public void onClick(View view) { - if (!mWorkspace.isSwitchingState()) { - onClickAddWidgetButton(view); - } + public void handleViewClick(View view) { + onClickAddWidgetButton(view); } - }); - mWidgetsButton.setOnLongClickListener(performClickOnLongClick); + }.attachTo(mWidgetsButton); mWidgetsButton.setOnTouchListener(getHapticFeedbackTouchListener()); // Bind settings actions View settingsButton = findViewById(R.id.settings_button); boolean hasSettings = hasSettings(); if (hasSettings) { - settingsButton.setOnClickListener(new OnClickListener() { + new OverviewButtonClickListener(LauncherLogProto.SETTINGS_BUTTON) { @Override - public void onClick(View view) { - if (!mWorkspace.isSwitchingState()) { - onClickSettingsButton(view); - } + public void handleViewClick(View view) { + onClickSettingsButton(view); } - }); - settingsButton.setOnLongClickListener(performClickOnLongClick); + }.attachTo(settingsButton); settingsButton.setOnTouchListener(getHapticFeedbackTouchListener()); } else { settingsButton.setVisibility(View.GONE); @@ -2896,6 +2879,8 @@ public class Launcher extends Activity // the workspace items folder.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + + getUserEventDispatcher().resetElapsedContainerMillis(); } public void closeFolder() { @@ -2934,6 +2919,8 @@ public class Launcher extends Activity // Notify the accessibility manager that this folder "window" has disappeared and no // longer occludes the workspace items getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + + getUserEventDispatcher().resetElapsedContainerMillis(); } public void closeShortcutsContainer() { @@ -2999,6 +2986,9 @@ public class Launcher extends Activity if (v instanceof Workspace) { if (!mWorkspace.isInOverviewMode()) { if (!mWorkspace.isTouchActive() && !fromEdgeOfScreen) { + getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, + LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE, + mWorkspace.getCurrentPage()); showOverviewMode(true); mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); @@ -3027,10 +3017,15 @@ public class Launcher extends Activity // User long pressed on empty space if (mWorkspace.isInOverviewMode()) { mWorkspace.startReordering(v); + getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, + LauncherLogProto.Action.NONE, LauncherLogProto.OVERVIEW); } else { if (fromEdgeOfScreen) { return false; } + getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, + LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE, + mWorkspace.getCurrentPage()); showOverviewMode(true); } mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index eb70650b2a..6d5f951598 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -607,6 +607,8 @@ public class LauncherStateTransitionAnimation { playCommonTransitionAnimations(toWorkspaceState, fromWorkspace, null, animated, animated, animation, layerViews); + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); + if (animated) { dispatchOnLauncherTransitionPrepare(fromWorkspace, animated, multiplePagesVisible); diff --git a/src/com/android/launcher3/OverviewButtonClickListener.java b/src/com/android/launcher3/OverviewButtonClickListener.java new file mode 100644 index 0000000000..c98f1d7bc6 --- /dev/null +++ b/src/com/android/launcher3/OverviewButtonClickListener.java @@ -0,0 +1,51 @@ +package com.android.launcher3; + +import android.view.View; + +import com.android.launcher3.userevent.nano.LauncherLogProto; + +/** + * A specialized listener for Overview buttons where both clicks and long clicks are logged + * handled the same via {@link #handleViewClick(View)}. + */ +public abstract class OverviewButtonClickListener implements View.OnClickListener, + View.OnLongClickListener { + + private int mControlType; /** ControlType enum as defined in {@link LauncherLogProto} */ + + public OverviewButtonClickListener(int controlType) { + mControlType = controlType; + } + + public void attachTo(View v) { + v.setOnClickListener(this); + v.setOnLongClickListener(this); + } + + @Override + public void onClick(View view) { + if (shouldPerformClick(view)) { + handleViewClick(view, LauncherLogProto.Action.TAP); + } + } + + @Override + public boolean onLongClick(View view) { + if (shouldPerformClick(view)) { + handleViewClick(view, LauncherLogProto.Action.LONGPRESS); + } + return true; + } + + private boolean shouldPerformClick(View view) { + return !Launcher.getLauncher(view.getContext()).getWorkspace().isSwitchingState(); + } + + private void handleViewClick(View view, int action) { + handleViewClick(view); + Launcher.getLauncher(view.getContext()).getUserEventDispatcher() + .logActionOnControl(action, mControlType); + } + + public abstract void handleViewClick(View view); +} \ No newline at end of file diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 315e23ad22..0bf8241ac8 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2344,6 +2344,8 @@ public class Workspace extends PagedView DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon((BubbleTextView) child); if (dsc != null) { dragOptions.preDragCondition = dsc.createPreDragCondition(); + + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); } } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 56fdce8343..2ad8847731 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -166,10 +166,15 @@ public class UserEventDispatcher { } public void logActionOnContainer(int action, int dir, int containerType) { + logActionOnContainer(action, dir, containerType, 0); + } + + public void logActionOnContainer(int action, int dir, int containerType, int pageIndex) { LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTAINER); event.action.touch = action; event.action.dir = dir; event.srcTarget[0].containerType = containerType; + event.srcTarget[0].pageIndex = pageIndex; dispatchUserEvent(event, null); } @@ -184,6 +189,8 @@ public class UserEventDispatcher { provider.fillInLaunchSourceData(icon, info, event.srcTarget[0], event.srcTarget[1]); event.action.touch = Action.LONGPRESS; dispatchUserEvent(event, null); + + resetElapsedContainerMillis(); } public void setPredictedApps(List predictedApps) { From c4de137793b5031523fe9e20ba6e3817d695afeb Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 5 Oct 2016 15:40:51 -0700 Subject: [PATCH 052/382] Added logging for pinching in/out b/w workspace and overview. Change-Id: I50f81a8a7841addef652cba2c448d09f3341c8b2 --- src/com/android/launcher3/PinchAnimationManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/launcher3/PinchAnimationManager.java b/src/com/android/launcher3/PinchAnimationManager.java index baeb77c824..84ef12e167 100644 --- a/src/com/android/launcher3/PinchAnimationManager.java +++ b/src/com/android/launcher3/PinchAnimationManager.java @@ -24,6 +24,8 @@ import android.util.Log; import android.view.View; import android.view.animation.LinearInterpolator; +import com.android.launcher3.userevent.nano.LauncherLogProto; + import static com.android.launcher3.Workspace.State.NORMAL; import static com.android.launcher3.Workspace.State.OVERVIEW; @@ -162,9 +164,15 @@ public class PinchAnimationManager { } else if (threshold == PinchThresholdManager.THRESHOLD_THREE) { // Passing threshold 3 ends the pinch and snaps to the new state. if (startState == OVERVIEW && goingTowards == NORMAL) { + mLauncher.getUserEventDispatcher().logActionOnContainer( + LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE, + LauncherLogProto.OVERVIEW, mWorkspace.getCurrentPage()); mLauncher.showWorkspace(true); mWorkspace.snapToPage(mWorkspace.getCurrentPage()); } else if (startState == NORMAL && goingTowards == OVERVIEW) { + mLauncher.getUserEventDispatcher().logActionOnContainer( + LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE, + LauncherLogProto.WORKSPACE, mWorkspace.getCurrentPage()); mLauncher.showOverviewMode(true); } } else { From 4b513f392f50606d7945308cdd5469de4d8a278d Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 4 Oct 2016 17:29:48 -0700 Subject: [PATCH 053/382] Fix page indicator bug where it gets stuck as a blue line. Bug: 31909035 Change-Id: I4cdda057807476c1c5ec454fd17dbfa9f0ed5111 --- .../pageindicators/PageIndicatorDots.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index fb9d2f7fea..12a67014d3 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -80,7 +80,7 @@ public class PageIndicatorDots extends PageIndicator { @Override public void onAnimationEnd(Animator animation) { mAnimator = null; - animateToPostion(mFinalPosition); + animateToPosition(mFinalPosition); } }; @@ -136,22 +136,25 @@ public class PageIndicatorDots extends PageIndicator { currentScroll = totalScroll - currentScroll; } int scrollPerPage = totalScroll / (mNumPages - 1); - int absScroll = mActivePage * scrollPerPage; - float scrollThreshold = SHIFT_THRESHOLD * scrollPerPage; + int pageToLeft = currentScroll / scrollPerPage; + int pageToLeftScroll = pageToLeft * scrollPerPage; + int pageToRightScroll = pageToLeftScroll + scrollPerPage; - if ((absScroll - currentScroll) > scrollThreshold) { - // current scroll is before absolute scroll - animateToPostion(mActivePage - SHIFT_PER_ANIMATION); - } else if ((currentScroll - absScroll) > scrollThreshold) { - // current scroll is ahead of absolute scroll - animateToPostion(mActivePage + SHIFT_PER_ANIMATION); + float scrollThreshold = SHIFT_THRESHOLD * scrollPerPage; + if (currentScroll < pageToLeftScroll + scrollThreshold) { + // scroll is within the left page's threshold + animateToPosition(pageToLeft); + } else if (currentScroll > pageToRightScroll - scrollThreshold) { + // scroll is far enough from left page to go to the right page + animateToPosition(pageToLeft + 1); } else { - animateToPostion(mActivePage); + // scroll is between left and right page + animateToPosition(pageToLeft + SHIFT_PER_ANIMATION); } } } - private void animateToPostion(float position) { + private void animateToPosition(float position) { mFinalPosition = position; if (Math.abs(mCurrentPosition - mFinalPosition) < SHIFT_THRESHOLD) { mCurrentPosition = mFinalPosition; From 4f66ee5bd4516e3e338dfcd33779454d2cc7f17c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 6 Oct 2016 01:59:32 -0700 Subject: [PATCH 054/382] Import translations. DO NOT MERGE Change-Id: I79312af8c821187e4e04c482e36a37b970f66109 Auto-generated-cl: translation import --- res/values-af/strings.xml | 4 ++++ res/values-am/strings.xml | 4 ++++ res/values-ar/strings.xml | 4 ++++ res/values-az-rAZ/strings.xml | 4 ++++ res/values-b+sr+Latn/strings.xml | 4 ++++ res/values-be-rBY/strings.xml | 4 ++++ res/values-bg/strings.xml | 4 ++++ res/values-bn-rBD/strings.xml | 4 ++++ res/values-bs-rBA/strings.xml | 4 ++++ res/values-ca/strings.xml | 4 ++++ res/values-cs/strings.xml | 4 ++++ res/values-da/strings.xml | 4 ++++ res/values-de/strings.xml | 4 ++++ res/values-el/strings.xml | 4 ++++ res/values-en-rAU/strings.xml | 4 ++++ res/values-en-rGB/strings.xml | 4 ++++ res/values-en-rIN/strings.xml | 4 ++++ res/values-es-rUS/strings.xml | 4 ++++ res/values-es/strings.xml | 4 ++++ res/values-et-rEE/strings.xml | 4 ++++ res/values-eu-rES/strings.xml | 4 ++++ res/values-fa/strings.xml | 4 ++++ res/values-fi/strings.xml | 4 ++++ res/values-fr-rCA/strings.xml | 4 ++++ res/values-fr/strings.xml | 4 ++++ res/values-gl-rES/strings.xml | 4 ++++ res/values-gu-rIN/strings.xml | 4 ++++ res/values-hi/strings.xml | 4 ++++ res/values-hr/strings.xml | 4 ++++ res/values-hu/strings.xml | 4 ++++ res/values-hy-rAM/strings.xml | 4 ++++ res/values-in/strings.xml | 4 ++++ res/values-is-rIS/strings.xml | 4 ++++ res/values-it/strings.xml | 4 ++++ res/values-iw/strings.xml | 4 ++++ res/values-ja/strings.xml | 4 ++++ res/values-ka-rGE/strings.xml | 4 ++++ res/values-kk-rKZ/strings.xml | 4 ++++ res/values-km-rKH/strings.xml | 4 ++++ res/values-kn-rIN/strings.xml | 4 ++++ res/values-ko/strings.xml | 4 ++++ res/values-ky-rKG/strings.xml | 4 ++++ res/values-lo-rLA/strings.xml | 4 ++++ res/values-lt/strings.xml | 4 ++++ res/values-lv/strings.xml | 4 ++++ res/values-mk-rMK/strings.xml | 4 ++++ res/values-ml-rIN/strings.xml | 4 ++++ res/values-mn-rMN/strings.xml | 4 ++++ res/values-mr-rIN/strings.xml | 4 ++++ res/values-ms-rMY/strings.xml | 4 ++++ res/values-my-rMM/strings.xml | 4 ++++ res/values-nb/strings.xml | 4 ++++ res/values-ne-rNP/strings.xml | 4 ++++ res/values-nl/strings.xml | 4 ++++ res/values-pa-rIN/strings.xml | 4 ++++ res/values-pl/strings.xml | 4 ++++ res/values-pt-rPT/strings.xml | 4 ++++ res/values-pt/strings.xml | 4 ++++ res/values-ro/strings.xml | 4 ++++ res/values-ru/strings.xml | 4 ++++ res/values-si-rLK/strings.xml | 4 ++++ res/values-sk/strings.xml | 4 ++++ res/values-sl/strings.xml | 4 ++++ res/values-sq-rAL/strings.xml | 4 ++++ res/values-sr/strings.xml | 4 ++++ res/values-sv/strings.xml | 4 ++++ res/values-sw/strings.xml | 4 ++++ res/values-ta-rIN/strings.xml | 4 ++++ res/values-te-rIN/strings.xml | 4 ++++ res/values-th/strings.xml | 4 ++++ res/values-tl/strings.xml | 4 ++++ res/values-tr/strings.xml | 4 ++++ res/values-uk/strings.xml | 4 ++++ res/values-ur-rPK/strings.xml | 4 ++++ res/values-uz-rUZ/strings.xml | 4 ++++ res/values-vi/strings.xml | 4 ++++ res/values-zh-rCN/strings.xml | 4 ++++ res/values-zh-rHK/strings.xml | 4 ++++ res/values-zh-rTW/strings.xml | 4 ++++ res/values-zu/strings.xml | 4 ++++ 80 files changed, 320 insertions(+) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 9152ea54b1..7eca0189f2 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -27,6 +27,10 @@ "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" "Kortpad is nie beskikbaar nie" + + + + "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index c20dc12350..b2de3fcd4b 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -27,6 +27,10 @@ "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" "አቋራጭ አይገኝም" + + + + "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c80d162c5e..5d00ca07bc 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -27,6 +27,10 @@ "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" "الاختصار غير متاح" + + + + "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 1a4f31b074..9a624f3975 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -27,6 +27,10 @@ "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" "Qısayol əlçatan deyil" + + + + "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index a9344f9ada..8f9611b02a 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -27,6 +27,10 @@ "Preuzeta aplikacija je onemogućena u Bezbednom režimu" "Vidžeti su onemogućeni u Bezbednom režimu" "Prečica nije dostupna" + + + + "Dodirnite i zadržite da biste izabrali vidžet." "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index f5dba2daea..426b8d4a4f 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -27,6 +27,10 @@ "Спампаваная праграма адключана ў Бяспечным рэжыме" "Віджэты адключаны ў Бяспечным рэжыме" "Ярлык недаступны" + + + + "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 2c6d3d4721..be84ec5b20 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -27,6 +27,10 @@ "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" "Няма достъп до прекия път" + + + + "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index d5108e9f84..dbb39bf5ee 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -27,6 +27,10 @@ "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" "শর্টকাটগুলি অনুপলব্ধ" + + + + "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 579b95a692..a66f24bab2 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -27,6 +27,10 @@ "Preuzeta aplikacija je onemogućena u sigurnom načinu rada" "Vidžeti su onemogućeni u sigurnom načinu rada." "Prečica nije dostupna" + + + + "Dodirnite & i držite da biste uzeli dodatak." "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 4ba0498211..06deaa1bf4 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -27,6 +27,10 @@ "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." "La drecera no està disponible" + + + + "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 373920cfc8..66a10da3d1 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -27,6 +27,10 @@ "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." "Zkratka není k dispozici" + + + + "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 93041408d2..6f5b6b1c2a 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -27,6 +27,10 @@ "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" "Genvejen er ikke tilgængelig" + + + + "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index e461d46f0a..2bc85774a4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -27,6 +27,10 @@ "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" "Verknüpfung nicht verfügbar" + + + + "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 119232dab6..f143ae5790 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -27,6 +27,10 @@ "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" "Η συντόμευση δεν είναι διαθέσιμη" + + + + "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 44daaa84f2..ebff65983e 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -27,6 +27,10 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" + + + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 44daaa84f2..ebff65983e 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -27,6 +27,10 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" + + + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 44daaa84f2..ebff65983e 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -27,6 +27,10 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" + + + + "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4bd6c88541..20edcfc082 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -27,6 +27,10 @@ "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" "El acceso directo no está disponible" + + + + "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index a4fc62038c..51f473a749 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -27,6 +27,10 @@ "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" "Acceso directo no disponible" + + + + "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index feb63ca314..5e7c0155cd 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -27,6 +27,10 @@ "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" "Otsetee pole saadaval" + + + + "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 76ef5c689a..0cb3d8fe86 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -27,6 +27,10 @@ "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" "Lasterbideak ez daude erabilgarri" + + + + "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 95675a7eb0..499d101774 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -27,6 +27,10 @@ "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" "میان‌بر دردسترس نیست" + + + + "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 40e6d96baa..77a51e4702 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -27,6 +27,10 @@ "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" "Pikakuvake ei ole käytettävissä." + + + + "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 01d6b272dc..acdca26ed2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -27,6 +27,10 @@ "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" "Le raccourci n\'est pas disponible" + + + + "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f42748ccb9..45f6a7291f 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -27,6 +27,10 @@ "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." "Raccourci non disponible" + + + + "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index c03ecdc510..4a2303a151 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -27,6 +27,10 @@ "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" "O atallo non está dispoñible" + + + + "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 39a176c484..bb9e4a3fb9 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -27,6 +27,10 @@ "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" "શૉર્ટકટ ઉપલબ્ધ નથી" + + + + "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index f534e1e6db..2025af549d 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -27,6 +27,10 @@ "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" "शॉर्टकट उपलब्ध नहीं है" + + + + "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index b4fb50eab9..4c902604e8 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -27,6 +27,10 @@ "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" "Prečac nije dostupan" + + + + "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 279749bac6..352290a7d1 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -27,6 +27,10 @@ "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" "A gyorsparancs nem áll rendelkezésre" + + + + "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index c7401a991c..acbbf36ac5 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -27,6 +27,10 @@ "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" "Դյուրանցումն անհասանելի է" + + + + "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 00e8d63903..11247e9e30 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -27,6 +27,10 @@ "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" "Pintasan tidak tersedia" + + + + "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 7586ae37ef..c59308cf01 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -27,6 +27,10 @@ "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" "Flýtileið er ekki tiltæk" + + + + "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b821222378..eebdc59305 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -27,6 +27,10 @@ "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" "La scorciatoia non è disponibile" + + + + "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index ffea51f1d4..b0f81537ad 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -27,6 +27,10 @@ "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" "קיצור הדרך אינו זמין" + + + + "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 8729abad77..ae6734c241 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -27,6 +27,10 @@ "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" "ショートカットは使用できません" + + + + "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 1a200d710a..e06fbe8db4 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -27,6 +27,10 @@ "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" "მალსახმობი მიუწვდომელია" + + + + "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 009fa4af00..57efc1516a 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -27,6 +27,10 @@ "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" "Таңбаша қолжетімді емес" + + + + "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 864c979250..b517cd3a35 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -27,6 +27,10 @@ "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" "ផ្លូវកាត់មិនអាចប្រើបានទេ" + + + + "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index befbd9aac6..b234328cd2 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -27,6 +27,10 @@ "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್ ಲಭ್ಯವಿಲ್ಲ" + + + + "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 1ef438f298..67d5d9111d 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -27,6 +27,10 @@ "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" "바로가기를 사용할 수 없음" + + + + "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 71e02d00a9..8494d20169 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -27,6 +27,10 @@ "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" "Кыска жол жок" + + + + "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index e2311024f7..a62585ea55 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -27,6 +27,10 @@ "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" "ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້" + + + + "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 13ebaa3b10..c076b89e08 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -27,6 +27,10 @@ "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" "Sparčiojo klavišo negalima naudoti" + + + + "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 924b399a66..a7ba59d733 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -27,6 +27,10 @@ "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" "Saīsne nav pieejama." + + + + "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 7e44707fc4..6daef64693 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -27,6 +27,10 @@ "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" "Кратенката не е достапна" + + + + "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 941d1acb4f..af73dc1cae 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -27,6 +27,10 @@ "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" "കുറുക്കുവഴി ലഭ്യമല്ല" + + + + "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 45e1856491..174bb535e9 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -27,6 +27,10 @@ "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" "Товчлол алга" + + + + "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 1ec443cc0c..cf2612de79 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -27,6 +27,10 @@ "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" "शॉर्टकट उपलब्ध नाही" + + + + "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 215315ad11..a037fc24c3 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -27,6 +27,10 @@ "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" "Pintasan tidak tersedia" + + + + "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index bc4e484ce8..71cf2e4374 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -27,6 +27,10 @@ "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" "ဖြတ်လမ်း မရနိုင်ပါ" + + + + "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 449094de26..b84e8ce7b4 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -27,6 +27,10 @@ "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" "Snarveien er ikke tilgjengelig" + + + + "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 8accfcc720..3d8cea136e 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -27,6 +27,10 @@ "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" "सर्टकट उपलब्ध छैन" + + + + "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 0134ae1c48..6179fff347 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -27,6 +27,10 @@ "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" "Snelkoppeling is niet beschikbaar" + + + + "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 3be9becfce..c703edb246 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -27,6 +27,10 @@ "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + + + + "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index feb2a36c50..fb923412b7 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -27,6 +27,10 @@ "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" "Skrót nie jest dostępny" + + + + "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 6d684fa857..8ccac334fb 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -27,6 +27,10 @@ "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" "O atalho não está disponível" + + + + "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 82a756f392..bdf4c08331 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -27,6 +27,10 @@ "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" "O atalho não está disponível" + + + + "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 5905bcfffb..7499caa679 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -27,6 +27,10 @@ "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" "Comanda rapidă nu este disponibilă" + + + + "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ad30c977d6..3e5b5f48e6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -27,6 +27,10 @@ "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" "Ярлык недоступен" + + + + "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 1e0ed28b82..d0444f3cf8 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -27,6 +27,10 @@ "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" "කෙටි මග ලබා ගත නොහැකිය" + + + + "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 7210d79a83..dab8403e71 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -27,6 +27,10 @@ "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" "Skratky nie sú k dispozícii" + + + + "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index b55cb0d0a4..dbddf9bc85 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -27,6 +27,10 @@ "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" "Bližnjica ni na voljo" + + + + "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index c4fbaf3e8a..50fb9e25c3 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -27,6 +27,10 @@ "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" "Shkurtorja nuk është e disponueshme" + + + + "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 67a63cff6c..564c653038 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -27,6 +27,10 @@ "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" "Пречица није доступна" + + + + "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index dfcc1b03b9..62034d4277 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -27,6 +27,10 @@ "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" "Genvägen är inte tillgänglig" + + + + "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 03c8f064f5..ae9657e881 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -27,6 +27,10 @@ "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" "Hakuna njia ya mkato" + + + + "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 7db0ae4652..24aa9bcdea 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -27,6 +27,10 @@ "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" "குறுக்குவழி இல்லை" + + + + "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 4e8b86fd8c..1d3989bdf5 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -27,6 +27,10 @@ "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" "సత్వరమార్గం అందుబాటులో లేదు" + + + + "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 90dec72264..bd85e130ab 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -27,6 +27,10 @@ "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" "ทางลัดไม่พร้อมใช้งาน" + + + + "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index b944ebcd50..544af15dfc 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -27,6 +27,10 @@ "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" "Hindi available ang shortcut" + + + + "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index e95ee2db27..b1fa6b1f91 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -27,6 +27,10 @@ "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" "Kısayol kullanılamıyor" + + + + "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 1f73f0423c..96c0febc73 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -27,6 +27,10 @@ "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" "Ярлик недоступний" + + + + "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index e4c637d8cb..e7bed280be 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -27,6 +27,10 @@ "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" "شارٹ کٹ دستیاب نہیں ہے" + + + + "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0e541d37ab..eb8d7caa15 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -27,6 +27,10 @@ "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" "Tezkor tugmadan foydalanib bo‘lmaydi" + + + + "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 2bf5ad6f9f..3b43c4dc7e 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -27,6 +27,10 @@ "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" "Lối tắt không khả dụng" + + + + "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e3ed354c29..81d1cf9e96 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -27,6 +27,10 @@ "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" "无法使用快捷方式" + + + + "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index ad0f99a018..ee9639cb59 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -27,6 +27,10 @@ "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" "沒有可用的捷徑" + + + + "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 24f391d712..b4338dff21 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -27,6 +27,10 @@ "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" "目前無法使用捷徑" + + + + "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 10fbef4e40..6655bd35d3 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -27,6 +27,10 @@ "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" "Isinqamuleli asitholakali" + + + + "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" From 0de011705b132eacdd10f7bfb5cdc4bd79a147e8 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 5 Oct 2016 16:27:48 -0700 Subject: [PATCH 055/382] Code sanitization - Removed bad method/class name typos Change-Id: Ie6900e9e3d9ce9b550d2a2442a5dac3f7050a573 --- src/com/android/launcher3/CellLayout.java | 4 +-- src/com/android/launcher3/DropTarget.java | 21 ------------ src/com/android/launcher3/IconCache.java | 2 +- src/com/android/launcher3/ItemInfo.java | 2 +- src/com/android/launcher3/Launcher.java | 6 ++-- .../android/launcher3/LauncherAppState.java | 4 +-- src/com/android/launcher3/PagedView.java | 6 ++-- .../android/launcher3/PendingAddItemInfo.java | 2 +- .../launcher3/PreloadIconDrawable.java | 4 +-- src/com/android/launcher3/Utilities.java | 2 +- src/com/android/launcher3/Workspace.java | 34 +++++++++---------- ...ava => AccessibleDragListenerAdapter.java} | 4 +-- .../OverviewAccessibilityDelegate.java | 2 +- .../allapps/AllAppsFastScrollHelper.java | 2 +- .../allapps/AlphabeticalAppsList.java | 4 +-- .../allapps/VerticalPullDetector.java | 2 +- .../compat/PackageInstallerCompatVL.java | 6 ++-- .../launcher3/dragndrop/DragController.java | 6 ++-- .../launcher3/dragndrop/DragLayer.java | 2 +- src/com/android/launcher3/folder/Folder.java | 4 +-- .../launcher3/folder/FolderPagedView.java | 2 +- .../graphics/DragPreviewProvider.java | 6 ++-- .../launcher3/graphics/IconNormalizer.java | 18 +++++----- .../logging/UserEventDispatcher.java | 2 +- .../launcher3/provider/LauncherDbUtils.java | 2 +- .../widget/WidgetsContainerView.java | 2 +- 26 files changed, 65 insertions(+), 86 deletions(-) rename src/com/android/launcher3/accessibility/{AccessibileDragListenerAdapter.java => AccessibleDragListenerAdapter.java} (93%) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 6714d9f17c..5d3cbb2990 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -1054,11 +1054,11 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int oldDragCellX = mDragCell[0]; final int oldDragCellY = mDragCell[1]; - if (outlineProvider == null || outlineProvider.gerenatedDragOutline == null) { + if (outlineProvider == null || outlineProvider.generatedDragOutline == null) { return; } - Bitmap dragOutline = outlineProvider.gerenatedDragOutline; + Bitmap dragOutline = outlineProvider.generatedDragOutline; if (cellX != oldDragCellX || cellY != oldDragCellY) { Point dragOffset = dragObject.dragView.getDragVisualizeOffset(); Rect dragRegion = dragObject.dragView.getDragRegion(); diff --git a/src/com/android/launcher3/DropTarget.java b/src/com/android/launcher3/DropTarget.java index efdeb1fa37..e91fc15e04 100644 --- a/src/com/android/launcher3/DropTarget.java +++ b/src/com/android/launcher3/DropTarget.java @@ -107,17 +107,6 @@ public interface DropTarget { /** * Handle an object being dropped on the DropTarget - * - * @param source DragSource where the drag started - * @param x X coordinate of the drop location - * @param y Y coordinate of the drop location - * @param xOffset Horizontal offset with the object being dragged where the original - * touch happened - * @param yOffset Vertical offset with the object being dragged where the original - * touch happened - * @param dragView The DragView that's being dragged around on screen. - * @param dragInfo Data associated with the object being dragged - * */ void onDrop(DragObject dragObject); @@ -137,16 +126,6 @@ public interface DropTarget { /** * Check if a drop action can occur at, or near, the requested location. * This will be called just before onDrop. - * - * @param source DragSource where the drag started - * @param x X coordinate of the drop location - * @param y Y coordinate of the drop location - * @param xOffset Horizontal offset with the object being dragged where the - * original touch happened - * @param yOffset Vertical offset with the object being dragged where the - * original touch happened - * @param dragView The DragView that's being dragged around on screen. - * @param dragInfo Data associated with the object being dragged * @return True if the drop will be accepted, false otherwise. */ boolean acceptDrop(DragObject dragObject); diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 8edfdf593b..79097376c6 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -363,7 +363,7 @@ public class IconCache { } /** - * Updates {@param values} to contain versoning information and adds it to the DB. + * Updates {@param values} to contain versioning information and adds it to the DB. * @param values {@link ContentValues} containing icon & title */ private void addIconToDB(ContentValues values, ComponentName key, diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index c0c22a325a..20437721ed 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -59,7 +59,7 @@ public class ItemInfo { public long container = NO_ID; /** - * Iindicates the screen in which the shortcut appears. + * Indicates the screen in which the shortcut appears. */ public long screenId = -1; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 164dc518b7..b1700ccbbc 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1340,7 +1340,7 @@ public class Launcher extends Activity } // Setup the drag controller (drop targets have to be added in reverse order in priority) - mDragController.setDragScoller(mWorkspace); + mDragController.setDragScroller(mWorkspace); mDragController.setScrollView(mDragLayer); mDragController.setMoveTarget(mWorkspace); mDragController.addDropTarget(mWorkspace); @@ -2516,7 +2516,7 @@ public class Launcher extends Activity * on the home screen. */ public void onClickWallpaperPicker(View v) { - if (!Utilities.isWallapaperAllowed(this)) { + if (!Utilities.isWallpaperAllowed(this)) { Toast.makeText(this, R.string.msg_disabled_by_admin, Toast.LENGTH_SHORT).show(); return; } @@ -3693,7 +3693,7 @@ public class Launcher extends Activity if (DEBUG_WIDGETS) { Log.d(TAG, "Removing restored widget: id=" + item.appWidgetId + " belongs to component " + item.providerName - + ", as the povider is null"); + + ", as the provider is null"); } LauncherModel.deleteItemFromDatabase(this, item); return; diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 7861a106fd..1ee4a1a375 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -86,10 +86,10 @@ public class LauncherAppState { private LauncherAppState() { if (sContext == null) { - throw new IllegalStateException("LauncherAppState inited before app context set"); + throw new IllegalStateException("LauncherAppState initiated before app context set"); } - Log.v(Launcher.TAG, "LauncherAppState inited"); + Log.v(Launcher.TAG, "LauncherAppState initiated"); if (TestingUtils.MEMORY_DUMP_ENABLED) { TestingUtils.startTrackingMemory(sContext); diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 0b9bf09dfb..136d48db94 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1082,7 +1082,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc canvas.translate(display.left, display.top); canvas.rotate(270); - getEdgeVerticalPostion(sTmpIntPoint); + getEdgeVerticalPosition(sTmpIntPoint); canvas.translate(display.top - sTmpIntPoint[1], 0); mEdgeGlowLeft.setSize(sTmpIntPoint[1] - sTmpIntPoint[0], display.width()); if (mEdgeGlowLeft.draw(canvas)) { @@ -1096,7 +1096,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc canvas.translate(display.left + mPageScrolls[mIsRtl ? 0 : (getPageCount() - 1)], display.top); canvas.rotate(90); - getEdgeVerticalPostion(sTmpIntPoint); + getEdgeVerticalPosition(sTmpIntPoint); canvas.translate(sTmpIntPoint[0] - display.top, -display.width()); mEdgeGlowRight.setSize(sTmpIntPoint[1] - sTmpIntPoint[0], display.width()); @@ -1111,7 +1111,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc /** * Returns the top and bottom position for the edge effect. */ - protected abstract void getEdgeVerticalPostion(int[] pos); + protected abstract void getEdgeVerticalPosition(int[] pos); @Override public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { diff --git a/src/com/android/launcher3/PendingAddItemInfo.java b/src/com/android/launcher3/PendingAddItemInfo.java index 31820d7424..76de3e7644 100644 --- a/src/com/android/launcher3/PendingAddItemInfo.java +++ b/src/com/android/launcher3/PendingAddItemInfo.java @@ -20,7 +20,7 @@ import android.content.ComponentName; /** * Meta data that is used for deferred binding. - * e.g., this object is used to pass information on dragable targets when they are dropped onto + * e.g., this object is used to pass information on draggable targets when they are dropped onto * the workspace from another container. */ public class PendingAddItemInfo extends ItemInfo { diff --git a/src/com/android/launcher3/PreloadIconDrawable.java b/src/com/android/launcher3/PreloadIconDrawable.java index b064c47fc7..8295b45e8b 100644 --- a/src/com/android/launcher3/PreloadIconDrawable.java +++ b/src/com/android/launcher3/PreloadIconDrawable.java @@ -18,7 +18,7 @@ public class PreloadIconDrawable extends Drawable { private static final float ANIMATION_PROGRESS_STARTED = 0f; private static final float ANIMATION_PROGRESS_COMPLETED = 1.0f; - private static final float MIN_SATUNATION = 0.2f; + private static final float MIN_SATURATION = 0.2f; private static final float MIN_LIGHTNESS = 0.6f; private static final float ICON_SCALE_FACTOR = 0.5f; @@ -242,7 +242,7 @@ public class PreloadIconDrawable extends Drawable { // Make sure that the dominant color has enough saturation to be visible properly. float[] hsv = new float[3]; Color.colorToHSV(mIndicatorColor, hsv); - if (hsv[1] < MIN_SATUNATION) { + if (hsv[1] < MIN_SATURATION) { mIndicatorColor = DEFAULT_COLOR; return mIndicatorColor; } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index b4f0a498c1..95e3d82692 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -618,7 +618,7 @@ public final class Utilities { return ATLEAST_LOLLIPOP && powerManager.isPowerSaveMode(); } - public static boolean isWallapaperAllowed(Context context) { + public static boolean isWallpaperAllowed(Context context) { if (isNycOrAbove()) { try { WallpaperManager wm = context.getSystemService(WallpaperManager.class); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 0bf8241ac8..d2524601c7 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -56,7 +56,7 @@ import android.widget.TextView; import com.android.launcher3.Launcher.CustomContentCallbacks; import com.android.launcher3.Launcher.LauncherOverlay; import com.android.launcher3.UninstallDropTarget.DropTargetSource; -import com.android.launcher3.accessibility.AccessibileDragListenerAdapter; +import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.accessibility.OverviewAccessibilityDelegate; import com.android.launcher3.accessibility.OverviewScreenAccessibilityDelegate; import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper; @@ -303,7 +303,7 @@ public class Workspace extends PagedView LauncherOverlay mLauncherOverlay; boolean mScrollInteractionBegan; boolean mStartedSendingScrollEvents; - float mLastOverlaySroll = 0; + float mLastOverlayScroll = 0; // Total over scrollX in the overlay direction. private int mUnboundedScrollX; private boolean mForceDrawAdjacentPages = false; @@ -407,7 +407,7 @@ public class Workspace extends PagedView @Override public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragStart", 0, 0); + enforceDragParity("onDragStart", 0, 0); } if (mOutlineProvider != null) { @@ -464,7 +464,7 @@ public class Workspace extends PagedView @Override public void onDragEnd() { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragEnd", 0, 0); + enforceDragParity("onDragEnd", 0, 0); } if (!mDeferRemoveExtraEmptyScreen) { @@ -582,7 +582,7 @@ public class Workspace extends PagedView /** * Initializes and binds the first page - * @param qsb an exisitng qsb to recycle or null. + * @param qsb an existing qsb to recycle or null. */ public void bindAndInitFirstWorkspaceScreen(View qsb) { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { @@ -1462,7 +1462,7 @@ public class Workspace extends PagedView boolean shouldScrollOverlay = mLauncherOverlay != null && ((amount <= 0 && !mIsRtl) || (amount >= 0 && mIsRtl)); - boolean shouldZeroOverlay = mLauncherOverlay != null && mLastOverlaySroll != 0 && + boolean shouldZeroOverlay = mLauncherOverlay != null && mLastOverlayScroll != 0 && ((amount >= 0 && !mIsRtl) || (amount <= 0 && mIsRtl)); if (shouldScrollOverlay) { @@ -1471,8 +1471,8 @@ public class Workspace extends PagedView mLauncherOverlay.onScrollInteractionBegin(); } - mLastOverlaySroll = Math.abs(amount / getViewportWidth()); - mLauncherOverlay.onScrollChange(mLastOverlaySroll, mIsRtl); + mLastOverlayScroll = Math.abs(amount / getViewportWidth()); + mLauncherOverlay.onScrollChange(mLastOverlayScroll, mIsRtl); } else if (shouldOverScroll) { dampedOverScroll(amount); } @@ -1616,7 +1616,7 @@ public class Workspace extends PagedView } @Override - protected void getEdgeVerticalPostion(int[] pos) { + protected void getEdgeVerticalPosition(int[] pos) { View child = getChildAt(getPageCount() - 1); pos[0] = child.getTop(); pos[1] = child.getBottom(); @@ -2266,7 +2266,7 @@ public class Workspace extends PagedView layout.prepareChildForDrag(child); if (options.isAccessibleDrag) { - mDragController.addDragListener(new AccessibileDragListenerAdapter( + mDragController.addDragListener(new AccessibleDragListenerAdapter( this, CellLayout.WORKSPACE_ACCESSIBILITY_DRAG) { @Override protected void enableAccessibleDrag(boolean enable) { @@ -2788,7 +2788,7 @@ public class Workspace extends PagedView @Override public void onDragEnter(DragObject d) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragEnter", 1, 1); + enforceDragParity("onDragEnter", 1, 1); } mCreateUserFolderOnDrop = false; @@ -2805,7 +2805,7 @@ public class Workspace extends PagedView @Override public void onDragExit(DragObject d) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragExit", -1, 0); + enforceDragParity("onDragExit", -1, 0); } // Here we store the final page that will be dropped to, if the workspace in fact @@ -2838,14 +2838,14 @@ public class Workspace extends PagedView mLauncher.getDragLayer().hidePageHints(); } - private void enfoceDragParity(String event, int update, int expectedValue) { - enfoceDragParity(this, event, update, expectedValue); + private void enforceDragParity(String event, int update, int expectedValue) { + enforceDragParity(this, event, update, expectedValue); for (int i = 0; i < getChildCount(); i++) { - enfoceDragParity(getChildAt(i), event, update, expectedValue); + enforceDragParity(getChildAt(i), event, update, expectedValue); } } - private void enfoceDragParity(View v, String event, int update, int expectedValue) { + private void enforceDragParity(View v, String event, int update, int expectedValue) { Object tag = v.getTag(R.id.drag_event_parity); int value = tag == null ? 0 : (Integer) tag; value += update; @@ -2966,7 +2966,7 @@ public class Workspace extends PagedView mTempXY[0] = (int) xy[0]; mTempXY[1] = (int) xy[1]; mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); - mLauncher.getDragLayer().mapCoordInSelfToDescendent(hotseat.getLayout(), mTempXY); + mLauncher.getDragLayer().mapCoordInSelfToDescendant(hotseat.getLayout(), mTempXY); xy[0] = mTempXY[0]; xy[1] = mTempXY[1]; diff --git a/src/com/android/launcher3/accessibility/AccessibileDragListenerAdapter.java b/src/com/android/launcher3/accessibility/AccessibleDragListenerAdapter.java similarity index 93% rename from src/com/android/launcher3/accessibility/AccessibileDragListenerAdapter.java rename to src/com/android/launcher3/accessibility/AccessibleDragListenerAdapter.java index 62a9a6d19a..f8df5d7be7 100644 --- a/src/com/android/launcher3/accessibility/AccessibileDragListenerAdapter.java +++ b/src/com/android/launcher3/accessibility/AccessibleDragListenerAdapter.java @@ -28,7 +28,7 @@ import com.android.launcher3.dragndrop.DragOptions; * Utility listener to enable/disable accessibility drag flags for a ViewGroup * containing CellLayouts */ -public class AccessibileDragListenerAdapter implements DragListener { +public class AccessibleDragListenerAdapter implements DragListener { private final ViewGroup mViewGroup; private final int mDragType; @@ -38,7 +38,7 @@ public class AccessibileDragListenerAdapter implements DragListener { * @param dragType either {@link CellLayout#WORKSPACE_ACCESSIBILITY_DRAG} or * {@link CellLayout#FOLDER_ACCESSIBILITY_DRAG} */ - public AccessibileDragListenerAdapter(ViewGroup parent, int dragType) { + public AccessibleDragListenerAdapter(ViewGroup parent, int dragType) { mViewGroup = parent; mDragType = dragType; } diff --git a/src/com/android/launcher3/accessibility/OverviewAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/OverviewAccessibilityDelegate.java index 64559f2ec1..a6e89d320f 100644 --- a/src/com/android/launcher3/accessibility/OverviewAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/OverviewAccessibilityDelegate.java @@ -44,7 +44,7 @@ public class OverviewAccessibilityDelegate extends AccessibilityDelegate { Context context = host.getContext(); info.addAction(new AccessibilityAction(OVERVIEW, context.getText(OVERVIEW))); - if (Utilities.isWallapaperAllowed(context)) { + if (Utilities.isWallpaperAllowed(context)) { info.addAction(new AccessibilityAction(WALLPAPERS, context.getText(WALLPAPERS))); } info.addAction(new AccessibilityAction(WIDGETS, context.getText(WIDGETS))); diff --git a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java index 76934af7dd..808de476b4 100644 --- a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java +++ b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java @@ -34,7 +34,7 @@ public class AllAppsFastScrollHelper implements AllAppsGridAdapter.BindViewCallb private AllAppsRecyclerView mRv; private AlphabeticalAppsList mApps; - // Keeps track of the current and targetted fast scroll section (the section to scroll to after + // Keeps track of the current and targeted fast scroll section (the section to scroll to after // the initial delay) int mTargetFastScrollPosition = -1; @Thunk String mCurrentFastScrollSection; diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java index 7127ec44b6..0be2b41904 100644 --- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java +++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java @@ -149,7 +149,7 @@ public class AlphabeticalAppsList { return item; } - public static AdapterItem asSearchDivder(int pos) { + public static AdapterItem asSearchDivider(int pos) { AdapterItem item = new AdapterItem(); item.viewType = AllAppsGridAdapter.VIEW_TYPE_SEARCH_DIVIDER; item.position = pos; @@ -429,7 +429,7 @@ public class AlphabeticalAppsList { } // Add the search divider - mAdapterItems.add(AdapterItem.asSearchDivder(position++)); + mAdapterItems.add(AdapterItem.asSearchDivider(position++)); // Process the predicted app components mPredictedApps.clear(); diff --git a/src/com/android/launcher3/allapps/VerticalPullDetector.java b/src/com/android/launcher3/allapps/VerticalPullDetector.java index ab2b6edd5a..96e1299cf0 100644 --- a/src/com/android/launcher3/allapps/VerticalPullDetector.java +++ b/src/com/android/launcher3/allapps/VerticalPullDetector.java @@ -230,7 +230,7 @@ public class VerticalPullDetector { private void reportDragEnd() { if (DBG) { - Log.d(TAG, String.format("onScrolEnd disp=%.1f, velocity=%.1f", + Log.d(TAG, String.format("onScrollEnd disp=%.1f, velocity=%.1f", mDisplacementY, mVelocity)); } mListener.onDragEnd(mVelocity, Math.abs(mVelocity) > RELEASE_VELOCITY_PX_MS); diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 4aa667ed09..948471c5e8 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -54,7 +54,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { HashMap activePackages = new HashMap<>(); UserHandleCompat user = UserHandleCompat.myUserHandle(); for (SessionInfo info : mInstaller.getAllSessions()) { - addSessionInfoToCahce(info, user); + addSessionInfoToCache(info, user); if (info.getAppPackageName() != null) { activePackages.put(info.getAppPackageName(), (int) (info.getProgress() * 100)); mActiveSessions.put(info.getSessionId(), info.getAppPackageName()); @@ -63,7 +63,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { return activePackages; } - @Thunk void addSessionInfoToCahce(SessionInfo info, UserHandleCompat user) { + @Thunk void addSessionInfoToCache(SessionInfo info, UserHandleCompat user) { String packageName = info.getAppPackageName(); if (packageName != null) { mCache.cachePackageInstallInfo(packageName, user, info.getAppIcon(), @@ -124,7 +124,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { private void pushSessionDisplayToLauncher(int sessionId) { SessionInfo session = mInstaller.getSessionInfo(sessionId); if (session != null && session.getAppPackageName() != null) { - addSessionInfoToCahce(session, UserHandleCompat.myUserHandle()); + addSessionInfoToCache(session, UserHandleCompat.myUserHandle()); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); if (app != null) { diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index 19a47e8738..e11bfc682c 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -775,7 +775,7 @@ public class DragController implements DragDriver.EventListener, TouchController dropCoordinates[0] = x; dropCoordinates[1] = y; - mLauncher.getDragLayer().mapCoordInSelfToDescendent((View) target, dropCoordinates); + mLauncher.getDragLayer().mapCoordInSelfToDescendant((View) target, dropCoordinates); return target; } @@ -783,7 +783,7 @@ public class DragController implements DragDriver.EventListener, TouchController return null; } - public void setDragScoller(DragScroller scroller) { + public void setDragScroller(DragScroller scroller) { mDragScroller = scroller; } @@ -792,7 +792,7 @@ public class DragController implements DragDriver.EventListener, TouchController } /** - * Sets the drag listner which will be notified when a drag starts or ends. + * Sets the drag listener which will be notified when a drag starts or ends. */ public void addDragListener(DragListener l) { mListeners.add(l); diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 15ee4118d5..ef9c9652d4 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -499,7 +499,7 @@ public class DragLayer extends InsettableFrameLayout { /** * Inverse of {@link #getDescendantCoordRelativeToSelf(View, int[])}. */ - public float mapCoordInSelfToDescendent(View descendant, int[] coord) { + public float mapCoordInSelfToDescendant(View descendant, int[] coord) { return Utilities.mapCoordInSelfToDescendent(descendant, this, coord); } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 4fe351368c..b85d97382a 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -71,7 +71,7 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.UninstallDropTarget.DropTargetSource; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; -import com.android.launcher3.accessibility.AccessibileDragListenerAdapter; +import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragController.DragListener; @@ -297,7 +297,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mDragController.addDragListener(this); if (options.isAccessibleDrag) { - mDragController.addDragListener(new AccessibileDragListenerAdapter( + mDragController.addDragListener(new AccessibleDragListenerAdapter( mContent, CellLayout.FOLDER_ACCESSIBILITY_DRAG) { @Override diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index c6b06717f5..170216340a 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -679,7 +679,7 @@ public class FolderPagedView extends PagedView { } @Override - protected void getEdgeVerticalPostion(int[] pos) { + protected void getEdgeVerticalPosition(int[] pos) { pos[0] = 0; pos[1] = getViewportHeight(); } diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index 7ad1e3a430..a7d4c63a19 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -44,7 +44,7 @@ public class DragPreviewProvider { // The padding added to the drag view during the preview generation. public final int previewPadding; - public Bitmap gerenatedDragOutline; + public Bitmap generatedDragOutline; public DragPreviewProvider(View view) { mView = view; @@ -120,11 +120,11 @@ public class DragPreviewProvider { } public final void generateDragOutline(Canvas canvas) { - if (ProviderConfig.IS_DOGFOOD_BUILD && gerenatedDragOutline != null) { + if (ProviderConfig.IS_DOGFOOD_BUILD && generatedDragOutline != null) { throw new RuntimeException("Drag outline generated twice"); } - gerenatedDragOutline = createDragOutline(canvas); + generatedDragOutline = createDragOutline(canvas); } /** diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index f90b2d72e3..14109172b2 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -186,16 +186,16 @@ public class IconNormalizer { } /** - * Modifies {@param xCordinates} to represent a convex border. Fills in all missing values + * Modifies {@param xCoordinates} to represent a convex border. Fills in all missing values * (except on either ends) with appropriate values. - * @param xCordinates map of x coordinate per y. + * @param xCoordinates map of x coordinate per y. * @param direction 1 for left border and -1 for right border. * @param topY the first Y position (inclusive) with a valid value. * @param bottomY the last Y position (inclusive) with a valid value. */ private static void convertToConvexArray( - float[] xCordinates, int direction, int topY, int bottomY) { - int total = xCordinates.length; + float[] xCoordinates, int direction, int topY, int bottomY) { + int total = xCoordinates.length; // The tangent at each pixel. float[] angles = new float[total - 1]; @@ -205,7 +205,7 @@ public class IconNormalizer { float lastAngle = Float.MAX_VALUE; for (int i = topY + 1; i <= bottomY; i++) { - if (xCordinates[i] <= -1) { + if (xCoordinates[i] <= -1) { continue; } int start; @@ -213,14 +213,14 @@ public class IconNormalizer { if (lastAngle == Float.MAX_VALUE) { start = first; } else { - float currentAngle = (xCordinates[i] - xCordinates[last]) / (i - last); + float currentAngle = (xCoordinates[i] - xCoordinates[last]) / (i - last); start = last; // If this position creates a concave angle, keep moving up until we find a // position which creates a convex angle. if ((currentAngle - lastAngle) * direction < 0) { while (start > first) { start --; - currentAngle = (xCordinates[i] - xCordinates[start]) / (i - start); + currentAngle = (xCoordinates[i] - xCoordinates[start]) / (i - start); if ((currentAngle - angles[start]) * direction >= 0) { break; } @@ -229,11 +229,11 @@ public class IconNormalizer { } // Reset from last check - lastAngle = (xCordinates[i] - xCordinates[start]) / (i - start); + lastAngle = (xCoordinates[i] - xCoordinates[start]) / (i - start); // Update all the points from start. for (int j = start; j < i; j++) { angles[j] = lastAngle; - xCordinates[j] = xCordinates[start] + lastAngle * (j - start); + xCoordinates[j] = xCoordinates[start] + lastAngle * (j - start); } last = i; } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 2ad8847731..8c702bf7c2 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -37,7 +37,7 @@ import java.util.Locale; /** * Manages the creation of {@link LauncherEvent}. - * To debug this class, execute following command before sideloading a new apk. + * To debug this class, execute following command before side loading a new apk. * * $ adb shell setprop log.tag.UserEvent VERBOSE */ diff --git a/src/com/android/launcher3/provider/LauncherDbUtils.java b/src/com/android/launcher3/provider/LauncherDbUtils.java index faa5fad12b..2f8241907f 100644 --- a/src/com/android/launcher3/provider/LauncherDbUtils.java +++ b/src/com/android/launcher3/provider/LauncherDbUtils.java @@ -56,7 +56,7 @@ public class LauncherDbUtils { if (screenIds.get(0) != 0) { // First screen is not 0, we need to rename screens if (screenIds.indexOf(0L) > -1) { - // There is already a screen 0. First rename it to a differen screen. + // There is already a screen 0. First rename it to a different screen. long newScreenId = 1; while (screenIds.indexOf(newScreenId) > -1) newScreenId++; renameScreen(db, 0, newScreenId); diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 8b72258218..07c8e386ef 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -139,7 +139,7 @@ public class WidgetsContainerView extends BaseContainerView @Override public boolean onLongClick(View v) { if (LOGD) { - Log.d(TAG, String.format("onLonglick [v=%s]", v)); + Log.d(TAG, String.format("onLongClick [v=%s]", v)); } // Return early if this is not initiated from a touch if (!v.isInTouchMode()) return false; From df7ef68bbf36f8bbf015ace74fce0e00142b2e23 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 6 Oct 2016 17:52:22 -0700 Subject: [PATCH 056/382] Refactors in UserEventDispatcher - LaunchSource -> LogContainer Change-Id: I71bfee992fb1ba7ae80e824d419f7bf8d3020999 --- src/com/android/launcher3/DragSource.java | 4 +-- src/com/android/launcher3/Hotseat.java | 4 +-- src/com/android/launcher3/Workspace.java | 2 +- .../allapps/AllAppsContainerView.java | 2 +- .../dragndrop/AnotherWindowDragSource.java | 2 +- src/com/android/launcher3/folder/Folder.java | 2 +- .../logging/UserEventDispatcher.java | 30 ++++++++----------- .../shortcuts/DeepShortcutsContainer.java | 2 +- .../widget/WidgetsContainerView.java | 2 +- 9 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/com/android/launcher3/DragSource.java b/src/com/android/launcher3/DragSource.java index efbb9d7b6f..2fb495fddc 100644 --- a/src/com/android/launcher3/DragSource.java +++ b/src/com/android/launcher3/DragSource.java @@ -19,12 +19,12 @@ package com.android.launcher3; import android.view.View; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.logging.UserEventDispatcher.LaunchSourceProvider; +import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; /** * Interface defining an object that can originate a drag. */ -public interface DragSource extends LaunchSourceProvider { +public interface DragSource extends LogContainerProvider { /** * @return whether items dragged from this source supports diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index f9424d4837..11d6b503b1 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -42,7 +42,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; public class Hotseat extends FrameLayout - implements UserEventDispatcher.LaunchSourceProvider { + implements UserEventDispatcher.LogContainerProvider { private CellLayout mContent; @@ -172,7 +172,7 @@ public class Hotseat extends FrameLayout } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; targetParent.containerType = LauncherLogProto.HOTSEAT; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index d2524601c7..e583be483c 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -4256,7 +4256,7 @@ public class Workspace extends PagedView } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; target.pageIndex = getCurrentPage(); diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 77e8ad17d2..cdd2f1d0ca 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -586,7 +586,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { targetParent.containerType = mAppsRecyclerView.getContainerType(v); } diff --git a/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java b/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java index 156941a29c..e968f36a72 100644 --- a/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java +++ b/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java @@ -70,7 +70,7 @@ public class AnotherWindowDragSource implements DragSource { } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { // TODO: Probably log something } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index b85d97382a..7030b660fe 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -1430,7 +1430,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; target.pageIndex = mContent.getCurrentPage(); diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 8c702bf7c2..441d8e5f5f 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -48,13 +48,9 @@ public class UserEventDispatcher { private final boolean mIsVerbose; /** - * TODO: change the name of this interface to LogContainerProvider - * and the method name to fillInLogContainerData. Not changed to minimize CL diff - * in this branch. - * - * Implemented by containers to provide a launch source for a given child. + * Implemented by containers to provide a container source for a given child. */ - public interface LaunchSourceProvider { + public interface LogContainerProvider { /** * Copies data from the source to the destination proto. @@ -64,13 +60,13 @@ public class UserEventDispatcher { * @param target dest of the data * @param targetParent dest of the data */ - void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent); + void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent); } /** * Recursively finds the parent of the given child which implements IconLogInfoProvider */ - public static LaunchSourceProvider getLaunchProviderRecursive(View v) { + public static LogContainerProvider getLaunchProviderRecursive(View v) { ViewParent parent = null; if (v != null) { @@ -82,8 +78,8 @@ public class UserEventDispatcher { // Optimization to only check up to 5 parents. int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; while (parent != null && count-- > 0) { - if (parent instanceof LaunchSourceProvider) { - return (LaunchSourceProvider) parent; + if (parent instanceof LogContainerProvider) { + return (LogContainerProvider) parent; } else { parent = parent.getParent(); } @@ -123,12 +119,12 @@ public class UserEventDispatcher { // Fill in grid(x,y), pageIndex of the child and container type of the parent // TODO: make this percolate up the view hierarchy if needed. int idx = 0; - LaunchSourceProvider provider = getLaunchProviderRecursive(v); + LogContainerProvider provider = getLaunchProviderRecursive(v); if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { return null; } ItemInfo itemInfo = (ItemInfo) v.getTag(); - provider.fillInLaunchSourceData(v, itemInfo, event.srcTarget[idx], event.srcTarget[idx + 1]); + provider.fillInLogContainerData(v, itemInfo, event.srcTarget[idx], event.srcTarget[idx + 1]); event.srcTarget[idx].intentHash = intent.hashCode(); ComponentName cn = intent.getComponent(); @@ -181,12 +177,12 @@ public class UserEventDispatcher { public void logDeepShortcutsOpen(View icon) { LauncherEvent event = LoggerUtils.initLauncherEvent( Action.TOUCH, icon, Target.CONTAINER); - LaunchSourceProvider provider = getLaunchProviderRecursive(icon); + LogContainerProvider provider = getLaunchProviderRecursive(icon); if (icon == null && !(icon.getTag() instanceof ItemInfo)) { return; } ItemInfo info = (ItemInfo) icon.getTag(); - provider.fillInLaunchSourceData(icon, info, event.srcTarget[0], event.srcTarget[1]); + provider.fillInLogContainerData(icon, info, event.srcTarget[0], event.srcTarget[1]); event.action.touch = Action.LONGPRESS; dispatchUserEvent(event, null); @@ -205,11 +201,11 @@ public class UserEventDispatcher { dropTargetAsView); event.action.touch = Action.DRAGDROP; - dragObj.dragSource.fillInLaunchSourceData(null, dragObj.originalDragInfo, + dragObj.dragSource.fillInLogContainerData(null, dragObj.originalDragInfo, event.srcTarget[0], event.srcTarget[1]); - if (dropTargetAsView instanceof LaunchSourceProvider) { - ((LaunchSourceProvider) dropTargetAsView).fillInLaunchSourceData(null, + if (dropTargetAsView instanceof LogContainerProvider) { + ((LogContainerProvider) dropTargetAsView).fillInLogContainerData(null, dragObj.dragInfo, event.destTarget[0], event.destTarget[1]); } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 31f382370e..9f9a99eb12 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -506,7 +506,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.itemType = LauncherLogProto.DEEPSHORTCUT; // TODO: add target.rank targetParent.containerType = LauncherLogProto.DEEPSHORTCUTS; diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 07c8e386ef..ecc853d905 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -338,7 +338,7 @@ public class WidgetsContainerView extends BaseContainerView } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { targetParent.containerType = LauncherLogProto.WIDGETS; } } \ No newline at end of file From fc744144ef3dbffb9d432a7443017c97fd30a096 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 7 Oct 2016 11:46:07 -0700 Subject: [PATCH 057/382] Using common method for updating icons in cache Change-Id: Ide1979d02387ffcb8839174ab9fdfa9e5b6e1d47 --- src/com/android/launcher3/IconCache.java | 63 +++++++++++------------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 41f612c706..661f99b9e4 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -224,7 +224,7 @@ public class IconCache { PackageManager.GET_UNINSTALLED_PACKAGES); long userSerial = mUserManager.getSerialNumberForUser(user); for (LauncherActivityInfoCompat app : mLauncherApps.getActivityList(packageName, user)) { - addIconToDBAndMemCache(app, info, userSerial); + addIconToDBAndMemCache(app, info, userSerial, false /*replace existing*/); } } catch (NameNotFoundException e) { Log.d(TAG, "Package not found", e); @@ -354,29 +354,14 @@ public class IconCache { } } - @Thunk void addIconToDBAndMemCache(LauncherActivityInfoCompat app, PackageInfo info, - long userSerial) { - // Reuse the existing entry if it already exists in the DB. This ensures that we do not - // create bitmap if it was already created during loader. - ContentValues values = updateCacheAndGetContentValues(app, false); - addIconToDB(values, app.getComponentName(), info, userSerial); - } - /** - * Updates {@param values} to contain versioning information and adds it to the DB. - * @param values {@link ContentValues} containing icon & title + * Adds an entry into the DB and the in-memory cache. + * @param replaceExisting if true, it will recreate the bitmap even if it already exists in + * the memory. This is useful then the previous bitmap was created using + * old data. */ - private void addIconToDB(ContentValues values, ComponentName key, - PackageInfo info, long userSerial) { - values.put(IconDB.COLUMN_COMPONENT, key.flattenToString()); - values.put(IconDB.COLUMN_USER, userSerial); - values.put(IconDB.COLUMN_LAST_UPDATED, info.lastUpdateTime); - values.put(IconDB.COLUMN_VERSION, info.versionCode); - mIconDb.insertOrReplace(values); - } - - @Thunk ContentValues updateCacheAndGetContentValues(LauncherActivityInfoCompat app, - boolean replaceExisting) { + @Thunk synchronized void addIconToDBAndMemCache(LauncherActivityInfoCompat app, + PackageInfo info, long userSerial, boolean replaceExisting) { final ComponentKey key = new ComponentKey(app.getComponentName(), app.getUser()); CacheEntry entry = null; if (!replaceExisting) { @@ -394,11 +379,25 @@ public class IconCache { } entry.title = app.getLabel(); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, app.getUser()); - mCache.put(new ComponentKey(app.getComponentName(), app.getUser()), entry); + mCache.put(key, entry); Bitmap lowResIcon = generateLowResIcon(entry.icon, mActivityBgColor); - return newContentValues(entry.icon, lowResIcon, entry.title.toString(), + ContentValues values = newContentValues(entry.icon, lowResIcon, entry.title.toString(), app.getApplicationInfo().packageName); + addIconToDB(values, app.getComponentName(), info, userSerial); + } + + /** + * Updates {@param values} to contain versioning information and adds it to the DB. + * @param values {@link ContentValues} containing icon & title + */ + private void addIconToDB(ContentValues values, ComponentName key, + PackageInfo info, long userSerial) { + values.put(IconDB.COLUMN_COMPONENT, key.flattenToString()); + values.put(IconDB.COLUMN_USER, userSerial); + values.put(IconDB.COLUMN_LAST_UPDATED, info.lastUpdateTime); + values.put(IconDB.COLUMN_VERSION, info.versionCode); + mIconDb.insertOrReplace(values); } /** @@ -775,13 +774,9 @@ public class IconCache { LauncherActivityInfoCompat app = mAppsToUpdate.pop(); String pkg = app.getComponentName().getPackageName(); PackageInfo info = mPkgInfoMap.get(pkg); - if (info != null) { - synchronized (IconCache.this) { - ContentValues values = updateCacheAndGetContentValues(app, true); - addIconToDB(values, app.getComponentName(), info, mUserSerial); - } - mUpdatedPackages.add(pkg); - } + addIconToDBAndMemCache(app, info, mUserSerial, true /*replace existing*/); + mUpdatedPackages.add(pkg); + if (mAppsToUpdate.isEmpty() && !mUpdatedPackages.isEmpty()) { // No more app to update. Notify model. LauncherAppState.getInstance().getModel().onPackageIconsUpdated( @@ -793,10 +788,10 @@ public class IconCache { } else if (!mAppsToAdd.isEmpty()) { LauncherActivityInfoCompat app = mAppsToAdd.pop(); PackageInfo info = mPkgInfoMap.get(app.getComponentName().getPackageName()); + // We do not check the mPkgInfoMap when generating the mAppsToAdd. Although every + // app should have package info, this is not guaranteed by the api if (info != null) { - synchronized (IconCache.this) { - addIconToDBAndMemCache(app, info, mUserSerial); - } + addIconToDBAndMemCache(app, info, mUserSerial, false /*replace existing*/); } if (!mAppsToAdd.isEmpty()) { From 08ca40f97670ad56ea01a81a439e89a484f9fdb5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 13 Sep 2016 21:07:31 -0700 Subject: [PATCH 058/382] Refactoring AppWidgetResizeFrame > Defining the layout in xml > Simplifying the touch handling calculations Change-Id: Iccfd82161d1e678d77ad6ff63f76e04ad905f9d8 --- res/layout/app_widget_resize_frame.xml | 57 +++ .../launcher3/AppWidgetResizeFrame.java | 382 +++++++++--------- .../launcher3/dragndrop/DragLayer.java | 11 +- 3 files changed, 246 insertions(+), 204 deletions(-) create mode 100644 res/layout/app_widget_resize_frame.xml diff --git a/res/layout/app_widget_resize_frame.xml b/res/layout/app_widget_resize_frame.xml new file mode 100644 index 0000000000..91a1e45a08 --- /dev/null +++ b/res/layout/app_widget_resize_frame.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index f0ec50343a..d00d5dda29 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -1,7 +1,5 @@ package com.android.launcher3; -import com.android.launcher3.dragndrop.DragLayer; - import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; @@ -13,14 +11,14 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; -import android.view.Gravity; +import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; -import android.widget.ImageView; import com.android.launcher3.accessibility.DragViewStateAnnouncer; +import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.util.FocusLogic; import com.android.launcher3.util.TouchController; @@ -35,17 +33,22 @@ public class AppWidgetResizeFrame extends FrameLayout // Represents the cell size on the grid in the two orientations. private static Point[] sCellSize; + private static final int HANDLE_COUNT = 4; + private static final int INDEX_LEFT = 0; + private static final int INDEX_TOP = 1; + private static final int INDEX_RIGHT = 2; + private static final int INDEX_BOTTOM = 3; + private final Launcher mLauncher; - private final LauncherAppWidgetHostView mWidgetView; - private final CellLayout mCellLayout; - private final DragLayer mDragLayer; + private final DragViewStateAnnouncer mStateAnnouncer; - private final ImageView mLeftHandle; - private final ImageView mRightHandle; - private final ImageView mTopHandle; - private final ImageView mBottomHandle; + private final View[] mDragHandles = new View[HANDLE_COUNT]; - private final Rect mWidgetPadding; + private LauncherAppWidgetHostView mWidgetView; + private CellLayout mCellLayout; + private DragLayer mDragLayer; + + private Rect mWidgetPadding; private final int mBackgroundPadding; private final int mTouchTargetWidth; @@ -54,17 +57,20 @@ public class AppWidgetResizeFrame extends FrameLayout private final int[] mLastDirectionVector = new int[2]; private final int[] mTmpPt = new int[2]; - private final DragViewStateAnnouncer mStateAnnouncer; + private final IntRange mTempRange1 = new IntRange(); + private final IntRange mTempRange2 = new IntRange(); + + private final IntRange mDeltaXRange = new IntRange(); + private final IntRange mBaselineX = new IntRange(); + + private final IntRange mDeltaYRange = new IntRange(); + private final IntRange mBaselineY = new IntRange(); private boolean mLeftBorderActive; private boolean mRightBorderActive; private boolean mTopBorderActive; private boolean mBottomBorderActive; - private int mBaselineWidth; - private int mBaselineHeight; - private int mBaselineX; - private int mBaselineY; private int mResizeMode; private int mRunningHInc; @@ -81,11 +87,36 @@ public class AppWidgetResizeFrame extends FrameLayout private int mXDown, mYDown; - public AppWidgetResizeFrame(Context context, - LauncherAppWidgetHostView widgetView, CellLayout cellLayout, DragLayer dragLayer) { + public AppWidgetResizeFrame(Context context) { + this(context, null); + } - super(context); - mLauncher = (Launcher) context; + public AppWidgetResizeFrame(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AppWidgetResizeFrame(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + mLauncher = Launcher.getLauncher(context); + mStateAnnouncer = DragViewStateAnnouncer.createFor(this); + + mBackgroundPadding = getResources() + .getDimensionPixelSize(R.dimen.resize_frame_background_padding); + mTouchTargetWidth = 2 * mBackgroundPadding; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + for (int i = 0; i < HANDLE_COUNT; i ++) { + mDragHandles[i] = getChildAt(i); + } + } + + public void setupForWidget(LauncherAppWidgetHostView widgetView, CellLayout cellLayout, + DragLayer dragLayer) { mCellLayout = cellLayout; mWidgetView = widgetView; LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo) @@ -96,63 +127,23 @@ public class AppWidgetResizeFrame extends FrameLayout mMinHSpan = info.minSpanX; mMinVSpan = info.minSpanY; - mStateAnnouncer = DragViewStateAnnouncer.createFor(this); - - setBackgroundResource(R.drawable.widget_resize_shadow); - setForeground(getResources().getDrawable(R.drawable.widget_resize_frame)); - setPadding(0, 0, 0, 0); - - final int handleMargin = getResources().getDimensionPixelSize(R.dimen.widget_handle_margin); - LayoutParams lp; - mLeftHandle = new ImageView(context); - mLeftHandle.setImageResource(R.drawable.ic_widget_resize_handle); - lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, - Gravity.LEFT | Gravity.CENTER_VERTICAL); - lp.leftMargin = handleMargin; - addView(mLeftHandle, lp); - - mRightHandle = new ImageView(context); - mRightHandle.setImageResource(R.drawable.ic_widget_resize_handle); - lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, - Gravity.RIGHT | Gravity.CENTER_VERTICAL); - lp.rightMargin = handleMargin; - addView(mRightHandle, lp); - - mTopHandle = new ImageView(context); - mTopHandle.setImageResource(R.drawable.ic_widget_resize_handle); - lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, - Gravity.CENTER_HORIZONTAL | Gravity.TOP); - lp.topMargin = handleMargin; - addView(mTopHandle, lp); - - mBottomHandle = new ImageView(context); - mBottomHandle.setImageResource(R.drawable.ic_widget_resize_handle); - lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, - Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); - lp.bottomMargin = handleMargin; - addView(mBottomHandle, lp); - if (!info.isCustomWidget) { - mWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, + mWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(getContext(), widgetView.getAppWidgetInfo().provider, null); } else { - Resources r = context.getResources(); + Resources r = getContext().getResources(); int padding = r.getDimensionPixelSize(R.dimen.default_widget_padding); mWidgetPadding = new Rect(padding, padding, padding, padding); } if (mResizeMode == AppWidgetProviderInfo.RESIZE_HORIZONTAL) { - mTopHandle.setVisibility(GONE); - mBottomHandle.setVisibility(GONE); + mDragHandles[INDEX_TOP].setVisibility(GONE); + mDragHandles[INDEX_BOTTOM].setVisibility(GONE); } else if (mResizeMode == AppWidgetProviderInfo.RESIZE_VERTICAL) { - mLeftHandle.setVisibility(GONE); - mRightHandle.setVisibility(GONE); + mDragHandles[INDEX_LEFT].setVisibility(GONE); + mDragHandles[INDEX_RIGHT].setVisibility(GONE); } - mBackgroundPadding = getResources() - .getDimensionPixelSize(R.dimen.resize_frame_background_padding); - mTouchTargetWidth = 2 * mBackgroundPadding; - // When we create the resize frame, we first mark all cells as unoccupied. The appropriate // cells (same if not resized, or different) will be marked as occupied when the resize // frame is dismissed. @@ -174,101 +165,74 @@ public class AppWidgetResizeFrame extends FrameLayout boolean anyBordersActive = mLeftBorderActive || mRightBorderActive || mTopBorderActive || mBottomBorderActive; - mBaselineWidth = getMeasuredWidth(); - mBaselineHeight = getMeasuredHeight(); - mBaselineX = getLeft(); - mBaselineY = getTop(); - if (anyBordersActive) { - mLeftHandle.setAlpha(mLeftBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); - mRightHandle.setAlpha(mRightBorderActive ? 1.0f :DIMMED_HANDLE_ALPHA); - mTopHandle.setAlpha(mTopBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); - mBottomHandle.setAlpha(mBottomBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); + mDragHandles[INDEX_LEFT].setAlpha(mLeftBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); + mDragHandles[INDEX_RIGHT].setAlpha(mRightBorderActive ? 1.0f :DIMMED_HANDLE_ALPHA); + mDragHandles[INDEX_TOP].setAlpha(mTopBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); + mDragHandles[INDEX_BOTTOM].setAlpha(mBottomBorderActive ? 1.0f : DIMMED_HANDLE_ALPHA); } + + if (mLeftBorderActive) { + mDeltaXRange.set(-getLeft(), getWidth() - 2 * mTouchTargetWidth); + } else if (mRightBorderActive) { + mDeltaXRange.set(2 * mTouchTargetWidth - getWidth(), mDragLayer.getWidth() - getRight()); + } else { + mDeltaXRange.set(0, 0); + } + mBaselineX.set(getLeft(), getRight()); + + if (mTopBorderActive) { + mDeltaYRange.set(-getTop(), getHeight() - 2 * mTouchTargetWidth); + } else if (mBottomBorderActive) { + mDeltaYRange.set(2 * mTouchTargetWidth - getHeight(), mDragLayer.getHeight() - getBottom()); + } else { + mDeltaYRange.set(0, 0); + } + mBaselineY.set(getTop(), getBottom()); + return anyBordersActive; } /** - * Here we bound the deltas such that the frame cannot be stretched beyond the extents - * of the CellLayout, and such that the frame's borders can't cross. + * Based on the deltas, we resize the frame. */ - public void updateDeltas(int deltaX, int deltaY) { - if (mLeftBorderActive) { - mDeltaX = Math.max(-mBaselineX, deltaX); - mDeltaX = Math.min(mBaselineWidth - 2 * mTouchTargetWidth, mDeltaX); - } else if (mRightBorderActive) { - mDeltaX = Math.min(mDragLayer.getWidth() - (mBaselineX + mBaselineWidth), deltaX); - mDeltaX = Math.max(-mBaselineWidth + 2 * mTouchTargetWidth, mDeltaX); - } + public void visualizeResizeForDelta(int deltaX, int deltaY) { + mDeltaX = mDeltaXRange.clamp(deltaX); + mDeltaY = mDeltaYRange.clamp(deltaY); - if (mTopBorderActive) { - mDeltaY = Math.max(-mBaselineY, deltaY); - mDeltaY = Math.min(mBaselineHeight - 2 * mTouchTargetWidth, mDeltaY); - } else if (mBottomBorderActive) { - mDeltaY = Math.min(mDragLayer.getHeight() - (mBaselineY + mBaselineHeight), deltaY); - mDeltaY = Math.max(-mBaselineHeight + 2 * mTouchTargetWidth, mDeltaY); - } - } - - private void visualizeResizeForDelta(int deltaX, int deltaY) { - visualizeResizeForDelta(deltaX, deltaY, false); - } - - /** - * Based on the deltas, we resize the frame, and, if needed, we resize the widget. - */ - private void visualizeResizeForDelta(int deltaX, int deltaY, boolean onDismiss) { - updateDeltas(deltaX, deltaY); DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); + mDeltaX = mDeltaXRange.clamp(deltaX); + mBaselineX.applyDelta(mLeftBorderActive, mRightBorderActive, mDeltaX, mTempRange1); + lp.x = mTempRange1.start; + lp.width = mTempRange1.size(); - if (mLeftBorderActive) { - lp.x = mBaselineX + mDeltaX; - lp.width = mBaselineWidth - mDeltaX; - } else if (mRightBorderActive) { - lp.width = mBaselineWidth + mDeltaX; - } + mDeltaY = mDeltaYRange.clamp(deltaY); + mBaselineY.applyDelta(mTopBorderActive, mBottomBorderActive, mDeltaY, mTempRange1); + lp.y = mTempRange1.start; + lp.height = mTempRange1.size(); - if (mTopBorderActive) { - lp.y = mBaselineY + mDeltaY; - lp.height = mBaselineHeight - mDeltaY; - } else if (mBottomBorderActive) { - lp.height = mBaselineHeight + mDeltaY; - } - - resizeWidgetIfNeeded(onDismiss); + resizeWidgetIfNeeded(false); requestLayout(); } + private static int getSpanIncrement(float deltaFrac) { + return Math.abs(deltaFrac) > RESIZE_THRESHOLD ? Math.round(deltaFrac) : 0; + } + /** * Based on the current deltas, we determine if and how to resize the widget. */ private void resizeWidgetIfNeeded(boolean onDismiss) { - int xThreshold = mCellLayout.getCellWidth() + mCellLayout.getWidthGap(); - int yThreshold = mCellLayout.getCellHeight() + mCellLayout.getHeightGap(); + float xThreshold = mCellLayout.getCellWidth() + mCellLayout.getWidthGap(); + float yThreshold = mCellLayout.getCellHeight() + mCellLayout.getHeightGap(); - int deltaX = mDeltaX + mDeltaXAddOn; - int deltaY = mDeltaY + mDeltaYAddOn; - - float hSpanIncF = 1.0f * deltaX / xThreshold - mRunningHInc; - float vSpanIncF = 1.0f * deltaY / yThreshold - mRunningVInc; - - int hSpanInc = 0; - int vSpanInc = 0; - int cellXInc = 0; - int cellYInc = 0; - - int countX = mCellLayout.getCountX(); - int countY = mCellLayout.getCountY(); - - if (Math.abs(hSpanIncF) > RESIZE_THRESHOLD) { - hSpanInc = Math.round(hSpanIncF); - } - if (Math.abs(vSpanIncF) > RESIZE_THRESHOLD) { - vSpanInc = Math.round(vSpanIncF); - } + int hSpanInc = getSpanIncrement((mDeltaX + mDeltaXAddOn) / xThreshold - mRunningHInc); + int vSpanInc = getSpanIncrement((mDeltaY + mDeltaYAddOn) / yThreshold - mRunningVInc); if (!onDismiss && (hSpanInc == 0 && vSpanInc == 0)) return; + mDirectionVector[0] = 0; + mDirectionVector[1] = 0; CellLayout.LayoutParams lp = (CellLayout.LayoutParams) mWidgetView.getLayoutParams(); @@ -277,55 +241,24 @@ public class AppWidgetResizeFrame extends FrameLayout int cellX = lp.useTmpCoords ? lp.tmpCellX : lp.cellX; int cellY = lp.useTmpCoords ? lp.tmpCellY : lp.cellY; - int hSpanDelta = 0; - int vSpanDelta = 0; - // For each border, we bound the resizing based on the minimum width, and the maximum // expandability. - if (mLeftBorderActive) { - cellXInc = Math.max(-cellX, hSpanInc); - cellXInc = Math.min(lp.cellHSpan - mMinHSpan, cellXInc); - hSpanInc *= -1; - hSpanInc = Math.min(cellX, hSpanInc); - hSpanInc = Math.max(-(lp.cellHSpan - mMinHSpan), hSpanInc); - hSpanDelta = -hSpanInc; - - } else if (mRightBorderActive) { - hSpanInc = Math.min(countX - (cellX + spanX), hSpanInc); - hSpanInc = Math.max(-(lp.cellHSpan - mMinHSpan), hSpanInc); - hSpanDelta = hSpanInc; + mTempRange1.set(cellX, spanX + cellX); + int hSpanDelta = mTempRange1.applyDeltaAndBound(mLeftBorderActive, mRightBorderActive, + hSpanInc, mMinHSpan, mCellLayout.getCountX(), mTempRange2); + cellX = mTempRange2.start; + spanX = mTempRange2.size(); + if (hSpanDelta != 0) { + mDirectionVector[0] = mLeftBorderActive ? -1 : 1; } - if (mTopBorderActive) { - cellYInc = Math.max(-cellY, vSpanInc); - cellYInc = Math.min(lp.cellVSpan - mMinVSpan, cellYInc); - vSpanInc *= -1; - vSpanInc = Math.min(cellY, vSpanInc); - vSpanInc = Math.max(-(lp.cellVSpan - mMinVSpan), vSpanInc); - vSpanDelta = -vSpanInc; - } else if (mBottomBorderActive) { - vSpanInc = Math.min(countY - (cellY + spanY), vSpanInc); - vSpanInc = Math.max(-(lp.cellVSpan - mMinVSpan), vSpanInc); - vSpanDelta = vSpanInc; - } - - mDirectionVector[0] = 0; - mDirectionVector[1] = 0; - // Update the widget's dimensions and position according to the deltas computed above - if (mLeftBorderActive || mRightBorderActive) { - spanX += hSpanInc; - cellX += cellXInc; - if (hSpanDelta != 0) { - mDirectionVector[0] = mLeftBorderActive ? -1 : 1; - } - } - - if (mTopBorderActive || mBottomBorderActive) { - spanY += vSpanInc; - cellY += cellYInc; - if (vSpanDelta != 0) { - mDirectionVector[1] = mTopBorderActive ? -1 : 1; - } + mTempRange1.set(cellY, spanY + cellY); + int vSpanDelta = mTempRange1.applyDeltaAndBound(mTopBorderActive, mBottomBorderActive, + vSpanInc, mMinVSpan, mCellLayout.getCountY(), mTempRange2); + cellY = mTempRange2.start; + spanY = mTempRange2.size(); + if (vSpanDelta != 0) { + mDirectionVector[1] = mTopBorderActive ? -1 : 1; } if (!onDismiss && vSpanDelta == 0 && hSpanDelta == 0) return; @@ -455,10 +388,9 @@ public class AppWidgetResizeFrame extends FrameLayout lp.height = newHeight; lp.x = newX; lp.y = newY; - mLeftHandle.setAlpha(1.0f); - mRightHandle.setAlpha(1.0f); - mTopHandle.setAlpha(1.0f); - mBottomHandle.setAlpha(1.0f); + for (int i = 0; i < HANDLE_COUNT; i++) { + mDragHandles[i].setAlpha(1.0f); + } requestLayout(); } else { PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", lp.width, newWidth); @@ -468,22 +400,15 @@ public class AppWidgetResizeFrame extends FrameLayout PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", lp.y, newY); ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(lp, this, width, height, x, y); - ObjectAnimator leftOa = LauncherAnimUtils.ofFloat(mLeftHandle, ALPHA, 1.0f); - ObjectAnimator rightOa = LauncherAnimUtils.ofFloat(mRightHandle, ALPHA, 1.0f); - ObjectAnimator topOa = LauncherAnimUtils.ofFloat(mTopHandle, ALPHA, 1.0f); - ObjectAnimator bottomOa = LauncherAnimUtils.ofFloat(mBottomHandle, ALPHA, 1.0f); oa.addUpdateListener(new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { requestLayout(); } }); AnimatorSet set = LauncherAnimUtils.createAnimatorSet(); - if (mResizeMode == AppWidgetProviderInfo.RESIZE_VERTICAL) { - set.playTogether(oa, topOa, bottomOa); - } else if (mResizeMode == AppWidgetProviderInfo.RESIZE_HORIZONTAL) { - set.playTogether(oa, leftOa, rightOa); - } else { - set.playTogether(oa, leftOa, rightOa, topOa, bottomOa); + set.play(oa); + for (int i = 0; i < HANDLE_COUNT; i++) { + set.play(LauncherAnimUtils.ofFloat(mDragHandles[i], ALPHA, 1.0f)); } set.setDuration(SNAP_DURATION); @@ -550,4 +475,63 @@ public class AppWidgetResizeFrame extends FrameLayout } return false; } + + /** + * A mutable class for describing the range of two int values. + */ + private static class IntRange { + + public int start, end; + + public int clamp(int value) { + return Utilities.boundToRange(value, start, end); + } + + public void set(int s, int e) { + start = s; + end = e; + } + + public int size() { + return end - start; + } + + /** + * Moves either the start or end edge (but never both) by {@param delta} and sets the + * result in {@param out} + */ + public void applyDelta(boolean moveStart, boolean moveEnd, int delta, IntRange out) { + out.start = moveStart ? start + delta : start; + out.end = moveEnd ? end + delta : end; + } + + /** + * Applies delta similar to {@link #applyDelta(boolean, boolean, int, IntRange)}, + * with extra conditions. + * @param minSize minimum size after with the moving edge should not be shifted any further. + * For eg, if delta = -3 when moving the endEdge brings the size to less than + * minSize, only delta = -2 will applied + * @param maxEnd The maximum value to the end edge (start edge is always restricted to 0) + * @return the amount of increase when endEdge was moves and the amount of decrease when + * the start edge was moved. + */ + public int applyDeltaAndBound(boolean moveStart, boolean moveEnd, int delta, + int minSize, int maxEnd, IntRange out) { + applyDelta(moveStart, moveEnd, delta, out); + if (start < 0) { + out.start = 0; + } + if (end > maxEnd) { + out.end = maxEnd; + } + if (out.size() < minSize) { + if (moveStart) { + out.start = out.end - minSize; + } else if (moveEnd) { + out.end = out.start + minSize; + } + } + return moveEnd ? out.size() - size() : size() - out.size(); + } + } } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index ef9c9652d4..1bbbd46157 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -38,6 +38,7 @@ import android.os.Build; import android.util.AttributeSet; import android.view.DragEvent; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -621,12 +622,12 @@ public class DragLayer extends InsettableFrameLayout { public void addResizeFrame(LauncherAppWidgetHostView widget, CellLayout cellLayout) { clearResizeFrame(); - mCurrentResizeFrame = new AppWidgetResizeFrame(getContext(), widget, cellLayout, this); + mCurrentResizeFrame = (AppWidgetResizeFrame) LayoutInflater.from(mLauncher) + .inflate(R.layout.app_widget_resize_frame, this, false); + mCurrentResizeFrame.setupForWidget(widget, cellLayout, this); + ((LayoutParams) mCurrentResizeFrame.getLayoutParams()).customPosition = true; - LayoutParams lp = new LayoutParams(-1, -1); - lp.customPosition = true; - - addView(mCurrentResizeFrame, lp); + addView(mCurrentResizeFrame); mCurrentResizeFrame.snapToWidget(false); } From 740ac7f00e0b847b8e392800f7948d93493e11d6 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 28 Sep 2016 16:47:32 -0700 Subject: [PATCH 059/382] Refactoring floating view opening/closing logic > Creating a base view for floating panels with some common methods > Moving the getOpen method to individual classes > Moving the folder icon animation logic to folder icon > Moving all the logic related for opening folder to Folder class Change-Id: I898dfb6870b857cb921d2729b89618bc43ff2e88 --- res/values/config.xml | 3 + .../launcher3/AbstractFloatingView.java | 124 ++++++++ .../android/launcher3/ExtendedEditText.java | 8 + src/com/android/launcher3/FolderInfo.java | 5 - src/com/android/launcher3/Launcher.java | 290 ++---------------- .../launcher3/PinchToOverviewListener.java | 2 +- src/com/android/launcher3/Workspace.java | 24 +- .../LauncherAccessibilityDelegate.java | 12 +- .../ShortcutMenuAccessibilityDelegate.java | 3 +- .../allapps/AllAppsContainerView.java | 3 +- .../launcher3/dragndrop/DragLayer.java | 66 ++-- src/com/android/launcher3/folder/Folder.java | 245 ++++++++------- .../android/launcher3/folder/FolderIcon.java | 88 +++++- .../launcher3/folder/PreviewImageView.java | 98 ++++++ .../keyboard/CustomActionsPopup.java | 2 +- .../shortcuts/DeepShortcutsContainer.java | 42 ++- 16 files changed, 532 insertions(+), 483 deletions(-) create mode 100644 src/com/android/launcher3/AbstractFloatingView.java create mode 100644 src/com/android/launcher3/folder/PreviewImageView.java diff --git a/res/values/config.xml b/res/values/config.xml index a942f02111..5b3ee46335 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -91,6 +91,9 @@ + + + 220 80 diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java new file mode 100644 index 0000000000..65da00211d --- /dev/null +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2016 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.launcher3; + +import android.content.Context; +import android.support.annotation.IntDef; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; + +import com.android.launcher3.dragndrop.DragLayer; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Base class for a View which shows a floating UI on top of the launcher UI. + */ +public abstract class AbstractFloatingView extends LinearLayout { + + @IntDef(flag = true, value = {TYPE_FOLDER, TYPE_DEEPSHORTCUT_CONTAINER}) + @Retention(RetentionPolicy.SOURCE) + public @interface FloatingViewType {} + public static final int TYPE_FOLDER = 1 << 0; + public static final int TYPE_DEEPSHORTCUT_CONTAINER = 1 << 1; + + protected boolean mIsOpen; + + public AbstractFloatingView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AbstractFloatingView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public final void close(boolean animate) { + animate &= !Utilities.isPowerSaverOn(getContext()); + handleClose(animate); + Launcher.getLauncher(getContext()).getUserEventDispatcher().resetElapsedContainerMillis(); + } + + protected abstract void handleClose(boolean animate); + + /** + * If the view is current handling keyboard, return the active target, null otherwise + */ + public ExtendedEditText getActiveTextView() { + return null; + } + + + /** + * Any additional view (outside of this container) where touch should be allowed while this + * view is visible. + */ + public View getExtendedTouchView() { + return null; + } + + public final boolean isOpen() { + return mIsOpen; + } + + protected abstract boolean isOfType(@FloatingViewType int type); + + protected static T getOpenView( + Launcher launcher, @FloatingViewType int type) { + DragLayer dragLayer = launcher.getDragLayer(); + // Iterate in reverse order. AbstractFloatingView is added later to the dragLayer, + // and will be one of the last views. + for (int i = dragLayer.getChildCount() - 1; i >= 0; i--) { + View child = dragLayer.getChildAt(i); + if (child instanceof AbstractFloatingView) { + AbstractFloatingView view = (AbstractFloatingView) child; + if (view.isOfType(type) && view.isOpen()) { + return (T) view; + } + } + } + return null; + } + + protected static void closeOpenContainer(Launcher launcher, @FloatingViewType int type) { + AbstractFloatingView view = getOpenView(launcher, type); + if (view != null) { + view.close(true); + } + } + + public static void closeAllOpenViews(Launcher launcher, boolean animate) { + DragLayer dragLayer = launcher.getDragLayer(); + // Iterate in reverse order. AbstractFloatingView is added later to the dragLayer, + // and will be one of the last views. + for (int i = dragLayer.getChildCount() - 1; i >= 0; i--) { + View child = dragLayer.getChildAt(i); + if (child instanceof AbstractFloatingView) { + ((AbstractFloatingView) child).close(animate); + } + } + } + + public static void closeAllOpenViews(Launcher launcher) { + closeAllOpenViews(launcher, true); + } + + public static AbstractFloatingView getTopOpenView(Launcher launcher) { + return getOpenView(launcher, TYPE_FOLDER | TYPE_DEEPSHORTCUT_CONTAINER); + } +} diff --git a/src/com/android/launcher3/ExtendedEditText.java b/src/com/android/launcher3/ExtendedEditText.java index c06f727a56..d05673cccf 100644 --- a/src/com/android/launcher3/ExtendedEditText.java +++ b/src/com/android/launcher3/ExtendedEditText.java @@ -99,4 +99,12 @@ public class ExtendedEditText extends EditText { ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); } + + public void dispatchBackKey() { + ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) + .hideSoftInputFromWindow(getWindowToken(), 0); + if (mBackKeyListener != null) { + mBackKeyListener.onBackKey(); + } + } } diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index c0a8caaa33..8b70d1c708 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -45,11 +45,6 @@ public class FolderInfo extends ItemInfo { */ public static final int FLAG_MULTI_PAGE_ANIMATION = 0x00000004; - /** - * Whether this folder has been opened - */ - public boolean opened; - public int options; /** diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index b1700ccbbc..43a250b3a4 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -18,9 +18,7 @@ package com.android.launcher3; import android.Manifest; import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.annotation.TargetApi; @@ -47,8 +45,6 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.AsyncTask; @@ -79,10 +75,8 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; -import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -295,13 +289,6 @@ public class Launcher extends Activity // it from the context. private SharedPreferences mSharedPrefs; - // Holds the page that we need to animate to, and the icon views that we need to animate up - // when we scroll to that page on resume. - @Thunk ImageView mFolderIconImageView; - private Bitmap mFolderIconBitmap; - private Canvas mFolderIconCanvas; - private Rect mRectForFolderAnimation = new Rect(); - private DeviceProfile mDeviceProfile; private boolean mMoveToDefaultScreenFromNewIntent; @@ -1231,11 +1218,8 @@ public class Launcher extends Activity if (keyCode == KeyEvent.KEYCODE_MENU) { // Ignore the menu key if we are currently dragging or are on the custom content screen if (!isOnCustomContent() && !mDragController.isDragging()) { - // Close any open folders - closeFolder(); - - // Close any shortcuts containers - closeShortcutsContainer(); + // Close any open floating view + AbstractFloatingView.closeAllOpenViews(this); // Stop resizing any widgets mWorkspace.exitWidgetResizeMode(); @@ -1705,7 +1689,7 @@ public class Launcher extends Activity // Check this condition before handling isActionMain, as this will get reset. boolean shouldMoveToDefaultScreen = alreadyOnHome && - mState == State.WORKSPACE && getTopFloatingView() == null; + mState == State.WORKSPACE && AbstractFloatingView.getTopOpenView(this) == null; boolean isActionMain = Intent.ACTION_MAIN.equals(intent.getAction()); if (isActionMain) { @@ -1719,8 +1703,7 @@ public class Launcher extends Activity // In all these cases, only animate if we're already on home mWorkspace.exitWidgetResizeMode(); - closeFolder(alreadyOnHome); - closeShortcutsContainer(alreadyOnHome); + AbstractFloatingView.closeAllOpenViews(this, alreadyOnHome); exitSpringLoadedDragMode(); // If we are already on home, then just animate back to the workspace, @@ -1803,11 +1786,9 @@ public class Launcher extends Activity super.onSaveInstanceState(outState); outState.putInt(RUNTIME_STATE, mState.ordinal()); - // We close any open folder since it will not be re-opened, and we need to make sure - // this state is reflected. - // TODO: Move folderInfo.isOpened out of the model and make it a UI state. - closeFolder(false); - closeShortcutsContainer(false); + // We close any open folders and shortcut containers since they will not be re-opened, + // and we need to make sure this state is reflected. + AbstractFloatingView.closeAllOpenViews(this, false); if (mPendingRequestArgs != null) { outState.putParcelable(RUNTIME_STATE_PENDING_REQUEST_ARGS, mPendingRequestArgs); @@ -2036,7 +2017,7 @@ public class Launcher extends Activity protected void moveToCustomContentScreen(boolean animate) { // Close any folders that may be open. - closeFolder(); + AbstractFloatingView.closeAllOpenViews(this, animate); mWorkspace.moveToCustomContentScreen(animate); } @@ -2227,21 +2208,19 @@ public class Launcher extends Activity return; } - if (getOpenShortcutsContainer() != null) { - closeShortcutsContainer(); + AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(this); + if (topView != null) { + if (topView.getActiveTextView() != null) { + topView.getActiveTextView().dispatchBackKey(); + } else { + topView.close(true); + } } else if (isAppsViewVisible()) { showWorkspace(true); } else if (isWidgetsViewVisible()) { showOverviewMode(true); } else if (mWorkspace.isInOverviewMode()) { showWorkspace(true); - } else if (mWorkspace.getOpenFolder() != null) { - Folder openFolder = mWorkspace.getOpenFolder(); - if (openFolder.isEditingName()) { - openFolder.dismissEditingName(); - } else { - closeFolder(); - } } else { mWorkspace.exitWidgetResizeMode(); @@ -2491,10 +2470,10 @@ public class Launcher extends Activity throw new IllegalArgumentException("Input must be a FolderIcon"); } - FolderIcon folderIcon = (FolderIcon) v; - if (!folderIcon.getFolderInfo().opened && !folderIcon.getFolder().isDestroyed()) { + Folder folder = ((FolderIcon) v).getFolder(); + if (!folder.isOpen() && !folder.isDestroyed()) { // Open the requested folder - openFolder(folderIcon); + folder.animateOpen(); } } @@ -2735,233 +2714,6 @@ public class Launcher extends Activity return false; } - /** - * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView - * in the DragLayer in the exact absolute location of the original FolderIcon. - */ - private void copyFolderIconToImage(FolderIcon fi) { - final int width = fi.getMeasuredWidth(); - final int height = fi.getMeasuredHeight(); - - // Lazy load ImageView, Bitmap and Canvas - if (mFolderIconImageView == null) { - mFolderIconImageView = new ImageView(this); - } - if (mFolderIconBitmap == null || mFolderIconBitmap.getWidth() != width || - mFolderIconBitmap.getHeight() != height) { - mFolderIconBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - mFolderIconCanvas = new Canvas(mFolderIconBitmap); - } - - DragLayer.LayoutParams lp; - if (mFolderIconImageView.getLayoutParams() instanceof DragLayer.LayoutParams) { - lp = (DragLayer.LayoutParams) mFolderIconImageView.getLayoutParams(); - } else { - lp = new DragLayer.LayoutParams(width, height); - } - - // The layout from which the folder is being opened may be scaled, adjust the starting - // view size by this scale factor. - float scale = mDragLayer.getDescendantRectRelativeToSelf(fi, mRectForFolderAnimation); - lp.customPosition = true; - lp.x = mRectForFolderAnimation.left; - lp.y = mRectForFolderAnimation.top; - lp.width = (int) (scale * width); - lp.height = (int) (scale * height); - - mFolderIconCanvas.drawColor(0, PorterDuff.Mode.CLEAR); - fi.draw(mFolderIconCanvas); - mFolderIconImageView.setImageBitmap(mFolderIconBitmap); - if (fi.getFolder() != null) { - mFolderIconImageView.setPivotX(fi.getFolder().getPivotXForIconAnimation()); - mFolderIconImageView.setPivotY(fi.getFolder().getPivotYForIconAnimation()); - } - // Just in case this image view is still in the drag layer from a previous animation, - // we remove it and re-add it. - if (mDragLayer.indexOfChild(mFolderIconImageView) != -1) { - mDragLayer.removeView(mFolderIconImageView); - } - mDragLayer.addView(mFolderIconImageView, lp); - if (fi.getFolder() != null) { - fi.getFolder().bringToFront(); - } - } - - private void growAndFadeOutFolderIcon(FolderIcon fi) { - if (fi == null) return; - FolderInfo info = (FolderInfo) fi.getTag(); - if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - CellLayout cl = (CellLayout) fi.getParent().getParent(); - CellLayout.LayoutParams lp = (CellLayout.LayoutParams) fi.getLayoutParams(); - cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); - } - - // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original - copyFolderIconToImage(fi); - fi.setVisibility(View.INVISIBLE); - - ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale( - mFolderIconImageView, 0, 1.5f, 1.5f); - if (Utilities.ATLEAST_LOLLIPOP) { - oa.setInterpolator(new LogDecelerateInterpolator(100, 0)); - } - oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); - oa.start(); - } - - private void shrinkAndFadeInFolderIcon(final FolderIcon fi, boolean animate) { - if (fi == null) return; - final CellLayout cl = (CellLayout) fi.getParent().getParent(); - - // We remove and re-draw the FolderIcon in-case it has changed - mDragLayer.removeView(mFolderIconImageView); - copyFolderIconToImage(fi); - - if (cl != null) { - cl.clearFolderLeaveBehind(); - } - - ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(mFolderIconImageView, 1, 1, 1); - oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); - oa.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (cl != null) { - // Remove the ImageView copy of the FolderIcon and make the original visible. - mDragLayer.removeView(mFolderIconImageView); - fi.setVisibility(View.VISIBLE); - } - } - }); - oa.start(); - if (!animate) { - oa.end(); - } - } - - /** - * Opens the user folder described by the specified tag. The opening of the folder - * is animated relative to the specified View. If the View is null, no animation - * is played. - * - * @param folderIcon The FolderIcon describing the folder to open. - */ - public void openFolder(FolderIcon folderIcon) { - - Folder folder = folderIcon.getFolder(); - Folder openFolder = mWorkspace != null ? mWorkspace.getOpenFolder() : null; - if (openFolder != null && openFolder != folder) { - // Close any open folder before opening a folder. - closeFolder(); - } - - FolderInfo info = folder.mInfo; - - info.opened = true; - - // While the folder is open, the position of the icon cannot change. - ((CellLayout.LayoutParams) folderIcon.getLayoutParams()).canReorder = false; - - // Just verify that the folder hasn't already been added to the DragLayer. - // There was a one-off crash where the folder had a parent already. - if (folder.getParent() == null) { - mDragLayer.addView(folder); - mDragController.addDropTarget(folder); - } else { - Log.w(TAG, "Opening folder (" + folder + ") which already has a parent (" + - folder.getParent() + ")."); - } - folder.animateOpen(); - - growAndFadeOutFolderIcon(folderIcon); - - // Notify the accessibility manager that this folder "window" has appeared and occluded - // the workspace items - folder.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - - getUserEventDispatcher().resetElapsedContainerMillis(); - } - - public void closeFolder() { - closeFolder(true); - } - - public void closeFolder(boolean animate) { - Folder folder = mWorkspace != null ? mWorkspace.getOpenFolder() : null; - if (folder != null) { - if (folder.isEditingName()) { - folder.dismissEditingName(); - } - closeFolder(folder, animate); - } - } - - public void closeFolder(Folder folder, boolean animate) { - animate &= !Utilities.isPowerSaverOn(this); - - folder.getInfo().opened = false; - - ViewGroup parent = (ViewGroup) folder.getParent().getParent(); - if (parent != null) { - FolderIcon fi = (FolderIcon) mWorkspace.getViewForTag(folder.mInfo); - shrinkAndFadeInFolderIcon(fi, animate); - if (fi != null) { - ((CellLayout.LayoutParams) fi.getLayoutParams()).canReorder = true; - } - } - if (animate) { - folder.animateClosed(); - } else { - folder.close(false); - } - - // Notify the accessibility manager that this folder "window" has disappeared and no - // longer occludes the workspace items - getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - - getUserEventDispatcher().resetElapsedContainerMillis(); - } - - public void closeShortcutsContainer() { - closeShortcutsContainer(true); - } - - public void closeShortcutsContainer(boolean animate) { - DeepShortcutsContainer deepShortcutsContainer = getOpenShortcutsContainer(); - if (deepShortcutsContainer != null) { - if (animate) { - deepShortcutsContainer.animateClose(); - } else { - deepShortcutsContainer.close(); - } - } - } - - public View getTopFloatingView() { - View topView = getOpenShortcutsContainer(); - if (topView == null) { - topView = getWorkspace().getOpenFolder(); - } - return topView; - } - - /** - * @return The open shortcuts container, or null if there is none - */ - public DeepShortcutsContainer getOpenShortcutsContainer() { - // Iterate in reverse order. Shortcuts container is added later to the dragLayer, - // and will be one of the last views. - for (int i = mDragLayer.getChildCount() - 1; i >= 0; i--) { - View child = mDragLayer.getChildAt(i); - if (child instanceof DeepShortcutsContainer - && ((DeepShortcutsContainer) child).isOpen()) { - return (DeepShortcutsContainer) child; - } - } - return null; - } - @Override public boolean dispatchTouchEvent(MotionEvent ev) { mLastDispatchTouchEventX = ev.getX(); @@ -3220,9 +2972,7 @@ public class Launcher extends Activity // Change the state *after* we've called all the transition code mState = toState; - - closeFolder(); - closeShortcutsContainer(); + AbstractFloatingView.closeAllOpenViews(this); // Send an accessibility event to announce the context change getWindow().getDecorView() @@ -4379,7 +4129,7 @@ public class Launcher extends Activity && mAccessibilityDelegate.performAction(focusedView, (ItemInfo) focusedView.getTag(), LauncherAccessibilityDelegate.DEEP_SHORTCUTS)) { - getOpenShortcutsContainer().requestFocus(); + DeepShortcutsContainer.getOpen(this).requestFocus(); return true; } break; diff --git a/src/com/android/launcher3/PinchToOverviewListener.java b/src/com/android/launcher3/PinchToOverviewListener.java index bc5ac24569..66209bfa1d 100644 --- a/src/com/android/launcher3/PinchToOverviewListener.java +++ b/src/com/android/launcher3/PinchToOverviewListener.java @@ -102,7 +102,7 @@ public class PinchToOverviewListener extends ScaleGestureDetector.SimpleOnScaleG // once the state switching animation is complete. return false; } - if (mLauncher.getTopFloatingView() != null) { + if (AbstractFloatingView.getTopOpenView(mLauncher) != null) { // Don't listen for the pinch gesture if a floating view is open. return false; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index e583be483c..f5297358b3 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -553,24 +553,6 @@ public class Workspace extends PagedView cl.getBackgroundAlpha() > 0); } - /** - * @return The open folder on the current screen, or null if there is none - */ - public Folder getOpenFolder() { - DragLayer dragLayer = mLauncher.getDragLayer(); - // Iterate in reverse order. Folder is added later to the dragLayer, - // and will be one of the last views. - for (int i = dragLayer.getChildCount() - 1; i >= 0; i--) { - View child = dragLayer.getChildAt(i); - if (child instanceof Folder) { - Folder folder = (Folder) child; - if (folder.getInfo().opened) - return folder; - } - } - return null; - } - boolean isTouchActive() { return mTouchState != TOUCH_STATE_REST; } @@ -3811,7 +3793,7 @@ public class Workspace extends PagedView if (!workspaceInModalState() && !mIsSwitchingState) { super.scrollLeft(); } - Folder openFolder = getOpenFolder(); + Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } @@ -3822,7 +3804,7 @@ public class Workspace extends PagedView if (!workspaceInModalState() && !mIsSwitchingState) { super.scrollRight(); } - Folder openFolder = getOpenFolder(); + Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } @@ -3841,7 +3823,7 @@ public class Workspace extends PagedView } boolean result = false; - if (!workspaceInModalState() && !mIsSwitchingState && getOpenFolder() == null) { + if (!workspaceInModalState() && !mIsSwitchingState && Folder.getOpen(mLauncher) == null) { mInScrollArea = true; final int page = getNextPage() + diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index 439e3145e8..83391f3ec4 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -192,8 +192,8 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme }); return true; } else if (action == MOVE_TO_WORKSPACE) { - Folder folder = mLauncher.getWorkspace().getOpenFolder(); - mLauncher.closeFolder(folder, true); + Folder folder = Folder.getOpen(mLauncher); + folder.close(true); ShortcutInfo info = (ShortcutInfo) item; folder.getInfo().remove(info, false); @@ -373,12 +373,10 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme mLauncher.getDragLayer().getDescendantRectRelativeToSelf(item, pos); mLauncher.getDragController().prepareAccessibleDrag(pos.centerX(), pos.centerY()); - Workspace workspace = mLauncher.getWorkspace(); - - Folder folder = workspace.getOpenFolder(); + Folder folder = Folder.getOpen(mLauncher); if (folder != null) { if (!folder.getItemsInReadingOrder().contains(item)) { - mLauncher.closeFolder(); + folder.close(true); folder = null; } } @@ -390,7 +388,7 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme if (folder != null) { folder.startDrag(cellInfo.cell, options); } else { - workspace.startDrag(cellInfo, options); + mLauncher.getWorkspace().startDrag(cellInfo, options); } } diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index 5baa7b59e8..f7ca7034da 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -19,6 +19,7 @@ package com.android.launcher3.accessibility; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherModel; @@ -64,7 +65,7 @@ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDele ArrayList itemList = new ArrayList<>(); itemList.add(info); mLauncher.bindItems(itemList, 0, itemList.size(), true); - mLauncher.closeShortcutsContainer(); + AbstractFloatingView.closeAllOpenViews(mLauncher); announceConfirmation(R.string.item_added_to_workspace); } }; diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index cdd2f1d0ca..689ee38168 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -52,6 +52,7 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; import com.android.launcher3.graphics.TintedDrawableSpan; import com.android.launcher3.keyboard.FocusedItemDecorator; +import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -265,7 +266,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } // IF a shortcuts container is open, container should not be pulled down. - if (mLauncher.getOpenShortcutsContainer() != null) { + if (DeepShortcutsContainer.getOpen(mLauncher) != null) { return false; } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index ef9c9652d4..e83554e494 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -48,9 +48,11 @@ import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.TextView; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.CellLayout; import com.android.launcher3.DropTargetBar; +import com.android.launcher3.ExtendedEditText; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; @@ -65,7 +67,6 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.keyboard.ViewGroupFocusHelper; -import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TouchController; @@ -177,18 +178,13 @@ public class DragLayer extends InsettableFrameLayout { } public boolean isEventOverPageIndicator(MotionEvent ev) { - getDescendantRectRelativeToSelf(mLauncher.getWorkspace().getPageIndicator(), mHitRect); - return mHitRect.contains((int) ev.getX(), (int) ev.getY()); + return isEventOverView(mLauncher.getWorkspace().getPageIndicator(), ev); } public boolean isEventOverHotseat(MotionEvent ev) { return isEventOverView(mLauncher.getHotseat(), ev); } - private boolean isEventOverFolderTextRegion(Folder folder, MotionEvent ev) { - return isEventOverView(folder.getEditTextRegion(), ev); - } - private boolean isEventOverFolder(Folder folder, MotionEvent ev) { return isEventOverView(folder, ev); } @@ -203,45 +199,27 @@ public class DragLayer extends InsettableFrameLayout { } private boolean handleTouchDown(MotionEvent ev, boolean intercept) { - // Remove the shortcuts container when touching outside of it. - DeepShortcutsContainer deepShortcutsContainer = mLauncher.getOpenShortcutsContainer(); - if (deepShortcutsContainer != null) { - if (isEventOverView(deepShortcutsContainer, ev)) { - // Let the container handle the event. - return false; - } else { + AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mLauncher); + if (topView != null && intercept) { + ExtendedEditText textView = topView.getActiveTextView(); + if (textView != null) { + if (!isEventOverView(textView, ev)) { + textView.dispatchBackKey(); + return true; + } + } else if (!isEventOverView(topView, ev)) { if (isInAccessibleDrag()) { // Do not close the container if in drag and drop. if (!isEventOverDropTargetBar(ev)) { return true; } } else { - mLauncher.closeShortcutsContainer(); + topView.close(true); + // We let touches on the original icon go through so that users can launch // the app with one tap if they don't find a shortcut they want. - return !isEventOverView(deepShortcutsContainer.getOriginalIcon(), ev); - } - } - } - - Folder currentFolder = mLauncher.getWorkspace().getOpenFolder(); - if (currentFolder != null && intercept) { - if (currentFolder.isEditingName()) { - if (!isEventOverFolderTextRegion(currentFolder, ev)) { - currentFolder.dismissEditingName(); - return true; - } - } - - if (!isEventOverFolder(currentFolder, ev)) { - if (isInAccessibleDrag()) { - // Do not close the folder if in drag and drop. - if (!isEventOverDropTargetBar(ev)) { - return true; - } - } else { - mLauncher.closeFolder(); - return true; + View extendedTouch = topView.getExtendedTouchView(); + return extendedTouch == null || !isEventOverView(extendedTouch, ev); } } } @@ -299,7 +277,7 @@ public class DragLayer extends InsettableFrameLayout { if (mLauncher == null || mLauncher.getWorkspace() == null) { return false; } - Folder currentFolder = mLauncher.getWorkspace().getOpenFolder(); + Folder currentFolder = Folder.getOpen(mLauncher); if (currentFolder == null) { return false; } else { @@ -349,7 +327,7 @@ public class DragLayer extends InsettableFrameLayout { @Override public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { // Shortcuts can appear above folder - View topView = mLauncher.getTopFloatingView(); + View topView = AbstractFloatingView.getTopOpenView(mLauncher); if (topView != null) { if (child == topView) { return super.onRequestSendAccessibilityEvent(child, event); @@ -366,7 +344,7 @@ public class DragLayer extends InsettableFrameLayout { @Override public void addChildrenForAccessibility(ArrayList childrenForAccessibility) { - View topView = mLauncher.getTopFloatingView(); + View topView = AbstractFloatingView.getTopOpenView(mLauncher); if (topView != null) { // Only add the top view as a child for accessibility when it is open childrenForAccessibility.add(topView); @@ -521,7 +499,7 @@ public class DragLayer extends InsettableFrameLayout { @Override public boolean dispatchUnhandledMove(View focused, int direction) { // Consume the unhandled move if a container is open, to avoid switching pages underneath. - boolean isContainerOpen = mLauncher.getTopFloatingView() != null; + boolean isContainerOpen = AbstractFloatingView.getTopOpenView(mLauncher) != null; return isContainerOpen || mDragController.dispatchUnhandledMove(focused, direction); } @@ -1030,7 +1008,7 @@ public class DragLayer extends InsettableFrameLayout { @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - View topView = mLauncher.getTopFloatingView(); + View topView = AbstractFloatingView.getTopOpenView(mLauncher); if (topView != null) { return topView.requestFocus(direction, previouslyFocusedRect); } else { @@ -1040,7 +1018,7 @@ public class DragLayer extends InsettableFrameLayout { @Override public void addFocusables(ArrayList views, int direction, int focusableMode) { - View topView = mLauncher.getTopFloatingView(); + View topView = AbstractFloatingView.getTopOpenView(mLauncher); if (topView != null) { topView.addFocusables(views, direction); } else { diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 7030b660fe..0685ddbe11 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -46,9 +46,9 @@ import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import android.widget.LinearLayout; import android.widget.TextView; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Alarm; import com.android.launcher3.AppInfo; import com.android.launcher3.BubbleTextView; @@ -73,6 +73,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragLayer; @@ -91,9 +92,10 @@ import java.util.Comparator; /** * Represents a set of icons chosen by the user or generated by the system. */ -public class Folder extends LinearLayout implements DragSource, View.OnClickListener, +public class Folder extends AbstractFloatingView implements DragSource, View.OnClickListener, View.OnLongClickListener, DropTarget, FolderListener, TextView.OnEditorActionListener, - View.OnFocusChangeListener, DragListener, DropTargetSource { + View.OnFocusChangeListener, DragListener, DropTargetSource, + ExtendedEditText.OnBackKeyListener { private static final String TAG = "Launcher.Folder"; /** @@ -227,14 +229,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mPageIndicator = (PageIndicatorDots) findViewById(R.id.folder_page_indicator); mFolderName = (ExtendedEditText) findViewById(R.id.folder_name); - mFolderName.setOnBackKeyListener(new ExtendedEditText.OnBackKeyListener() { - @Override - public boolean onBackKey() { - // Close the activity on back key press - doneEditingFolderName(true); - return false; - } - }); + mFolderName.setOnBackKeyListener(this); mFolderName.setOnFocusChangeListener(this); if (!Utilities.ATLEAST_MARSHMALLOW) { @@ -357,12 +352,9 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList }); } - public void dismissEditingName() { - mInputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); - doneEditingFolderName(true); - } - public void doneEditingFolderName(boolean commit) { + @Override + public boolean onBackKey() { mFolderName.setHint(sHintText); // Convert to a string here to ensure that no other state associated with the text field // gets saved. @@ -370,30 +362,30 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mInfo.setTitle(newTitle); LauncherModel.updateItemInDatabase(mLauncher, mInfo); - if (commit) { - Utilities.sendCustomAccessibilityEvent( - this, AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, - getContext().getString(R.string.folder_renamed, newTitle)); - } + Utilities.sendCustomAccessibilityEvent( + this, AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, + getContext().getString(R.string.folder_renamed, newTitle)); // This ensures that focus is gained every time the field is clicked, which selects all // the text and brings up the soft keyboard if necessary. mFolderName.clearFocus(); - Selection.setSelection((Spannable) mFolderName.getText(), 0, 0); + Selection.setSelection(mFolderName.getText(), 0, 0); mIsEditingName = false; + return true; } public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { - dismissEditingName(); + mFolderName.dispatchBackKey(); return true; } return false; } - public View getEditTextRegion() { - return mFolderName; + @Override + public ExtendedEditText getActiveTextView() { + return isEditingName() ? mFolderName : null; } /** @@ -518,8 +510,33 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mState = STATE_SMALL; } + /** + * Opens the user folder described by the specified tag. The opening of the folder + * is animated relative to the specified View. If the View is null, no animation + * is played. + */ public void animateOpen() { - if (!(getParent() instanceof DragLayer)) return; + Folder openFolder = getOpen(mLauncher); + if (openFolder != null && openFolder != this) { + // Close any open folder before opening a folder. + openFolder.close(true); + } + + DragLayer dragLayer = mLauncher.getDragLayer(); + // Just verify that the folder hasn't already been added to the DragLayer. + // There was a one-off crash where the folder had a parent already. + if (getParent() == null) { + dragLayer.addView(this); + mDragController.addDropTarget(this); + } else { + if (ProviderConfig.IS_DOGFOOD_BUILD) { + Log.e(TAG, "Opening folder (" + this + ") which already has a parent:" + + getParent()); + } + } + + mIsOpen = true; + mFolderIcon.growAndFadeOut(); mContent.completePendingPageChanges(); if (!mDragInProgress) { @@ -532,83 +549,63 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList // dropping. One resulting issue is that replaceFolderWithFinalItem() can be called twice. mDeleteFolderOnDropCompleted = false; - Animator openFolderAnim = null; final Runnable onCompleteRunnable; - if (!Utilities.ATLEAST_LOLLIPOP) { - positionAndSizeAsIcon(); - centerAboutIcon(); + prepareReveal(); + centerAboutIcon(); - final ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(this, 1, 1, 1); - oa.setDuration(mExpandDuration); - openFolderAnim = oa; + AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); + int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth(); + int height = getFolderHeight(); - setLayerType(LAYER_TYPE_HARDWARE, null); - onCompleteRunnable = new Runnable() { - @Override - public void run() { - setLayerType(LAYER_TYPE_NONE, null); - } - }; - } else { - prepareReveal(); - centerAboutIcon(); + float transX = - 0.075f * (width / 2 - getPivotX()); + float transY = - 0.075f * (height / 2 - getPivotY()); + setTranslationX(transX); + setTranslationY(transY); + PropertyValuesHolder tx = PropertyValuesHolder.ofFloat(TRANSLATION_X, transX, 0); + PropertyValuesHolder ty = PropertyValuesHolder.ofFloat(TRANSLATION_Y, transY, 0); - AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); - int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth(); - int height = getFolderHeight(); + Animator drift = ObjectAnimator.ofPropertyValuesHolder(this, tx, ty); + drift.setDuration(mMaterialExpandDuration); + drift.setStartDelay(mMaterialExpandStagger); + drift.setInterpolator(new LogDecelerateInterpolator(100, 0)); - float transX = - 0.075f * (width / 2 - getPivotX()); - float transY = - 0.075f * (height / 2 - getPivotY()); - setTranslationX(transX); - setTranslationY(transY); - PropertyValuesHolder tx = PropertyValuesHolder.ofFloat(TRANSLATION_X, transX, 0); - PropertyValuesHolder ty = PropertyValuesHolder.ofFloat(TRANSLATION_Y, transY, 0); + int rx = (int) Math.max(Math.max(width - getPivotX(), 0), getPivotX()); + int ry = (int) Math.max(Math.max(height - getPivotY(), 0), getPivotY()); + float radius = (float) Math.hypot(rx, ry); - Animator drift = ObjectAnimator.ofPropertyValuesHolder(this, tx, ty); - drift.setDuration(mMaterialExpandDuration); - drift.setStartDelay(mMaterialExpandStagger); - drift.setInterpolator(new LogDecelerateInterpolator(100, 0)); + Animator reveal = new CircleRevealOutlineProvider((int) getPivotX(), + (int) getPivotY(), 0, radius).createRevealAnimator(this); + reveal.setDuration(mMaterialExpandDuration); + reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); - int rx = (int) Math.max(Math.max(width - getPivotX(), 0), getPivotX()); - int ry = (int) Math.max(Math.max(height - getPivotY(), 0), getPivotY()); - float radius = (float) Math.hypot(rx, ry); + mContent.setAlpha(0f); + Animator iconsAlpha = ObjectAnimator.ofFloat(mContent, "alpha", 0f, 1f); + iconsAlpha.setDuration(mMaterialExpandDuration); + iconsAlpha.setStartDelay(mMaterialExpandStagger); + iconsAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); - Animator reveal = new CircleRevealOutlineProvider((int) getPivotX(), - (int) getPivotY(), 0, radius).createRevealAnimator(this); - reveal.setDuration(mMaterialExpandDuration); - reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); + mFooter.setAlpha(0f); + Animator textAlpha = ObjectAnimator.ofFloat(mFooter, "alpha", 0f, 1f); + textAlpha.setDuration(mMaterialExpandDuration); + textAlpha.setStartDelay(mMaterialExpandStagger); + textAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); - mContent.setAlpha(0f); - Animator iconsAlpha = ObjectAnimator.ofFloat(mContent, "alpha", 0f, 1f); - iconsAlpha.setDuration(mMaterialExpandDuration); - iconsAlpha.setStartDelay(mMaterialExpandStagger); - iconsAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); + anim.play(drift); + anim.play(iconsAlpha); + anim.play(textAlpha); + anim.play(reveal); - mFooter.setAlpha(0f); - Animator textAlpha = ObjectAnimator.ofFloat(mFooter, "alpha", 0f, 1f); - textAlpha.setDuration(mMaterialExpandDuration); - textAlpha.setStartDelay(mMaterialExpandStagger); - textAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); - - anim.play(drift); - anim.play(iconsAlpha); - anim.play(textAlpha); - anim.play(reveal); - - openFolderAnim = anim; - - mContent.setLayerType(LAYER_TYPE_HARDWARE, null); - mFooter.setLayerType(LAYER_TYPE_HARDWARE, null); - onCompleteRunnable = new Runnable() { - @Override - public void run() { - mContent.setLayerType(LAYER_TYPE_NONE, null); - mFooter.setLayerType(LAYER_TYPE_NONE, null); - mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); - } - }; - } - openFolderAnim.addListener(new AnimatorListenerAdapter() { + mContent.setLayerType(LAYER_TYPE_HARDWARE, null); + mFooter.setLayerType(LAYER_TYPE_HARDWARE, null); + onCompleteRunnable = new Runnable() { + @Override + public void run() { + mContent.setLayerType(LAYER_TYPE_NONE, null); + mFooter.setLayerType(LAYER_TYPE_NONE, null); + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); + } + }; + anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { Utilities.sendCustomAccessibilityEvent( @@ -639,7 +636,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList // Do not update the flag if we are in drag mode. The flag will be updated, when we // actually drop the icon. final boolean updateAnimationFlag = !mDragInProgress; - openFolderAnim.addListener(new AnimatorListenerAdapter() { + anim.addListener(new AnimatorListenerAdapter() { @SuppressLint("InlinedApi") @Override @@ -662,7 +659,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList } mPageIndicator.stopAllAnimations(); - openFolderAnim.start(); + anim.start(); // Make sure the folder picks up the last drag move even if the finger doesn't move. if (mDragController.isDragging()) { @@ -670,6 +667,11 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList } mContent.verifyVisibleHighResIcons(mContent.getNextPage()); + + // Notify the accessibility manager that this folder "window" has appeared and occluded + // the workspace items + sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + dragLayer.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } public void beginExternalDrag() { @@ -682,14 +684,44 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mDragController.addDragListener(this); } - public void animateClosed() { + @Override + protected boolean isOfType(int type) { + return (type & TYPE_FOLDER) != 0; + } + + @Override + protected void handleClose(boolean animate) { + mIsOpen = false; + + if (isEditingName()) { + mFolderName.dispatchBackKey(); + } + + if (mFolderIcon != null) { + mFolderIcon.shrinkAndFadeIn(animate); + } + if (!(getParent() instanceof DragLayer)) return; + + if (animate) { + animateClosed(); + } else { + closeComplete(false); + } + + // Notify the accessibility manager that this folder "window" has disappeared and no + // longer occludes the workspace items + ((DragLayer) getParent()) + .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } + + private void animateClosed() { final ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(this, 0, 0.9f, 0.9f); oa.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { setLayerType(LAYER_TYPE_NONE, null); - close(true); + closeComplete(true); } @Override public void onAnimationStart(Animator animation) { @@ -705,7 +737,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList oa.start(); } - public void close(boolean wasAnimated) { + private void closeComplete(boolean wasAnimated) { // TODO: Clear all active animations. DragLayer parent = (DragLayer) getParent(); if (parent != null) { @@ -840,8 +872,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList }; public void completeDragExit() { - if (mInfo.opened) { - mLauncher.closeFolder(); + if (mIsOpen) { + close(true); mRearrangeOnClose = true; } else if (mState == STATE_ANIMATING) { mRearrangeOnClose = true; @@ -1370,8 +1402,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList rearrangeChildren(); } if (getItemCount() <= 1) { - if (mInfo.opened) { - mLauncher.closeFolder(this, true); + if (mIsOpen) { + close(true); } else { replaceFolderWithFinalItem(); } @@ -1417,7 +1449,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList if (hasFocus) { startEditingFolderName(); } else { - dismissEditingName(); + mFolderName.dispatchBackKey(); } } } @@ -1516,4 +1548,11 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList updateTextViewFocus(); } } + + /** + * Returns a folder which is already open or null + */ + public static Folder getOpen(Launcher launcher) { + return getOpenView(launcher, TYPE_FOLDER); + } } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 69c2b0fa3e..a29a946591 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -18,6 +18,7 @@ package com.android.launcher3.folder; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; @@ -56,7 +57,6 @@ import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.OnAlarmListener; import com.android.launcher3.PreloadIconDrawable; @@ -142,6 +142,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { mPreviewLayoutRule = FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON ? new StackFolderIconLayoutRule() : new ClippedFolderIconLayoutRule(); + mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); } public static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group, @@ -202,16 +203,12 @@ public class FolderIcon extends FrameLayout implements FolderListener { updateItemDrawingParams(false); } - public FolderInfo getFolderInfo() { - return mInfo; - } - private boolean willAcceptItem(ItemInfo item) { final int itemType = item.itemType; return ((itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT || itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) && - !mFolder.isFull() && item != mInfo && !mInfo.opened); + !mFolder.isFull() && item != mInfo && !mFolder.isOpen()); } public boolean acceptDrop(ItemInfo dragInfo) { @@ -243,7 +240,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { OnAlarmListener mOnOpenListener = new OnAlarmListener() { public void onAlarm(Alarm alarm) { mFolder.beginExternalDrag(); - mLauncher.openFolder(FolderIcon.this); + mFolder.animateOpen(); } }; @@ -973,12 +970,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { return result; } - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); - } - @Override public void cancelLongPress() { super.cancelLongPress(); @@ -990,13 +981,76 @@ public class FolderIcon extends FrameLayout implements FolderListener { mInfo.removeListener(mFolder); } + public void shrinkAndFadeIn(boolean animate) { + final CellLayout cl = (CellLayout) getParent().getParent(); + ((CellLayout.LayoutParams) getLayoutParams()).canReorder = true; + + // We remove and re-draw the FolderIcon in-case it has changed + final PreviewImageView previewImage = PreviewImageView.get(getContext()); + previewImage.removeFromParent(); + copyToPreview(previewImage); + + if (cl != null) { + cl.clearFolderLeaveBehind(); + } + + ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(previewImage, 1, 1, 1); + oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); + oa.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (cl != null) { + // Remove the ImageView copy of the FolderIcon and make the original visible. + previewImage.removeFromParent(); + setVisibility(View.VISIBLE); + } + } + }); + oa.start(); + if (!animate) { + oa.end(); + } + } + + public void growAndFadeOut() { + CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); + // While the folder is open, the position of the icon cannot change. + lp.canReorder = false; + if (mInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + CellLayout cl = (CellLayout) getParent().getParent(); + cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); + } + + // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original + PreviewImageView previewImage = PreviewImageView.get(getContext()); + copyToPreview(previewImage); + setVisibility(View.INVISIBLE); + + ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(previewImage, 0, 1.5f, 1.5f); + oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); + oa.start(); + } + + /** + * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView + * in the DragLayer in the exact absolute location of the original FolderIcon. + */ + private void copyToPreview(PreviewImageView previewImageView) { + previewImageView.copy(this); + if (mFolder != null) { + previewImageView.setPivotX(mFolder.getPivotXForIconAnimation()); + previewImageView.setPivotY(mFolder.getPivotYForIconAnimation()); + mFolder.bringToFront(); + } + } + public interface PreviewLayoutRule { - public PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, + PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, PreviewItemDrawingParams params); - public void init(int availableSpace, int intrinsicIconSize, boolean rtl); + void init(int availableSpace, int intrinsicIconSize, boolean rtl); - public int numItems(); - public boolean clipToBackground(); + int numItems(); + boolean clipToBackground(); } } diff --git a/src/com/android/launcher3/folder/PreviewImageView.java b/src/com/android/launcher3/folder/PreviewImageView.java new file mode 100644 index 0000000000..c4f3ee15c2 --- /dev/null +++ b/src/com/android/launcher3/folder/PreviewImageView.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2016 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.launcher3.folder; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.android.launcher3.Launcher; +import com.android.launcher3.R; +import com.android.launcher3.dragndrop.DragLayer; + +/** + * A temporary view which displays the a bitmap (used for folder icon animation) + */ +public class PreviewImageView extends ImageView { + + private final Rect mTempRect = new Rect(); + private final DragLayer mParent; + + private Bitmap mBitmap; + private Canvas mCanvas; + + public PreviewImageView(DragLayer parent) { + super(parent.getContext()); + mParent = parent; + } + + public void copy(View view) { + final int width = view.getMeasuredWidth(); + final int height = view.getMeasuredHeight(); + + if (mBitmap == null || mBitmap.getWidth() != width || mBitmap.getHeight() != height) { + mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mCanvas = new Canvas(mBitmap); + } + + DragLayer.LayoutParams lp; + if (getLayoutParams() instanceof DragLayer.LayoutParams) { + lp = (DragLayer.LayoutParams) getLayoutParams(); + } else { + lp = new DragLayer.LayoutParams(width, height); + } + + // The layout from which the folder is being opened may be scaled, adjust the starting + // view size by this scale factor. + float scale = mParent.getDescendantRectRelativeToSelf(view, mTempRect); + lp.customPosition = true; + lp.x = mTempRect.left; + lp.y = mTempRect.top; + lp.width = (int) (scale * width); + lp.height = (int) (scale * height); + + mCanvas.drawColor(0, PorterDuff.Mode.CLEAR); + view.draw(mCanvas); + setImageBitmap(mBitmap); + + // Just in case this image view is still in the drag layer from a previous animation, + // we remove it and re-add it. + removeFromParent(); + mParent.addView(this, lp); + } + + public void removeFromParent() { + if (mParent.indexOfChild(this) != -1) { + mParent.removeView(this); + } + } + + public static PreviewImageView get(Context context) { + DragLayer dragLayer = Launcher.getLauncher(context).getDragLayer(); + PreviewImageView view = (PreviewImageView) dragLayer.getTag(R.id.preview_image_id); + if (view == null) { + view = new PreviewImageView(dragLayer); + dragLayer.setTag(R.id.preview_image_id, view); + } + return view; + } +} diff --git a/src/com/android/launcher3/keyboard/CustomActionsPopup.java b/src/com/android/launcher3/keyboard/CustomActionsPopup.java index 6056f4c109..6603e93b0a 100644 --- a/src/com/android/launcher3/keyboard/CustomActionsPopup.java +++ b/src/com/android/launcher3/keyboard/CustomActionsPopup.java @@ -46,7 +46,7 @@ public class CustomActionsPopup implements OnMenuItemClickListener { public CustomActionsPopup(Launcher launcher, View icon) { mLauncher = launcher; mIcon = icon; - DeepShortcutsContainer container = launcher.getOpenShortcutsContainer(); + DeepShortcutsContainer container = DeepShortcutsContainer.getOpen(launcher); if (container != null) { mDelegate = container.getAccessibilityDelegate(); } else { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 9f9a99eb12..b5126e95c3 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -41,6 +41,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.animation.DecelerateInterpolator; import android.widget.LinearLayout; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; @@ -73,9 +74,9 @@ import java.util.List; * A container for shortcuts to deep links within apps. */ @TargetApi(Build.VERSION_CODES.N) -public class DeepShortcutsContainer extends LinearLayout implements View.OnLongClickListener, +public class DeepShortcutsContainer extends AbstractFloatingView + implements View.OnLongClickListener, View.OnTouchListener, DragSource, DragController.DragListener { - private static final String TAG = "ShortcutsContainer"; private final Point mIconShift = new Point(); @@ -94,7 +95,6 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC private Animator mOpenCloseAnimator; private boolean mDeferContainerRemoval; - private boolean mIsOpen; public DeepShortcutsContainer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -376,7 +376,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC return arrowView; } - public BubbleTextView getOriginalIcon() { + @Override + public View getExtendedTouchView() { return mOriginalIcon; } @@ -444,7 +445,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC dv.animateShift(-mIconShift.x, -mIconShift.y); // TODO: support dragging from within folder without having to close it - mLauncher.closeFolder(); + AbstractFloatingView.closeOpenContainer(mLauncher, AbstractFloatingView.TYPE_FOLDER); return false; } @@ -499,7 +500,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } else { // Close animation is not running. if (mDeferContainerRemoval) { - close(); + closeComplete(); } } } @@ -512,7 +513,16 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC targetParent.containerType = LauncherLogProto.DEEPSHORTCUTS; } - public void animateClose() { + @Override + protected void handleClose(boolean animate) { + if (animate) { + animateClose(); + } else { + closeComplete(); + } + } + + private void animateClose() { if (!mIsOpen) { return; } @@ -592,7 +602,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC if (mDeferContainerRemoval) { setVisibility(INVISIBLE); } else { - close(); + closeComplete(); } } }); @@ -607,7 +617,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC /** * Closes the folder without animation. */ - public void close() { + private void closeComplete() { if (mOpenCloseAnimator != null) { mOpenCloseAnimator.cancel(); mOpenCloseAnimator = null; @@ -621,8 +631,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC mLauncher.getDragLayer().removeView(this); } - public boolean isOpen() { - return mIsOpen; + @Override + protected boolean isOfType(int type) { + return (type & TYPE_DEEPSHORTCUT_CONTAINER) != 0; } /** @@ -631,7 +642,7 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC */ public static DeepShortcutsContainer showForIcon(BubbleTextView icon) { Launcher launcher = Launcher.getLauncher(icon.getContext()); - if (launcher.getOpenShortcutsContainer() != null) { + if (getOpen(launcher) != null) { // There is already a shortcuts container open, so don't open this one. icon.clearFocus(); return null; @@ -666,4 +677,11 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC return unbadgedBitmap; } } + + /** + * Returns a DeepShortcutsContainer which is already open or null + */ + public static DeepShortcutsContainer getOpen(Launcher launcher) { + return getOpenView(launcher, TYPE_DEEPSHORTCUT_CONTAINER); + } } From b4e63799902136a88d6749bbcda12ca16eb798e4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 10 Oct 2016 13:48:58 -0700 Subject: [PATCH 060/382] Import translations. DO NOT MERGE Change-Id: I0f12c5e0414f45e751b726160759de71287b9686 Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 ++---- res/values-am/strings.xml | 6 ++---- res/values-ar/strings.xml | 6 ++---- res/values-az-rAZ/strings.xml | 6 ++---- res/values-b+sr+Latn/strings.xml | 6 ++---- res/values-be-rBY/strings.xml | 6 ++---- res/values-bg/strings.xml | 6 ++---- res/values-bn-rBD/strings.xml | 6 ++---- res/values-bs-rBA/strings.xml | 6 ++---- res/values-ca/strings.xml | 6 ++---- res/values-cs/strings.xml | 6 ++---- res/values-da/strings.xml | 6 ++---- res/values-de/strings.xml | 6 ++---- res/values-el/strings.xml | 6 ++---- res/values-en-rAU/strings.xml | 6 ++---- res/values-en-rGB/strings.xml | 6 ++---- res/values-en-rIN/strings.xml | 6 ++---- res/values-es-rUS/strings.xml | 6 ++---- res/values-es/strings.xml | 6 ++---- res/values-et-rEE/strings.xml | 6 ++---- res/values-eu-rES/strings.xml | 6 ++---- res/values-fa/strings.xml | 6 ++---- res/values-fi/strings.xml | 6 ++---- res/values-fr-rCA/strings.xml | 6 ++---- res/values-fr/strings.xml | 6 ++---- res/values-gl-rES/strings.xml | 6 ++---- res/values-gu-rIN/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-hr/strings.xml | 6 ++---- res/values-hu/strings.xml | 6 ++---- res/values-hy-rAM/strings.xml | 6 ++---- res/values-in/strings.xml | 6 ++---- res/values-is-rIS/strings.xml | 6 ++---- res/values-it/strings.xml | 6 ++---- res/values-iw/strings.xml | 6 ++---- res/values-ja/strings.xml | 6 ++---- res/values-ka-rGE/strings.xml | 6 ++---- res/values-kk-rKZ/strings.xml | 6 ++---- res/values-km-rKH/strings.xml | 6 ++---- res/values-kn-rIN/strings.xml | 6 ++---- res/values-ko/strings.xml | 6 ++---- res/values-ky-rKG/strings.xml | 6 ++---- res/values-lo-rLA/strings.xml | 6 ++---- res/values-lt/strings.xml | 6 ++---- res/values-lv/strings.xml | 6 ++---- res/values-mk-rMK/strings.xml | 6 ++---- res/values-ml-rIN/strings.xml | 6 ++---- res/values-mn-rMN/strings.xml | 6 ++---- res/values-mr-rIN/strings.xml | 6 ++---- res/values-ms-rMY/strings.xml | 6 ++---- res/values-my-rMM/strings.xml | 6 ++---- res/values-nb/strings.xml | 6 ++---- res/values-ne-rNP/strings.xml | 6 ++---- res/values-nl/strings.xml | 6 ++---- res/values-pa-rIN/strings.xml | 6 ++---- res/values-pl/strings.xml | 6 ++---- res/values-pt-rPT/strings.xml | 6 ++---- res/values-pt/strings.xml | 6 ++---- res/values-ro/strings.xml | 6 ++---- res/values-ru/strings.xml | 6 ++---- res/values-si-rLK/strings.xml | 6 ++---- res/values-sk/strings.xml | 6 ++---- res/values-sl/strings.xml | 6 ++---- res/values-sq-rAL/strings.xml | 6 ++---- res/values-sr/strings.xml | 6 ++---- res/values-sv/strings.xml | 6 ++---- res/values-sw/strings.xml | 6 ++---- res/values-ta-rIN/strings.xml | 6 ++---- res/values-te-rIN/strings.xml | 6 ++---- res/values-th/strings.xml | 6 ++---- res/values-tl/strings.xml | 6 ++---- res/values-tr/strings.xml | 6 ++---- res/values-uk/strings.xml | 6 ++---- res/values-ur-rPK/strings.xml | 6 ++---- res/values-uz-rUZ/strings.xml | 6 ++---- res/values-vi/strings.xml | 6 ++---- res/values-zh-rCN/strings.xml | 6 ++---- res/values-zh-rHK/strings.xml | 6 ++---- res/values-zh-rTW/strings.xml | 6 ++---- res/values-zu/strings.xml | 6 ++---- 80 files changed, 160 insertions(+), 320 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 7eca0189f2..dd427e3fb6 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -27,10 +27,8 @@ "Afgelaaide program in veiligmodus gedeaktiveer" "Legstukke gedeaktiveer in Veiligmodus" "Kortpad is nie beskikbaar nie" - - - - + "Tuisskerm" + "Gepasmaakte handelinge" "Raak en hou om \'n legstuk op te tel." "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index b2de3fcd4b..02d5cc1c6d 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -27,10 +27,8 @@ "የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል" "ምግብሮች በደህንነቱ የተጠበቀ ሁኔታ ተሰናክለዋል" "አቋራጭ አይገኝም" - - - - + "መነሻ ገጽ" + "ብጁ እርምጃዎች" "ፍርግም ለማንሳት ይንኩ እና ይያዙት" "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 5d00ca07bc..437e9743a0 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -27,10 +27,8 @@ "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" "الأدوات معطلة في الوضع الآمن" "الاختصار غير متاح" - - - - + "الشاشة الرئيسية" + "الإجراءات المخصّصة" "المس مع الاستمرار لاختيار إحدى الأدوات." "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 9a624f3975..fe0ef4f8d5 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -27,10 +27,8 @@ "Güvənli rejimdə icazə verilməyən tətbiq endirildi" "Vidcetlər Güvənli rejimdə deaktiv edilib" "Qısayol əlçatan deyil" - - - - + "Əsas ekran" + "Fərdi əməliyyatlar" "Vidceti götürmək üçün toxunub saxlayın." "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 8f9611b02a..bd7b874d4b 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -27,10 +27,8 @@ "Preuzeta aplikacija je onemogućena u Bezbednom režimu" "Vidžeti su onemogućeni u Bezbednom režimu" "Prečica nije dostupna" - - - - + "Početni ekran" + "Prilagođene radnje" "Dodirnite i zadržite da biste izabrali vidžet." "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 426b8d4a4f..b15dc60149 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -27,10 +27,8 @@ "Спампаваная праграма адключана ў Бяспечным рэжыме" "Віджэты адключаны ў Бяспечным рэжыме" "Ярлык недаступны" - - - - + "Галоўны экран" + "Спецыяльныя дзеянні" "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index be84ec5b20..13d1641759 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -27,10 +27,8 @@ "Изтегленото приложение е деактивирано в безопасния режим" "Приспособленията са деактивирани в безопасния режим" "Няма достъп до прекия път" - - - - + "Начален екран" + "Персонализирани действия" "Докоснете и задръжте за избор на приспособление." "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index dbb39bf5ee..60cdd474ee 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -27,10 +27,8 @@ "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" "শর্টকাটগুলি অনুপলব্ধ" - - - - + "হোম স্ক্রীন" + "কাস্টম অ্যাকশন" "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index a66f24bab2..705ca040e7 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -27,10 +27,8 @@ "Preuzeta aplikacija je onemogućena u sigurnom načinu rada" "Vidžeti su onemogućeni u sigurnom načinu rada." "Prečica nije dostupna" - - - - + "Početni ekran" + "Prilagođene akcije" "Dodirnite & i držite da biste uzeli dodatak." "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 06deaa1bf4..c12ec8d80c 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -27,10 +27,8 @@ "L\'aplicació que has baixat està desactivada al mode segur." "En Mode segur, els widgets estan desactivats." "La drecera no està disponible" - - - - + "Pantalla d\'inici" + "Accions personalitzades" "Mantén premut un widget per triar-lo." "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 66a10da3d1..8eacd0a604 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -27,10 +27,8 @@ "Stažená aplikace je v nouzovém režimu zakázána" "V nouzovém režimu jsou widgety zakázány." "Zkratka není k dispozici" - - - - + "Plocha" + "Vlastní akce" "Widget vyberete dotykem a podržením." "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 6f5b6b1c2a..220bd4b457 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -27,10 +27,8 @@ "Downloadet app er deaktiveret i sikker tilstand" "Widgets er deaktiveret i Beskyttet tilstand" "Genvejen er ikke tilgængelig" - - - - + "Startskærm" + "Brugerdefinerede handlinger" "Tryk på en widget, og hold den nede for at vælge." "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2bc85774a4..990c901be6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -27,10 +27,8 @@ "Heruntergeladene App im abgesicherten Modus deaktiviert" "Widgets im abgesicherten Modus deaktiviert" "Verknüpfung nicht verfügbar" - - - - + "Startbildschirm" + "Benutzerdefinierte Aktionen" "Zum Hinzufügen Widget berühren und halten" "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index f143ae5790..c82b7ee297 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -27,10 +27,8 @@ "Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία" "Τα γραφικά στοιχεία απενεργοποιήθηκαν στην ασφαλή λειτουργία" "Η συντόμευση δεν είναι διαθέσιμη" - - - - + "Αρχική οθόνη" + "Προσαρμοσμένες ενέργειες" "Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ." "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index ebff65983e..baae4b0029 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -27,10 +27,8 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" - - - - + "Home screen" + "Customised actions" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index ebff65983e..baae4b0029 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -27,10 +27,8 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" - - - - + "Home screen" + "Customised actions" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index ebff65983e..baae4b0029 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -27,10 +27,8 @@ "Downloaded app disabled in Safe mode" "Widgets disabled in Safe mode" "Shortcut isn\'t available" - - - - + "Home screen" + "Customised actions" "Touch & hold to pick up a widget." "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 20edcfc082..250f784836 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -27,10 +27,8 @@ "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" "El acceso directo no está disponible" - - - - + "Pantalla principal" + "Acciones personalizadas" "Mantén presionado el widget que desees elegir." "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 51f473a749..1fdf3ef8db 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -27,10 +27,8 @@ "Aplicación descargada inhabilitada en modo seguro" "Widgets inhabilitados en modo seguro" "Acceso directo no disponible" - - - - + "Pantalla de inicio" + "Acciones personalizadas" "Mantén pulsado el widget que quieras seleccionar." "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5e7c0155cd..a0ee1e93f4 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -27,10 +27,8 @@ "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" "Otsetee pole saadaval" - - - - + "Avaekraan" + "Kohandatud toimingud" "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 0cb3d8fe86..b2aed2e053 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -27,10 +27,8 @@ "Deskargatutako aplikazioa modu seguruan desgaitu da" "Widgetak desgaitu egin dira modu seguruan" "Lasterbideak ez daude erabilgarri" - - - - + "Hasierako pantaila" + "Ekintza pertsonalizatuak" "Eduki sakatuta widgeta aukeratzeko." "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 499d101774..88a4fb5cfe 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -27,10 +27,8 @@ "برنامه بارگیری شده در حالت ایمن غیرفعال شد" "ابزارک‌ها در حالت ایمن غیرفعال هستند" "میان‌بر دردسترس نیست" - - - - + "صفحه اصلی" + "عملکردهای سفارشی" "برای انتخاب ابزارک لمس کنید و نگه دارید." "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 77a51e4702..0aa01b90e4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -27,10 +27,8 @@ "Ladattu sovellus poistettiin käytöstä suojatussa tilassa" "Widgetit poistettu käytöstä vikasietotilassa" "Pikakuvake ei ole käytettävissä." - - - - + "Aloitusnäyttö" + "Muokatut toiminnot" "Valitse widget painamalla sitä pitkään." "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index acdca26ed2..e261b74032 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -27,10 +27,8 @@ "L\'application téléchargée est désactivée en mode sécurisé." "Widgets désactivés en mode sans échec" "Le raccourci n\'est pas disponible" - - - - + "Écran d\'accueil" + "Actions personnalisées" "Maintenez un doigt sur le widget pour l\'ajouter." "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 45f6a7291f..591dff7a84 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -27,10 +27,8 @@ "L\'application téléchargée est désactivée en mode sécurisé." "Les widgets sont désactivés en mode sécurisé." "Raccourci non disponible" - - - - + "Écran d\'accueil" + "Actions personnalisées" "App. de manière prolongée pour sélectionner widget." "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 4a2303a151..766cddb199 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -27,10 +27,8 @@ "A aplicación que descargaches está desactivada no modo seguro" "Os widgets están desactivados no modo seguro" "O atallo non está dispoñible" - - - - + "Pantalla de inicio" + "Accións personalizadas" "Mantén premido un widget para seleccionalo." "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index bb9e4a3fb9..c14816af58 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -27,10 +27,8 @@ "સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી" "સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા" "શૉર્ટકટ ઉપલબ્ધ નથી" - - - - + "હોમ સ્ક્રીન" + "કસ્ટમ ક્રિયાઓ" "વિજેટ ચૂંટવા માટે ટચ કરો અને પકડી રાખો." "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 2025af549d..3d1fecb5a9 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -27,10 +27,8 @@ "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" "शॉर्टकट उपलब्ध नहीं है" - - - - + "होम स्क्रीन" + "कस्टम कार्रवाई" "विजेट को चुनने के लिए स्‍पर्श करके रखें." "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 4c902604e8..ce370f9e19 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -27,10 +27,8 @@ "Preuzeta aplikacija onemogućena je u Sigurnom načinu rada" "Widgeti su onemogućeni u Sigurnom načinu rada" "Prečac nije dostupan" - - - - + "Početni zaslon" + "Prilagođene radnje" "Dodirnite i držite kako biste podigli widget." "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 352290a7d1..c2003b6600 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -27,10 +27,8 @@ "A letöltött alkalmazás Csökkentett módban ki van kapcsolva" "A modulok ki vannak kapcsolva Csökkentett módban" "A gyorsparancs nem áll rendelkezésre" - - - - + "Kezdőképernyő" + "Egyéni műveletek" "Modul felvételéhez érintse meg, és tartsa lenyomva" "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index acbbf36ac5..78848955fa 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -27,10 +27,8 @@ "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" "Վիջեթներն անջատված են անվտանգ ռեժիմում" "Դյուրանցումն անհասանելի է" - - - - + "Հիմնական էկրան" + "Հատուկ գործողություններ" "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 11247e9e30..16c375298d 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -27,10 +27,8 @@ "Aplikasi yang diunduh dinonaktifkan dalam mode Aman" "Widget dinonaktifkan dalam mode Aman" "Pintasan tidak tersedia" - - - - + "Layar utama" + "Tindakan khusus" "Sentuh lama untuk memilih widget." "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index c59308cf01..f39628d1d5 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -27,10 +27,8 @@ "Sótt forrit er óvirkt í öryggisstillingu" "Græjur eru óvirkar í öruggri stillingu" "Flýtileið er ekki tiltæk" - - - - + "Heimaskjár" + "Sérsniðnar aðgerðir" "Haltu fingri á græju til að grípa hana." "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index eebdc59305..e4e1242bc3 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -27,10 +27,8 @@ "L\'app scaricata è stata disattivata in modalità provvisoria" "Widget disabilitati in modalità provvisoria" "La scorciatoia non è disponibile" - - - - + "Schermata Home" + "Azioni personalizzate" "Tocca e tieni premuto per scegliere un widget." "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index b0f81537ad..c04bf129b3 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -27,10 +27,8 @@ "אפליקציה שהורדת הושבתה במצב בטוח" "ווידג\'טים מושבתים במצב בטוח" "קיצור הדרך אינו זמין" - - - - + "מסך דף הבית" + "פעולות מותאמות אישית" "גע נגיעה רציפה בווידג\'ט כדי לבחור בו." "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index ae6734c241..ea9d381a10 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -27,10 +27,8 @@ "ダウンロードしたアプリは、セーフモードでは無効です" "セーフモードではウィジェットは無効です" "ショートカットは使用できません" - - - - + "ホーム画面" + "カスタム操作" "ウィジェットを追加するには押し続けます。" "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index e06fbe8db4..7c413897da 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -27,10 +27,8 @@ "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" "მალსახმობი მიუწვდომელია" - - - - + "მთავარი ეკრანი" + "მორგებული ქმედებები" "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 57efc1516a..7762cd711c 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -27,10 +27,8 @@ "Жүктелген қолданба қауіпсіз режимде өшірілген" "Қауіпсіз режимде виджеттер өшіріледі" "Таңбаша қолжетімді емес" - - - - + "Негізгі экран" + "Арнаулы әрекеттер" "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index b517cd3a35..862a652796 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -27,10 +27,8 @@ "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" "ផ្លូវកាត់មិនអាចប្រើបានទេ" - - - - + "អេក្រង់ដើម" + "សកម្មភាព​ផ្ទាល់ខ្លួន" "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index b234328cd2..33eb3bb274 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -27,10 +27,8 @@ "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್ ಲಭ್ಯವಿಲ್ಲ" - - - - + "ಮುಖಪುಟದ ಪರದೆ" + "ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳು" "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 67d5d9111d..bcc1699a99 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -27,10 +27,8 @@ "다운로드한 앱은 안전 모드에서 사용할 수 없습니다." "안전 모드에서 위젯 사용 중지됨" "바로가기를 사용할 수 없음" - - - - + "메인 스크린" + "맞춤 작업" "위젯을 선택하려면 길게 터치하세요." "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8494d20169..75700cecea 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -27,10 +27,8 @@ "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" "Виджеттер Коопсуз режимде өчүрүлгөн" "Кыска жол жок" - - - - + "Башкы экран" + "Ыңгайлаштырылган аракеттер" "Виджетти тандаш үчүн, басып туруңуз" "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index a62585ea55..31b7db44cc 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -27,10 +27,8 @@ "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" "ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້" - - - - + "ໜ້າຈໍຫຼັກ" + "ຄຳສັ່ງແບບກຳນົດເອງ" "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index c076b89e08..1564d459a8 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -27,10 +27,8 @@ "Atsisiųsta programa išjungta Saugos režimu" "Valdikliai išjungti Saugiame režime" "Sparčiojo klavišo negalima naudoti" - - - - + "Pagrindinis ekranas" + "Tinkinti veiksmai" "Palieskite ir laikykite, kad pasirinkt. valdiklį." "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index a7ba59d733..6458d0b4ab 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -27,10 +27,8 @@ "Lejupielādētā lietotne ir atspējota drošajā režīmā." "Logrīki atspējoti drošajā režīmā" "Saīsne nav pieejama." - - - - + "Sākuma ekrāns" + "Pielāgotās darbības" "Lai izvēlētos logrīku, pieskarieties un turiet to." "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 6daef64693..83da8a1b7f 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -27,10 +27,8 @@ "Преземената апликација е оневозможена во безбеден режим" "Додатоците се оневозможени во безбеден режим" "Кратенката не е достапна" - - - - + "Почетен екран" + "Приспособени дејства" "Допри и задржи за да се избере виџетот." "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index af73dc1cae..95a558aae4 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -27,10 +27,8 @@ "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" "കുറുക്കുവഴി ലഭ്യമല്ല" - - - - + "ഹോം സ്‌ക്രീൻ" + "ഇഷ്‌ടാനുസൃത പ്രവർത്തനങ്ങൾ" "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 174bb535e9..d9efe5d475 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -27,10 +27,8 @@ "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" "Товчлол алга" - - - - + "Үндсэн нүүр" + "Захиалгат үйлдэл" "Виджетийг авах бол хүрээд барина уу." "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index cf2612de79..5938b8e53c 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -27,10 +27,8 @@ "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" "विजेट सुरक्षित मोडमध्ये अक्षम झाले" "शॉर्टकट उपलब्ध नाही" - - - - + "मुख्यपृष्ठ" + "सानुकूल क्रिया" "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index a037fc24c3..63de9cb376 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -27,10 +27,8 @@ "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" "Widget dilumpuhkan dalam mod Selamat" "Pintasan tidak tersedia" - - - - + "Skrin utama" + "Tindakan tersuai" "Sentuh & tahan untuk mengambil widget." "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 71cf2e4374..c65f3abef8 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -27,10 +27,8 @@ "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" "ဖြတ်လမ်း မရနိုင်ပါ" - - - - + "ပင်မစာမျက်နှာ" + "စိတ်ကြိုက် လုပ်ဆောင်ချက်များ" "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index b84e8ce7b4..38f027a639 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -27,10 +27,8 @@ "En nedlastet app er deaktivert i sikker modus" "Moduler er deaktivert i sikker modus" "Snarveien er ikke tilgjengelig" - - - - + "Startskjerm" + "Tilpassede handlinger" "Trykk og hold inne for å plukke opp en modul." "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 3d8cea136e..330352f404 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -27,10 +27,8 @@ "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" "सर्टकट उपलब्ध छैन" - - - - + "गृह स्क्रिन" + "आफू अनुकूलका कारबाहीहरू" "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" "विजेटलाई छान्न वा अनुकूलन कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 6179fff347..58f63e6adb 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -27,10 +27,8 @@ "Gedownloade app uitgeschakeld in veilige modus" "Widgets uitgeschakeld in Veilige modus" "Snelkoppeling is niet beschikbaar" - - - - + "Startscherm" + "Aangepaste acties" "Blijf aanraken om een widget toe te voegen." "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index c703edb246..38769aaf50 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -27,10 +27,8 @@ "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਵਿਜਿਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" "ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" - - - - + "ਮੁੱਖ ਸਕ੍ਰੀਨ" + "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਾਰਵਾਈਆਂ" "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index fb923412b7..1e2fc47d0c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -27,10 +27,8 @@ "Pobrana aplikacja została wyłączona w trybie awaryjnym" "Widżety są wyłączone w trybie bezpiecznym" "Skrót nie jest dostępny" - - - - + "Ekran główny" + "Działania niestandardowe" "Aby dodać widżet, kliknij go i przytrzymaj." "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8ccac334fb..000c7adb20 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -27,10 +27,8 @@ "Aplicação transferida desativada no Modo de segurança" "Widgets desativados no Modo de segurança" "O atalho não está disponível" - - - - + "Ecrã principal" + "Ações personalizadas" "Prima sem soltar para escolher um widget." "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index bdf4c08331..9969997de8 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -27,10 +27,8 @@ "App transferido por download desativado no modo de segurança" "Widgets desativados no modo de segurança" "O atalho não está disponível" - - - - + "Tela inicial" + "Ações personalizadas" "Toque e pressione para selecionar um widget." "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 7499caa679..6faf57f785 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -27,10 +27,8 @@ "Aplicația descărcată este dezactivată în modul de siguranță" "Widgeturile sunt dezactivate în modul de siguranță" "Comanda rapidă nu este disponibilă" - - - - + "Ecran de pornire" + "Acțiuni personalizate" "Atingeți lung un widget pentru a-l alege." "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 3e5b5f48e6..7bc18194a7 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -27,10 +27,8 @@ "Скачанное приложение отключено в безопасном режиме" "Виджеты отключены в безопасном режиме" "Ярлык недоступен" - - - - + "Главный экран" + "Пользовательские действия" "Чтобы выбрать виджет, нажмите на значок и удерживайте его." "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index d0444f3cf8..df4b411151 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -27,10 +27,8 @@ "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" "කෙටි මග ලබා ගත නොහැකිය" - - - - + "මුල් පිටු තිරය" + "අභිරුචි ක්‍රියා" "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index dab8403e71..d0a2e5925c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -27,10 +27,8 @@ "Stiahnutá aplikácia je v núdzovom režime zakázaná" "Miniaplikácie sú v núdzovom režime zakázané" "Skratky nie sú k dispozícii" - - - - + "Plocha" + "Vlastné akcie" "Miniaplikáciu pridáte stlačením a podržaním." "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index dbddf9bc85..0682f8d160 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -27,10 +27,8 @@ "Prenesena aplikacija je onemogočena v Varnem načinu" "Pripomočki so onemogočeni v varnem načinu" "Bližnjica ni na voljo" - - - - + "Začetni zaslon" + "Dejanja po meri" "Za izbiro pripomočka se ga dotaknite in pridržite." "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 50fb9e25c3..701eaf8d3d 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -27,10 +27,8 @@ "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" "Shkurtorja nuk është e disponueshme" - - - - + "Ekrani bazë" + "Veprimet e personalizuara" "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 564c653038..a396f18b25 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -27,10 +27,8 @@ "Преузета апликација је онемогућена у Безбедном режиму" "Виџети су онемогућени у Безбедном режиму" "Пречица није доступна" - - - - + "Почетни екран" + "Прилагођене радње" "Додирните и задржите да бисте изабрали виџет." "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 62034d4277..907de79322 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -27,10 +27,8 @@ "Den hämtade appen inaktiverades i säkert läge" "Widgets är inaktiverade i felsäkert läge" "Genvägen är inte tillgänglig" - - - - + "Startskärm" + "Anpassade åtgärder" "Tryck länge om du vill flytta en widget." "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index ae9657e881..20654e057a 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -27,10 +27,8 @@ "Programu iliyopakuliwa imezimwa katika Hali Salama" "Wijeti zimezimwa katika hali ya Usalama" "Hakuna njia ya mkato" - - - - + "Skrini ya kwanza" + "Vitendo maalum" "Gusa na ushikilie ili kuteua wijeti." "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 24aa9bcdea..fd51b71351 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -27,10 +27,8 @@ "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" "குறுக்குவழி இல்லை" - - - - + "முகப்புத் திரை" + "தனிப்பயன் செயல்கள்" "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 1d3989bdf5..ba19ddca9f 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -27,10 +27,8 @@ "డౌన్‌లోడ్ చేసిన అనువర్తనం సురక్షిత మోడ్‌లో నిలిపివేయబడింది" "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" "సత్వరమార్గం అందుబాటులో లేదు" - - - - + "హోమ్ స్క్రీన్" + "అనుకూల చర్యలు" "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index bd85e130ab..4bcda7afe7 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -27,10 +27,8 @@ "แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย" "มีการปิดใช้งานวิดเจ็ตในเซฟโหมด" "ทางลัดไม่พร้อมใช้งาน" - - - - + "หน้าจอหลัก" + "การทำงานที่กำหนดเอง" "แตะค้างเพื่อรับวิดเจ็ต" "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 544af15dfc..55e02e9a0c 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -27,10 +27,8 @@ "Naka-disable ang na-download na app sa Safe mode" "Naka-disable ang mga widget sa Safe mode" "Hindi available ang shortcut" - - - - + "Home screen" + "Mga custom na pagkilos" "Pindutin nang matagal upang kumuha ng widget." "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index b1fa6b1f91..f30b559877 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -27,10 +27,8 @@ "İndirilen uygulama Güvenli modda devre dışı bırakıldı" "Güvenli modda widget\'lar devre dışı" "Kısayol kullanılamıyor" - - - - + "Ana ekran" + "Özel işlemler" "Widget seçmek için dokunun ve basılı tutun." "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 96c0febc73..750b6a0e80 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -27,10 +27,8 @@ "Завантажений додаток вимкнено в безпечному режимі" "У безпечному режимі віджети вимкнено" "Ярлик недоступний" - - - - + "Головний екран" + "Спеціальні дії" "Натисніть і утримуйте, щоб вибрати віджет." "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index e7bed280be..b285de0d30 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -27,10 +27,8 @@ "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" "شارٹ کٹ دستیاب نہیں ہے" - - - - + "ہوم اسکرین" + "حسب ضرورت کارروائیاں" "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index eb8d7caa15..77b7367cae 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -27,10 +27,8 @@ "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" "Tezkor tugmadan foydalanib bo‘lmaydi" - - - - + "Bosh ekran" + "Maxsus amallar" "Vidjetni tanlash uchun bosib turing." "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 3b43c4dc7e..2d953e68a8 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -27,10 +27,8 @@ "Ứng dụng đã tải xuống bị tắt ở chế độ An toàn" "Tiện ích con bị vô hiệu hóa ở chế độ an toàn" "Lối tắt không khả dụng" - - - - + "Màn hình chính" + "Tác vụ tùy chỉnh" "Chạm và giữ để chọn tiện ích con." "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 81d1cf9e96..7967812629 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -27,10 +27,8 @@ "安全模式下不允许使用下载的此应用" "安全模式下不允许使用小部件" "无法使用快捷方式" - - - - + "主屏幕" + "自定义操作" "触摸并按住小部件即可选择。" "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index ee9639cb59..236fc4246e 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -27,10 +27,8 @@ "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式中無法使用小工具" "沒有可用的捷徑" - - - - + "主畫面" + "自訂操作" "輕觸並按住小工具即可選取。" "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index b4338dff21..8d4c74497f 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -27,10 +27,8 @@ "在安全模式中無法使用「已下載的應用程式」功能" "在安全模式下無法使用小工具" "目前無法使用捷徑" - - - - + "主螢幕" + "自訂動作" "輕觸並按住小工具即可選取。" "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 6655bd35d3..88d4295432 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -27,10 +27,8 @@ "Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile" "Amawijethi akhutshaziwe kwimodi yokuphepha" "Isinqamuleli asitholakali" - - - - + "Isikrini sasekhaya" + "Izenzo zangokwezifiso" "Thinta uphinde ubambe ukuze uphakamise iwijethi." "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" From 8e0e1d76095badc58a3178917c43642065ace37c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 10 Oct 2016 10:41:41 -0700 Subject: [PATCH 061/382] Moving come helper methods to corresponding classes > Moving isPackageEnabled to InstallShortcutReceiver > Moving the deep shortcut map to the data model > Removing appInfo.flags. Instead fetching the flags when needed Change-Id: I654dd8acefa7b7d183b0419afbe112bef001d536 --- src/com/android/launcher3/AllAppsList.java | 7 +- src/com/android/launcher3/AppInfo.java | 20 ----- .../launcher3/InstallShortcutReceiver.java | 3 +- src/com/android/launcher3/LauncherModel.java | 73 +++---------------- .../android/launcher3/LauncherProvider.java | 2 +- src/com/android/launcher3/ShortcutInfo.java | 9 --- .../launcher3/UninstallDropTarget.java | 40 ++++++---- .../android/launcher3/model/BgDataModel.java | 40 ++++++++++ 8 files changed, 81 insertions(+), 113 deletions(-) diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index c427ddc939..0e465a41ec 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -33,7 +33,7 @@ import java.util.List; /** * Stores the list of all applications for the all apps view. */ -class AllAppsList { +public class AllAppsList { public static final int DEFAULT_APPLICATIONS_NUMBER = 42; /** The list off all apps. */ @@ -112,8 +112,7 @@ class AllAppsList { final List data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); - final ComponentName component = info.intent.getComponent(); - if (info.user.equals(user) && packageName.equals(component.getPackageName())) { + if (info.user.equals(user) && packageName.equals(info.componentName.getPackageName())) { removed.add(info); data.remove(i); } @@ -127,7 +126,7 @@ class AllAppsList { final List data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); - if (matcher.matches(info, info.intent.getComponent())) { + if (matcher.matches(info, info.componentName)) { info.isDisabled = op.apply(info.isDisabled); modified.add(info); } diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 4c4d67c599..3b22f46f2f 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -52,11 +52,6 @@ public class AppInfo extends ItemInfo { public ComponentName componentName; - static final int DOWNLOADED_FLAG = 1; - static final int UPDATED_SYSTEM_APP_FLAG = 2; - - int flags = 0; - /** * {@see ShortcutInfo#isDisabled} */ @@ -88,7 +83,6 @@ public class AppInfo extends ItemInfo { IconCache iconCache, boolean quietModeEnabled) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; - flags = initFlags(info); if (PackageManagerHelper.isAppSuspended(info.getApplicationInfo())) { isDisabled |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; } @@ -101,25 +95,11 @@ public class AppInfo extends ItemInfo { this.user = user; } - public static int initFlags(LauncherActivityInfoCompat info) { - int appFlags = info.getApplicationInfo().flags; - int flags = 0; - if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) { - flags |= DOWNLOADED_FLAG; - - if ((appFlags & android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { - flags |= UPDATED_SYSTEM_APP_FLAG; - } - } - return flags; - } - public AppInfo(AppInfo info) { super(info); componentName = info.componentName; title = Utilities.trim(info.title); intent = new Intent(info.intent); - flags = info.flags; isDisabled = info.isDisabled; iconBitmap = info.iconBitmap; } diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index d8e58d8294..bd20e324b2 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -226,7 +226,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { String packageName = pendingInfo.getTargetPackage(); if (!TextUtils.isEmpty(packageName)) { UserHandleCompat myUserHandle = UserHandleCompat.myUserHandle(); - if (!LauncherModel.isValidPackage(context, packageName, myUserHandle)) { + if (!LauncherAppsCompat.getInstance(context) + .isPackageEnabledForProfile(packageName, myUserHandle)) { if (DBG) Log.d(TAG, "Ignoring shortcut for absent package: " + pendingInfo.launchIntent); continue; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 4afff18988..3f9c2a3243 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -93,7 +93,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Executor; @@ -145,9 +144,6 @@ public class LauncherModel extends BroadcastReceiver // Entire list of widgets. private final WidgetsModel mBgWidgetsModel; - // Maps all launcher activities to the id's of their shortcuts (if they have any). - private final MultiHashMap mBgDeepShortcutMap = new MultiHashMap<>(); - private boolean mHasShortcutHostPermission; // Runnable to check if the shortcuts permission has changed. private final Runnable mShortcutPermissionCheckRunnable = new Runnable() { @@ -316,15 +312,7 @@ public class LauncherModel extends BroadcastReceiver ComponentName cn = si.getTargetComponent(); if (si.isPromise() && (cn != null) && packageName.equals(cn.getPackageName())) { - if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { - // For auto install apps update the icon as well as label. - mIconCache.getTitleAndIcon(si, - si.promisedIntent, user, - si.shouldUseLowResIcon()); - } else { - // Only update the icon for restored apps. - si.updateIcon(mIconCache); - } + si.updateIcon(mIconCache); updates.add(si); } } @@ -2647,14 +2635,14 @@ public class LauncherModel extends BroadcastReceiver Log.d(TAG, "loadAndBindDeepShortcuts mDeepShortcutsLoaded=" + mDeepShortcutsLoaded); } if (!mDeepShortcutsLoaded) { - mBgDeepShortcutMap.clear(); + sBgDataModel.deepShortcutMap.clear(); mHasShortcutHostPermission = mDeepShortcutManager.hasHostPermission(); if (mHasShortcutHostPermission) { for (UserHandleCompat user : mUserManager.getUserProfiles()) { if (mUserManager.isUserUnlocked(user)) { List shortcuts = mDeepShortcutManager .queryForAllShortcuts(user); - updateDeepShortcutMap(null, user, shortcuts); + sBgDataModel.updateDeepShortcutMap(null, user, shortcuts); } } } @@ -2678,36 +2666,9 @@ public class LauncherModel extends BroadcastReceiver } } - /** - * Clear all the shortcuts for the given package, and re-add the new shortcuts. - */ - private void updateDeepShortcutMap( - String packageName, UserHandleCompat user, List shortcuts) { - if (packageName != null) { - Iterator keysIter = mBgDeepShortcutMap.keySet().iterator(); - while (keysIter.hasNext()) { - ComponentKey next = keysIter.next(); - if (next.componentName.getPackageName().equals(packageName) - && next.user.equals(user)) { - keysIter.remove(); - } - } - } - - // Now add the new shortcuts to the map. - for (ShortcutInfoCompat shortcut : shortcuts) { - boolean shouldShowInContainer = shortcut.isEnabled() - && (shortcut.isDeclaredInManifest() || shortcut.isDynamic()); - if (shouldShowInContainer) { - ComponentKey targetComponent - = new ComponentKey(shortcut.getActivity(), shortcut.getUserHandle()); - mBgDeepShortcutMap.addToList(targetComponent, shortcut.getId()); - } - } - } - public void bindDeepShortcuts() { - final MultiHashMap shortcutMapCopy = mBgDeepShortcutMap.clone(); + final MultiHashMap shortcutMapCopy = + sBgDataModel.deepShortcutMap.clone(); Runnable r = new Runnable() { @Override public void run() { @@ -2989,11 +2950,6 @@ public class LauncherModel extends BroadcastReceiver } } - // Restore the shortcut. - if (appInfo != null) { - si.flags = appInfo.flags; - } - si.intent = si.promisedIntent; si.promisedIntent = null; si.status = ShortcutInfo.DEFAULT; @@ -3221,7 +3177,7 @@ public class LauncherModel extends BroadcastReceiver if (mUpdateIdMap) { // Update the deep shortcut map if the list of ids has changed for an activity. - updateDeepShortcutMap(mPackageName, mUser, mShortcuts); + sBgDataModel.updateDeepShortcutMap(mPackageName, mUser, mShortcuts); bindDeepShortcuts(); } } @@ -3289,7 +3245,7 @@ public class LauncherModel extends BroadcastReceiver } // Remove shortcut id map for that user - Iterator keysIter = mBgDeepShortcutMap.keySet().iterator(); + Iterator keysIter = sBgDataModel.deepShortcutMap.keySet().iterator(); while (keysIter.hasNext()) { if (keysIter.next().user.equals(mUser)) { keysIter.remove(); @@ -3297,7 +3253,8 @@ public class LauncherModel extends BroadcastReceiver } if (isUserUnlocked) { - updateDeepShortcutMap(null, mUser, mDeepShortcutManager.queryForAllShortcuts(mUser)); + sBgDataModel.updateDeepShortcutMap( + null, mUser, mDeepShortcutManager.queryForAllShortcuts(mUser)); } bindDeepShortcuts(); } @@ -3338,15 +3295,6 @@ public class LauncherModel extends BroadcastReceiver return !launcherApps.isPackageEnabledForProfile(packageName, user); } - public static boolean isValidPackage(Context context, String packageName, - UserHandleCompat user) { - if (packageName == null) { - return false; - } - final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - return launcherApps.isPackageEnabledForProfile(packageName, user); - } - /** * Make an ShortcutInfo object for a restored application or shortcut item that points * to a package that is not yet installed on the system. @@ -3454,9 +3402,6 @@ public class LauncherModel extends BroadcastReceiver info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; info.user = user; info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); - if (lai != null) { - info.flags = AppInfo.initFlags(lai); - } return info; } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index e1ff6dbc11..229dd9cbac 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -1014,7 +1014,7 @@ public class LauncherProvider extends ContentProvider { public void checkId(String table, ContentValues values) { long id = values.getAsLong(LauncherSettings.BaseLauncherColumns._ID); - if (table == WorkspaceScreens.TABLE_NAME) { + if (WorkspaceScreens.TABLE_NAME.equals(table)) { mMaxScreenId = Math.max(id, mMaxScreenId); } else { mMaxItemId = Math.max(id, mMaxItemId); diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index ce06291360..9a9287234d 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -147,11 +147,6 @@ public class ShortcutInfo extends ItemInfo { */ private int mInstallProgress; - /** - * TODO move this to {@link #status} - */ - int flags = 0; - /** * If this shortcut is a placeholder, then intent will be a market intent for the package, and * this will hold the original intent from the database. Otherwise, null. @@ -189,7 +184,6 @@ public class ShortcutInfo extends ItemInfo { intent = new Intent(info.intent); iconResource = info.iconResource; mIcon = info.mIcon; // TODO: should make a copy here. maybe we don't need this ctor at all - flags = info.flags; status = info.status; mInstallProgress = info.mInstallProgress; isDisabled = info.isDisabled; @@ -201,7 +195,6 @@ public class ShortcutInfo extends ItemInfo { super(info); title = Utilities.trim(info.title); intent = new Intent(info.intent); - flags = info.flags; isDisabled = info.isDisabled; } @@ -212,7 +205,6 @@ public class ShortcutInfo extends ItemInfo { .getBadgedLabelForUser(info.getLabel(), info.getUser()); intent = AppInfo.makeLaunchIntent(context, info, info.getUser()); itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; - flags = AppInfo.initFlags(info); } /** @@ -222,7 +214,6 @@ public class ShortcutInfo extends ItemInfo { public ShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { user = shortcutInfo.getUserHandle(); itemType = LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; - flags = 0; updateFromDeepShortcutInfo(shortcutInfo, context); } diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index 91539439c2..7ea9aca7c8 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -4,6 +4,7 @@ import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -12,6 +13,8 @@ import android.util.AttributeSet; import android.util.Pair; import android.widget.Toast; +import com.android.launcher3.compat.LauncherActivityInfoCompat; +import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; public class UninstallDropTarget extends ButtonDropTarget { @@ -49,23 +52,34 @@ public class UninstallDropTarget extends ButtonDropTarget { } } - Pair componentInfo = getAppInfoFlags(info); - return componentInfo != null && (componentInfo.second & AppInfo.DOWNLOADED_FLAG) != 0; + return getUninstallTarget(context, info) != null; } /** - * @return the component name and flags if {@param info} is an AppInfo or an app shortcut. + * @return the component name that should be uninstalled or null. */ - private static Pair getAppInfoFlags(Object item) { + private static ComponentName getUninstallTarget(Context context, Object item) { + Intent intent = null; + UserHandleCompat user = null; if (item instanceof AppInfo) { AppInfo info = (AppInfo) item; - return Pair.create(info.componentName, info.flags); + intent = info.intent; + user = info.user; } else if (item instanceof ShortcutInfo) { ShortcutInfo info = (ShortcutInfo) item; - ComponentName component = info.getTargetComponent(); - if (info.itemType == LauncherSettings.BaseLauncherColumns.ITEM_TYPE_APPLICATION - && component != null) { - return Pair.create(component, info.flags); + if (info.itemType == LauncherSettings.BaseLauncherColumns.ITEM_TYPE_APPLICATION) { + // Do not use restore/target intent here as we cannot uninstall an app which is + // being installed/restored. + intent = info.intent; + user = info.user; + } + } + if (intent != null) { + LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(context) + .resolveActivity(intent, user); + if (info != null + && (info.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + return info.getComponentName(); } } return null; @@ -93,11 +107,10 @@ public class UninstallDropTarget extends ButtonDropTarget { public static boolean startUninstallActivity( final Launcher launcher, ItemInfo info, DropTargetResultCallback callback) { - Pair componentInfo = getAppInfoFlags(info); - ComponentName cn = componentInfo.first; + final ComponentName cn = getUninstallTarget(launcher, info); final boolean isUninstallable; - if ((componentInfo.second & AppInfo.DOWNLOADED_FLAG) == 0) { + if (cn == null) { // System applications cannot be installed. For now, show a toast explaining that. // We may give them the option of disabling apps this way. Toast.makeText(launcher, R.string.uninstall_system_app_text, Toast.LENGTH_SHORT).show(); @@ -112,8 +125,7 @@ public class UninstallDropTarget extends ButtonDropTarget { isUninstallable = true; } if (callback != null) { - sendUninstallResult( - launcher, isUninstallable, componentInfo.first, info.user, callback); + sendUninstallResult(launcher, isUninstallable, cn, info.user, callback); } return isUninstallable; } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 2b7039928d..c18eeef3d7 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -24,13 +24,19 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; +import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.LongArrayMap; +import com.android.launcher3.util.MultiHashMap; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; /** @@ -72,6 +78,11 @@ public class BgDataModel { */ public final Map pinnedShortcutCounts = new HashMap<>(); + /** + * Maps all launcher activities to the id's of their shortcuts (if they have any). + */ + public final MultiHashMap deepShortcutMap = new MultiHashMap<>(); + /** * Clears all the data */ @@ -82,6 +93,7 @@ public class BgDataModel { itemsIdMap.clear(); workspaceScreens.clear(); pinnedShortcutCounts.clear(); + deepShortcutMap.clear(); } public synchronized void removeItem(ItemInfo... items) { @@ -194,4 +206,32 @@ public class BgDataModel { } return folderInfo; } + + /** + * Clear all the deep shortcuts for the given package, and re-add the new shortcuts. + */ + public synchronized void updateDeepShortcutMap( + String packageName, UserHandleCompat user, List shortcuts) { + if (packageName != null) { + Iterator keysIter = deepShortcutMap.keySet().iterator(); + while (keysIter.hasNext()) { + ComponentKey next = keysIter.next(); + if (next.componentName.getPackageName().equals(packageName) + && next.user.equals(user)) { + keysIter.remove(); + } + } + } + + // Now add the new shortcuts to the map. + for (ShortcutInfoCompat shortcut : shortcuts) { + boolean shouldShowInContainer = shortcut.isEnabled() + && (shortcut.isDeclaredInManifest() || shortcut.isDynamic()); + if (shouldShowInContainer) { + ComponentKey targetComponent + = new ComponentKey(shortcut.getActivity(), shortcut.getUserHandle()); + deepShortcutMap.addToList(targetComponent, shortcut.getId()); + } + } + } } From 5d9fb0e92f2ef2b25f3aa93c1f89838ccc68aa88 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sat, 8 Oct 2016 17:43:48 -0700 Subject: [PATCH 062/382] Simplifying fast scroller logic > Using a separate view for drawing the popup. This allows us to use elevation property instead of drawing the shadow as bitmap. > During the thumb animation, invalidating the full track width, instead of invalidating the track and thumb separately. > The thumb path is calculated at 0,0 and drawn using canvas.translate(). This avoids recalculating the path on every scroll. Change-Id: I48741e5b4432df0d939016db284d7aaf52cc2aa6 --- res/layout/all_apps.xml | 16 + res/layout/widgets_view.xml | 16 + res/values/dimens.xml | 1 + .../android/launcher3/BaseRecyclerView.java | 25 +- .../BaseRecyclerViewFastScrollBar.java | 276 +++++++++--------- .../BaseRecyclerViewFastScrollPopup.java | 198 ------------- .../allapps/AllAppsContainerView.java | 2 +- .../allapps/AllAppsRecyclerView.java | 13 +- .../graphics/HolographicOutlineHelper.java | 22 +- .../launcher3/widget/WidgetsRecyclerView.java | 2 +- 10 files changed, 203 insertions(+), 368 deletions(-) delete mode 100644 src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 926883927f..d48bd500e6 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -55,6 +55,22 @@ android:focusable="true" android:theme="@style/CustomOverscroll.Light" /> + + + + + + 5dp 9dp + 18dp 72dp -24dp 72dp diff --git a/src/com/android/launcher3/BaseRecyclerView.java b/src/com/android/launcher3/BaseRecyclerView.java index 45bc940064..9bdbe2580a 100644 --- a/src/com/android/launcher3/BaseRecyclerView.java +++ b/src/com/android/launcher3/BaseRecyclerView.java @@ -22,6 +22,8 @@ import android.graphics.Rect; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; +import android.view.ViewGroup; + import com.android.launcher3.util.Thunk; @@ -41,7 +43,7 @@ public abstract class BaseRecyclerView extends RecyclerView @Thunk int mDy = 0; private float mDeltaThreshold; - protected BaseRecyclerViewFastScrollBar mScrollbar; + protected final BaseRecyclerViewFastScrollBar mScrollbar; private int mDownX; private int mDownY; @@ -92,6 +94,12 @@ public abstract class BaseRecyclerView extends RecyclerView addOnItemTouchListener(this); } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mScrollbar.setPopupView(((ViewGroup) getParent()).findViewById(R.id.fast_scroller_popup)); + } + /** * We intercept the touch handling only to support fast scrolling when initiated from the * scroll bar. Otherwise, we fall back to the default RecyclerView touch handling. @@ -235,7 +243,7 @@ public abstract class BaseRecyclerView extends RecyclerView // Only show the scrollbar if there is height to be scrolled int availableScrollBarHeight = getAvailableScrollBarHeight(); if (availableScrollHeight <= 0) { - mScrollbar.setThumbOffset(-1, -1); + mScrollbar.setThumbOffsetY(-1); return; } @@ -246,18 +254,7 @@ public abstract class BaseRecyclerView extends RecyclerView (int) (((float) scrollY / availableScrollHeight) * availableScrollBarHeight); // Calculate the position and size of the scroll bar - mScrollbar.setThumbOffset(getScrollBarX(), scrollBarY); - } - - /** - * @return the x position for the scrollbar thumb - */ - protected int getScrollBarX() { - if (Utilities.isRtl(getResources())) { - return mBackgroundPadding.left; - } else { - return getWidth() - mBackgroundPadding.right - mScrollbar.getThumbWidth(); - } + mScrollbar.setThumbOffsetY(scrollBarY); } /** diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java index 3d71632ce7..770166daea 100644 --- a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java +++ b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java @@ -15,21 +15,18 @@ */ package com.android.launcher3; -import android.animation.AnimatorSet; -import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; -import android.graphics.Point; import android.graphics.Rect; +import android.util.Property; import android.view.MotionEvent; +import android.view.View; import android.view.ViewConfiguration; - -import com.android.launcher3.util.Thunk; +import android.widget.TextView; /** * The track and scrollbar that shows when you scroll the list. @@ -40,29 +37,46 @@ public class BaseRecyclerViewFastScrollBar { void setFastScrollFocusState(final FastBitmapDrawable.State focusState, boolean animated); } + private static final Property TRACK_WIDTH = + new Property(Integer.class, "width") { + + @Override + public Integer get(BaseRecyclerViewFastScrollBar scrollBar) { + return scrollBar.mWidth; + } + + @Override + public void set(BaseRecyclerViewFastScrollBar scrollBar, Integer value) { + scrollBar.setTrackWidth(value); + } + }; + private final static int MAX_TRACK_ALPHA = 30; private final static int SCROLL_BAR_VIS_DURATION = 150; + private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 1.5f; - @Thunk BaseRecyclerView mRv; - private BaseRecyclerViewFastScrollPopup mPopup; + private final Rect mTmpRect = new Rect(); + private final BaseRecyclerView mRv; - private AnimatorSet mScrollbarAnimator; + private final boolean mIsRtl; - private int mThumbInactiveColor; - private int mThumbActiveColor; - @Thunk Point mThumbOffset = new Point(-1, -1); - @Thunk Paint mThumbPaint; - private int mThumbMinWidth; - private int mThumbMaxWidth; - @Thunk int mThumbWidth; - @Thunk int mThumbHeight; - private int mThumbCurvature; - private Path mThumbPath = new Path(); - private Paint mTrackPaint; - private int mTrackWidth; - private float mLastTouchY; // The inset is the buffer around which a point will still register as a click on the scrollbar - private int mTouchInset; + private final int mTouchInset; + + private final int mMinWidth; + private final int mMaxWidth; + + // Current width of the track + private int mWidth; + private ObjectAnimator mWidthAnimator; + + private final Path mThumbPath = new Path(); + private final Paint mThumbPaint; + private final int mThumbHeight; + + private final Paint mTrackPaint; + + private float mLastTouchY; private boolean mIsDragging; private boolean mIsThumbDetached; private boolean mCanThumbDetach; @@ -70,27 +84,35 @@ public class BaseRecyclerViewFastScrollBar { // This is the offset from the top of the scrollbar when the user first starts touching. To // prevent jumping, this offset is applied as the user scrolls. - private int mTouchOffset; + private int mTouchOffsetY; + private int mThumbOffsetY; - private Rect mInvalidateRect = new Rect(); - private Rect mTmpRect = new Rect(); + // Fast scroller popup + private TextView mPopupView; + private boolean mPopupVisible; + private String mPopupSectionName; public BaseRecyclerViewFastScrollBar(BaseRecyclerView rv, Resources res) { mRv = rv; - mPopup = new BaseRecyclerViewFastScrollPopup(rv, res); mTrackPaint = new Paint(); mTrackPaint.setColor(rv.getFastScrollerTrackColor(Color.BLACK)); mTrackPaint.setAlpha(MAX_TRACK_ALPHA); - mThumbActiveColor = mThumbInactiveColor = Utilities.getColorAccent(rv.getContext()); + mThumbPaint = new Paint(); mThumbPaint.setAntiAlias(true); - mThumbPaint.setColor(mThumbInactiveColor); + mThumbPaint.setColor(Utilities.getColorAccent(rv.getContext())); mThumbPaint.setStyle(Paint.Style.FILL); - mThumbWidth = mThumbMinWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_min_width); - mThumbMaxWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_max_width); + + mWidth = mMinWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_min_width); + mMaxWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_max_width); mThumbHeight = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_height); - mThumbCurvature = mThumbMaxWidth - mThumbMinWidth; mTouchInset = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_touch_inset); + mIsRtl = Utilities.isRtl(res); + updateThumbPath(); + } + + public void setPopupView(View popup) { + mPopupView = (TextView) popup; } public void setDetachThumbOnFastScroll() { @@ -101,51 +123,54 @@ public class BaseRecyclerViewFastScrollBar { mIsThumbDetached = false; } - public void setThumbOffset(int x, int y) { - if (mThumbOffset.x == x && mThumbOffset.y == y) { + private int getDrawLeft() { + return mIsRtl ? 0 : (mRv.getWidth() - mMaxWidth); + } + + public void setThumbOffsetY(int y) { + if (mThumbOffsetY == y) { return; } - mInvalidateRect.set(mThumbOffset.x - mThumbCurvature, mThumbOffset.y, - mThumbOffset.x + mThumbWidth, mThumbOffset.y + mThumbHeight); - mThumbOffset.set(x, y); + + // Invalidate the previous and new thumb area + int drawLeft = getDrawLeft(); + mTmpRect.set(drawLeft, mThumbOffsetY, drawLeft + mMaxWidth, mThumbOffsetY + mThumbHeight); + mThumbOffsetY = y; + mTmpRect.union(drawLeft, mThumbOffsetY, drawLeft + mMaxWidth, mThumbOffsetY + mThumbHeight); + mRv.invalidate(mTmpRect); + } + + public int getThumbOffsetY() { + return mThumbOffsetY; + } + + private void setTrackWidth(int width) { + if (mWidth == width) { + return; + } + int left = getDrawLeft(); + // Invalidate the whole scroll bar area. + mRv.invalidate(left, 0, left + mMaxWidth, mRv.getVisibleHeight()); + + mWidth = width; updateThumbPath(); - mInvalidateRect.union(mThumbOffset.x - mThumbCurvature, mThumbOffset.y, - mThumbOffset.x + mThumbWidth, mThumbOffset.y + mThumbHeight); - mRv.invalidate(mInvalidateRect); } - public Point getThumbOffset() { - return mThumbOffset; - } + /** + * Updates the path for the thumb drawable. + */ + private void updateThumbPath() { + int smallWidth = mIsRtl ? mWidth : -mWidth; + int largeWidth = mIsRtl ? mMaxWidth : -mMaxWidth; - // Setter/getter for the thumb bar width for animations - public void setThumbWidth(int width) { - mInvalidateRect.set(mThumbOffset.x - mThumbCurvature, mThumbOffset.y, - mThumbOffset.x + mThumbWidth, mThumbOffset.y + mThumbHeight); - mThumbWidth = width; - updateThumbPath(); - mInvalidateRect.union(mThumbOffset.x - mThumbCurvature, mThumbOffset.y, - mThumbOffset.x + mThumbWidth, mThumbOffset.y + mThumbHeight); - mRv.invalidate(mInvalidateRect); - } - - public int getThumbWidth() { - return mThumbWidth; - } - - // Setter/getter for the track bar width for animations - public void setTrackWidth(int width) { - mInvalidateRect.set(mThumbOffset.x - mThumbCurvature, 0, mThumbOffset.x + mThumbWidth, - mRv.getVisibleHeight()); - mTrackWidth = width; - updateThumbPath(); - mInvalidateRect.union(mThumbOffset.x - mThumbCurvature, 0, mThumbOffset.x + mThumbWidth, - mRv.getVisibleHeight()); - mRv.invalidate(mInvalidateRect); - } - - public int getTrackWidth() { - return mTrackWidth; + mThumbPath.reset(); + mThumbPath.moveTo(0, 0); + mThumbPath.lineTo(0, mThumbHeight); // Left edge + mThumbPath.lineTo(smallWidth, mThumbHeight); // bottom edge + mThumbPath.cubicTo(smallWidth, mThumbHeight, // right edge + largeWidth, mThumbHeight / 2, + smallWidth, 0); + mThumbPath.close(); } public int getThumbHeight() { @@ -153,7 +178,7 @@ public class BaseRecyclerViewFastScrollBar { } public int getThumbMaxWidth() { - return mThumbMaxWidth; + return mMaxWidth; } public boolean isDraggingThumb() { @@ -176,7 +201,7 @@ public class BaseRecyclerViewFastScrollBar { switch (action) { case MotionEvent.ACTION_DOWN: if (isNearThumb(downX, downY)) { - mTouchOffset = downY - mThumbOffset.y; + mTouchOffsetY = downY - mThumbOffsetY; } break; case MotionEvent.ACTION_MOVE: @@ -191,32 +216,35 @@ public class BaseRecyclerViewFastScrollBar { if (mCanThumbDetach) { mIsThumbDetached = true; } - mTouchOffset += (lastY - downY); - mPopup.animateVisibility(true); + mTouchOffsetY += (lastY - downY); + animatePopupVisibility(true); showActiveScrollbar(true); } if (mIsDragging) { // Update the fastscroller section name at this touch position int top = mRv.getBackgroundPadding().top; int bottom = top + mRv.getVisibleHeight() - mThumbHeight; - float boundedY = (float) Math.max(top, Math.min(bottom, y - mTouchOffset)); + float boundedY = (float) Math.max(top, Math.min(bottom, y - mTouchOffsetY)); String sectionName = mRv.scrollToPositionAtProgress((boundedY - top) / (bottom - top)); - mPopup.setSectionName(sectionName); - mPopup.animateVisibility(!sectionName.isEmpty()); - mRv.invalidate(mPopup.updateFastScrollerBounds(lastY)); + if (!sectionName.equals(mPopupSectionName)) { + mPopupSectionName = sectionName; + mPopupView.setText(sectionName); + } + animatePopupVisibility(!sectionName.isEmpty()); + updatePopupY(lastY); mLastTouchY = boundedY; - setThumbOffset(mRv.getScrollBarX(), (int) mLastTouchY); + setThumbOffsetY((int) mLastTouchY); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - mTouchOffset = 0; + mTouchOffsetY = 0; mLastTouchY = 0; mIgnoreDragGesture = false; if (mIsDragging) { mIsDragging = false; - mPopup.animateVisibility(false); + animatePopupVisibility(false); showActiveScrollbar(false); } break; @@ -224,74 +252,58 @@ public class BaseRecyclerViewFastScrollBar { } public void draw(Canvas canvas) { - if (mThumbOffset.x < 0 || mThumbOffset.y < 0) { + if (mThumbOffsetY < 0) { return; } - - // Draw the scroll bar track and thumb - if (mTrackPaint.getAlpha() > 0) { - canvas.drawRect(mThumbOffset.x, 0, mThumbOffset.x + mThumbWidth, - mRv.getVisibleHeight(), mTrackPaint); + int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG); + if (!mIsRtl) { + canvas.translate(mRv.getWidth(), 0); } - canvas.drawPath(mThumbPath, mThumbPaint); + // Draw the track + int thumbWidth = mIsRtl ? mWidth : -mWidth; + canvas.drawRect(0, 0, thumbWidth, mRv.getVisibleHeight(), mTrackPaint); - // Draw the popup - mPopup.draw(canvas); + canvas.translate(0, mThumbOffsetY); + canvas.drawPath(mThumbPath, mThumbPaint); + canvas.restoreToCount(saveCount); } /** - * Animates the width and color of the scrollbar. + * Animates the width of the scrollbar. */ private void showActiveScrollbar(boolean isScrolling) { - if (mScrollbarAnimator != null) { - mScrollbarAnimator.cancel(); + if (mWidthAnimator != null) { + mWidthAnimator.cancel(); } - mScrollbarAnimator = new AnimatorSet(); - ObjectAnimator trackWidthAnim = ObjectAnimator.ofInt(this, "trackWidth", - isScrolling ? mThumbMaxWidth : mThumbMinWidth); - ObjectAnimator thumbWidthAnim = ObjectAnimator.ofInt(this, "thumbWidth", - isScrolling ? mThumbMaxWidth : mThumbMinWidth); - mScrollbarAnimator.playTogether(trackWidthAnim, thumbWidthAnim); - if (mThumbActiveColor != mThumbInactiveColor) { - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), - mThumbPaint.getColor(), isScrolling ? mThumbActiveColor : mThumbInactiveColor); - colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animator) { - mThumbPaint.setColor((Integer) animator.getAnimatedValue()); - mRv.invalidate(mThumbOffset.x, mThumbOffset.y, mThumbOffset.x + mThumbWidth, - mThumbOffset.y + mThumbHeight); - } - }); - mScrollbarAnimator.play(colorAnimation); - } - mScrollbarAnimator.setDuration(SCROLL_BAR_VIS_DURATION); - mScrollbarAnimator.start(); - } - - /** - * Updates the path for the thumb drawable. - */ - private void updateThumbPath() { - mThumbCurvature = mThumbMaxWidth - mThumbWidth; - mThumbPath.reset(); - mThumbPath.moveTo(mThumbOffset.x + mThumbWidth, mThumbOffset.y); // tr - mThumbPath.lineTo(mThumbOffset.x + mThumbWidth, mThumbOffset.y + mThumbHeight); // br - mThumbPath.lineTo(mThumbOffset.x, mThumbOffset.y + mThumbHeight); // bl - mThumbPath.cubicTo(mThumbOffset.x, mThumbOffset.y + mThumbHeight, - mThumbOffset.x - mThumbCurvature, mThumbOffset.y + mThumbHeight / 2, - mThumbOffset.x, mThumbOffset.y); // bl2tl - mThumbPath.close(); + mWidthAnimator = ObjectAnimator.ofInt(this, TRACK_WIDTH, + isScrolling ? mMaxWidth : mMinWidth); + mWidthAnimator.setDuration(SCROLL_BAR_VIS_DURATION); + mWidthAnimator.start(); } /** * Returns whether the specified points are near the scroll bar bounds. */ public boolean isNearThumb(int x, int y) { - mTmpRect.set(mThumbOffset.x, mThumbOffset.y, mThumbOffset.x + mThumbWidth, - mThumbOffset.y + mThumbHeight); + int left = getDrawLeft(); + mTmpRect.set(left, mThumbOffsetY, left + mMaxWidth, mThumbOffsetY + mThumbHeight); mTmpRect.inset(mTouchInset, mTouchInset); return mTmpRect.contains(x, y); } + + private void animatePopupVisibility(boolean visible) { + if (mPopupVisible != visible) { + mPopupVisible = visible; + mPopupView.animate().cancel(); + mPopupView.animate().alpha(visible ? 1f : 0f).setDuration(visible ? 200 : 150).start(); + } + } + + private void updatePopupY(int lastTouchY) { + int height = mPopupView.getHeight(); + float top = lastTouchY - (FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR * height); + top = Math.max(mMaxWidth, Math.min(top, mRv.getVisibleHeight() - mMaxWidth - height)); + mPopupView.setTranslationY(top); + } } diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java deleted file mode 100644 index b9b044db9d..0000000000 --- a/src/com/android/launcher3/BaseRecyclerViewFastScrollPopup.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.launcher3; - -import android.animation.Animator; -import android.animation.ObjectAnimator; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; - -import com.android.launcher3.graphics.HolographicOutlineHelper; - -/** - * The fast scroller popup that shows the section name the list will jump to. - */ -public class BaseRecyclerViewFastScrollPopup { - - private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 1.5f; - - private static final int SHADOW_INSET = 3; - private static final int SHADOW_SHIFT_Y = 2; - private static final float SHADOW_ALPHA_MULTIPLIER = 0.67f; - - private Resources mRes; - private BaseRecyclerView mRv; - - private Bitmap mShadow; - private Paint mShadowPaint; - - private Drawable mBg; - // The absolute bounds of the fast scroller bg - private Rect mBgBounds = new Rect(); - private int mBgOriginalSize; - private Rect mInvalidateRect = new Rect(); - private Rect mTmpRect = new Rect(); - - private String mSectionName; - private Paint mTextPaint; - private Rect mTextBounds = new Rect(); - private float mAlpha; - - private Animator mAlphaAnimator; - private boolean mVisible; - - public BaseRecyclerViewFastScrollPopup(BaseRecyclerView rv, Resources res) { - mRes = res; - mRv = rv; - - mBgOriginalSize = res.getDimensionPixelSize(R.dimen.container_fastscroll_popup_size); - mBg = rv.getContext().getDrawable(R.drawable.container_fastscroll_popup_bg); - mBg.setBounds(0, 0, mBgOriginalSize, mBgOriginalSize); - - mTextPaint = new Paint(); - mTextPaint.setColor(Color.WHITE); - mTextPaint.setAntiAlias(true); - mTextPaint.setTextSize(res.getDimensionPixelSize(R.dimen.container_fastscroll_popup_text_size)); - - mShadowPaint = new Paint(); - mShadowPaint.setAntiAlias(true); - mShadowPaint.setFilterBitmap(true); - mShadowPaint.setDither(true); - } - - /** - * Sets the section name. - */ - public void setSectionName(String sectionName) { - if (!sectionName.equals(mSectionName)) { - mSectionName = sectionName; - mTextPaint.getTextBounds(sectionName, 0, sectionName.length(), mTextBounds); - // Update the width to use measureText since that is more accurate - mTextBounds.right = (int) (mTextBounds.left + mTextPaint.measureText(sectionName)); - } - } - - /** - * Updates the bounds for the fast scroller. - * - * @return the invalidation rect for this update. - */ - public Rect updateFastScrollerBounds(int lastTouchY) { - mInvalidateRect.set(mBgBounds); - - if (isVisible()) { - // Calculate the dimensions and position of the fast scroller popup - int edgePadding = mRv.getMaxScrollbarWidth(); - int bgPadding = (mBgOriginalSize - mTextBounds.height()) / 2; - int bgHeight = mBgOriginalSize; - int bgWidth = Math.max(mBgOriginalSize, mTextBounds.width() + (2 * bgPadding)); - if (Utilities.isRtl(mRes)) { - mBgBounds.left = mRv.getBackgroundPadding().left + (2 * mRv.getMaxScrollbarWidth()); - mBgBounds.right = mBgBounds.left + bgWidth; - } else { - mBgBounds.right = mRv.getWidth() - mRv.getBackgroundPadding().right - - (2 * mRv.getMaxScrollbarWidth()); - mBgBounds.left = mBgBounds.right - bgWidth; - } - mBgBounds.top = lastTouchY - (int) (FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR * bgHeight); - mBgBounds.top = Math.max(edgePadding, - Math.min(mBgBounds.top, mRv.getVisibleHeight() - edgePadding - bgHeight)); - mBgBounds.bottom = mBgBounds.top + bgHeight; - - // Generate a bitmap for a shadow matching these bounds - mShadow = HolographicOutlineHelper.getInstance( - mRv.getContext()).createMediumDropShadow(mBg, false /* shouldCache */); - } else { - mShadow = null; - mBgBounds.setEmpty(); - } - - // Combine the old and new fast scroller bounds to create the full invalidate rect - mInvalidateRect.union(mBgBounds); - return mInvalidateRect; - } - - /** - * Animates the visibility of the fast scroller popup. - */ - public void animateVisibility(boolean visible) { - if (mVisible != visible) { - mVisible = visible; - if (mAlphaAnimator != null) { - mAlphaAnimator.cancel(); - } - mAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", visible ? 1f : 0f); - mAlphaAnimator.setDuration(visible ? 200 : 150); - mAlphaAnimator.start(); - } - } - - // Setter/getter for the popup alpha for animations - public void setAlpha(float alpha) { - mAlpha = alpha; - mRv.invalidate(mBgBounds); - } - - public float getAlpha() { - return mAlpha; - } - - public int getHeight() { - return mBgOriginalSize; - } - - public void draw(Canvas c) { - if (isVisible()) { - // Determine the alpha and prepare the canvas - final int alpha = (int) (mAlpha * 255); - int restoreCount = c.save(Canvas.MATRIX_SAVE_FLAG); - c.translate(mBgBounds.left, mBgBounds.top); - mTmpRect.set(mBgBounds); - mTmpRect.offsetTo(0, 0); - - // Expand the rect (with a negative inset), translate it, and draw the shadow - if (mShadow != null) { - mTmpRect.inset(-SHADOW_INSET * 2, -SHADOW_INSET * 2); - mTmpRect.offset(0, SHADOW_SHIFT_Y); - mShadowPaint.setAlpha((int) (alpha * SHADOW_ALPHA_MULTIPLIER)); - c.drawBitmap(mShadow, null, mTmpRect, mShadowPaint); - mTmpRect.inset(SHADOW_INSET * 2, SHADOW_INSET * 2); - mTmpRect.offset(0, -SHADOW_SHIFT_Y); - } - - // Draw the background - mBg.setBounds(mTmpRect); - mBg.setAlpha(alpha); - mBg.draw(c); - - // Draw the text - mTextPaint.setAlpha(alpha); - c.drawText(mSectionName, (mBgBounds.width() - mTextBounds.width()) / 2, - mBgBounds.height() - (mBgBounds.height() / 2) - mTextBounds.exactCenterY(), - mTextPaint); - c.restoreToCount(restoreCount); - } - } - - public boolean isVisible() { - return (mAlpha > 0f) && (mSectionName != null); - } -} diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 689ee38168..5c9e3f74e2 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -272,7 +272,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc // IF scroller is at the very top OR there is no scroll bar because there is probably not // enough items to scroll, THEN it's okay for the container to be pulled down. - if (mAppsRecyclerView.getScrollBar().getThumbOffset().y <= 0) { + if (mAppsRecyclerView.getScrollBar().getThumbOffsetY() <= 0) { return true; } return false; diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index 0173847e05..5a9ea6bb36 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -299,14 +299,14 @@ public class AllAppsRecyclerView extends BaseRecyclerView { // Skip early if there are no items or we haven't been measured if (items.isEmpty() || mNumAppsPerRow == 0) { - mScrollbar.setThumbOffset(-1, -1); + mScrollbar.setThumbOffsetY(-1); return; } // Skip early if, there no child laid out in the container. int scrollY = getCurrentScrollY(); if (scrollY < 0) { - mScrollbar.setThumbOffset(-1, -1); + mScrollbar.setThumbOffsetY(-1); return; } @@ -314,7 +314,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView { int availableScrollBarHeight = getAvailableScrollBarHeight(); int availableScrollHeight = getAvailableScrollHeight(); if (availableScrollHeight <= 0) { - mScrollbar.setThumbOffset(-1, -1); + mScrollbar.setThumbOffsetY(-1); return; } @@ -323,11 +323,10 @@ public class AllAppsRecyclerView extends BaseRecyclerView { // Calculate the current scroll position, the scrollY of the recycler view accounts // for the view padding, while the scrollBarY is drawn right up to the background // padding (ignoring padding) - int scrollBarX = getScrollBarX(); int scrollBarY = mBackgroundPadding.top + (int) (((float) scrollY / availableScrollHeight) * availableScrollBarHeight); - int thumbScrollY = mScrollbar.getThumbOffset().y; + int thumbScrollY = mScrollbar.getThumbOffsetY(); int diffScrollY = scrollBarY - thumbScrollY; if (diffScrollY * dy > 0f) { // User is scrolling in the same direction the thumb needs to catch up to the @@ -344,7 +343,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView { thumbScrollY += Math.min(offset, diffScrollY); } thumbScrollY = Math.max(0, Math.min(availableScrollBarHeight, thumbScrollY)); - mScrollbar.setThumbOffset(scrollBarX, thumbScrollY); + mScrollbar.setThumbOffsetY(thumbScrollY); if (scrollBarY == thumbScrollY) { mScrollbar.reattachThumbToScroll(); } @@ -352,7 +351,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView { // User is scrolling in an opposite direction to the direction that the thumb // needs to catch up to the scroll position. Do nothing except for updating // the scroll bar x to match the thumb width. - mScrollbar.setThumbOffset(scrollBarX, thumbScrollY); + mScrollbar.setThumbOffsetY(thumbScrollY); } } } else { diff --git a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java index 0d70bdee1f..9c397210e1 100644 --- a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java +++ b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java @@ -158,18 +158,13 @@ public class HolographicOutlineHelper { } public Bitmap createMediumDropShadow(BubbleTextView view) { - return createMediumDropShadow(view.getIcon(), view.getScaleX(), view.getScaleY(), true); - } - - public Bitmap createMediumDropShadow(Drawable drawable, boolean shouldCache) { - return createMediumDropShadow(drawable, 1f, 1f, shouldCache); - } - - Bitmap createMediumDropShadow(Drawable drawable, float scaleX, float scaleY, - boolean shouldCache) { + Drawable drawable = view.getIcon(); if (drawable == null) { return null; } + + float scaleX = view.getScaleX(); + float scaleY = view.getScaleY(); Rect rect = drawable.getBounds(); int bitmapWidth = (int) (rect.width() * scaleX); @@ -179,14 +174,11 @@ public class HolographicOutlineHelper { } int key = (bitmapWidth << 16) | bitmapHeight; - Bitmap cache = shouldCache ? mBitmapCache.get(key) : null; + Bitmap cache = mBitmapCache.get(key); if (cache == null) { cache = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ALPHA_8); mCanvas.setBitmap(cache); - - if (shouldCache) { - mBitmapCache.put(key, cache); - } + mBitmapCache.put(key, cache); } else { mCanvas.setBitmap(cache); mCanvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR); @@ -206,7 +198,7 @@ public class HolographicOutlineHelper { int resultWidth = bitmapWidth + extraSize; int resultHeight = bitmapHeight + extraSize; key = (resultWidth << 16) | resultHeight; - Bitmap result = shouldCache ? mBitmapCache.get(key) : null; + Bitmap result = mBitmapCache.get(key); if (result == null) { result = Bitmap.createBitmap(resultWidth, resultHeight, Bitmap.Config.ALPHA_8); mCanvas.setBitmap(result); diff --git a/src/com/android/launcher3/widget/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/WidgetsRecyclerView.java index 2560661c18..c33978eea8 100644 --- a/src/com/android/launcher3/widget/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/WidgetsRecyclerView.java @@ -121,7 +121,7 @@ public class WidgetsRecyclerView extends BaseRecyclerView { // Skip early if, there no child laid out in the container. int scrollY = getCurrentScrollY(); if (scrollY < 0) { - mScrollbar.setThumbOffset(-1, -1); + mScrollbar.setThumbOffsetY(-1); return; } From 3f0a53fa448fc077a1e3ca547bdd0f3bd408372f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 11 Oct 2016 15:49:42 -0700 Subject: [PATCH 063/382] Making the width of the fast scroller popup as wrap_content Adding minWidth and width=wrap_content, so that the popup can grow for wider characters. Change-Id: I6e0c4087df51e37f696c47f20f146f32d41e8bc8 --- res/layout/all_apps.xml | 12 ++---------- res/layout/widgets_view.xml | 12 ++---------- res/values/styles.xml | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index d48bd500e6..64d34e715d 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -57,19 +57,11 @@ + android:layout_marginEnd="@dimen/container_fastscroll_popup_margin" /> + android:layout_marginEnd="@dimen/container_fastscroll_popup_margin" /> + + diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 979c9508bf..84b504ebcb 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -618,7 +618,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { public void setIsHotseat(boolean isHotseat) { mIsHotseat = isHotseat; - mShortcutsAndWidgets.setIsHotseat(isHotseat); + mShortcutsAndWidgets.setContainerType(isHotseat + ? ShortcutAndWidgetContainer.HOTSEAT + : ShortcutAndWidgetContainer.DEFAULT); } public boolean isHotseat() { diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index cc21920b05..483c5a9ce4 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -207,7 +207,15 @@ public class DeviceProfile { // In multi-window mode, we can have widthPx = availableWidthPx // and heightPx = availableHeightPx because Launcher uses the InvariantDeviceProfiles' // widthPx and heightPx values where it's needed. - return new DeviceProfile(context, inv, mwSize, mwSize, mwSize.x, mwSize.y, isLandscape); + DeviceProfile profile = new DeviceProfile(context, inv, mwSize, mwSize, mwSize.x, mwSize.y, + isLandscape); + + // Hide labels on the workspace. + profile.iconTextSizePx = 0; + profile.cellHeightPx = profile.iconSizePx + profile.iconDrawablePaddingPx + + Utilities.calculateTextHeight(profile.iconTextSizePx); + + return profile; } public void addLauncherLayoutChangedListener(LauncherLayoutChangeListener listener) { diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index c8bb793061..dafc81acef 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -18,13 +18,25 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; -import android.graphics.Paint; import android.graphics.Rect; +import android.support.annotation.IntDef; import android.view.View; import android.view.ViewGroup; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + public class ShortcutAndWidgetContainer extends ViewGroup { - static final String TAG = "CellLayoutChildren"; + static final String TAG = "ShortcutAndWidgetContainer"; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({DEFAULT, HOTSEAT, FOLDER}) + public @interface ContainerType{} + public static final int DEFAULT = 0; + public static final int HOTSEAT = 1; + public static final int FOLDER = 2; + + private int mContainerType = DEFAULT; // These are temporary variables to prevent having to allocate a new object just to // return an (x, y) value from helper functions. Do NOT use them to maintain other state. @@ -32,8 +44,6 @@ public class ShortcutAndWidgetContainer extends ViewGroup { private final WallpaperManager mWallpaperManager; - private boolean mIsHotseatLayout; - private int mCellWidth; private int mCellHeight; @@ -101,20 +111,19 @@ public class ShortcutAndWidgetContainer extends ViewGroup { mInvertIfRtl = invert; } - public void setIsHotseat(boolean isHotseat) { - mIsHotseatLayout = isHotseat; - } - - int getCellContentWidth() { - final DeviceProfile grid = mLauncher.getDeviceProfile(); - return Math.min(getMeasuredHeight(), mIsHotseatLayout ? - grid.hotseatCellWidthPx: grid.cellWidthPx); + public void setContainerType(@ContainerType int containerType) { + mContainerType = containerType; } int getCellContentHeight() { final DeviceProfile grid = mLauncher.getDeviceProfile(); - return Math.min(getMeasuredHeight(), mIsHotseatLayout ? - grid.hotseatCellHeightPx : grid.cellHeightPx); + int cellContentHeight = grid.cellHeightPx; + if (mContainerType == HOTSEAT) { + cellContentHeight = grid.hotseatCellHeightPx; + } else if (mContainerType == FOLDER) { + cellContentHeight = grid.folderCellHeightPx; + } + return Math.min(getMeasuredHeight(), cellContentHeight); } public void measureChild(View child) { diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 31ec7092ba..e71c5e9ccc 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -256,6 +256,7 @@ public class FolderPagedView extends PagedView { CellLayout page = new CellLayout(getContext()); page.setCellDimensions(grid.folderCellWidthPx, grid.folderCellHeightPx); page.getShortcutsAndWidgets().setMotionEventSplittingEnabled(false); + page.getShortcutsAndWidgets().setContainerType(ShortcutAndWidgetContainer.FOLDER); page.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); page.setInvertIfRtl(true); page.setGridSize(mGridCountX, mGridCountY); From c1b08c5b7f0701a4e984e184b8318e9b3e4d64f7 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 15 Nov 2016 14:37:56 -0800 Subject: [PATCH 122/382] Add bottom padding to hotseat in multi-window mode. In multi-window mode, the navigation bar is black which makes the hotseat's top padding -- and lack of symmetric botom padding -- super apparent. We add bottom padding to the hotseat so that the hotseat icons remain visually centered. Bug: 32176631 Change-Id: I3eebf5ab98898c8ee092bda6ec48c6afdcd353b9 --- src/com/android/launcher3/DeviceProfile.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 483c5a9ce4..59ec56ab32 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -112,6 +112,7 @@ public class DeviceProfile { public int hotseatIconSizePx; public int hotseatBarHeightPx; private int hotseatBarTopPaddingPx; + private int hotseatBarBottomPaddingPx; private int hotseatLandGutterPx; // All apps @@ -185,6 +186,7 @@ public class DeviceProfile { hotseatBarHeightPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_height); hotseatBarTopPaddingPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding); + hotseatBarBottomPaddingPx = 0; hotseatLandGutterPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_gutter_width); // Determine sizes. @@ -215,6 +217,9 @@ public class DeviceProfile { profile.cellHeightPx = profile.iconSizePx + profile.iconDrawablePaddingPx + Utilities.calculateTextHeight(profile.iconTextSizePx); + // The nav bar is black so we add bottom padding to visually center hotseat icons. + profile.hotseatBarBottomPaddingPx = profile.hotseatBarTopPaddingPx; + return profile; } @@ -404,7 +409,8 @@ public class DeviceProfile { availablePaddingX = (int) Math.min(availablePaddingX, width * MAX_HORIZONTAL_PADDING_PERCENT); int availablePaddingY = Math.max(0, height - topWorkspacePadding - paddingBottom - - (int) (2 * inv.numRows * cellHeightPx)); + - (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx + - hotseatBarBottomPaddingPx); padding.set(availablePaddingX / 2, topWorkspacePadding + availablePaddingY / 2, availablePaddingX / 2, paddingBottom + availablePaddingY / 2); } else { @@ -537,7 +543,7 @@ public class DeviceProfile { lp.height = hotseatBarHeightPx + mInsets.bottom; hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left, hotseatBarTopPaddingPx, hotseatAdjustment + workspacePadding.right, - mInsets.bottom); + hotseatBarBottomPaddingPx + mInsets.bottom); } else { // For phones, layout the hotseat without any bottom margin // to ensure that we have space for the folders @@ -546,7 +552,7 @@ public class DeviceProfile { lp.height = hotseatBarHeightPx + mInsets.bottom; hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left, hotseatBarTopPaddingPx, hotseatAdjustment + workspacePadding.right, - mInsets.bottom); + hotseatBarBottomPaddingPx + mInsets.bottom); } hotseat.setLayoutParams(lp); From 4f9611a87c204649f43dd30a41718e7ba7aa7f2c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 15 Nov 2016 17:27:15 -0800 Subject: [PATCH 123/382] Fixing item check when user is enabled/disabled Bug: 32747950 Change-Id: I278cbd7626ee30be6b803d617cf05f8359e5d940 --- .../android/launcher3/model/PackageUpdatedTask.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 7286bf51f8..e3a2b24a96 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -87,6 +87,7 @@ public class PackageUpdatedTask extends ExtendedModelTask { final int N = packages.length; FlagOp flagOp = FlagOp.NO_OP; final HashSet packageSet = new HashSet<>(Arrays.asList(packages)); + ItemInfoMatcher matcher = ItemInfoMatcher.ofPackages(packageSet, mUser); switch (mOp) { case OP_ADD: { for (int i = 0; i < N; i++) { @@ -135,15 +136,15 @@ public class PackageUpdatedTask extends ExtendedModelTask { FlagOp.addFlag(ShortcutInfo.FLAG_DISABLED_SUSPENDED) : FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_SUSPENDED); if (DEBUG) Log.d(TAG, "mAllAppsList.(un)suspend " + N); - appsList.updateDisabledFlags( - ItemInfoMatcher.ofPackages(packageSet, mUser), flagOp); + appsList.updateDisabledFlags(matcher, flagOp); break; case OP_USER_AVAILABILITY_CHANGE: flagOp = UserManagerCompat.getInstance(context).isQuietModeEnabled(mUser) ? FlagOp.addFlag(ShortcutInfo.FLAG_DISABLED_QUIET_USER) : FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_QUIET_USER); // We want to update all packages for this user. - appsList.updateDisabledFlags(ItemInfoMatcher.ofUser(mUser), flagOp); + matcher = ItemInfoMatcher.ofUser(mUser); + appsList.updateDisabledFlags(matcher, flagOp); break; } @@ -219,10 +220,10 @@ public class PackageUpdatedTask extends ExtendedModelTask { } ComponentName cn = si.getTargetComponent(); - if (cn != null && packageSet.contains(cn.getPackageName())) { + if (cn != null && matcher.matches(si, cn)) { AppInfo appInfo = addedOrUpdatedApps.get(cn); - if (si.isPromise()) { + if (si.isPromise() && mOp == OP_ADD) { if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { // Auto install icon PackageManager pm = context.getPackageManager(); From 0d4899026c16f7e830cfe32c717951e8bb494c84 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 17 Nov 2016 12:23:33 -0800 Subject: [PATCH 124/382] Add logging for workspace rearrangement in overview mode b/32457561 Change-Id: Ic38fbd540616a74f26c19a09ab4247fe8f9174b4 --- src/com/android/launcher3/Workspace.java | 2 +- .../logging/UserEventDispatcher.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 340177d38d..950a40766a 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2045,7 +2045,7 @@ public class Workspace extends PagedView CellLayout cl = ((CellLayout) getChildAt(i)); mScreenOrder.add(getIdForScreen(cl)); } - + mLauncher.getUserEventDispatcher().logOverviewReorder(); mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder); // Re-enable auto layout transitions for page deletion. diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 56fdce8343..53a2f5dc8f 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -27,6 +27,7 @@ import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.Utilities; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -190,6 +191,25 @@ public class UserEventDispatcher { mPredictedApps = predictedApps; } + /* Currently we are only interested in whether this event happens or not and don't + * care about which screen moves to where. */ + public void logOverviewReorder() { + LauncherEvent event = new LauncherLogProto.LauncherEvent(); + + event.srcTarget = new LauncherLogProto.Target[2]; + event.srcTarget[0] = new LauncherLogProto.Target(); + event.srcTarget[0].type = Target.CONTAINER; + event.srcTarget[0].containerType = LauncherLogProto.WORKSPACE; + event.srcTarget[1] = new LauncherLogProto.Target(); + event.srcTarget[1].type = Target.CONTAINER; + event.srcTarget[1].containerType = LauncherLogProto.OVERVIEW; + + event.action = new LauncherLogProto.Action(); + event.action.type = Action.TOUCH; + event.action.touch = Action.DRAGDROP; + dispatchUserEvent(event, null); + + } public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, dragObj.dragView, From 32f3dda80240e707ad4467b6b65fb589f539c58e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 11 Nov 2016 11:45:00 -0800 Subject: [PATCH 125/382] Adding a utility class to enforce that icons are always flattened on the background thread. Bug: 21325319 Change-Id: I4d0f02557cdbf70cfa86750ac047faf2917e39bf --- .../android/launcher3/AutoInstallsLayout.java | 4 +- src/com/android/launcher3/FolderInfo.java | 10 +- src/com/android/launcher3/IconCache.java | 2 - src/com/android/launcher3/ItemInfo.java | 39 +++----- .../launcher3/LauncherAppWidgetInfo.java | 16 ++- src/com/android/launcher3/LauncherModel.java | 53 +++++----- src/com/android/launcher3/ShortcutInfo.java | 35 +++---- .../launcher3/model/PackageUpdatedTask.java | 1 - .../android/launcher3/util/ContentWriter.java | 98 +++++++++++++++++++ .../launcher3/util/PendingRequestArgs.java | 2 +- .../com/android/launcher3/BindWidgetTest.java | 9 +- 11 files changed, 168 insertions(+), 101 deletions(-) create mode 100644 src/com/android/launcher3/util/ContentWriter.java diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 8b5a8a863e..2a4212a2dd 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -17,7 +17,6 @@ package com.android.launcher3; import android.appwidget.AppWidgetHost; -import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.ContentValues; import android.content.Context; @@ -437,7 +436,8 @@ public class AutoInstallsLayout { return -1; } - ItemInfo.writeBitmap(mValues, LauncherIcons.createIconBitmap(icon, mContext)); + mValues.put(LauncherSettings.Favorites.ICON, + Utilities.flattenBitmap(LauncherIcons.createIconBitmap(icon, mContext))); mValues.put(Favorites.ICON_PACKAGE, mIconRes.getResourcePackageName(iconId)); mValues.put(Favorites.ICON_RESOURCE, mIconRes.getResourceName(iconId)); diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index 8b70d1c708..c24423589d 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -16,10 +16,10 @@ package com.android.launcher3; -import android.content.ContentValues; import android.content.Context; import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.util.ContentWriter; import java.util.ArrayList; @@ -93,10 +93,10 @@ public class FolderInfo extends ItemInfo { } @Override - void onAddToDatabase(Context context, ContentValues values) { - super.onAddToDatabase(context, values); - values.put(LauncherSettings.Favorites.TITLE, title.toString()); - values.put(LauncherSettings.Favorites.OPTIONS, options); + void onAddToDatabase(ContentWriter writer) { + super.onAddToDatabase(writer); + writer.put(LauncherSettings.Favorites.TITLE, title) + .put(LauncherSettings.Favorites.OPTIONS, options); } diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 04d0c8c916..db72b2f997 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -494,7 +494,6 @@ public class IconCache { shortcutInfo.setIcon(getDefaultIcon(user)); shortcutInfo.title = ""; shortcutInfo.contentDescription = ""; - shortcutInfo.usingFallbackIcon = true; shortcutInfo.usingLowResIcon = false; } else { LauncherActivityInfoCompat info = mLauncherApps.resolveActivity(intent, user); @@ -512,7 +511,6 @@ public class IconCache { shortcutInfo.setIcon(getNonNullIcon(entry, user)); shortcutInfo.title = Utilities.trim(entry.title); shortcutInfo.contentDescription = entry.contentDescription; - shortcutInfo.usingFallbackIcon = isDefaultIcon(entry.icon, user); shortcutInfo.usingLowResIcon = entry.isLowResIcon; } diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index 20437721ed..3e0ae4ffc6 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -18,12 +18,10 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.ContentValues; -import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import com.android.launcher3.compat.UserHandleCompat; -import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.util.ContentWriter; /** * Represents an item in the launcher. @@ -142,15 +140,15 @@ public class ItemInfo { return getIntent() == null ? null : getIntent().getComponent(); } - public void writeToValues(ContentValues values) { - values.put(LauncherSettings.Favorites.ITEM_TYPE, itemType); - values.put(LauncherSettings.Favorites.CONTAINER, container); - values.put(LauncherSettings.Favorites.SCREEN, screenId); - values.put(LauncherSettings.Favorites.CELLX, cellX); - values.put(LauncherSettings.Favorites.CELLY, cellY); - values.put(LauncherSettings.Favorites.SPANX, spanX); - values.put(LauncherSettings.Favorites.SPANY, spanY); - values.put(LauncherSettings.Favorites.RANK, rank); + public void writeToValues(ContentWriter writer) { + writer.put(LauncherSettings.Favorites.ITEM_TYPE, itemType) + .put(LauncherSettings.Favorites.CONTAINER, container) + .put(LauncherSettings.Favorites.SCREEN, screenId) + .put(LauncherSettings.Favorites.CELLX, cellX) + .put(LauncherSettings.Favorites.CELLY, cellY) + .put(LauncherSettings.Favorites.SPANX, spanX) + .put(LauncherSettings.Favorites.SPANY, spanY) + .put(LauncherSettings.Favorites.RANK, rank); } public void readFromValues(ContentValues values) { @@ -166,26 +164,15 @@ public class ItemInfo { /** * Write the fields of this item to the DB - * - * @param context A context object to use for getting UserManagerCompat - * @param values */ - void onAddToDatabase(Context context, ContentValues values) { - writeToValues(values); - long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); - values.put(LauncherSettings.Favorites.PROFILE_ID, serialNumber); - + void onAddToDatabase(ContentWriter writer) { if (screenId == Workspace.EXTRA_EMPTY_SCREEN_ID) { // We should never persist an item on the extra empty screen. throw new RuntimeException("Screen id should not be EXTRA_EMPTY_SCREEN_ID"); } - } - static void writeBitmap(ContentValues values, Bitmap bitmap) { - if (bitmap != null) { - byte[] data = Utilities.flattenBitmap(bitmap); - values.put(LauncherSettings.Favorites.ICON, data); - } + writeToValues(writer); + writer.put(LauncherSettings.Favorites.PROFILE_ID, user); } @Override diff --git a/src/com/android/launcher3/LauncherAppWidgetInfo.java b/src/com/android/launcher3/LauncherAppWidgetInfo.java index 78f5b8edb8..2218767114 100644 --- a/src/com/android/launcher3/LauncherAppWidgetInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetInfo.java @@ -18,11 +18,10 @@ package com.android.launcher3; import android.appwidget.AppWidgetHostView; import android.content.ComponentName; -import android.content.ContentValues; -import android.content.Context; import android.content.Intent; import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.util.ContentWriter; /** * Represents a widget (either instantiated or about to be) in the Launcher. @@ -127,13 +126,12 @@ public class LauncherAppWidgetInfo extends ItemInfo { } @Override - void onAddToDatabase(Context context, ContentValues values) { - super.onAddToDatabase(context, values); - values.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId); - values.put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, providerName.flattenToString()); - values.put(LauncherSettings.Favorites.RESTORED, restoreStatus); - values.put(LauncherSettings.Favorites.INTENT, - bindOptions == null ? null : bindOptions.toUri(0)); + void onAddToDatabase(ContentWriter writer) { + super.onAddToDatabase(writer); + writer.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId) + .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, providerName.flattenToString()) + .put(LauncherSettings.Favorites.RESTORED, restoreStatus) + .put(LauncherSettings.Favorites.INTENT, bindOptions); } /** diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c70a47595d..42c798325c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -76,6 +76,7 @@ import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.ContentWriter; import com.android.launcher3.util.CursorIconInfo; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ItemInfoMatcher; @@ -332,7 +333,7 @@ public class LauncherModel extends BroadcastReceiver runOnWorkerThread(r); } - static void updateItemInDatabaseHelper(Context context, final ContentValues values, + static void updateItemInDatabaseHelper(Context context, final ContentWriter writer, final ItemInfo item, final String callingFunction) { final long itemId = item.id; final Uri uri = LauncherSettings.Favorites.getContentUri(itemId); @@ -341,7 +342,7 @@ public class LauncherModel extends BroadcastReceiver final StackTraceElement[] stackTrace = new Throwable().getStackTrace(); Runnable r = new Runnable() { public void run() { - cr.update(uri, values, null, null); + cr.update(uri, writer.getValues(), null, null); updateItemArrays(item, itemId, stackTrace); } }; @@ -439,14 +440,14 @@ public class LauncherModel extends BroadcastReceiver item.screenId = screenId; } - final ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.CONTAINER, item.container); - values.put(LauncherSettings.Favorites.CELLX, item.cellX); - values.put(LauncherSettings.Favorites.CELLY, item.cellY); - values.put(LauncherSettings.Favorites.RANK, item.rank); - values.put(LauncherSettings.Favorites.SCREEN, item.screenId); + final ContentWriter writer = new ContentWriter(context) + .put(LauncherSettings.Favorites.CONTAINER, item.container) + .put(LauncherSettings.Favorites.CELLX, item.cellX) + .put(LauncherSettings.Favorites.CELLY, item.cellY) + .put(LauncherSettings.Favorites.RANK, item.rank) + .put(LauncherSettings.Favorites.SCREEN, item.screenId); - updateItemInDatabaseHelper(context, values, item, "moveItemInDatabase"); + updateItemInDatabaseHelper(context, writer, item, "moveItemInDatabase"); } /** @@ -506,25 +507,25 @@ public class LauncherModel extends BroadcastReceiver item.screenId = screenId; } - final ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.CONTAINER, item.container); - values.put(LauncherSettings.Favorites.CELLX, item.cellX); - values.put(LauncherSettings.Favorites.CELLY, item.cellY); - values.put(LauncherSettings.Favorites.RANK, item.rank); - values.put(LauncherSettings.Favorites.SPANX, item.spanX); - values.put(LauncherSettings.Favorites.SPANY, item.spanY); - values.put(LauncherSettings.Favorites.SCREEN, item.screenId); + final ContentWriter writer = new ContentWriter(context) + .put(LauncherSettings.Favorites.CONTAINER, item.container) + .put(LauncherSettings.Favorites.CELLX, item.cellX) + .put(LauncherSettings.Favorites.CELLY, item.cellY) + .put(LauncherSettings.Favorites.RANK, item.rank) + .put(LauncherSettings.Favorites.SPANX, item.spanX) + .put(LauncherSettings.Favorites.SPANY, item.spanY) + .put(LauncherSettings.Favorites.SCREEN, item.screenId); - updateItemInDatabaseHelper(context, values, item, "modifyItemInDatabase"); + updateItemInDatabaseHelper(context, writer, item, "modifyItemInDatabase"); } /** * Update an item to the database in a specified container. */ public static void updateItemInDatabase(Context context, final ItemInfo item) { - final ContentValues values = new ContentValues(); - item.onAddToDatabase(context, values); - updateItemInDatabaseHelper(context, values, item, "updateItemInDatabase"); + ContentWriter writer = new ContentWriter(context); + item.onAddToDatabase(writer); + updateItemInDatabaseHelper(context, writer, item, "updateItemInDatabase"); } /** @@ -546,19 +547,19 @@ public class LauncherModel extends BroadcastReceiver item.screenId = screenId; } - final ContentValues values = new ContentValues(); + final ContentWriter writer = new ContentWriter(context); final ContentResolver cr = context.getContentResolver(); - item.onAddToDatabase(context, values); + item.onAddToDatabase(writer); item.id = LauncherSettings.Settings.call(cr, LauncherSettings.Settings.METHOD_NEW_ITEM_ID) .getLong(LauncherSettings.Settings.EXTRA_VALUE); - values.put(LauncherSettings.Favorites._ID, item.id); + writer.put(LauncherSettings.Favorites._ID, item.id); final StackTraceElement[] stackTrace = new Throwable().getStackTrace(); Runnable r = new Runnable() { public void run() { - cr.insert(LauncherSettings.Favorites.CONTENT_URI, values); + cr.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues()); synchronized (sBgDataModel) { checkItemInfoLocked(item.id, item, stackTrace); @@ -2632,7 +2633,6 @@ public class LauncherModel extends BroadcastReceiver // the fallback icon if (icon == null) { icon = mIconCache.getDefaultIcon(info.user); - info.usingFallbackIcon = true; } info.setIcon(icon); } @@ -2669,7 +2669,6 @@ public class LauncherModel extends BroadcastReceiver info.user = UserHandleCompat.myUserHandle(); if (icon == null) { icon = mIconCache.getDefaultIcon(info.user); - info.usingFallbackIcon = true; } info.setIcon(icon); diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index fc087363a1..f894aae0af 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -18,7 +18,6 @@ package com.android.launcher3; import android.annotation.TargetApi; import android.content.ComponentName; -import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -33,6 +32,7 @@ import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.util.ContentWriter; /** * Represents a launchable icon on the workspaces and in folders. @@ -76,12 +76,6 @@ public class ShortcutInfo extends ItemInfo { */ public Intent intent; - /** - * Indicates whether we're using the default fallback icon instead of something from the - * app. - */ - public boolean usingFallbackIcon; - /** * Indicates whether we're using a low res icon */ @@ -187,7 +181,6 @@ public class ShortcutInfo extends ItemInfo { status = info.status; mInstallProgress = info.mInstallProgress; isDisabled = info.isDisabled; - usingFallbackIcon = info.usingFallbackIcon; } /** TODO: Remove this. It's only called by ApplicationInfo.makeShortcut. */ @@ -240,25 +233,19 @@ public class ShortcutInfo extends ItemInfo { } @Override - void onAddToDatabase(Context context, ContentValues values) { - super.onAddToDatabase(context, values); + void onAddToDatabase(ContentWriter writer) { + super.onAddToDatabase(writer); + writer.put(LauncherSettings.BaseLauncherColumns.TITLE, title) + .put(LauncherSettings.BaseLauncherColumns.INTENT, getPromisedIntent()) + .put(LauncherSettings.Favorites.RESTORED, status); - String titleStr = title != null ? title.toString() : null; - values.put(LauncherSettings.BaseLauncherColumns.TITLE, titleStr); - - String uri = promisedIntent != null ? promisedIntent.toUri(0) - : (intent != null ? intent.toUri(0) : null); - values.put(LauncherSettings.BaseLauncherColumns.INTENT, uri); - values.put(LauncherSettings.Favorites.RESTORED, status); - - if (!usingFallbackIcon && !usingLowResIcon) { - writeBitmap(values, mIcon); + if (!usingLowResIcon) { + writer.putIcon(mIcon, user); } if (iconResource != null) { - values.put(LauncherSettings.BaseLauncherColumns.ICON_PACKAGE, - iconResource.packageName); - values.put(LauncherSettings.BaseLauncherColumns.ICON_RESOURCE, - iconResource.resourceName); + writer.put(LauncherSettings.BaseLauncherColumns.ICON_PACKAGE, iconResource.packageName) + .put(LauncherSettings.BaseLauncherColumns.ICON_RESOURCE, + iconResource.resourceName); } } diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 7286bf51f8..668b21b275 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -213,7 +213,6 @@ public class PackageUpdatedTask extends ExtendedModelTask { si.iconResource.resourceName, context); if (icon != null) { si.setIcon(icon); - si.usingFallbackIcon = false; infoUpdated = true; } } diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java new file mode 100644 index 0000000000..33d979c189 --- /dev/null +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -0,0 +1,98 @@ +package com.android.launcher3.util; + +/** + * Copyright (C) 2016 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. + */ + +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; + +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.Utilities; +import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.compat.UserManagerCompat; + +/** + * A wrapper around {@link ContentValues} with some utility methods. + */ +public class ContentWriter { + + private final ContentValues mValues; + private final Context mContext; + + private Bitmap mIcon; + private UserHandleCompat mUser; + + public ContentWriter(Context context) { + this(new ContentValues(), context); + } + + public ContentWriter(ContentValues values, Context context) { + mValues = values; + mContext = context; + } + + public ContentWriter put(String key, Integer value) { + mValues.put(key, value); + return this; + } + + public ContentWriter put(String key, Long value) { + mValues.put(key, value); + return this; + } + + public ContentWriter put(String key, String value) { + mValues.put(key, value); + return this; + } + + public ContentWriter put(String key, CharSequence value) { + mValues.put(key, value == null ? null : value.toString()); + return this; + } + + public ContentWriter put(String key, Intent value) { + mValues.put(key, value == null ? null : value.toUri(0)); + return this; + } + + public ContentWriter putIcon(Bitmap value, UserHandleCompat user) { + mIcon = value; + mUser = user; + return this; + } + + public ContentWriter put(String key, UserHandleCompat user) { + return put(key, UserManagerCompat.getInstance(mContext).getSerialNumberForUser(user)); + } + + /** + * Commits any pending validation and returns the final values. + * Must not be called on UI thread. + */ + public ContentValues getValues() { + Preconditions.assertNonUiThread(); + if (mIcon != null && !LauncherAppState.getInstance().getIconCache() + .isDefaultIcon(mIcon, mUser)) { + mValues.put(LauncherSettings.Favorites.ICON, Utilities.flattenBitmap(mIcon)); + mIcon = null; + } + return mValues; + } +} diff --git a/src/com/android/launcher3/util/PendingRequestArgs.java b/src/com/android/launcher3/util/PendingRequestArgs.java index bade967c17..8eea28bb88 100644 --- a/src/com/android/launcher3/util/PendingRequestArgs.java +++ b/src/com/android/launcher3/util/PendingRequestArgs.java @@ -73,7 +73,7 @@ public class PendingRequestArgs extends ItemInfo implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { ContentValues itemValues = new ContentValues(); - writeToValues(itemValues); + writeToValues(new ContentWriter(itemValues, null)); itemValues.writeToParcel(dest, flags); dest.writeInt(mArg1); diff --git a/tests/src/com/android/launcher3/BindWidgetTest.java b/tests/src/com/android/launcher3/BindWidgetTest.java index c133bf6c85..6be252234b 100644 --- a/tests/src/com/android/launcher3/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/BindWidgetTest.java @@ -17,6 +17,7 @@ import android.test.suitebuilder.annotation.LargeTest; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.ui.LauncherInstrumentationTestCase; +import com.android.launcher3.util.ContentWriter; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.WidgetHostViewLoader; @@ -218,14 +219,14 @@ public class BindWidgetTest extends LauncherInstrumentationTestCase { mResolver.insert(LauncherSettings.WorkspaceScreens.CONTENT_URI, v); // Insert the item - v = new ContentValues(); + ContentWriter writer = new ContentWriter(mTargetContext); item.id = LauncherSettings.Settings.call( mResolver, LauncherSettings.Settings.METHOD_NEW_ITEM_ID) .getLong(LauncherSettings.Settings.EXTRA_VALUE); item.screenId = screenId; - item.onAddToDatabase(mTargetContext, v); - v.put(LauncherSettings.Favorites._ID, item.id); - mResolver.insert(LauncherSettings.Favorites.CONTENT_URI, v); + item.onAddToDatabase(writer); + writer.put(LauncherSettings.Favorites._ID, item.id); + mResolver.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues()); // Reset loader try { From aa8a871e337fe42e9339b96833eaf37bf2b64b2f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sun, 20 Nov 2016 15:26:01 +0530 Subject: [PATCH 126/382] Removing widgetGap and heightGap from cellLayout This values are always set to 0 Change-Id: Ic317efdc65baa22e915f4766c60c67c116bb94a8 --- .../launcher3/AppWidgetResizeFrame.java | 8 +- src/com/android/launcher3/CellLayout.java | 114 +++++------------- .../launcher3/ShortcutAndWidgetContainer.java | 14 +-- 3 files changed, 37 insertions(+), 99 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index d00d5dda29..0380923572 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -223,8 +223,8 @@ public class AppWidgetResizeFrame extends FrameLayout * Based on the current deltas, we determine if and how to resize the widget. */ private void resizeWidgetIfNeeded(boolean onDismiss) { - float xThreshold = mCellLayout.getCellWidth() + mCellLayout.getWidthGap(); - float yThreshold = mCellLayout.getCellHeight() + mCellLayout.getHeightGap(); + float xThreshold = mCellLayout.getCellWidth(); + float yThreshold = mCellLayout.getCellHeight(); int hSpanInc = getSpanIncrement((mDeltaX + mDeltaXAddOn) / xThreshold - mRunningHInc); int vSpanInc = getSpanIncrement((mDeltaY + mDeltaYAddOn) / yThreshold - mRunningVInc); @@ -337,8 +337,8 @@ public class AppWidgetResizeFrame extends FrameLayout } private void onTouchUp() { - int xThreshold = mCellLayout.getCellWidth() + mCellLayout.getWidthGap(); - int yThreshold = mCellLayout.getCellHeight() + mCellLayout.getHeightGap(); + int xThreshold = mCellLayout.getCellWidth(); + int yThreshold = mCellLayout.getCellHeight(); mDeltaXAddOn = mRunningHInc * xThreshold; mDeltaYAddOn = mRunningVInc * yThreshold; diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 84b504ebcb..3564cecee0 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -87,13 +87,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { @ViewDebug.ExportedProperty(category = "launcher") private int mCountY; - private int mOriginalWidthGap; - private int mOriginalHeightGap; - @ViewDebug.ExportedProperty(category = "launcher") - @Thunk int mWidthGap; - @ViewDebug.ExportedProperty(category = "launcher") - @Thunk int mHeightGap; - private int mMaxGap; private boolean mDropPending = false; private boolean mIsDragTarget = true; private boolean mJailContent = true; @@ -202,9 +195,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mCellWidth = mCellHeight = -1; mFixedCellWidth = mFixedCellHeight = -1; - mWidthGap = mOriginalWidthGap = 0; - mHeightGap = mOriginalHeightGap = 0; - mMaxGap = Integer.MAX_VALUE; mCountX = grid.inv.numColumns; mCountY = grid.inv.numRows; @@ -287,8 +277,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context); - mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap, - mCountX, mCountY); + mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); @@ -373,8 +362,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { public void setCellDimensions(int width, int height) { mFixedCellWidth = mCellWidth = width; mFixedCellHeight = mCellHeight = height; - mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap, - mCountX, mCountY); + mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY); } public void setGridSize(int x, int y) { @@ -383,8 +371,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mOccupied = new GridOccupancy(mCountX, mCountY); mTmpOccupied = new GridOccupancy(mCountX, mCountY); mTempRectStack.clear(); - mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap, - mCountX, mCountY); + mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY); requestLayout(); } @@ -719,8 +706,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int hStartPadding = getPaddingLeft(); final int vStartPadding = getPaddingTop(); - result[0] = (x - hStartPadding) / (mCellWidth + mWidthGap); - result[1] = (y - vStartPadding) / (mCellHeight + mHeightGap); + result[0] = (x - hStartPadding) / mCellWidth; + result[1] = (y - vStartPadding) / mCellHeight; final int xAxis = mCountX; final int yAxis = mCountY; @@ -753,8 +740,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int hStartPadding = getPaddingLeft(); final int vStartPadding = getPaddingTop(); - result[0] = hStartPadding + cellX * (mCellWidth + mWidthGap); - result[1] = vStartPadding + cellY * (mCellHeight + mHeightGap); + result[0] = hStartPadding + cellX * mCellWidth; + result[1] = vStartPadding + cellY * mCellHeight; } /** @@ -780,10 +767,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { void regionToCenterPoint(int cellX, int cellY, int spanX, int spanY, int[] result) { final int hStartPadding = getPaddingLeft(); final int vStartPadding = getPaddingTop(); - result[0] = hStartPadding + cellX * (mCellWidth + mWidthGap) + - (spanX * mCellWidth + (spanX - 1) * mWidthGap) / 2; - result[1] = vStartPadding + cellY * (mCellHeight + mHeightGap) + - (spanY * mCellHeight + (spanY - 1) * mHeightGap) / 2; + result[0] = hStartPadding + cellX * mCellWidth + (spanX * mCellWidth) / 2; + result[1] = vStartPadding + cellY * mCellHeight + (spanY * mCellHeight) / 2; } /** @@ -796,10 +781,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { void regionToRect(int cellX, int cellY, int spanX, int spanY, Rect result) { final int hStartPadding = getPaddingLeft(); final int vStartPadding = getPaddingTop(); - final int left = hStartPadding + cellX * (mCellWidth + mWidthGap); - final int top = vStartPadding + cellY * (mCellHeight + mHeightGap); - result.set(left, top, left + (spanX * mCellWidth + (spanX - 1) * mWidthGap), - top + (spanY * mCellHeight + (spanY - 1) * mHeightGap)); + final int left = hStartPadding + cellX * mCellWidth; + final int top = vStartPadding + cellY * mCellHeight; + result.set(left, top, left + (spanX * mCellWidth), top + (spanY * mCellHeight)); } public float getDistanceFromCell(float x, float y, int[] cell) { @@ -815,14 +799,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { return mCellHeight; } - int getWidthGap() { - return mWidthGap; - } - - int getHeightGap() { - return mHeightGap; - } - public void setFixedSize(int width, int height) { mFixedWidth = width; mFixedHeight = height; @@ -842,8 +818,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { if (cw != mCellWidth || ch != mCellHeight) { mCellWidth = cw; mCellHeight = ch; - mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, - mHeightGap, mCountX, mCountY); + mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY); } } @@ -856,23 +831,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions"); } - int numWidthGaps = mCountX - 1; - int numHeightGaps = mCountY - 1; - - if (mOriginalWidthGap < 0 || mOriginalHeightGap < 0) { - int hSpace = childWidthSize; - int vSpace = childHeightSize; - int hFreeSpace = hSpace - (mCountX * mCellWidth); - int vFreeSpace = vSpace - (mCountY * mCellHeight); - mWidthGap = Math.min(mMaxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0); - mHeightGap = Math.min(mMaxGap,numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0); - mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, - mHeightGap, mCountX, mCountY); - } else { - mWidthGap = mOriginalWidthGap; - mHeightGap = mOriginalHeightGap; - } - // Make the feedback view large enough to hold the blur bitmap. mTouchFeedbackView.measure( MeasureSpec.makeMeasureSpec(mCellWidth + mTouchFeedbackView.getExtraSize(), @@ -1085,23 +1043,19 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // outside the bounds of the view. top += (v.getHeight() - dragOutline.getHeight()) / 2; // We center about the x axis - left += ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap) - - dragOutline.getWidth()) / 2; + left += ((mCellWidth * spanX) - dragOutline.getWidth()) / 2; } else { if (dragOffset != null && dragRegion != null) { // Center the drag region *horizontally* in the cell and apply a drag // outline offset - left += dragOffset.x + ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap) - - dragRegion.width()) / 2; + left += dragOffset.x + ((mCellWidth * spanX) - dragRegion.width()) / 2; int cHeight = getShortcutsAndWidgets().getCellContentHeight(); int cellPaddingY = (int) Math.max(0, ((mCellHeight - cHeight) / 2f)); top += dragOffset.y + cellPaddingY; } else { // Center the drag outline in the cell - left += ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap) - - dragOutline.getWidth()) / 2; - top += ((mCellHeight * spanY) + ((spanY - 1) * mHeightGap) - - dragOutline.getHeight()) / 2; + left += ((mCellWidth * spanX) - dragOutline.getWidth()) / 2; + top += ((mCellHeight * spanY) - dragOutline.getHeight()) / 2; } } r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight()); @@ -1190,8 +1144,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // For items with a spanX / spanY > 1, the passed in point (pixelX, pixelY) corresponds // to the center of the item, but we are searching based on the top-left cell, so // we translate the point over to correspond to the top-left. - pixelX -= (mCellWidth + mWidthGap) * (spanX - 1) / 2f; - pixelY -= (mCellHeight + mHeightGap) * (spanY - 1) / 2f; + pixelX -= mCellWidth * (spanX - 1) / 2f; + pixelY -= mCellHeight * (spanY - 1) / 2f; // Keep track of best-scoring drop area final int[] bestXY = result != null ? result : new int[2]; @@ -2586,17 +2540,14 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, Rect resultRect) { final int cellWidth = mCellWidth; final int cellHeight = mCellHeight; - final int widthGap = mWidthGap; - final int heightGap = mHeightGap; final int hStartPadding = getPaddingLeft(); final int vStartPadding = getPaddingTop(); - int width = cellHSpan * cellWidth + ((cellHSpan - 1) * widthGap); - int height = cellVSpan * cellHeight + ((cellVSpan - 1) * heightGap); - - int x = hStartPadding + cellX * (cellWidth + widthGap); - int y = vStartPadding + cellY * (cellHeight + heightGap); + int width = cellHSpan * cellWidth; + int height = cellVSpan * cellHeight; + int x = hStartPadding + cellX * cellWidth; + int y = vStartPadding + cellY * cellHeight; resultRect.set(x, y, x + width, y + height); } @@ -2614,13 +2565,11 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } public int getDesiredWidth() { - return getPaddingLeft() + getPaddingRight() + (mCountX * mCellWidth) + - (Math.max((mCountX - 1), 0) * mWidthGap); + return getPaddingLeft() + getPaddingRight() + (mCountX * mCellWidth); } public int getDesiredHeight() { - return getPaddingTop() + getPaddingBottom() + (mCountY * mCellHeight) + - (Math.max((mCountY - 1), 0) * mHeightGap); + return getPaddingTop() + getPaddingBottom() + (mCountY * mCellHeight); } public boolean isOccupied(int x, int y) { @@ -2740,8 +2689,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { this.cellVSpan = cellVSpan; } - public void setup(int cellWidth, int cellHeight, int widthGap, int heightGap, - boolean invertHorizontally, int colCount) { + public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount) { if (isLockedToGrid) { final int myCellHSpan = cellHSpan; final int myCellVSpan = cellVSpan; @@ -2752,12 +2700,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { myCellX = colCount - myCellX - cellHSpan; } - width = myCellHSpan * cellWidth + ((myCellHSpan - 1) * widthGap) - - leftMargin - rightMargin; - height = myCellVSpan * cellHeight + ((myCellVSpan - 1) * heightGap) - - topMargin - bottomMargin; - x = (int) (myCellX * (cellWidth + widthGap) + leftMargin); - y = (int) (myCellY * (cellHeight + heightGap) + topMargin); + width = myCellHSpan * cellWidth - leftMargin - rightMargin; + height = myCellVSpan * cellHeight - topMargin - bottomMargin; + x = (myCellX * cellWidth + leftMargin); + y = (myCellY * cellHeight + topMargin); } } diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index dafc81acef..5f89af6cae 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -47,9 +47,6 @@ public class ShortcutAndWidgetContainer extends ViewGroup { private int mCellWidth; private int mCellHeight; - private int mWidthGap; - private int mHeightGap; - private int mCountX; private Launcher mLauncher; @@ -62,12 +59,9 @@ public class ShortcutAndWidgetContainer extends ViewGroup { mWallpaperManager = WallpaperManager.getInstance(context); } - public void setCellDimensions(int cellWidth, int cellHeight, int widthGap, int heightGap, - int countX, int countY) { + public void setCellDimensions(int cellWidth, int cellHeight, int countX, int countY) { mCellWidth = cellWidth; mCellHeight = cellHeight; - mWidthGap = widthGap; - mHeightGap = heightGap; mCountX = countX; } @@ -102,8 +96,7 @@ public class ShortcutAndWidgetContainer extends ViewGroup { } public void setupLp(CellLayout.LayoutParams lp) { - lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap, invertLayoutHorizontally(), - mCountX); + lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX); } // Set whether or not to invert the layout horizontally if the layout is in RTL mode. @@ -132,8 +125,7 @@ public class ShortcutAndWidgetContainer extends ViewGroup { final int cellHeight = mCellHeight; CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); if (!lp.isFullscreen) { - lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap, invertLayoutHorizontally(), - mCountX); + lp.setup(cellWidth, cellHeight, invertLayoutHorizontally(), mCountX); if (child instanceof LauncherAppWidgetHostView) { // Widgets have their own padding, so skip From c13403c612748bfdf06436510600230c4c4b55ec Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 18 Nov 2016 23:44:48 -0800 Subject: [PATCH 127/382] Defining various modes for CellLayout: Workspace, Hotseat & Folder > Moving the definition of modes to xml > Defining attributes in xml Change-Id: I7a569fdbeb833d569eeeef2f2cbc8214e608ad11 --- res/layout/folder_page.xml | 24 ++++++ res/layout/hotseat.xml | 3 +- res/layout/workspace_screen.xml | 3 +- res/values/attrs.xml | 8 ++ src/com/android/launcher3/CellLayout.java | 84 ++++++++++--------- src/com/android/launcher3/DeviceProfile.java | 14 ++++ src/com/android/launcher3/Hotseat.java | 7 +- .../launcher3/InvariantDeviceProfile.java | 5 ++ src/com/android/launcher3/Launcher.java | 1 + .../launcher3/ShortcutAndWidgetContainer.java | 32 ++----- .../WorkspaceAccessibilityHelper.java | 8 +- .../launcher3/folder/FolderPagedView.java | 4 +- .../android/launcher3/widget/WidgetCell.java | 12 +-- 13 files changed, 114 insertions(+), 91 deletions(-) create mode 100644 res/layout/folder_page.xml diff --git a/res/layout/folder_page.xml b/res/layout/folder_page.xml new file mode 100644 index 0000000000..084e8fdb67 --- /dev/null +++ b/res/layout/folder_page.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/layout/hotseat.xml b/res/layout/hotseat.xml index 7bef889a99..f5b5bbf713 100644 --- a/res/layout/hotseat.xml +++ b/res/layout/hotseat.xml @@ -20,5 +20,6 @@ android:id="@+id/layout" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_gravity="center" /> + android:layout_gravity="center" + launcher:containerType="hotseat" /> diff --git a/res/layout/workspace_screen.xml b/res/layout/workspace_screen.xml index faf688503e..94bdedbecc 100644 --- a/res/layout/workspace_screen.xml +++ b/res/layout/workspace_screen.xml @@ -19,4 +19,5 @@ xmlns:launcher="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:hapticFeedbackEnabled="false" /> + android:hapticFeedbackEnabled="false" + launcher:containerType="workspace" /> diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 32bccb82c4..1e34c0f221 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -112,4 +112,12 @@ + + + + + + + + diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 3564cecee0..af22cfaeda 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -24,6 +24,7 @@ import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -35,6 +36,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.os.Build; import android.os.Parcelable; +import android.support.annotation.IntDef; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.util.Log; @@ -60,6 +62,8 @@ import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ParcelableSparseArray; import com.android.launcher3.util.Thunk; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -145,8 +149,16 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private TimeInterpolator mEaseOutInterpolator; private ShortcutAndWidgetContainer mShortcutsAndWidgets; - private boolean mIsHotseat = false; - private float mHotseatScale = 1f; + @Retention(RetentionPolicy.SOURCE) + @IntDef({WORKSPACE, HOTSEAT, FOLDER}) + public @interface ContainerType{} + public static final int WORKSPACE = 0; + public static final int HOTSEAT = 1; + public static final int FOLDER = 2; + + @ContainerType private final int mContainerType; + + private final float mChildScale; public static final int MODE_SHOW_REORDER_HINT = 0; public static final int MODE_DRAG_OVER = 1; @@ -158,7 +170,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final float REORDER_PREVIEW_MAGNITUDE = 0.12f; private static final int REORDER_ANIMATION_DURATION = 150; - @Thunk float mReorderPreviewAnimationMagnitude; + @Thunk final float mReorderPreviewAnimationMagnitude; private ArrayList mIntersectingViews = new ArrayList(); private Rect mOccupiedRect = new Rect(); @@ -184,6 +196,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { public CellLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0); + mContainerType = a.getInteger(R.styleable.CellLayout_containerType, WORKSPACE); + a.recycle(); // A ViewGroup usually does not draw, but CellLayout needs to draw a rectangle to show // the user where a dragged item will land when dropped. @@ -207,9 +222,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mFolderLeaveBehind.delegateCellX = -1; mFolderLeaveBehind.delegateCellY = -1; + mChildScale = mContainerType == HOTSEAT ? grid.inv.hotseatScale : 1f; + setAlwaysDrawnWithCacheEnabled(false); final Resources res = getResources(); - mHotseatScale = (float) grid.hotseatIconSizePx / grid.iconSizePx; mBackground = (TransitionDrawable) res.getDrawable( FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND ? R.drawable.bg_screenpanel @@ -217,8 +233,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mBackground.setCallback(this); mBackground.setAlpha((int) (mBackgroundAlpha * 255)); - mReorderPreviewAnimationMagnitude = (REORDER_PREVIEW_MAGNITUDE * - grid.iconSizePx); + mReorderPreviewAnimationMagnitude = (REORDER_PREVIEW_MAGNITUDE * grid.iconSizePx); // Initialize the data structures used for the drag visualization. mEaseOutInterpolator = new DecelerateInterpolator(2.5f); // Quint ease out @@ -276,7 +291,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mDragOutlineAnims[i] = anim; } - mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context); + mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context, mContainerType); mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); @@ -355,10 +370,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mShortcutsAndWidgets.buildLayer(); } - public float getChildrenScale() { - return mIsHotseat ? mHotseatScale : 1.0f; - } - public void setCellDimensions(int width, int height) { mFixedCellWidth = mCellWidth = width; mFixedCellHeight = mCellHeight = height; @@ -603,15 +614,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { return mCountY; } - public void setIsHotseat(boolean isHotseat) { - mIsHotseat = isHotseat; - mShortcutsAndWidgets.setContainerType(isHotseat - ? ShortcutAndWidgetContainer.HOTSEAT - : ShortcutAndWidgetContainer.DEFAULT); - } - - public boolean isHotseat() { - return mIsHotseat; + public boolean acceptsWidget() { + return mContainerType == WORKSPACE; } public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params, @@ -621,11 +625,11 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // Hotseat icons - remove text if (child instanceof BubbleTextView) { BubbleTextView bubbleChild = (BubbleTextView) child; - bubbleChild.setTextVisibility(!mIsHotseat); + bubbleChild.setTextVisibility(mContainerType != HOTSEAT); } - child.setScaleX(getChildrenScale()); - child.setScaleY(getChildrenScale()); + child.setScaleX(mChildScale); + child.setScaleY(mChildScale); // Generate an id for each view, this assumes we have at most 256x256 cells // per workspace screen @@ -1061,24 +1065,26 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight()); } - Utilities.scaleRectAboutCenter(r, getChildrenScale()); + Utilities.scaleRectAboutCenter(r, mChildScale); mDragOutlineAnims[mDragOutlineCurrent].setTag(dragOutline); mDragOutlineAnims[mDragOutlineCurrent].animateIn(); if (dragObject.stateAnnouncer != null) { - String msg; - if (isHotseat()) { - msg = getContext().getString(R.string.move_to_hotseat_position, - Math.max(cellX, cellY) + 1); - } else { - msg = getContext().getString(R.string.move_to_empty_cell, - cellY + 1, cellX + 1); - } - dragObject.stateAnnouncer.announce(msg); + dragObject.stateAnnouncer.announce(getItemMoveDescription(cellX, cellY)); } } } + public String getItemMoveDescription(int cellX, int cellY) { + if (mContainerType == HOTSEAT) { + return getContext().getString(R.string.move_to_hotseat_position, + Math.max(cellX, cellY) + 1); + } else { + return getContext().getString(R.string.move_to_empty_cell, + cellY + 1, cellX + 1); + } + } + public void clearDragOutlines() { final int oldIndex = mDragOutlineCurrent; mDragOutlineAnims[oldIndex].animateOut(); @@ -2011,7 +2017,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { this.mode = mode; initDeltaX = child.getTranslationX(); initDeltaY = child.getTranslationY(); - finalScale = getChildrenScale() - 4.0f / child.getWidth(); + finalScale = mChildScale - 4.0f / child.getWidth(); initScale = child.getScaleX(); this.child = child; } @@ -2061,7 +2067,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // We make sure to end only after a full period initDeltaX = 0; initDeltaY = 0; - initScale = getChildrenScale(); + initScale = mChildScale; repeating = true; } }); @@ -2081,8 +2087,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } a = new LauncherViewPropertyAnimator(child) - .scaleX(getChildrenScale()) - .scaleY(getChildrenScale()) + .scaleX(mChildScale) + .scaleY(mChildScale) .translationX(0) .translationY(0) .setDuration(REORDER_ANIMATION_DURATION); @@ -2104,7 +2110,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { long screenId = mLauncher.getWorkspace().getIdForScreen(this); int container = Favorites.CONTAINER_DESKTOP; - if (mLauncher.isHotseatLayout(this)) { + if (mContainerType == HOTSEAT) { screenId = -1; container = Favorites.CONTAINER_HOTSEAT; } @@ -2127,7 +2133,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { info.spanY = lp.cellVSpan; if (requiresDbUpdate) { - LauncherModel.modifyItemInDatabase(mLauncher, info, container, screenId, + LauncherModel.modifyItemInDatabase(getContext(), info, container, screenId, info.cellX, info.cellY, info.spanX, info.spanY); } } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 59ec56ab32..b38109ce84 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -29,6 +29,7 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; +import com.android.launcher3.CellLayout.ContainerType; import com.android.launcher3.config.FeatureFlags; import java.util.ArrayList; @@ -610,6 +611,19 @@ public class DeviceProfile { : Math.max(widthPx, heightPx); } + public int getCellHeight(@ContainerType int containerType) { + switch (containerType) { + case CellLayout.WORKSPACE: + return cellHeightPx; + case CellLayout.FOLDER: + return folderCellHeightPx; + case CellLayout.HOTSEAT: + return hotseatCellHeightPx; + default: + // ?? + return 0; + } + } /** * @return the left/right paddings for all containers. diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index b93c6dfa17..7cddabb2bd 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -113,12 +113,11 @@ public class Hotseat extends FrameLayout super.onFinishInflate(); DeviceProfile grid = mLauncher.getDeviceProfile(); mContent = (CellLayout) findViewById(R.id.layout); - if (grid.isLandscape && !grid.isLargeTablet) { - mContent.setGridSize(1, (int) grid.inv.numHotseatIcons); + if (grid.isVerticalBarLayout()) { + mContent.setGridSize(1, grid.inv.numHotseatIcons); } else { - mContent.setGridSize((int) grid.inv.numHotseatIcons, 1); + mContent.setGridSize(grid.inv.numHotseatIcons, 1); } - mContent.setIsHotseat(true); resetLayout(); } diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 38545e2d0f..1b0e5b371b 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -85,6 +85,7 @@ public class InvariantDeviceProfile { */ public int numHotseatIcons; float hotseatIconSize; + public float hotseatScale; int defaultLayoutId; DeviceProfile landscapeProfile; @@ -117,6 +118,8 @@ public class InvariantDeviceProfile { numHotseatIcons = hs; hotseatIconSize = his; defaultLayoutId = dlId; + + hotseatScale = hotseatIconSize / iconSize; } @TargetApi(23) @@ -158,6 +161,8 @@ public class InvariantDeviceProfile { // Supported overrides: numRows, numColumns, iconSize applyPartnerDeviceProfileOverrides(context, dm); + hotseatScale = hotseatIconSize / iconSize; + Point realSize = new Point(); display.getRealSize(realSize); // The real size never changes. smallSide and largeSide will remain the diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f7d1f4a7e0..2f51054a38 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2784,6 +2784,7 @@ public class Launcher extends Activity } boolean isHotseatLayout(View layout) { + // TODO: Remove this method return mHotseat != null && layout != null && (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); } diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index 5f89af6cae..9568d57923 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -19,29 +19,19 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; import android.graphics.Rect; -import android.support.annotation.IntDef; import android.view.View; import android.view.ViewGroup; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; +import com.android.launcher3.CellLayout.ContainerType; public class ShortcutAndWidgetContainer extends ViewGroup { static final String TAG = "ShortcutAndWidgetContainer"; - @Retention(RetentionPolicy.SOURCE) - @IntDef({DEFAULT, HOTSEAT, FOLDER}) - public @interface ContainerType{} - public static final int DEFAULT = 0; - public static final int HOTSEAT = 1; - public static final int FOLDER = 2; - - private int mContainerType = DEFAULT; - // These are temporary variables to prevent having to allocate a new object just to // return an (x, y) value from helper functions. Do NOT use them to maintain other state. private final int[] mTmpCellXY = new int[2]; + @ContainerType private final int mContainerType; private final WallpaperManager mWallpaperManager; private int mCellWidth; @@ -50,13 +40,13 @@ public class ShortcutAndWidgetContainer extends ViewGroup { private int mCountX; private Launcher mLauncher; - private boolean mInvertIfRtl = false; - public ShortcutAndWidgetContainer(Context context) { + public ShortcutAndWidgetContainer(Context context, @ContainerType int containerType) { super(context); mLauncher = Launcher.getLauncher(context); mWallpaperManager = WallpaperManager.getInstance(context); + mContainerType = containerType; } public void setCellDimensions(int cellWidth, int cellHeight, int countX, int countY) { @@ -104,19 +94,9 @@ public class ShortcutAndWidgetContainer extends ViewGroup { mInvertIfRtl = invert; } - public void setContainerType(@ContainerType int containerType) { - mContainerType = containerType; - } - int getCellContentHeight() { - final DeviceProfile grid = mLauncher.getDeviceProfile(); - int cellContentHeight = grid.cellHeightPx; - if (mContainerType == HOTSEAT) { - cellContentHeight = grid.hotseatCellHeightPx; - } else if (mContainerType == FOLDER) { - cellContentHeight = grid.folderCellHeightPx; - } - return Math.min(getMeasuredHeight(), cellContentHeight); + return Math.min(getMeasuredHeight(), + mLauncher.getDeviceProfile().getCellHeight(mContainerType)); } public void measureChild(View child) { diff --git a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java index c71307d485..9a23aa8138 100644 --- a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java +++ b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java @@ -57,7 +57,7 @@ public class WorkspaceAccessibilityHelper extends DragAndDropAccessibilityDelega int y = id / mCountX; LauncherAccessibilityDelegate.DragInfo dragInfo = mDelegate.getDragInfo(); - if (dragInfo.dragType == DragType.WIDGET && mView.isHotseat()) { + if (dragInfo.dragType == DragType.WIDGET && !mView.acceptsWidget()) { return INVALID_POSITION; } @@ -161,11 +161,7 @@ public class WorkspaceAccessibilityHelper extends DragAndDropAccessibilityDelega View child = mView.getChildAt(x, y); if (child == null || child == dragInfo.item) { - if (mView.isHotseat()) { - return mContext.getString(R.string.move_to_hotseat_position, id + 1); - } else { - return mContext.getString(R.string.move_to_empty_cell, y + 1, x + 1); - } + return mView.getItemMoveDescription(x, y); } else { return getDescriptionForDropOver(child, mContext); } diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index e71c5e9ccc..8aaeb9e376 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -253,11 +253,9 @@ public class FolderPagedView extends PagedView { private CellLayout createAndAddNewPage() { DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile(); - CellLayout page = new CellLayout(getContext()); + CellLayout page = (CellLayout) mInflater.inflate(R.layout.folder_page, this, false); page.setCellDimensions(grid.folderCellWidthPx, grid.folderCellHeightPx); page.getShortcutsAndWidgets().setMotionEventSplittingEnabled(false); - page.getShortcutsAndWidgets().setContainerType(ShortcutAndWidgetContainer.FOLDER); - page.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); page.setInvertIfRtl(true); page.setGridSize(mGridCountX, mGridCountY); diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index 293585dd66..07f59a576e 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -29,11 +29,9 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.SimpleOnStylusPressListener; import com.android.launcher3.R; +import com.android.launcher3.SimpleOnStylusPressListener; import com.android.launcher3.StylusEventHelper; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.WidgetPreviewLoader.PreviewLoadRequest; @@ -182,14 +180,6 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { ensurePreview(); } - public int getActualItemWidth() { - ItemInfo info = (ItemInfo) getTag(); - int[] size = getPreviewSize(); - int cellWidth = mLauncher.getDeviceProfile().cellWidthPx; - - return Math.min(size[0], info.spanX * cellWidth); - } - @Override public boolean onTouchEvent(MotionEvent ev) { boolean handled = super.onTouchEvent(ev); From dde4fd971e825749686e7aa77379c65e410eea54 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 21 Nov 2016 16:02:39 +0530 Subject: [PATCH 128/382] Changing DeepShortcutManager to have a singleton contructor instead of getting it from LauncherAppState This follows the design of other managers and makes it easier to access it from other processes and non-ui thread. Bug: 33032833 Change-Id: I8ad82ae5b6cc47bae885f9896985675c7dd0d5b8 --- src/com/android/launcher3/Launcher.java | 2 +- .../android/launcher3/LauncherAppState.java | 10 +-------- src/com/android/launcher3/LauncherModel.java | 22 +++++++++---------- src/com/android/launcher3/ShortcutInfo.java | 3 ++- .../android/launcher3/model/BgDataModel.java | 7 +++--- .../launcher3/model/ShortcutsChangedTask.java | 4 ++-- .../model/UserLockStateChangedTask.java | 2 +- .../shortcuts/DeepShortcutManager.java | 14 +++++++++++- .../shortcuts/DeepShortcutsContainer.java | 3 +-- 9 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f7d1f4a7e0..9a5e1868a5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2594,7 +2594,7 @@ public class Launcher extends Activity if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { String id = ((ShortcutInfo) info).getDeepShortcutId(); String packageName = intent.getPackage(); - LauncherAppState.getInstance().getShortcutManager().startShortcut( + DeepShortcutManager.getInstance(this).startShortcut( packageName, id, intent.getSourceBounds(), optsBundle, info.user); } else { // Could be launching some bookkeeping activity diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 2a43aad23c..5937d78fcd 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -28,8 +28,6 @@ import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.logging.FileLog; -import com.android.launcher3.shortcuts.DeepShortcutManager; -import com.android.launcher3.shortcuts.ShortcutCache; import com.android.launcher3.util.ConfigMonitor; import com.android.launcher3.util.TestingUtils; import com.android.launcher3.util.Thunk; @@ -44,7 +42,6 @@ public class LauncherAppState { @Thunk final LauncherModel mModel; private final IconCache mIconCache; private final WidgetPreviewLoader mWidgetCache; - private final DeepShortcutManager mDeepShortcutManager; @Thunk boolean mWallpaperChangedSinceLastCheck; @@ -98,10 +95,9 @@ public class LauncherAppState { mInvariantDeviceProfile = new InvariantDeviceProfile(sContext); mIconCache = new IconCache(sContext, mInvariantDeviceProfile); mWidgetCache = new WidgetPreviewLoader(sContext, mIconCache); - mDeepShortcutManager = new DeepShortcutManager(sContext, new ShortcutCache()); mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class)); - mModel = new LauncherModel(this, mIconCache, mAppFilter, mDeepShortcutManager); + mModel = new LauncherModel(this, mIconCache, mAppFilter); LauncherAppsCompat.getInstance(sContext).addOnAppsChangedCallback(mModel); @@ -173,10 +169,6 @@ public class LauncherAppState { return mWidgetCache; } - public DeepShortcutManager getShortcutManager() { - return mDeepShortcutManager; - } - public boolean hasWallpaperChangedSinceLastCheck() { boolean result = mWallpaperChangedSinceLastCheck; mWallpaperChangedSinceLastCheck = false; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c70a47595d..144330a98d 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -155,7 +155,8 @@ public class LauncherModel extends BroadcastReceiver @Override public void run() { if (mDeepShortcutsLoaded) { - boolean hasShortcutHostPermission = mDeepShortcutManager.hasHostPermission(); + boolean hasShortcutHostPermission = + DeepShortcutManager.getInstance(mApp.getContext()).hasHostPermission(); if (hasShortcutHostPermission != mHasShortcutHostPermission) { mApp.reloadWorkspace(); } @@ -172,7 +173,6 @@ public class LauncherModel extends BroadcastReceiver // private final IconCache mIconCache; - private final DeepShortcutManager mDeepShortcutManager; private final LauncherAppsCompat mLauncherApps; private final UserManagerCompat mUserManager; @@ -209,14 +209,12 @@ public class LauncherModel extends BroadcastReceiver public void bindDeepShortcutMap(MultiHashMap deepShortcutMap); } - LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter, - DeepShortcutManager deepShortcutManager) { + LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) { Context context = app.getContext(); mApp = app; mBgAllAppsList = new AllAppsList(iconCache, appFilter); mBgWidgetsModel = new WidgetsModel(iconCache, appFilter); mIconCache = iconCache; - mDeepShortcutManager = deepShortcutManager; mLauncherApps = LauncherAppsCompat.getInstance(context); mUserManager = UserManagerCompat.getInstance(context); @@ -1190,6 +1188,7 @@ public class LauncherModel extends BroadcastReceiver final PackageManager manager = context.getPackageManager(); final boolean isSafeMode = manager.isSafeMode(); final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); + final DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(context); final boolean isSdCardReady = Utilities.isBootCompleted(); final MultiHashMap pendingPackages = new MultiHashMap<>(); @@ -1287,8 +1286,8 @@ public class LauncherModel extends BroadcastReceiver // We can only query for shortcuts when the user is unlocked. if (userUnlocked) { List pinnedShortcuts = - mDeepShortcutManager.queryForPinnedShortcuts(null, user); - if (mDeepShortcutManager.wasLastCallSuccess()) { + shortcutManager.queryForPinnedShortcuts(null, user); + if (shortcutManager.wasLastCallSuccess()) { for (ShortcutInfoCompat shortcut : pinnedShortcuts) { shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut); @@ -1772,7 +1771,7 @@ public class LauncherModel extends BroadcastReceiver MutableInt numTimesPinned = sBgDataModel.pinnedShortcutCounts.get(key); if (numTimesPinned == null || numTimesPinned.value == 0) { // Shortcut is pinned but doesn't exist on the workspace; unpin it. - mDeepShortcutManager.unpinShortcut(key); + shortcutManager.unpinShortcut(key); } } @@ -2325,12 +2324,13 @@ public class LauncherModel extends BroadcastReceiver } if (!mDeepShortcutsLoaded) { sBgDataModel.deepShortcutMap.clear(); - mHasShortcutHostPermission = mDeepShortcutManager.hasHostPermission(); + DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(mContext); + mHasShortcutHostPermission = shortcutManager.hasHostPermission(); if (mHasShortcutHostPermission) { for (UserHandleCompat user : mUserManager.getUserProfiles()) { if (mUserManager.isUserUnlocked(user)) { - List shortcuts = mDeepShortcutManager - .queryForAllShortcuts(user); + List shortcuts = + shortcutManager.queryForAllShortcuts(user); sBgDataModel.updateDeepShortcutMap(null, user, shortcuts); } } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index fc087363a1..513ab06380 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -32,6 +32,7 @@ import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; /** @@ -308,7 +309,7 @@ public class ShortcutInfo extends ItemInfo { // TODO: Use cache for this LauncherAppState launcherAppState = LauncherAppState.getInstance(); - Drawable unbadgedDrawable = launcherAppState.getShortcutManager() + Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) .getShortcutIconDrawable(shortcutInfo, launcherAppState.getInvariantDeviceProfile().fillResIconDpi); diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index c18eeef3d7..29defdd089 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -26,6 +26,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; @@ -123,8 +124,8 @@ public class BgDataModel { ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); if (count == null || --count.value == 0) { - LauncherAppState.getInstance() - .getShortcutManager().unpinShortcut(pinnedShortcut); + DeepShortcutManager.getInstance(LauncherAppState.getInstance().getContext()) + .unpinShortcut(pinnedShortcut); } // Fall through. } @@ -161,7 +162,7 @@ public class BgDataModel { // Since this is a new item, pin the shortcut in the system server. if (newItem && count.value == 1) { - LauncherAppState.getInstance().getShortcutManager() + DeepShortcutManager.getInstance(LauncherAppState.getInstance().getContext()) .pinShortcut(pinnedShortcut); } // Fall through diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 8f7c21db04..3314353b76 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -51,7 +51,8 @@ public class ShortcutsChangedTask extends ExtendedModelTask { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { - DeepShortcutManager deepShortcutManager = app.getShortcutManager(); + final Context context = app.getContext(); + DeepShortcutManager deepShortcutManager = DeepShortcutManager.getInstance(context); deepShortcutManager.onShortcutsChanged(mShortcuts); // Find ShortcutInfo's that have changed on the workspace. @@ -67,7 +68,6 @@ public class ShortcutsChangedTask extends ExtendedModelTask { } } - final Context context = LauncherAppState.getInstance().getContext(); final ArrayList updatedShortcutInfos = new ArrayList<>(); if (!idsToWorkspaceShortcutInfos.isEmpty()) { // Update the workspace to reflect the changes to updated shortcuts residing on it. diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index b7b52a4486..a89fe0bd7c 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -50,7 +50,7 @@ public class UserLockStateChangedTask extends ExtendedModelTask { public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { Context context = app.getContext(); boolean isUserUnlocked = UserManagerCompat.getInstance(context).isUserUnlocked(mUser); - DeepShortcutManager deepShortcutManager = app.getShortcutManager(); + DeepShortcutManager deepShortcutManager = DeepShortcutManager.getInstance(context); HashMap pinnedShortcuts = new HashMap<>(); if (isUserUnlocked) { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index c2c7c17727..41f1a47af1 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -45,10 +45,22 @@ public class DeepShortcutManager { private static final int FLAG_GET_ALL = ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_PINNED; + private static DeepShortcutManager sInstance; + private static final Object sInstanceLock = new Object(); + + public static DeepShortcutManager getInstance(Context context) { + synchronized (sInstanceLock) { + if (sInstance == null) { + sInstance = new DeepShortcutManager(context.getApplicationContext()); + } + return sInstance; + } + } + private final LauncherApps mLauncherApps; private boolean mWasLastCallSuccess; - public DeepShortcutManager(Context context, ShortcutCache shortcutCache) { + private DeepShortcutManager(Context context) { mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE); } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 08ca2429f4..314a8628be 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -52,7 +52,6 @@ import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherViewPropertyAnimator; @@ -103,7 +102,7 @@ public class DeepShortcutsContainer extends AbstractFloatingView public DeepShortcutsContainer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mLauncher = Launcher.getLauncher(context); - mDeepShortcutsManager = LauncherAppState.getInstance().getShortcutManager(); + mDeepShortcutsManager = DeepShortcutManager.getInstance(context); mStartDragThreshold = getResources().getDimensionPixelSize( R.dimen.deep_shortcuts_start_drag_threshold); From feba90fe802cb54e02dd961dbea265c044ad5f9e Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 6 Oct 2016 10:53:29 -0700 Subject: [PATCH 129/382] Added logging for HOME_INTENT and BACK commands. Document: go/false-longpress-overview Change-Id: If6ba4996c861a44f4950b41acb4246e3a483d8f2 --- protos/launcher_log.proto | 13 +++- src/com/android/launcher3/Launcher.java | 34 ++++++++- src/com/android/launcher3/Workspace.java | 14 ++-- src/com/android/launcher3/folder/Folder.java | 5 +- .../launcher3/logging/LoggerUtils.java | 49 +++++++++++-- .../logging/UserEventDispatcher.java | 69 +++++++++++++------ 6 files changed, 146 insertions(+), 38 deletions(-) diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto index 6b27559534..33041dbca2 100644 --- a/protos/launcher_log.proto +++ b/protos/launcher_log.proto @@ -63,6 +63,7 @@ enum ItemType { FOLDER_ICON = 4; DEEPSHORTCUT = 5; SEARCHBOX = 6; + EDITTEXT = 7; } // Used to define what type of container a Target would represent. @@ -91,7 +92,9 @@ enum ControlType { APPINFO_TARGET = 7; RESIZE_HANDLE = 8; VERTICAL_SCROLL = 9; - // HOME, BACK, GO_TO_PLAYSTORE + HOME_INTENT = 10; // Deprecated, use enum Command instead + BACK_BUTTON = 11; // Deprecated, use enum Command instead + // GO_TO_PLAYSTORE } // Used to define the action component of the LauncherEvent. @@ -99,6 +102,7 @@ message Action { enum Type { TOUCH = 0; AUTOMATED = 1; + COMMAND = 2; // SOFT_KEYBOARD, HARD_KEYBOARD, ASSIST } enum Touch { @@ -116,9 +120,16 @@ message Action { LEFT = 3; RIGHT = 4; } + enum Command { + HOME_INTENT = 0; + BACK = 1; + } optional Type type = 1; optional Touch touch = 2; optional Direction dir = 3; + optional Command command = 4; + // Log if the action was performed on outside of the container + optional bool is_outside = 5; } // diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9a5e1868a5..9160a012e7 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1681,9 +1681,27 @@ public class Launcher extends Activity // Can be cases where mWorkspace is null, this prevents a NPE return; } - // In all these cases, only animate if we're already on home + + // Note: There should be at most one log per method call. This is enforced implicitly + // by using if-else statements. + UserEventDispatcher ued = getUserEventDispatcher(); + + // TODO: Log this case. mWorkspace.exitWidgetResizeMode(); + AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(this); + if (topOpenView instanceof DeepShortcutsContainer) { + ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, + topOpenView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS); + } else if (topOpenView instanceof Folder) { + ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, + ((Folder) topOpenView).getFolderIcon(), LauncherLogProto.FOLDER); + } else if (alreadyOnHome) { + ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, + mWorkspace.getState().containerType, mWorkspace.getCurrentPage()); + } + + // In all these cases, only animate if we're already on home AbstractFloatingView.closeAllOpenViews(this, alreadyOnHome); exitSpringLoadedDragMode(); @@ -2187,20 +2205,34 @@ public class Launcher extends Activity return; } + // Note: There should be at most one log per method call. This is enforced implicitly + // by using if-else statements. + UserEventDispatcher ued = getUserEventDispatcher(); AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(this); if (topView != null) { if (topView.getActiveTextView() != null) { topView.getActiveTextView().dispatchBackKey(); } else { + if (topView instanceof DeepShortcutsContainer) { + ued.logActionCommand(LauncherLogProto.Action.BACK, + topView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS); + } else if (topView instanceof Folder) { + ued.logActionCommand(LauncherLogProto.Action.BACK, + ((Folder) topView).getFolderIcon(), LauncherLogProto.FOLDER); + } topView.close(true); } } else if (isAppsViewVisible()) { + ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.ALLAPPS); showWorkspace(true); } else if (isWidgetsViewVisible()) { + ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.WIDGETS); showOverviewMode(true); } else if (mWorkspace.isInOverviewMode()) { + ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.OVERVIEW); showWorkspace(true); } else { + // TODO: Log this case. mWorkspace.exitWidgetResizeMode(); // Back button is a no-op here, but give at least some feedback for the button press diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f6b5072569..7758769b3e 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -183,18 +183,20 @@ public class Workspace extends PagedView // in all apps or customize mode) public enum State { - NORMAL (false, false), - NORMAL_HIDDEN (false, false), - SPRING_LOADED (false, true), - OVERVIEW (true, true), - OVERVIEW_HIDDEN (true, false); + NORMAL (false, false, LauncherLogProto.WORKSPACE), + NORMAL_HIDDEN (false, false, LauncherLogProto.ALLAPPS), + SPRING_LOADED (false, true, LauncherLogProto.WORKSPACE), + OVERVIEW (true, true, LauncherLogProto.OVERVIEW), + OVERVIEW_HIDDEN (true, false, LauncherLogProto.WIDGETS); public final boolean shouldUpdateWidget; public final boolean hasMultipleVisiblePages; + public final int containerType; - State(boolean shouldUpdateWidget, boolean hasMultipleVisiblePages) { + State(boolean shouldUpdateWidget, boolean hasMultipleVisiblePages, int containerType) { this.shouldUpdateWidget = shouldUpdateWidget; this.hasMultipleVisiblePages = hasMultipleVisiblePages; + this.containerType = containerType; } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 53c12b5b1a..e813bb450b 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -79,7 +79,6 @@ import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.pageindicators.PageIndicatorDots; -import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.CircleRevealOutlineProvider; @@ -388,6 +387,10 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC return isEditingName() ? mFolderName : null; } + public FolderIcon getFolderIcon() { + return mFolderIcon; + } + /** * We need to handle touch events to prevent them from falling through to the workspace below. */ diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index c2b97eb2d8..395daa5f09 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -20,8 +20,16 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Target; public class LoggerUtils { private static final String TAG = "LoggerUtils"; - public static String getActionStr(LauncherLogProto.Action action) { - switch(action.touch) { + private static String getCommandStr(Action action) { + switch (action.command) { + case Action.HOME_INTENT: return "HOME_INTENT"; + case Action.BACK: return "BACK"; + default: return "UNKNOWN"; + } + } + + private static String getTouchStr(Action action) { + switch (action.touch) { case Action.TAP: return "TAP"; case Action.LONGPRESS: return "LONGPRESS"; case Action.DRAGDROP: return "DRAGDROP"; @@ -32,6 +40,14 @@ public class LoggerUtils { } } + public static String getActionStr(LauncherLogProto.Action action) { + switch (action.type) { + case Action.TOUCH: return getTouchStr(action); + case Action.COMMAND: return getCommandStr(action); + default: return "UNKNOWN"; + } + } + public static String getTargetStr(Target t) { String typeStr = ""; if (t == null){ @@ -61,6 +77,7 @@ public class LoggerUtils { case LauncherLogProto.DEEPSHORTCUT: typeStr = "DEEPSHORTCUT"; break; case LauncherLogProto.FOLDER_ICON: typeStr = "FOLDERICON"; break; case LauncherLogProto.SEARCHBOX: typeStr = "SEARCHBOX"; break; + case LauncherLogProto.EDITTEXT: typeStr = "EDITTEXT"; break; default: typeStr = "UNKNOWN"; } @@ -172,24 +189,42 @@ public class LoggerUtils { return event; } + /** + * Used for commands. + */ + public static LauncherLogProto.LauncherEvent initLauncherEvent(int command, + boolean createSrcTarget) { + LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); + event.action = new LauncherLogProto.Action(); + event.action.type = Action.COMMAND; + event.action.command = command; + event.srcTarget = null; + + if (createSrcTarget) { + event.srcTarget = new LauncherLogProto.Target[1]; + event.srcTarget[0] = new LauncherLogProto.Target(); + event.srcTarget[0].type = Target.CONTAINER; + } + return event; + } + /** * Used for drag and drop interaction. */ public static LauncherLogProto.LauncherEvent initLauncherEvent( int actionType, - View v, ItemInfo info, int parentSrcTargetType, View parentDestTargetType){ LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); event.srcTarget = new LauncherLogProto.Target[2]; - event.srcTarget[0] = initTarget(v, info); + event.srcTarget[0] = initTarget(info); event.srcTarget[1] = new LauncherLogProto.Target(); event.srcTarget[1].type = parentSrcTargetType; event.destTarget = new LauncherLogProto.Target[2]; - event.destTarget[0] = initTarget(v, info); + event.destTarget[0] = initTarget(info); event.destTarget[1] = initDropTarget(parentDestTargetType); event.action = new LauncherLogProto.Action(); @@ -197,7 +232,7 @@ public class LoggerUtils { return event; } - private static Target initTarget(View v, ItemInfo info) { + private static Target initTarget(ItemInfo info) { Target t = new LauncherLogProto.Target(); t.type = Target.ITEM; switch (info.itemType) { @@ -243,6 +278,6 @@ public class LoggerUtils { if (!(v.getTag() instanceof ItemInfo)) { return t; } - return initTarget(v, (ItemInfo) v.getTag()); + return initTarget((ItemInfo) v.getTag()); } } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index abe8f42358..2fcdd3970d 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -117,29 +117,35 @@ public class UserEventDispatcher { Action.TOUCH, v, Target.CONTAINER); event.action.touch = Action.TAP; - // Fill in grid(x,y), pageIndex of the child and container type of the parent - // TODO: make this percolate up the view hierarchy if needed. + // TODO: make idx percolate up the view hierarchy if needed. int idx = 0; - LogContainerProvider provider = getLaunchProviderRecursive(v); - if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { - return null; - } - ItemInfo itemInfo = (ItemInfo) v.getTag(); - provider.fillInLogContainerData(v, itemInfo, event.srcTarget[idx], event.srcTarget[idx + 1]); - - event.srcTarget[idx].intentHash = intent.hashCode(); - ComponentName cn = intent.getComponent(); - if (cn != null) { - event.srcTarget[idx].packageNameHash = cn.getPackageName().hashCode(); - event.srcTarget[idx].componentHash = cn.hashCode(); - if (mPredictedApps != null) { - event.srcTarget[idx].predictedRank = mPredictedApps.indexOf( - new ComponentKey(cn, itemInfo.user)); + if (fillInLogContainerData(event, v)) { + ItemInfo itemInfo = (ItemInfo) v.getTag(); + event.srcTarget[idx].intentHash = intent.hashCode(); + ComponentName cn = intent.getComponent(); + if (cn != null) { + event.srcTarget[idx].packageNameHash = cn.getPackageName().hashCode(); + event.srcTarget[idx].componentHash = cn.hashCode(); + if (mPredictedApps != null) { + event.srcTarget[idx].predictedRank = mPredictedApps.indexOf( + new ComponentKey(cn, itemInfo.user)); + } } } return event; } + public boolean fillInLogContainerData(LauncherEvent event, View v) { + // Fill in grid(x,y), pageIndex of the child and container type of the parent + LogContainerProvider provider = getLaunchProviderRecursive(v); + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { + return false; + } + ItemInfo itemInfo = (ItemInfo) v.getTag(); + provider.fillInLogContainerData(v, itemInfo, event.srcTarget[0], event.srcTarget[1]); + return true; + } + public void logAppLaunch(View v, Intent intent) { LauncherEvent ev = createLauncherEvent(v, intent); if (ev == null) { @@ -148,10 +154,30 @@ public class UserEventDispatcher { dispatchUserEvent(ev, intent); } - public void logActionOnItem(int action, int itemType) { - LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.ITEM); - event.action.touch = action; - event.srcTarget[0].itemType = itemType; + public void logActionCommand(int command, int containerType) { + logActionCommand(command, containerType, 0); + } + + public void logActionCommand(int command, int containerType, int pageIndex) { + LauncherEvent event = LoggerUtils.initLauncherEvent(command, true); + event.srcTarget[0].containerType = containerType; + event.srcTarget[0].pageIndex = pageIndex; + dispatchUserEvent(event, null); + } + + /** + * TODO: Make this function work when a container view is passed as the 2nd param. + */ + public void logActionCommand(int command, View itemView, int containerType) { + LauncherEvent event = LoggerUtils.initLauncherEvent(Action.COMMAND, itemView, + Target.CONTAINER); + event.action.command = command; + if (fillInLogContainerData(event, itemView)) { + // TODO: Remove the following two lines once fillInLogContainerData can take in a + // container view. + event.srcTarget[0].type = Target.CONTAINER; + event.srcTarget[0].containerType = containerType; + } dispatchUserEvent(event, null); } @@ -215,7 +241,6 @@ public class UserEventDispatcher { } public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, - dragObj.dragView, dragObj.originalDragInfo, Target.CONTAINER, dropTargetAsView); From 7ae64ffbe11a629e54ced0c5c99cd47228b28821 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 21 Nov 2016 16:18:46 -0800 Subject: [PATCH 130/382] Scale widgets in multi-window mode. To keep this CL small and focused, I'm going to create a separate CL that handles the scaling for the widget in drag and drop mode. Bug: 32176631 Change-Id: Id6557d070edb664aa1f4851de7abf494cf8a0677 --- .../launcher3/AppWidgetResizeFrame.java | 9 +++--- src/com/android/launcher3/CellLayout.java | 16 ++++++++-- src/com/android/launcher3/DeviceProfile.java | 10 +++++++ .../launcher3/ShortcutAndWidgetContainer.java | 30 ++++++++++++++----- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 0380923572..c45ff7b0ca 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -355,10 +355,11 @@ public class AppWidgetResizeFrame extends FrameLayout public void snapToWidget(boolean animate) { final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); - int newWidth = mWidgetView.getWidth() + 2 * mBackgroundPadding - - mWidgetPadding.left - mWidgetPadding.right; - int newHeight = mWidgetView.getHeight() + 2 * mBackgroundPadding - - mWidgetPadding.top - mWidgetPadding.bottom; + DeviceProfile profile = mLauncher.getDeviceProfile(); + int newWidth = (int) (mWidgetView.getWidth() * profile.appWidgetScale.x) + + 2 * mBackgroundPadding - mWidgetPadding.left - mWidgetPadding.right; + int newHeight = (int) (mWidgetView.getHeight() * profile.appWidgetScale.y) + + 2 * mBackgroundPadding - mWidgetPadding.top - mWidgetPadding.bottom; mTmpPt[0] = mWidgetView.getLeft(); mTmpPt[1] = mWidgetView.getTop(); diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 3564cecee0..9eaef90cef 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -2690,6 +2690,18 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount) { + setup(cellWidth, cellHeight, invertHorizontally, colCount, 1.0f, 1.0f); + } + + /** + * Use this method, as opposed to {@link #setup(int, int, boolean, int)}, if the view needs + * to be scaled. + * + * ie. In multi-window mode, we setup widgets so that they are measured and laid out + * using their full/invariant device profile sizes. + */ + public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount, + float cellScaleX, float cellScaleY) { if (isLockedToGrid) { final int myCellHSpan = cellHSpan; final int myCellVSpan = cellVSpan; @@ -2700,8 +2712,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { myCellX = colCount - myCellX - cellHSpan; } - width = myCellHSpan * cellWidth - leftMargin - rightMargin; - height = myCellVSpan * cellHeight - topMargin - bottomMargin; + width = (int) (myCellHSpan * cellWidth / cellScaleX - leftMargin - rightMargin); + height = (int) (myCellVSpan * cellHeight / cellScaleY - topMargin - bottomMargin); x = (myCellX * cellWidth + leftMargin); y = (myCellY * cellHeight + topMargin); } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 59ec56ab32..eb1db1cf05 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -21,6 +21,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.graphics.Point; +import android.graphics.PointF; import android.graphics.Rect; import android.util.DisplayMetrics; import android.view.Gravity; @@ -123,6 +124,9 @@ public class DeviceProfile { public int allAppsIconDrawablePaddingPx; public float allAppsIconTextSizePx; + // Widgets + public final PointF appWidgetScale = new PointF(1.0f, 1.0f); + // Drop Target public int dropTargetBarSizePx; @@ -220,6 +224,12 @@ public class DeviceProfile { // The nav bar is black so we add bottom padding to visually center hotseat icons. profile.hotseatBarBottomPaddingPx = profile.hotseatBarTopPaddingPx; + // We use these scales to measure and layout the widgets using their full invariant profile + // sizes and then draw them scaled and centered to fit in their multi-window mode cellspans. + float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x; + float appWidgetScaleY = (float) profile.getCellSize().y / getCellSize().y; + profile.appWidgetScale.set(appWidgetScaleX, appWidgetScaleY); + return profile; } diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index 5f89af6cae..342479f741 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -18,6 +18,7 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; +import android.graphics.PointF; import android.graphics.Rect; import android.support.annotation.IntDef; import android.view.View; @@ -120,20 +121,20 @@ public class ShortcutAndWidgetContainer extends ViewGroup { } public void measureChild(View child) { - final DeviceProfile grid = mLauncher.getDeviceProfile(); - final int cellWidth = mCellWidth; - final int cellHeight = mCellHeight; CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); if (!lp.isFullscreen) { - lp.setup(cellWidth, cellHeight, invertLayoutHorizontally(), mCountX); + final DeviceProfile profile = mLauncher.getDeviceProfile(); if (child instanceof LauncherAppWidgetHostView) { - // Widgets have their own padding, so skip + lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, + profile.appWidgetScale.x, profile.appWidgetScale.y); + // Widgets have their own padding } else { - // Otherwise, center the icon/folder + lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX); + // Center the icon/folder int cHeight = getCellContentHeight(); int cellPaddingY = (int) Math.max(0, ((lp.height - cHeight) / 2f)); - int cellPaddingX = (int) (grid.edgeMarginPx / 2f); + int cellPaddingX = (int) (profile.edgeMarginPx / 2f); child.setPadding(cellPaddingX, cellPaddingY, cellPaddingX, 0); } } else { @@ -158,6 +159,21 @@ public class ShortcutAndWidgetContainer extends ViewGroup { final View child = getChildAt(i); if (child.getVisibility() != GONE) { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); + + if (child instanceof LauncherAppWidgetHostView) { + // Scale and center the widget to fit within its cells. + DeviceProfile profile = mLauncher.getDeviceProfile(); + float scaleX = profile.appWidgetScale.x; + float scaleY = profile.appWidgetScale.y; + + float scale = Math.min(scaleX, scaleY); + child.setScaleX(scale); + child.setScaleY(scale); + + child.setTranslationX(-(lp.width - (lp.width * scaleX)) / 2.0f); + child.setTranslationY(-(lp.height - (lp.height * scaleY)) / 2.0f); + } + int childLeft = lp.x; int childTop = lp.y; child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height); From 1c581c6d61ad51df26390027725521289bd9ce4a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 24 Nov 2016 06:46:50 +0530 Subject: [PATCH 131/382] Bug fix: QSB sometimes gets stuck to transparent. At some places, we were calling removeAllListeners before calling cancel on an animation. AnimationListeners are also used to track states, and removing listeners before canceling will prevent onAnimationEnd to be called, thus preventing state cleanup. PinchAnimationManager was causing ZeroAlphaAnimatorListener to be removing from Qsb alpha animation, making the MultiStateAlphaController think there is a zeroAlpha animation running. > Removing all instances of removeAllListeners > Updating various affected listeners to handle onAnimatinoCancel > Fixing WorkspaceStateTransitionAnimation, which was animation QSB alpha on page scroll index Bug: 31910152 Change-Id: Ie7f31b67d4c502badcdd41f7b04867d1f35f5d27 --- .../android/launcher3/FastBitmapDrawable.java | 1 - .../launcher3/PinchAnimationManager.java | 12 +++++-- .../WorkspaceStateTransitionAnimation.java | 7 ++-- .../allapps/AllAppsBackgroundDrawable.java | 1 - .../pageindicators/PageIndicatorDots.java | 36 +++++++++++-------- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 7eaae5a44d..270d539391 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -364,7 +364,6 @@ public class FastBitmapDrawable extends Drawable { private AnimatorSet cancelAnimator(AnimatorSet animator) { if (animator != null) { - animator.removeAllListeners(); animator.cancel(); } return null; diff --git a/src/com/android/launcher3/PinchAnimationManager.java b/src/com/android/launcher3/PinchAnimationManager.java index c1d60fd021..41074bea01 100644 --- a/src/com/android/launcher3/PinchAnimationManager.java +++ b/src/com/android/launcher3/PinchAnimationManager.java @@ -215,9 +215,18 @@ public class PinchAnimationManager { view.setVisibility(View.VISIBLE); } else { animator.addListener(new AnimatorListenerAdapter() { + private boolean mCancelled = false; + + @Override + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + @Override public void onAnimationEnd(Animator animation) { - view.setVisibility(View.INVISIBLE); + if (!mCancelled) { + view.setVisibility(View.INVISIBLE); + } } }); } @@ -226,7 +235,6 @@ public class PinchAnimationManager { private void startAnimator(int index, Animator animator, long duration) { if (mAnimators[index] != null) { - mAnimators[index].removeAllListeners(); mAnimators[index].cancel(); } mAnimators[index] = animator; diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 1f36468a7c..6a71befe46 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -356,7 +356,8 @@ public class WorkspaceStateTransitionAnimation { cl.setShortcutAndWidgetAlpha(finalAlpha); } - if (Workspace.isQsbContainerPage(i)) { + if (Workspace.isQsbContainerPage(i) && + states.stateIsNormal && mWorkspaceFadeInAdjacentScreens) { if (animated) { Animator anim = mWorkspace.mQsbAlphaController .animateAlphaAtIndex(finalAlpha, Workspace.QSB_ALPHA_INDEX_PAGE_SCROLL); @@ -372,8 +373,6 @@ public class WorkspaceStateTransitionAnimation { final ViewGroup overviewPanel = mLauncher.getOverviewPanel(); - final View qsbContainer = mLauncher.getQsbContainer(); - Animator qsbAlphaAnimation = mWorkspace.mQsbAlphaController .animateAlphaAtIndex(finalQsbAlpha, Workspace.QSB_ALPHA_INDEX_STATE_CHANGE); @@ -395,7 +394,7 @@ public class WorkspaceStateTransitionAnimation { // For animation optimization, we may need to provide the Launcher transition // with a set of views on which to force build and manage layers in certain scenarios. layerViews.addView(overviewPanel); - layerViews.addView(qsbContainer); + layerViews.addView(mLauncher.getQsbContainer()); layerViews.addView(mLauncher.getHotseat()); layerViews.addView(mWorkspace.getPageIndicator()); diff --git a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java index cfd07e6581..bc602f37b6 100644 --- a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java +++ b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java @@ -188,7 +188,6 @@ public class AllAppsBackgroundDrawable extends Drawable { private ObjectAnimator cancelAnimator(ObjectAnimator animator) { if (animator != null) { - animator.removeAllListeners(); animator.cancel(); } return null; diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 12a67014d3..4f5edc94fd 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -72,18 +72,6 @@ public class PageIndicatorDots extends PageIndicator { } }; - /** - * Listener for keep running the animation until the final state is reached. - */ - private final AnimatorListenerAdapter mAnimCycleListener = new AnimatorListenerAdapter() { - - @Override - public void onAnimationEnd(Animator animation) { - mAnimator = null; - animateToPosition(mFinalPosition); - } - }; - private final Paint mCirclePaint; private final float mDotRadius; private final int mActiveColor; @@ -163,7 +151,7 @@ public class PageIndicatorDots extends PageIndicator { float positionForThisAnim = mCurrentPosition > mFinalPosition ? mCurrentPosition - SHIFT_PER_ANIMATION : mCurrentPosition + SHIFT_PER_ANIMATION; mAnimator = ObjectAnimator.ofFloat(this, CURRENT_POSITION, positionForThisAnim); - mAnimator.addListener(mAnimCycleListener); + mAnimator.addListener(new AnimationCycleListener()); mAnimator.setDuration(ANIMATION_DURATION); mAnimator.start(); } @@ -171,7 +159,6 @@ public class PageIndicatorDots extends PageIndicator { public void stopAllAnimations() { if (mAnimator != null) { - mAnimator.removeAllListeners(); mAnimator.cancel(); mAnimator = null; } @@ -326,4 +313,25 @@ public class PageIndicatorDots extends PageIndicator { } } } + + /** + * Listener for keep running the animation until the final state is reached. + */ + private class AnimationCycleListener extends AnimatorListenerAdapter { + + private boolean mCancelled = false; + + @Override + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCancelled) { + mAnimator = null; + animateToPosition(mFinalPosition); + } + } + } } From 72db9afef419db161bf2c7e2f1125e6818e467d3 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 29 Nov 2016 07:25:49 +0530 Subject: [PATCH 132/382] Fixing wrong message sent on app widget host reset Change-Id: If5842d4ebbf3fa0ef8596f22788f909748f01ac5 --- src/com/android/launcher3/LauncherProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 349f09405f..b30c3f3cc5 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -650,7 +650,7 @@ public class LauncherProvider extends ContentProvider { if (mWidgetHostResetHandler != null) { new AppWidgetHost(mContext, Launcher.APPWIDGET_HOST_ID).deleteHost(); mWidgetHostResetHandler.sendEmptyMessage( - ChangeListenerWrapper.MSG_EXTRACTED_COLORS_CHANGED); + ChangeListenerWrapper.MSG_APP_WIDGET_HOST_RESET); } // Set the flag for empty DB From 2bcbe13c642efa4c94df570441c700b7aa8e353d Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 16 Nov 2016 09:23:42 -0800 Subject: [PATCH 133/382] Moving ShortcutInfo creation in InstallShortcutReceiver to background thread > Creating shortcut info requires iconCache access Bug: 21325319 Change-Id: I3317d8b6824aa05b836f3ed3626f169d4d34f783 --- .../launcher3/InstallShortcutReceiver.java | 88 +++++++++++-------- src/com/android/launcher3/LauncherModel.java | 12 ++- .../model/AddWorkspaceItemsTask.java | 16 ++-- .../util/ManagedProfileHeuristic.java | 4 +- src/com/android/launcher3/util/Provider.java | 38 ++++++++ .../model/AddWorkspaceItemsTaskTest.java | 5 +- 6 files changed, 111 insertions(+), 52 deletions(-) create mode 100644 src/com/android/launcher3/util/Provider.java diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 056facba57..d2f25a4a05 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -33,6 +33,8 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.PackageManagerHelper; +import com.android.launcher3.util.Preconditions; +import com.android.launcher3.util.Provider; import com.android.launcher3.util.Thunk; import org.json.JSONException; @@ -44,6 +46,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; public class InstallShortcutReceiver extends BroadcastReceiver { @@ -76,11 +79,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { String encoded = info.encodeToString(); if (encoded != null) { Set strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null); - if (strings == null) { - strings = new HashSet(1); - } else { - strings = new HashSet(strings); - } + strings = (strings != null) ? new HashSet<>(strings) : new HashSet(1); strings.add(encoded); sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL, strings).apply(); } @@ -115,16 +114,15 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } } - private static ArrayList getAndClearInstallQueue( - SharedPreferences sharedPrefs, Context context) { + private static ArrayList getAndClearInstallQueue(Context context) { + SharedPreferences sharedPrefs = Utilities.getPrefs(context); synchronized(sLock) { + ArrayList infos = new ArrayList<>(); Set strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null); if (DBG) Log.d(TAG, "Getting and clearing APPS_PENDING_INSTALL: " + strings); if (strings == null) { - return new ArrayList(); + return infos; } - ArrayList infos = - new ArrayList(); for (String encoded : strings) { PendingInstallShortcutInfo info = decode(encoded, context); if (info != null) { @@ -212,36 +210,12 @@ public class InstallShortcutReceiver extends BroadcastReceiver { mUseInstallQueue = false; flushInstallQueue(context); } + static void flushInstallQueue(Context context) { - SharedPreferences sp = Utilities.getPrefs(context); - ArrayList installQueue = getAndClearInstallQueue(sp, context); - if (!installQueue.isEmpty()) { - Iterator iter = installQueue.iterator(); - ArrayList addShortcuts = new ArrayList(); - while (iter.hasNext()) { - final PendingInstallShortcutInfo pendingInfo = iter.next(); - - // If the intent specifies a package, make sure the package exists - String packageName = pendingInfo.getTargetPackage(); - if (!TextUtils.isEmpty(packageName)) { - UserHandleCompat myUserHandle = UserHandleCompat.myUserHandle(); - if (!LauncherAppsCompat.getInstance(context) - .isPackageEnabledForProfile(packageName, myUserHandle)) { - if (DBG) Log.d(TAG, "Ignoring shortcut for absent package: " - + pendingInfo.launchIntent); - continue; - } - } - - // Generate a shortcut info to add into the model - addShortcuts.add(pendingInfo.getShortcutInfo()); - } - - // Add the new apps to the model and bind them - if (!addShortcuts.isEmpty()) { - LauncherAppState app = LauncherAppState.getInstance(); - app.getModel().addAndBindAddedWorkspaceItems(addShortcuts); - } + ArrayList items = getAndClearInstallQueue(context); + if (!items.isEmpty()) { + LauncherAppState.getInstance().getModel().addAndBindAddedWorkspaceItems( + new LazyShortcutsProvider(context.getApplicationContext(), items)); } } @@ -445,4 +419,40 @@ public class InstallShortcutReceiver extends BroadcastReceiver { // Ignore any conflicts in the label name, as that can change based on locale. return new PendingInstallShortcutInfo(info, original.mContext); } + + private static class LazyShortcutsProvider extends Provider> { + + private final Context mContext; + private final ArrayList mPendingItems; + + public LazyShortcutsProvider(Context context, ArrayList items) { + mContext = context; + mPendingItems = items; + } + + /** + * This must be called on the background thread as this requires multiple calls to + * packageManager and icon cache. + */ + @Override + public ArrayList get() { + Preconditions.assertNonUiThread(); + ArrayList installQueue = new ArrayList<>(); + LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mContext); + for (PendingInstallShortcutInfo pendingInfo : mPendingItems) { + // If the intent specifies a package, make sure the package exists + String packageName = pendingInfo.getTargetPackage(); + if (!TextUtils.isEmpty(packageName) && !launcherApps.isPackageEnabledForProfile( + packageName, pendingInfo.user)) { + if (DBG) Log.d(TAG, "Ignoring shortcut for absent package: " + + pendingInfo.launchIntent); + continue; + } + + // Generate a shortcut info to add into the model + installQueue.add(pendingInfo.getShortcutInfo()); + } + return installQueue; + } + } } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c70a47595d..3daa2c30f1 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -84,6 +84,7 @@ import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Preconditions; +import com.android.launcher3.util.Provider; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.ViewOnDrawExecutor; @@ -258,12 +259,19 @@ public class LauncherModel extends BroadcastReceiver CacheDataUpdatedTask.OP_SESSION_UPDATE, UserHandleCompat.myUserHandle(), packages)); } + /** + * Adds the provided items to the workspace. + */ + public void addAndBindAddedWorkspaceItems(List workspaceApps) { + addAndBindAddedWorkspaceItems(Provider.of(workspaceApps)); + } + /** * Adds the provided items to the workspace. */ public void addAndBindAddedWorkspaceItems( - final ArrayList workspaceApps) { - enqueueModelUpdateTask(new AddWorkspaceItemsTask(workspaceApps)); + Provider> appsProvider) { + enqueueModelUpdateTask(new AddWorkspaceItemsTask(appsProvider)); } /** diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 986e163e6f..97335cb256 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -33,26 +33,29 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.Provider; import java.util.ArrayList; +import java.util.List; /** * Task to add auto-created workspace items. */ public class AddWorkspaceItemsTask extends ExtendedModelTask { - private final ArrayList mWorkspaceApps; + private final Provider> mAppsProvider; /** - * @param workspaceApps items to add on the workspace + * @param appsProvider items to add on the workspace */ - public AddWorkspaceItemsTask(ArrayList workspaceApps) { - mWorkspaceApps = workspaceApps; + public AddWorkspaceItemsTask(Provider> appsProvider) { + mAppsProvider = appsProvider; } @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { - if (mWorkspaceApps.isEmpty()) { + List workspaceApps = mAppsProvider.get(); + if (workspaceApps.isEmpty()) { return; } Context context = app.getContext(); @@ -65,7 +68,7 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { // called. ArrayList workspaceScreens = LauncherModel.loadWorkspaceScreensDb(context); synchronized(dataModel) { - for (ItemInfo item : mWorkspaceApps) { + for (ItemInfo item : workspaceApps) { if (item instanceof ShortcutInfo) { // Short-circuit this logic if the icon exists somewhere on the workspace if (shortcutExists(dataModel, item.getIntent(), item.user)) { @@ -258,5 +261,4 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } return occupied.findVacantCell(xy, spanX, spanY); } - } diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index 78b7a3eee3..817a38ad5c 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -121,7 +121,7 @@ public class ManagedProfileHeuristic { // getting filled with the managed user apps, when it start with a fresh DB (or after // a very long time). if (userAppsExisted && !homescreenApps.isEmpty()) { - mModel.addAndBindAddedWorkspaceItems(homescreenApps); + mModel.addAndBindAddedWorkspaceItems(new ArrayList(homescreenApps)); } } @@ -173,7 +173,7 @@ public class ManagedProfileHeuristic { } // Add the item to home screen and DB. This also generates an item id synchronously. - ArrayList itemList = new ArrayList(1); + ArrayList itemList = new ArrayList<>(1); itemList.add(workFolder); mModel.addAndBindAddedWorkspaceItems(itemList); mPrefs.edit().putLong(folderIdKey, workFolder.id).apply(); diff --git a/src/com/android/launcher3/util/Provider.java b/src/com/android/launcher3/util/Provider.java new file mode 100644 index 0000000000..1cdd8d6aa0 --- /dev/null +++ b/src/com/android/launcher3/util/Provider.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2016 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.launcher3.util; + +/** + * Utility class to allow lazy initialization of objects. + */ +public abstract class Provider { + + /** + * Initializes and returns the object. This may contain expensive operations not suitable + * to UI thread. + */ + public abstract T get(); + + public static Provider of (final T value) { + return new Provider() { + @Override + public T get() { + return value; + } + }; + } +} diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index ecb3782fc9..b2f0cbbbc7 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -15,6 +15,7 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.LongArrayMap; +import com.android.launcher3.util.Provider; import org.mockito.ArgumentCaptor; @@ -48,8 +49,8 @@ public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { idp.numRows = 5; } - private AddWorkspaceItemsTask newTask(T... items) { - return new AddWorkspaceItemsTask(new ArrayList<>(Arrays.asList(items))) { + private AddWorkspaceItemsTask newTask(ItemInfo... items) { + return new AddWorkspaceItemsTask(Provider.of(Arrays.asList(items))) { @Override protected void addItemToDatabase(Context context, ItemInfo item, From f75baa9f4023c0cf728360806891fd344aa8f3cd Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 Nov 2016 03:23:51 +0530 Subject: [PATCH 134/382] Adding support for deep shortcuts in Install queue Bug: 32904959 Change-Id: Ida43bcf78da716defdf95eb704c31973bc390ea1 --- .../launcher3/InstallShortcutReceiver.java | 201 ++++++++++++------ src/com/android/launcher3/LauncherModel.java | 5 +- .../android/launcher3/model/BgDataModel.java | 10 +- 3 files changed, 148 insertions(+), 68 deletions(-) diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index d2f25a4a05..46df0b283b 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -32,6 +32,9 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; @@ -40,10 +43,10 @@ import com.android.launcher3.util.Thunk; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONStringer; -import org.json.JSONTokener; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -63,6 +66,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static final String ICON_RESOURCE_PACKAGE_NAME_KEY = "iconResourcePackage"; private static final String APP_SHORTCUT_TYPE_KEY = "isAppShortcut"; + private static final String DEEPSHORTCUT_TYPE_KEY = "isDeepShortcut"; private static final String USER_HANDLE_KEY = "userHandle"; // The set of shortcuts that are pending install @@ -98,19 +102,25 @@ public class InstallShortcutReceiver extends BroadcastReceiver { Log.d(TAG, "APPS_PENDING_INSTALL: " + strings + ", removing packages: " + packageNames); } - if (strings != null) { - Set newStrings = new HashSet(strings); - Iterator newStringsIter = newStrings.iterator(); - while (newStringsIter.hasNext()) { - String encoded = newStringsIter.next(); - PendingInstallShortcutInfo info = decode(encoded, context); - if (info == null || (packageNames.contains(info.getTargetPackage()) - && user.equals(info.user))) { + if (Utilities.isEmpty(strings)) { + return; + } + Set newStrings = new HashSet<>(strings); + Iterator newStringsIter = newStrings.iterator(); + while (newStringsIter.hasNext()) { + String encoded = newStringsIter.next(); + try { + Decoder decoder = new Decoder(encoded, context); + if (packageNames.contains(getIntentPackage(decoder.launcherIntent)) && + user.equals(decoder.user)) { newStringsIter.remove(); } + } catch (JSONException | URISyntaxException e) { + Log.d(TAG, "Exception reading shortcut to add: " + e); + newStringsIter.remove(); } - sp.edit().putStringSet(APPS_PENDING_INSTALL, newStrings).apply(); } + sp.edit().putStringSet(APPS_PENDING_INSTALL, newStrings).apply(); } } @@ -178,7 +188,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return null; } - PendingInstallShortcutInfo info = new PendingInstallShortcutInfo(data, context); + PendingInstallShortcutInfo info = new PendingInstallShortcutInfo( + data, UserHandleCompat.myUserHandle(), context); if (info.launchIntent == null || info.label == null) { if (DBG) Log.e(TAG, "Invalid install shortcut intent"); return null; @@ -192,6 +203,31 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return info == null ? null : info.getShortcutInfo(); } + public static void queueShortcut(ShortcutInfoCompat info, Context context) { + queuePendingShortcutInfo(new PendingInstallShortcutInfo(info, context), context); + } + + public static HashSet getPendingShortcuts(Context context) { + HashSet result = new HashSet<>(); + + Set strings = Utilities.getPrefs(context).getStringSet(APPS_PENDING_INSTALL, null); + if (Utilities.isEmpty(strings)) { + return result; + } + + for (String encoded : strings) { + try { + Decoder decoder = new Decoder(encoded, context); + if (decoder.optBoolean(DEEPSHORTCUT_TYPE_KEY)) { + result.add(ShortcutKey.fromIntent(decoder.launcherIntent, decoder.user)); + } + } catch (JSONException | URISyntaxException e) { + Log.d(TAG, "Exception reading shortcut to add: " + e); + } + } + return result; + } + private static void queuePendingShortcutInfo(PendingInstallShortcutInfo info, Context context) { // Queue the item up for adding if launcher has not loaded properly yet LauncherAppState app = LauncherAppState.getInstance(); @@ -239,6 +275,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static class PendingInstallShortcutInfo { final LauncherActivityInfoCompat activityInfo; + final ShortcutInfoCompat shortcutInfo; final Intent data; final Context mContext; @@ -249,14 +286,15 @@ public class InstallShortcutReceiver extends BroadcastReceiver { /** * Initializes a PendingInstallShortcutInfo received from a different app. */ - public PendingInstallShortcutInfo(Intent data, Context context) { + public PendingInstallShortcutInfo(Intent data, UserHandleCompat user, Context context) { this.data = data; + this.user = user; mContext = context; launchIntent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); label = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); - user = UserHandleCompat.myUserHandle(); activityInfo = null; + shortcutInfo = null; } /** @@ -266,15 +304,30 @@ public class InstallShortcutReceiver extends BroadcastReceiver { this.data = null; mContext = context; activityInfo = info; + shortcutInfo = null; user = info.getUser(); launchIntent = AppInfo.makeLaunchIntent(context, info, user); label = info.getLabel().toString(); } + /** + * Initializes a PendingInstallShortcutInfo to represent a launcher target. + */ + public PendingInstallShortcutInfo(ShortcutInfoCompat info, Context context) { + this.data = null; + shortcutInfo = info; + mContext = context; + activityInfo = null; + user = info.getUserHandle(); + + launchIntent = info.makeIntent(context); + label = info.getShortLabel().toString(); + } + public String encodeToString() { - if (activityInfo != null) { - try { + try { + if (activityInfo != null) { // If it a launcher target, we only need component name, and user to // recreate this. return new JSONStringer() @@ -284,30 +337,35 @@ public class InstallShortcutReceiver extends BroadcastReceiver { .key(USER_HANDLE_KEY).value(UserManagerCompat.getInstance(mContext) .getSerialNumberForUser(user)) .endObject().toString(); - } catch (JSONException e) { - Log.d(TAG, "Exception when adding shortcut: " + e); - return null; + } else if (shortcutInfo != null) { + // If it a launcher target, we only need component name, and user to + // recreate this. + return new JSONStringer() + .object() + .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0)) + .key(DEEPSHORTCUT_TYPE_KEY).value(true) + .key(USER_HANDLE_KEY).value(UserManagerCompat.getInstance(mContext) + .getSerialNumberForUser(user)) + .endObject().toString(); } - } - if (launchIntent.getAction() == null) { - launchIntent.setAction(Intent.ACTION_VIEW); - } else if (launchIntent.getAction().equals(Intent.ACTION_MAIN) && - launchIntent.getCategories() != null && - launchIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { - launchIntent.addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - } + if (launchIntent.getAction() == null) { + launchIntent.setAction(Intent.ACTION_VIEW); + } else if (launchIntent.getAction().equals(Intent.ACTION_MAIN) && + launchIntent.getCategories() != null && + launchIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { + launchIntent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + } - // This name is only used for comparisons and notifications, so fall back to activity - // name if not supplied - String name = ensureValidName(mContext, launchIntent, label).toString(); - Bitmap icon = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); - Intent.ShortcutIconResource iconResource = - data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); + // This name is only used for comparisons and notifications, so fall back to activity + // name if not supplied + String name = ensureValidName(mContext, launchIntent, label).toString(); + Bitmap icon = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); + Intent.ShortcutIconResource iconResource = + data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - // Only encode the parameters which are supported by the API. - try { + // Only encode the parameters which are supported by the API. JSONStringer json = new JSONStringer() .object() .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0)) @@ -326,57 +384,56 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return json.endObject().toString(); } catch (JSONException e) { Log.d(TAG, "Exception when adding shortcut: " + e); + return null; } - return null; } public ShortcutInfo getShortcutInfo() { if (activityInfo != null) { return new ShortcutInfo(activityInfo, mContext); + } else if (shortcutInfo != null) { + return new ShortcutInfo(shortcutInfo, mContext); } else { return LauncherAppState.getInstance().getModel().infoFromShortcutIntent(mContext, data); } } - public String getTargetPackage() { - String packageName = launchIntent.getPackage(); - if (packageName == null) { - packageName = launchIntent.getComponent() == null ? null : - launchIntent.getComponent().getPackageName(); - } - return packageName; - } - public boolean isLauncherActivity() { return activityInfo != null; } } + private static String getIntentPackage(Intent intent) { + return intent.getComponent() == null + ? intent.getPackage() : intent.getComponent().getPackageName(); + } + private static PendingInstallShortcutInfo decode(String encoded, Context context) { try { - JSONObject object = (JSONObject) new JSONTokener(encoded).nextValue(); - Intent launcherIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0); - - if (object.optBoolean(APP_SHORTCUT_TYPE_KEY)) { - // The is an internal launcher target shortcut. - UserHandleCompat user = UserManagerCompat.getInstance(context) - .getUserForSerialNumber(object.getLong(USER_HANDLE_KEY)); - if (user == null) { - return null; - } - + Decoder decoder = new Decoder(encoded, context); + if (decoder.optBoolean(APP_SHORTCUT_TYPE_KEY)) { LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(context) - .resolveActivity(launcherIntent, user); + .resolveActivity(decoder.launcherIntent, decoder.user); return info == null ? null : new PendingInstallShortcutInfo(info, context); + } else if (decoder.optBoolean(DEEPSHORTCUT_TYPE_KEY)) { + DeepShortcutManager sm = DeepShortcutManager.getInstance(context); + List si = sm.queryForFullDetails( + decoder.launcherIntent.getPackage(), + Arrays.asList(ShortcutInfoCompat.EXTRA_SHORTCUT_ID), decoder.user); + if (si.isEmpty()) { + return null; + } else { + return new PendingInstallShortcutInfo(si.get(0), context); + } } Intent data = new Intent(); - data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent); - data.putExtra(Intent.EXTRA_SHORTCUT_NAME, object.getString(NAME_KEY)); + data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, decoder.launcherIntent); + data.putExtra(Intent.EXTRA_SHORTCUT_NAME, decoder.getString(NAME_KEY)); - String iconBase64 = object.optString(ICON_KEY); - String iconResourceName = object.optString(ICON_RESOURCE_NAME_KEY); - String iconResourcePackageName = object.optString(ICON_RESOURCE_PACKAGE_NAME_KEY); + String iconBase64 = decoder.optString(ICON_KEY); + String iconResourceName = decoder.optString(ICON_RESOURCE_NAME_KEY); + String iconResourcePackageName = decoder.optString(ICON_RESOURCE_PACKAGE_NAME_KEY); if (iconBase64 != null && !iconBase64.isEmpty()) { byte[] iconArray = Base64.decode(iconBase64, Base64.DEFAULT); Bitmap b = BitmapFactory.decodeByteArray(iconArray, 0, iconArray.length); @@ -389,13 +446,29 @@ public class InstallShortcutReceiver extends BroadcastReceiver { data.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); } - return new PendingInstallShortcutInfo(data, context); + return new PendingInstallShortcutInfo(data, decoder.user, context); } catch (JSONException | URISyntaxException e) { Log.d(TAG, "Exception reading shortcut to add: " + e); } return null; } + private static class Decoder extends JSONObject { + public final Intent launcherIntent; + public final UserHandleCompat user; + + private Decoder(String encoded, Context context) throws JSONException, URISyntaxException { + super(encoded); + launcherIntent = Intent.parseUri(getString(LAUNCH_INTENT_KEY), 0); + user = has(USER_HANDLE_KEY) ? UserManagerCompat.getInstance(context) + .getUserForSerialNumber(getLong(USER_HANDLE_KEY)) + : UserHandleCompat.myUserHandle(); + if (user == null) { + throw new JSONException("Invalid user"); + } + } + } + /** * Tries to create a new PendingInstallShortcutInfo which represents the same target, * but is an app target and not a shortcut. @@ -441,7 +514,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mContext); for (PendingInstallShortcutInfo pendingInfo : mPendingItems) { // If the intent specifies a package, make sure the package exists - String packageName = pendingInfo.getTargetPackage(); + String packageName = getIntentPackage(pendingInfo.launchIntent); if (!TextUtils.isEmpty(packageName) && !launcherApps.isPackageEnabledForProfile( packageName, pendingInfo.user)) { if (DBG) Log.d(TAG, "Ignoring shortcut for absent package: " diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c7bb188b3b..cc56d439fe 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1776,9 +1776,12 @@ public class LauncherModel extends BroadcastReceiver } // Unpin shortcuts that don't exist on the workspace. + HashSet pendingShortcuts = + InstallShortcutReceiver.getPendingShortcuts(context); for (ShortcutKey key : shortcutKeyToPinnedShortcuts.keySet()) { MutableInt numTimesPinned = sBgDataModel.pinnedShortcutCounts.get(key); - if (numTimesPinned == null || numTimesPinned.value == 0) { + if ((numTimesPinned == null || numTimesPinned.value == 0) + && !pendingShortcuts.contains(key)) { // Shortcut is pinned but doesn't exist on the workspace; unpin it. shortcutManager.unpinShortcut(key); } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 29defdd089..3d54637244 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -15,10 +15,12 @@ */ package com.android.launcher3.model; +import android.content.Context; import android.util.Log; import android.util.MutableInt; import com.android.launcher3.FolderInfo; +import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; @@ -123,9 +125,11 @@ public class BgDataModel { // Decrement pinned shortcut count ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); - if (count == null || --count.value == 0) { - DeepShortcutManager.getInstance(LauncherAppState.getInstance().getContext()) - .unpinShortcut(pinnedShortcut); + Context context = LauncherAppState.getInstance().getContext(); + if ((count == null || --count.value == 0) + && !InstallShortcutReceiver.getPendingShortcuts(context) + .contains(pinnedShortcut)) { + DeepShortcutManager.getInstance(context).unpinShortcut(pinnedShortcut); } // Fall through. } From 4633be64e863a96c63f814a2386b23b02d43910b Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 6 Dec 2016 17:11:35 -0800 Subject: [PATCH 135/382] Fix for mTransitionProgress not being updated throughout animation. Change-Id: I8f792794b7bc6edff081383b5a0a74af04a744ad --- src/com/android/launcher3/Workspace.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 7758769b3e..bd21412392 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -48,7 +48,6 @@ import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; -import android.view.animation.Animation.AnimationListener; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.TextView; @@ -2056,7 +2055,7 @@ public class Workspace extends PagedView StateTransitionListener listener = new StateTransitionListener(); if (animated) { ValueAnimator stepAnimator = ValueAnimator.ofFloat(0, 1); - stepAnimator.addListener(listener); + stepAnimator.addUpdateListener(listener); workspaceAnim.play(stepAnimator); workspaceAnim.addListener(listener); From 5dc7435b3352ab6f5645a2450290ed317bf1b054 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 6 Dec 2016 16:24:43 -0800 Subject: [PATCH 136/382] Move icon back to original cell if a quick drag would cause reorder. Most likely the user accidentally dragged the icon, so let's not rearrange their home screen. Bug: 30378199 Change-Id: I815a0817bca3b0d212324a58842b1f59dfdf0b91 --- src/com/android/launcher3/Workspace.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index bd21412392..85cb73678a 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2569,10 +2569,19 @@ public class Workspace extends PagedView && item.screenId == screenId && item.container == container && item.cellX == mTargetCell[0] && item.cellY == mTargetCell[1]; + // When quickly moving an item, a user may accidentally rearrange their + // workspace. So instead we move the icon back safely to its original position. + boolean returnToOriginalCellToPreventShuffling = !isFinishedSwitchingState() + && !droppedOnOriginalCellDuringTransition && !dropTargetLayout + .isRegionVacant(mTargetCell[0], mTargetCell[1], spanX, spanY); int[] resultSpan = new int[2]; - mTargetCell = dropTargetLayout.performReorder((int) mDragViewVisualCenter[0], - (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY, cell, - mTargetCell, resultSpan, CellLayout.MODE_ON_DROP); + if (returnToOriginalCellToPreventShuffling) { + mTargetCell[0] = mTargetCell[1] = -1; + } else { + mTargetCell = dropTargetLayout.performReorder((int) mDragViewVisualCenter[0], + (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY, cell, + mTargetCell, resultSpan, CellLayout.MODE_ON_DROP); + } boolean foundCell = mTargetCell[0] >= 0 && mTargetCell[1] >= 0; @@ -2638,7 +2647,9 @@ public class Workspace extends PagedView LauncherModel.modifyItemInDatabase(mLauncher, info, container, screenId, lp.cellX, lp.cellY, item.spanX, item.spanY); } else { - onNoCellFound(dropTargetLayout); + if (!returnToOriginalCellToPreventShuffling) { + onNoCellFound(dropTargetLayout); + } // If we can't find a drop location, we return the item to its original position CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams(); From d5462aa31b53eb690a3f57c7c6c0cc4021271de6 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 Nov 2016 16:52:39 +0530 Subject: [PATCH 137/382] Simplifyling widget inflation and addition flow. > Removing insert parameter used to select the index of the view. ShortcutAndWidgetContainer no longet relies on the index and instead uses x and y to refer a particulat view. > Creating helper methods to easily insert the icon by passing ItemInfo directly. LauncherModel.addItemToDatabase synchronously updates the ItemInfo with proper postion information. So we can directly use the info instead of passing each parameter separately. Bug: 32904959 Change-Id: I021c1b818f2f42604b95a6970e06aacc7211292a --- src/com/android/launcher3/Launcher.java | 49 +++++---------- .../launcher3/PendingAppWidgetHostView.java | 8 ++- src/com/android/launcher3/Workspace.java | 60 +++++++++---------- src/com/android/launcher3/folder/Folder.java | 3 +- 4 files changed, 50 insertions(+), 70 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9160a012e7..8cc0fca96b 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1470,9 +1470,7 @@ public class Launcher extends Activity } LauncherModel.addItemToDatabase(this, info, container, screenId, cellXY[0], cellXY[1]); - - mWorkspace.addInScreen(view, container, screenId, cellXY[0], cellXY[1], 1, 1, - isWorkspaceLocked()); + mWorkspace.addInScreen(view, info); } /** @@ -1507,20 +1505,15 @@ public class Launcher extends Activity hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); } hostView.setVisibility(View.VISIBLE); - addAppWidgetToWorkspace(hostView, launcherInfo, appWidgetInfo, isWorkspaceLocked()); + prepareAppWidget(hostView, launcherInfo); + mWorkspace.addInScreen(hostView, launcherInfo); } - private void addAppWidgetToWorkspace( - AppWidgetHostView hostView, LauncherAppWidgetInfo item, - LauncherAppWidgetProviderInfo appWidgetInfo, boolean insert) { + private void prepareAppWidget(AppWidgetHostView hostView, LauncherAppWidgetInfo item) { hostView.setTag(item); item.onBindAppWidget(this, hostView); - hostView.setFocusable(true); hostView.setOnFocusChangeListener(mFocusHandler); - - mWorkspace.addInScreen(hostView, item.container, item.screenId, - item.cellX, item.cellY, item.spanX, item.spanY, insert); } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -2105,8 +2098,7 @@ public class Launcher extends Activity // Create the view FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache); - mWorkspace.addInScreen(newFolder, container, screenId, cellX, cellY, 1, 1, - isWorkspaceLocked()); + mWorkspace.addInScreen(newFolder, folderInfo); // Force measure the new folder icon CellLayout parent = mWorkspace.getParentCellLayoutForView(newFolder); parent.getShortcutsAndWidgets().measureChild(newFolder); @@ -3365,8 +3357,7 @@ public class Launcher extends Activity } } } - workspace.addInScreenFromBind(view, item.container, item.screenId, item.cellX, - item.cellY, 1, 1); + workspace.addInScreenFromBind(view, item); if (animateIcons) { // Animate all the applications up now view.setAlpha(0f); @@ -3408,15 +3399,6 @@ public class Launcher extends Activity workspace.requestLayout(); } - private void bindSafeModeWidget(LauncherAppWidgetInfo item) { - PendingAppWidgetHostView view = new PendingAppWidgetHostView(this, item, true); - view.updateIcon(mIconCache); - view.updateAppWidget(null); - view.setOnClickListener(this); - addAppWidgetToWorkspace(view, item, null, false); - mWorkspace.requestLayout(); - } - /** * Add the views for a widget to the workspace. * @@ -3433,7 +3415,11 @@ public class Launcher extends Activity } if (mIsSafeModeEnabled) { - bindSafeModeWidget(item); + PendingAppWidgetHostView view = + new PendingAppWidgetHostView(this, item, mIconCache, true); + prepareAppWidget(view, item); + mWorkspace.addInScreen(view, item); + mWorkspace.requestLayout(); return; } @@ -3521,6 +3507,7 @@ public class Launcher extends Activity } } + final AppWidgetHostView view; if (item.restoreStatus == LauncherAppWidgetInfo.RESTORE_COMPLETED) { if (DEBUG_WIDGETS) { Log.d(TAG, "bindAppWidget: id=" + item.appWidgetId + " belongs to component " @@ -3536,16 +3523,12 @@ public class Launcher extends Activity item.minSpanX = appWidgetInfo.minSpanX; item.minSpanY = appWidgetInfo.minSpanY; - addAppWidgetToWorkspace( - mAppWidgetHost.createView(this, item.appWidgetId, appWidgetInfo), - item, appWidgetInfo, false); + view = mAppWidgetHost.createView(this, item.appWidgetId, appWidgetInfo); } else { - PendingAppWidgetHostView view = new PendingAppWidgetHostView(this, item, false); - view.updateIcon(mIconCache); - view.updateAppWidget(null); - view.setOnClickListener(this); - addAppWidgetToWorkspace(view, item, null, false); + view = new PendingAppWidgetHostView(this, item, mIconCache, false); } + prepareAppWidget(view, item); + mWorkspace.addInScreen(view, item); mWorkspace.requestLayout(); if (DEBUG_WIDGETS) { diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java index bf397744bc..eb1a76388d 100644 --- a/src/com/android/launcher3/PendingAppWidgetHostView.java +++ b/src/com/android/launcher3/PendingAppWidgetHostView.java @@ -63,7 +63,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen @TargetApi(Build.VERSION_CODES.LOLLIPOP) public PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info, - boolean disabledForSafeMode) { + IconCache cache, boolean disabledForSafeMode) { super(new ContextThemeWrapper(context, R.style.WidgetContainerTheme)); mLauncher = Launcher.getLauncher(context); @@ -82,6 +82,10 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen if (Utilities.ATLEAST_LOLLIPOP) { setElevation(getResources().getDimension(R.dimen.pending_widget_elevation)); } + + updateIcon(cache); + updateAppWidget(null); + setOnClickListener(mLauncher); } @Override @@ -117,7 +121,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen mDrawableSizeChanged = true; } - public void updateIcon(IconCache cache) { + private void updateIcon(IconCache cache) { Bitmap icon = cache.getIcon(mIconLookupIntent, mInfo.user); if (mIcon == icon) { return; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index bd21412392..54d9b2ea1d 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1043,23 +1043,28 @@ public class Workspace extends PagedView } } - // See implementation for parameter definition. - void addInScreen(View child, long container, long screenId, - int x, int y, int spanX, int spanY) { - addInScreen(child, container, screenId, x, y, spanX, spanY, false, false); + /** + * At bind time, we use the rank (screenId) to compute x and y for hotseat items. + * See {@link #addInScreen}. + */ + public void addInScreenFromBind(View child, ItemInfo info) { + int x = info.cellX; + int y = info.cellY; + if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + int screenId = (int) info.screenId; + x = mLauncher.getHotseat().getCellXFromOrder(screenId); + y = mLauncher.getHotseat().getCellYFromOrder(screenId); + } + addInScreen(child, info.container, info.screenId, x, y, info.spanX, info.spanY); } - // At bind time, we use the rank (screenId) to compute x and y for hotseat items. - // See implementation for parameter definition. - public void addInScreenFromBind(View child, long container, long screenId, int x, int y, - int spanX, int spanY) { - addInScreen(child, container, screenId, x, y, spanX, spanY, false, true); - } - - // See implementation for parameter definition. - void addInScreen(View child, long container, long screenId, int x, int y, int spanX, int spanY, - boolean insert) { - addInScreen(child, container, screenId, x, y, spanX, spanY, insert, false); + /** + * Adds the specified child in the specified screen based on the {@param info} + * See {@link #addInScreen}. + */ + public void addInScreen(View child, ItemInfo info) { + addInScreen(child, info.container, info.screenId, info.cellX, info.cellY, + info.spanX, info.spanY); } /** @@ -1072,13 +1077,9 @@ public class Workspace extends PagedView * @param y The Y position of the child in the screen's grid. * @param spanX The number of cells spanned horizontally by the child. * @param spanY The number of cells spanned vertically by the child. - * @param insert When true, the child is inserted at the beginning of the children list. - * @param computeXYFromRank When true, we use the rank (stored in screenId) to compute - * the x and y position in which to place hotseat items. Otherwise - * we use the x and y position to compute the rank. */ - void addInScreen(View child, long container, long screenId, int x, int y, int spanX, int spanY, - boolean insert, boolean computeXYFromRank) { + private void addInScreen(View child, long container, long screenId, int x, int y, + int spanX, int spanY) { if (container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { if (getScreenWithId(screenId) == null) { Log.e(TAG, "Skipping child, screenId " + screenId + " not found"); @@ -1101,13 +1102,6 @@ public class Workspace extends PagedView if (child instanceof FolderIcon) { ((FolderIcon) child).setTextVisible(false); } - - if (computeXYFromRank) { - x = mLauncher.getHotseat().getCellXFromOrder((int) screenId); - y = mLauncher.getHotseat().getCellYFromOrder((int) screenId); - } else { - screenId = mLauncher.getHotseat().getOrderInHotseat(x, y); - } } else { // Show folder title if not in the hotseat if (child instanceof FolderIcon) { @@ -1138,7 +1132,7 @@ public class Workspace extends PagedView int childId = mLauncher.getViewIdForItem(info); boolean markCellsAsOccupied = !(child instanceof Folder); - if (!layout.addViewToCellLayout(child, insert ? 0 : -1, childId, lp, markCellsAsOccupied)) { + if (!layout.addViewToCellLayout(child, -1, childId, lp, markCellsAsOccupied)) { // TODO: This branch occurs when the workspace is adding views // outside of the defined grid // maybe we should be deleting these items from the LauncherModel? @@ -2519,7 +2513,7 @@ public class Workspace extends PagedView if (d.dragSource != this) { final int[] touchXY = new int[] { (int) mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1] }; - onDropExternal(touchXY, d.dragInfo, dropTargetLayout, false, d); + onDropExternal(touchXY, d.dragInfo, dropTargetLayout, d); } else if (mDragInfo != null) { final View cell = mDragInfo.cell; boolean droppedOnOriginalCellDuringTransition = false; @@ -3265,7 +3259,7 @@ public class Workspace extends PagedView * to add an item to one of the workspace screens. */ private void onDropExternal(final int[] touchXY, final ItemInfo dragInfo, - final CellLayout cellLayout, boolean insertAtFirst, DragObject d) { + final CellLayout cellLayout, DragObject d) { final Runnable exitSpringLoadedRunnable = new Runnable() { @Override public void run() { @@ -3415,8 +3409,8 @@ public class Workspace extends PagedView LauncherModel.addOrMoveItemInDatabase(mLauncher, info, container, screenId, mTargetCell[0], mTargetCell[1]); - addInScreen(view, container, screenId, mTargetCell[0], mTargetCell[1], info.spanX, - info.spanY, insertAtFirst); + addInScreen(view, container, screenId, mTargetCell[0], mTargetCell[1], + info.spanX, info.spanY); cellLayout.onDropChild(view); cellLayout.getShortcutsAndWidgets().measureChild(view); diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index e813bb450b..a81b4caba5 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -1225,8 +1225,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC // We add the child after removing the folder to prevent both from existing // at the same time in the CellLayout. We need to add the new item with // addInScreenFromBind() to ensure that hotseat items are placed correctly. - mLauncher.getWorkspace().addInScreenFromBind(newIcon, mInfo.container, - mInfo.screenId, mInfo.cellX, mInfo.cellY, mInfo.spanX, mInfo.spanY); + mLauncher.getWorkspace().addInScreenFromBind(newIcon, mInfo); // Focus the newly created child newIcon.requestFocus(); From 55cb70bf70d6defe84fe44e0d942998adefbb71c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sat, 12 Nov 2016 09:58:29 -0800 Subject: [PATCH 138/382] Adding an overridable DrawableFactory to allow creating custom icon drawables > Adding ItemInfo as a parameter for creating drawable Change-Id: I793acb0381d2b8df4db0a08317dddf1464788ebc --- res/values/config.xml | 3 + src/com/android/launcher3/BubbleTextView.java | 20 +----- .../android/launcher3/FastBitmapDrawable.java | 19 +++-- src/com/android/launcher3/Hotseat.java | 5 +- src/com/android/launcher3/Launcher.java | 18 ----- .../launcher3/PendingAppWidgetHostView.java | 9 ++- .../android/launcher3/folder/FolderIcon.java | 5 +- .../launcher3/graphics/DrawableFactory.java | 69 +++++++++++++++++++ 8 files changed, 100 insertions(+), 48 deletions(-) create mode 100644 src/com/android/launcher3/graphics/DrawableFactory.java diff --git a/res/values/config.xml b/res/values/config.xml index 5b3ee46335..d270def78e 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -79,6 +79,9 @@ + + + diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index dbb797dc55..51cd0527f1 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -26,9 +25,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Region; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.util.AttributeSet; import android.util.SparseArray; import android.util.TypedValue; @@ -42,6 +39,7 @@ import android.widget.TextView; import com.android.launcher3.IconCache.IconLoadRequest; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.model.PackageItemInfo; @@ -190,7 +188,7 @@ public class BubbleTextView extends TextView } private void applyIconAndLabel(Bitmap icon, ItemInfo info) { - FastBitmapDrawable iconDrawable = mLauncher.createIconDrawable(icon); + FastBitmapDrawable iconDrawable = DrawableFactory.get(getContext()).newIcon(icon, info); iconDrawable.setIsDisabled(info.isDisabled()); setIcon(iconDrawable); setText(info.title); @@ -201,15 +199,6 @@ public class BubbleTextView extends TextView } } - /** - * Used for measurement only, sets some dummy values on this view. - */ - public void applyDummyInfo() { - ColorDrawable d = new ColorDrawable(); - setIcon(mLauncher.resizeIconDrawable(d)); - setText(""); - } - /** * Overrides the default long press timeout. */ @@ -528,12 +517,9 @@ public class BubbleTextView extends TextView /** * Sets the icon for this view based on the layout direction. */ - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void setIcon(Drawable icon) { mIcon = icon; - if (mIconSize != -1) { - mIcon.setBounds(0, 0, mIconSize, mIconSize); - } + mIcon.setBounds(0, 0, mIconSize, mIconSize); applyCompoundDrawables(mIcon); } diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 270d539391..0cefc57392 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -94,7 +94,7 @@ public class FastBitmapDrawable extends Drawable { private static final ColorMatrix sTempBrightnessMatrix = new ColorMatrix(); private static final ColorMatrix sTempFilterMatrix = new ColorMatrix(); - private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); + protected final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); private final Bitmap mBitmap; private State mState = State.NORMAL; private boolean mIsDisabled; @@ -116,6 +116,17 @@ public class FastBitmapDrawable extends Drawable { @Override public void draw(Canvas canvas) { + drawInternal(canvas); + } + + public void drawWithBrightness(Canvas canvas, float brightness) { + float oldBrightness = getBrightness(); + setBrightness(brightness); + drawInternal(canvas); + setBrightness(oldBrightness); + } + + protected void drawInternal(Canvas canvas) { canvas.drawBitmap(mBitmap, null, getBounds(), mPaint); } @@ -278,7 +289,7 @@ public class FastBitmapDrawable extends Drawable { /** * Sets the saturation of this icon, 0 [full color] -> 1 [desaturated] */ - public void setDesaturation(float desaturation) { + private void setDesaturation(float desaturation) { int newDesaturation = (int) Math.floor(desaturation * REDUCED_FILTER_VALUE_SPACE); if (mDesaturation != newDesaturation) { mDesaturation = newDesaturation; @@ -293,7 +304,7 @@ public class FastBitmapDrawable extends Drawable { /** * Sets the brightness of this icon, 0 [no add. brightness] -> 1 [2bright2furious] */ - public void setBrightness(float brightness) { + private void setBrightness(float brightness) { int newBrightness = (int) Math.floor(brightness * REDUCED_FILTER_VALUE_SPACE); if (mBrightness != newBrightness) { mBrightness = newBrightness; @@ -301,7 +312,7 @@ public class FastBitmapDrawable extends Drawable { } } - public float getBrightness() { + private float getBrightness() { return (float) mBrightness / REDUCED_FILTER_VALUE_SPACE; } diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index b93c6dfa17..5c96dde43d 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -129,14 +129,15 @@ public class Hotseat extends FrameLayout if (!FeatureFlags.NO_ALL_APPS_ICON) { // Add the Apps button Context context = getContext(); - int allAppsButtonRank = mLauncher.getDeviceProfile().inv.getAllAppsButtonRank(); + DeviceProfile grid = mLauncher.getDeviceProfile(); + int allAppsButtonRank = grid.inv.getAllAppsButtonRank(); LayoutInflater inflater = LayoutInflater.from(context); TextView allAppsButton = (TextView) inflater.inflate(R.layout.all_apps_button, mContent, false); Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon); + d.setBounds(0, 0, grid.iconSizePx, grid.iconSizePx); - mLauncher.resizeIconDrawable(d); int scaleDownPx = getResources().getDimensionPixelSize(R.dimen.all_apps_button_scale_down); Rect bounds = d.getBounds(); d.setBounds(bounds.left, bounds.top + scaleDownPx / 2, bounds.right - scaleDownPx, diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9160a012e7..887a8bd2de 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4034,24 +4034,6 @@ public class Launcher extends Activity mWorkspace.moveToDefaultScreen(false); } - /** - * Returns a FastBitmapDrawable with the icon, accurately sized. - */ - public FastBitmapDrawable createIconDrawable(Bitmap icon) { - FastBitmapDrawable d = new FastBitmapDrawable(icon); - d.setFilterBitmap(true); - resizeIconDrawable(d); - return d; - } - - /** - * Resizes an icon drawable to the correct icon size. - */ - public Drawable resizeIconDrawable(Drawable icon) { - icon.setBounds(0, 0, mDeviceProfile.iconSizePx, mDeviceProfile.iconSizePx); - return icon; - } - /** * Prints out out state for debugging. */ diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java index bf397744bc..7c9b76bdfb 100644 --- a/src/com/android/launcher3/PendingAppWidgetHostView.java +++ b/src/com/android/launcher3/PendingAppWidgetHostView.java @@ -36,6 +36,8 @@ import android.view.ContextThemeWrapper; import android.view.View; import android.view.View.OnClickListener; +import com.android.launcher3.graphics.DrawableFactory; + public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implements OnClickListener { private static final float SETUP_ICON_SIZE_FACTOR = 2f / 5; private static final float MIN_SATUNATION = 0.7f; @@ -132,13 +134,14 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen // 1) App icon in the center // 2) Preload icon in the center // 3) Setup icon in the center and app icon in the top right corner. + DrawableFactory drawableFactory = DrawableFactory.get(getContext()); if (mDisabledForSafeMode) { - FastBitmapDrawable disabledIcon = mLauncher.createIconDrawable(mIcon); + FastBitmapDrawable disabledIcon = drawableFactory.newIcon(mIcon, mInfo); disabledIcon.setIsDisabled(true); mCenterDrawable = disabledIcon; mSettingIconDrawable = null; } else if (isReadyForClickSetup()) { - mCenterDrawable = new FastBitmapDrawable(mIcon); + mCenterDrawable = drawableFactory.newIcon(mIcon, mInfo); mSettingIconDrawable = getResources().getDrawable(R.drawable.ic_setting).mutate(); updateSettingColor(); @@ -148,7 +151,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen sPreloaderTheme.applyStyle(R.style.PreloadIcon, true); } - FastBitmapDrawable drawable = mLauncher.createIconDrawable(mIcon); + FastBitmapDrawable drawable = drawableFactory.newIcon(mIcon, mInfo); mCenterDrawable = new PreloadIconDrawable(drawable, sPreloaderTheme); mCenterDrawable.setCallback(this); mSettingIconDrawable = null; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index a29a946591..37453232be 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -459,10 +459,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { d.setBounds(0, 0, mIntrinsicIconSize, mIntrinsicIconSize); if (d instanceof FastBitmapDrawable) { FastBitmapDrawable fd = (FastBitmapDrawable) d; - float oldBrightness = fd.getBrightness(); - fd.setBrightness(params.overlayAlpha); - d.draw(canvas); - fd.setBrightness(oldBrightness); + fd.drawWithBrightness(canvas, params.overlayAlpha); } else { d.setColorFilter(Color.argb((int) (params.overlayAlpha * 255), 255, 255, 255), PorterDuff.Mode.SRC_ATOP); diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java new file mode 100644 index 0000000000..2926a29d6a --- /dev/null +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2016 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.launcher3.graphics; + +import android.content.Context; +import android.graphics.Bitmap; +import android.text.TextUtils; + +import com.android.launcher3.FastBitmapDrawable; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.R; + +import java.lang.reflect.InvocationTargetException; + +/** + * Factory for creating new drawables. + */ +public class DrawableFactory { + + private static DrawableFactory sInstance; + private static final Object LOCK = new Object(); + + public static DrawableFactory get(Context context) { + synchronized (LOCK) { + if (sInstance == null) { + context = context.getApplicationContext(); + sInstance = loadByName(context.getString(R.string.drawable_factory_class), context); + } + return sInstance; + } + } + + public static DrawableFactory loadByName(String className, Context context) { + if (!TextUtils.isEmpty(className)) { + try { + Class cls = Class.forName(className); + return (DrawableFactory) + cls.getDeclaredConstructor(Context.class).newInstance(context); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | ClassCastException | NoSuchMethodException | InvocationTargetException e) { + return new DrawableFactory(); + } + } + return new DrawableFactory(); + } + + /** + * Returns a FastBitmapDrawable with the icon. + */ + public FastBitmapDrawable newIcon(Bitmap icon, ItemInfo info) { + FastBitmapDrawable d = new FastBitmapDrawable(icon); + d.setFilterBitmap(true); + return d; + } +} From f7ff3fe58a5daea94cbb641aa09a0eb4a5d2f8c3 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 5 Dec 2016 12:04:44 -0800 Subject: [PATCH 139/382] Scale widgets when dragging and dropping in multi-window mode. This change mimics the non-MW mode behavior when dragging and dropping widgets by taking the app widget scale into consideration. This ensures a consistant drag and drop experience between MW mode and non-MW mode. * Uses cell data (cell height/width, spanX/Y) to get the expected widget sizes. * Scales sizes when necessary. Bug: 32176631 Change-Id: Icdaf73ecd89a30e57fe7f405292d793f2d6a3ee8 --- src/com/android/launcher3/CellLayout.java | 2 +- src/com/android/launcher3/Workspace.java | 14 ++--- .../graphics/DragPreviewProvider.java | 59 +++++++++++++++---- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 9eaef90cef..866d239458 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -1041,7 +1041,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // Offsets due to the size difference between the View and the dragOutline. // There is a size difference to account for the outer blur, which may lie // outside the bounds of the view. - top += (v.getHeight() - dragOutline.getHeight()) / 2; + top += ((mCellHeight * spanY) - dragOutline.getHeight()) / 2; // We center about the x axis left += ((mCellWidth * spanX) - dragOutline.getWidth()) / 2; } else { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index bd21412392..7f7d3a87c2 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3467,14 +3467,14 @@ public class Workspace extends PagedView mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(layout, loc, true); resetTransitionTransform(layout); - float dragViewScaleX; - float dragViewScaleY; + float dragViewScaleX = 1f; + float dragViewScaleY = 1f; if (scale) { - dragViewScaleX = (1.0f * r.width()) / dragView.getMeasuredWidth(); - dragViewScaleY = (1.0f * r.height()) / dragView.getMeasuredHeight(); - } else { - dragViewScaleX = 1f; - dragViewScaleY = 1f; + float width = info.spanX * layout.mCellWidth; + float height = info.spanY * layout.mCellHeight; + + dragViewScaleX = r.width() / width; + dragViewScaleY = r.height() / height; } // The animation will scale the dragView about its center, so we need to center about diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index a7d4c63a19..e205c42113 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -24,7 +24,9 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PreloadIconDrawable; import com.android.launcher3.Workspace; import com.android.launcher3.config.ProviderConfig; @@ -100,20 +102,31 @@ public class DragPreviewProvider { * Responsibility for the bitmap is transferred to the caller. */ public Bitmap createDragBitmap(Canvas canvas) { - Bitmap b; + float scale = 1f; + int width = mView.getWidth(); + int height = mView.getHeight(); if (mView instanceof TextView) { Drawable d = Workspace.getTextViewIcon((TextView) mView); Rect bounds = getDrawableBounds(d); - b = Bitmap.createBitmap(bounds.width() + DRAG_BITMAP_PADDING, - bounds.height() + DRAG_BITMAP_PADDING, Bitmap.Config.ARGB_8888); - } else { - b = Bitmap.createBitmap(mView.getWidth() + DRAG_BITMAP_PADDING, - mView.getHeight() + DRAG_BITMAP_PADDING, Bitmap.Config.ARGB_8888); + width = bounds.width(); + height = bounds.height(); + } else if (mView instanceof LauncherAppWidgetHostView) { + DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); + scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + width = (int) (mView.getWidth() * scale); + height = (int) (mView.getHeight() * scale); } + Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING, + Bitmap.Config.ARGB_8888); canvas.setBitmap(b); + + canvas.save(); + canvas.scale(scale, scale); drawDragView(canvas); + canvas.restore(); + canvas.setBitmap(null); return b; @@ -132,12 +145,29 @@ public class DragPreviewProvider { * Responsibility for the bitmap is transferred to the caller. */ public Bitmap createDragOutline(Canvas canvas) { - final Bitmap b = Bitmap.createBitmap(mView.getWidth() + DRAG_BITMAP_PADDING, - mView.getHeight() + DRAG_BITMAP_PADDING, Bitmap.Config.ALPHA_8); + float scale = 1f; + int width = mView.getWidth(); + int height = mView.getHeight(); + + if (mView instanceof LauncherAppWidgetHostView) { + DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); + scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + width = (int) Math.floor(mView.getWidth() * scale); + height = (int) Math.floor(mView.getHeight() * scale); + } + + Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING, + Bitmap.Config.ALPHA_8); canvas.setBitmap(b); + + canvas.save(); + canvas.scale(scale, scale); drawDragView(canvas); + canvas.restore(); + HolographicOutlineHelper.getInstance(mView.getContext()) .applyExpensiveOutlineWithBlur(b, canvas); + canvas.setBitmap(null); return b; } @@ -160,8 +190,17 @@ public class DragPreviewProvider { public float getScaleAndPosition(Bitmap preview, int[] outPos) { float scale = Launcher.getLauncher(mView.getContext()) .getDragLayer().getLocationInDragLayer(mView, outPos); - outPos[0] = Math.round(outPos[0] - (preview.getWidth() - scale * mView.getWidth()) / 2); - outPos[1] = Math.round(outPos[1] - (1 - scale) * preview.getHeight() / 2 - previewPadding / 2); + DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); + if (mView instanceof LauncherAppWidgetHostView) { + // App widgets are technically scaled, but are drawn at their expected size -- so the + // app widget scale should not affect the scale of the preview. + scale /= Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + } + + outPos[0] = Math.round(outPos[0] - + (preview.getWidth() - scale * mView.getWidth() * mView.getScaleX()) / 2); + outPos[1] = Math.round(outPos[1] - (1 - scale) * preview.getHeight() / 2 + - previewPadding / 2); return scale; } } From e391bd5a9acfbe08edac56fe2f3c3c21b2b8cb51 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 8 Dec 2016 11:41:22 -0800 Subject: [PATCH 140/382] Set PreloadIconDrawable disabled = false when restore is complete This ensures that it regains its color rather than remaining gray. Bug: 33429398 Change-Id: Ic073570613aa01f061f0f3093cf05ee74332ae8a --- src/com/android/launcher3/PreloadIconDrawable.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/PreloadIconDrawable.java b/src/com/android/launcher3/PreloadIconDrawable.java index efc0eaca2b..973e688d92 100644 --- a/src/com/android/launcher3/PreloadIconDrawable.java +++ b/src/com/android/launcher3/PreloadIconDrawable.java @@ -177,8 +177,9 @@ public class PreloadIconDrawable extends Drawable { // Set the paint color only when the level changes, so that the dominant color // is only calculated when needed. mPaint.setColor(getIndicatorColor()); - } else if (mIcon instanceof FastBitmapDrawable) { - ((FastBitmapDrawable) mIcon).setIsDisabled(true); + } + if (mIcon instanceof FastBitmapDrawable) { + ((FastBitmapDrawable) mIcon).setIsDisabled(level < 100); } invalidateSelf(); From 4c82c33a64b9f6719a0a1457361362cf70e2c9ac Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 8 Dec 2016 14:58:44 -0800 Subject: [PATCH 141/382] Build empty test apk until junit dependency issue is sorted out. Change-Id: Ib63a654139e43c433011d0f7b761905426aff24d --- tests/Android.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Android.mk b/tests/Android.mk index 5103ced7cf..466146e3b4 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -17,9 +17,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 +#LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 -LOCAL_SRC_FILES := $(call all-java-files-under, src) +#LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SDK_VERSION := current LOCAL_MIN_SDK_VERSION := 21 From 3be633b82fc87f429bd92c9a8e1e7a6d5241418e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 8 Dec 2016 09:59:25 -0800 Subject: [PATCH 142/382] Adding support for app widgets in the InstallQueue Bug: 32904959 Change-Id: I0d07a0c59d266493ae30a42579c1fa69b805009e --- .../launcher3/InstallShortcutReceiver.java | 86 ++++++++++++++++--- src/com/android/launcher3/Launcher.java | 40 ++++++--- .../model/AddWorkspaceItemsTask.java | 22 ++--- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 46df0b283b..46bc3b3cda 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -67,6 +69,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static final String APP_SHORTCUT_TYPE_KEY = "isAppShortcut"; private static final String DEEPSHORTCUT_TYPE_KEY = "isDeepShortcut"; + private static final String APP_WIDGET_TYPE_KEY = "isAppWidget"; private static final String USER_HANDLE_KEY = "userHandle"; // The set of shortcuts that are pending install @@ -200,13 +203,17 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public static ShortcutInfo fromShortcutIntent(Context context, Intent data) { PendingInstallShortcutInfo info = createPendingInfo(context, data); - return info == null ? null : info.getShortcutInfo(); + return info == null ? null : (ShortcutInfo) info.getItemInfo(); } public static void queueShortcut(ShortcutInfoCompat info, Context context) { queuePendingShortcutInfo(new PendingInstallShortcutInfo(info, context), context); } + public static void queueWidget(AppWidgetProviderInfo info, int widgetId, Context context) { + queuePendingShortcutInfo(new PendingInstallShortcutInfo(info, widgetId, context), context); + } + public static HashSet getPendingShortcuts(Context context) { HashSet result = new HashSet<>(); @@ -276,6 +283,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { final LauncherActivityInfoCompat activityInfo; final ShortcutInfoCompat shortcutInfo; + final AppWidgetProviderInfo providerInfo; final Intent data; final Context mContext; @@ -287,25 +295,30 @@ public class InstallShortcutReceiver extends BroadcastReceiver { * Initializes a PendingInstallShortcutInfo received from a different app. */ public PendingInstallShortcutInfo(Intent data, UserHandleCompat user, Context context) { + activityInfo = null; + shortcutInfo = null; + providerInfo = null; + this.data = data; this.user = user; mContext = context; launchIntent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); label = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); - activityInfo = null; - shortcutInfo = null; + } /** * Initializes a PendingInstallShortcutInfo to represent a launcher target. */ public PendingInstallShortcutInfo(LauncherActivityInfoCompat info, Context context) { - this.data = null; - mContext = context; activityInfo = info; shortcutInfo = null; + providerInfo = null; + + data = null; user = info.getUser(); + mContext = context; launchIntent = AppInfo.makeLaunchIntent(context, info, user); label = info.getLabel().toString(); @@ -315,16 +328,36 @@ public class InstallShortcutReceiver extends BroadcastReceiver { * Initializes a PendingInstallShortcutInfo to represent a launcher target. */ public PendingInstallShortcutInfo(ShortcutInfoCompat info, Context context) { - this.data = null; - shortcutInfo = info; - mContext = context; activityInfo = null; + shortcutInfo = info; + providerInfo = null; + + data = null; + mContext = context; user = info.getUserHandle(); launchIntent = info.makeIntent(context); label = info.getShortLabel().toString(); } + /** + * Initializes a PendingInstallShortcutInfo to represent a launcher target. + */ + public PendingInstallShortcutInfo( + AppWidgetProviderInfo info, int widgetId, Context context) { + activityInfo = null; + shortcutInfo = null; + providerInfo = info; + + data = null; + mContext = context; + user = UserHandleCompat.fromUser(info.getProfile()); + + launchIntent = new Intent().setComponent(info.provider) + .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); + label = info.label; + } + public String encodeToString() { try { if (activityInfo != null) { @@ -347,6 +380,16 @@ public class InstallShortcutReceiver extends BroadcastReceiver { .key(USER_HANDLE_KEY).value(UserManagerCompat.getInstance(mContext) .getSerialNumberForUser(user)) .endObject().toString(); + } else if (providerInfo != null) { + // If it a launcher target, we only need component name, and user to + // recreate this. + return new JSONStringer() + .object() + .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0)) + .key(APP_WIDGET_TYPE_KEY).value(true) + .key(USER_HANDLE_KEY).value(UserManagerCompat.getInstance(mContext) + .getSerialNumberForUser(user)) + .endObject().toString(); } if (launchIntent.getAction() == null) { @@ -388,11 +431,24 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } } - public ShortcutInfo getShortcutInfo() { + public ItemInfo getItemInfo() { if (activityInfo != null) { return new ShortcutInfo(activityInfo, mContext); } else if (shortcutInfo != null) { return new ShortcutInfo(shortcutInfo, mContext); + } else if (providerInfo != null) { + LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo + .fromProviderInfo(mContext, providerInfo); + LauncherAppWidgetInfo widgetInfo = new LauncherAppWidgetInfo( + launchIntent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0), + info.provider); + InvariantDeviceProfile idp = LauncherAppState.getInstance() + .getInvariantDeviceProfile(); + widgetInfo.minSpanX = info.minSpanX; + widgetInfo.minSpanY = info.minSpanY; + widgetInfo.spanX = Math.min(info.spanX, idp.numColumns); + widgetInfo.spanY = Math.min(info.spanY, idp.numRows); + return widgetInfo; } else { return LauncherAppState.getInstance().getModel().infoFromShortcutIntent(mContext, data); } @@ -425,6 +481,16 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } else { return new PendingInstallShortcutInfo(si.get(0), context); } + } else if (decoder.optBoolean(APP_WIDGET_TYPE_KEY)) { + int widgetId = decoder.launcherIntent + .getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); + AppWidgetProviderInfo info = AppWidgetManager.getInstance(context) + .getAppWidgetInfo(widgetId); + if (info == null || !info.provider.equals(decoder.launcherIntent.getComponent()) || + !info.getProfile().equals(decoder.user.getUser())) { + return null; + } + return new PendingInstallShortcutInfo(info, widgetId, context); } Intent data = new Intent(); @@ -523,7 +589,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } // Generate a shortcut info to add into the model - installQueue.add(pendingInfo.getShortcutInfo()); + installQueue.add(pendingInfo.getItemInfo()); } return installQueue; } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 2f7a31f34a..7fce079a33 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3295,25 +3295,25 @@ public class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ @Override - public void bindItems(final ArrayList shortcuts, final int start, final int end, + public void bindItems(final ArrayList items, final int start, final int end, final boolean forceAnimateIcons) { Runnable r = new Runnable() { public void run() { - bindItems(shortcuts, start, end, forceAnimateIcons); + bindItems(items, start, end, forceAnimateIcons); } }; if (waitUntilResume(r)) { return; } - // Get the list of added shortcuts and intersect them with the set of shortcuts here + // Get the list of added items and intersect them with the set of items here final AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); final Collection bounceAnims = new ArrayList(); final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation(); Workspace workspace = mWorkspace; - long newShortcutsScreenId = -1; + long newItemsScreenId = -1; for (int i = start; i < end; i++) { - final ItemInfo item = shortcuts.get(i); + final ItemInfo item = items.get(i); // Short circuit if we are loading dock items for a configuration which has no dock if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT && @@ -3325,15 +3325,33 @@ public class Launcher extends Activity switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: + case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: { ShortcutInfo info = (ShortcutInfo) item; view = createShortcut(info); break; - case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: + } + case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: { view = FolderIcon.fromXml(R.layout.folder_icon, this, (ViewGroup) workspace.getChildAt(workspace.getCurrentPage()), (FolderInfo) item, mIconCache); break; + } + case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: { + LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) item; + if (mIsSafeModeEnabled) { + view = new PendingAppWidgetHostView(this, info, mIconCache, true); + } else { + LauncherAppWidgetProviderInfo providerInfo = + mAppWidgetManager.getLauncherAppWidgetInfo(info.appWidgetId); + if (providerInfo == null) { + deleteWidgetInfo(info); + continue; + } + view = mAppWidgetHost.createView(this, info.appWidgetId, providerInfo); + } + prepareAppWidget((AppWidgetHostView) view, info); + break; + } default: throw new RuntimeException("Invalid Item Type"); } @@ -3364,22 +3382,22 @@ public class Launcher extends Activity view.setScaleX(0f); view.setScaleY(0f); bounceAnims.add(createNewAppBounceAnimation(view, i)); - newShortcutsScreenId = item.screenId; + newItemsScreenId = item.screenId; } } if (animateIcons) { // Animate to the correct page - if (newShortcutsScreenId > -1) { + if (newItemsScreenId > -1) { long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage()); - final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId); + final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newItemsScreenId); final Runnable startBounceAnimRunnable = new Runnable() { public void run() { anim.playTogether(bounceAnims); anim.start(); } }; - if (newShortcutsScreenId != currentScreenId) { + if (newItemsScreenId != currentScreenId) { // We post the animation slightly delayed to prevent slowdowns // when we are loading right after we return to launcher. mWorkspace.postDelayed(new Runnable() { diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 97335cb256..4cbb0879b6 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -26,6 +26,7 @@ import com.android.launcher3.FolderInfo; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; @@ -60,8 +61,8 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } Context context = app.getContext(); - final ArrayList addedShortcutsFinal = new ArrayList(); - final ArrayList addedWorkspaceScreensFinal = new ArrayList(); + final ArrayList addedItemsFinal = new ArrayList<>(); + final ArrayList addedWorkspaceScreensFinal = new ArrayList<>(); // Get the list of workspace screens. We need to append to this list and // can not use sBgWorkspaceScreens because loadWorkspace() may not have been @@ -77,13 +78,14 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } // Find appropriate space for the item. - Pair coords = findSpaceForItem( - app, dataModel, workspaceScreens, addedWorkspaceScreensFinal, 1, 1); + Pair coords = findSpaceForItem(app, dataModel, workspaceScreens, + addedWorkspaceScreensFinal, item.spanX, item.spanY); long screenId = coords.first; int[] cordinates = coords.second; ItemInfo itemInfo; - if (item instanceof ShortcutInfo || item instanceof FolderInfo) { + if (item instanceof ShortcutInfo || item instanceof FolderInfo || + item instanceof LauncherAppWidgetInfo) { itemInfo = item; } else if (item instanceof AppInfo) { itemInfo = ((AppInfo) item).makeShortcut(); @@ -95,23 +97,23 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { addItemToDatabase(context, itemInfo, screenId, cordinates); // Save the ShortcutInfo for binding in the workspace - addedShortcutsFinal.add(itemInfo); + addedItemsFinal.add(itemInfo); } } // Update the workspace screens updateScreens(context, workspaceScreens); - if (!addedShortcutsFinal.isEmpty()) { + if (!addedItemsFinal.isEmpty()) { scheduleCallbackTask(new CallbackTask() { @Override public void execute(Callbacks callbacks) { final ArrayList addAnimated = new ArrayList(); final ArrayList addNotAnimated = new ArrayList(); - if (!addedShortcutsFinal.isEmpty()) { - ItemInfo info = addedShortcutsFinal.get(addedShortcutsFinal.size() - 1); + if (!addedItemsFinal.isEmpty()) { + ItemInfo info = addedItemsFinal.get(addedItemsFinal.size() - 1); long lastScreenId = info.screenId; - for (ItemInfo i : addedShortcutsFinal) { + for (ItemInfo i : addedItemsFinal) { if (i.screenId == lastScreenId) { addAnimated.add(i); } else { From ab121c17159a7f655b772fa78c04a6d2479e2a8e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 2 Dec 2016 19:29:43 +0530 Subject: [PATCH 143/382] Adding a generic method to initiate overridable objects Change-Id: Ia433427c65ad38804f2eed9c6bc209df232758c0 --- src/com/android/launcher3/AllAppsList.java | 2 +- src/com/android/launcher3/AppFilter.java | 31 ++----------------- src/com/android/launcher3/IconCache.java | 5 ++- src/com/android/launcher3/IconProvider.java | 17 ---------- .../android/launcher3/LauncherAppState.java | 5 ++- src/com/android/launcher3/Utilities.java | 20 ++++++++++++ .../launcher3/graphics/DrawableFactory.java | 22 ++----------- .../android/launcher3/model/WidgetsModel.java | 2 +- 8 files changed, 32 insertions(+), 72 deletions(-) diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index b13c20b204..bbc865036d 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -66,7 +66,7 @@ public class AllAppsList { * If the app is already in the list, doesn't add it. */ public void add(AppInfo info) { - if (mAppFilter != null && !mAppFilter.shouldShowApp(info.componentName)) { + if (!mAppFilter.shouldShowApp(info.componentName)) { return; } if (findActivity(data, info.componentName, info.user)) { diff --git a/src/com/android/launcher3/AppFilter.java b/src/com/android/launcher3/AppFilter.java index e01436d7ab..db8f5dd0e0 100644 --- a/src/com/android/launcher3/AppFilter.java +++ b/src/com/android/launcher3/AppFilter.java @@ -1,35 +1,10 @@ package com.android.launcher3; import android.content.ComponentName; -import android.text.TextUtils; -import android.util.Log; -public abstract class AppFilter { +public class AppFilter { - private static final boolean DBG = false; - private static final String TAG = "AppFilter"; - - public abstract boolean shouldShowApp(ComponentName app); - - public static AppFilter loadByName(String className) { - if (TextUtils.isEmpty(className)) return null; - if (DBG) Log.d(TAG, "Loading AppFilter: " + className); - try { - Class cls = Class.forName(className); - return (AppFilter) cls.newInstance(); - } catch (ClassNotFoundException e) { - Log.e(TAG, "Bad AppFilter class", e); - return null; - } catch (InstantiationException e) { - Log.e(TAG, "Bad AppFilter class", e); - return null; - } catch (IllegalAccessException e) { - Log.e(TAG, "Bad AppFilter class", e); - return null; - } catch (ClassCastException e) { - Log.e(TAG, "Bad AppFilter class", e); - return null; - } + public boolean shouldShowApp(ComponentName app) { + return true; } - } diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index db72b2f997..4b09bf82d9 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -123,9 +123,8 @@ public class IconCache { mLowResCanvas = new Canvas(); mLowResPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); - mIconProvider = IconProvider.loadByName(context.getString(R.string.icon_provider_class), - context); - + mIconProvider = Utilities.getOverrideObject( + IconProvider.class, context, R.string.icon_provider_class); mWorkerHandler = new Handler(LauncherModel.getWorkerLooper()); mActivityBgColor = context.getResources().getColor(R.color.quantum_panel_bg_color); diff --git a/src/com/android/launcher3/IconProvider.java b/src/com/android/launcher3/IconProvider.java index 0a273bbc3b..005bbaa02c 100644 --- a/src/com/android/launcher3/IconProvider.java +++ b/src/com/android/launcher3/IconProvider.java @@ -1,13 +1,9 @@ package com.android.launcher3; -import android.content.Context; import android.graphics.drawable.Drawable; -import android.text.TextUtils; -import android.util.Log; import com.android.launcher3.compat.LauncherActivityInfoCompat; -import java.lang.reflect.InvocationTargetException; import java.util.Locale; public class IconProvider { @@ -21,19 +17,6 @@ public class IconProvider { updateSystemStateString(); } - public static IconProvider loadByName(String className, Context context) { - if (TextUtils.isEmpty(className)) return new IconProvider(); - if (DBG) Log.d(TAG, "Loading IconProvider: " + className); - try { - Class cls = Class.forName(className); - return (IconProvider) cls.getDeclaredConstructor(Context.class).newInstance(context); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException - | ClassCastException | NoSuchMethodException | InvocationTargetException e) { - Log.e(TAG, "Bad IconProvider class", e); - return new IconProvider(); - } - } - public void updateSystemStateString() { mSystemState = Locale.getDefault().toString(); } diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 5937d78fcd..ca5cd74304 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -38,7 +38,6 @@ public class LauncherAppState { public static final boolean PROFILE_STARTUP = ProviderConfig.IS_DOGFOOD_BUILD; - private final AppFilter mAppFilter; @Thunk final LauncherModel mModel; private final IconCache mIconCache; private final WidgetPreviewLoader mWidgetCache; @@ -96,8 +95,8 @@ public class LauncherAppState { mIconCache = new IconCache(sContext, mInvariantDeviceProfile); mWidgetCache = new WidgetPreviewLoader(sContext, mIconCache); - mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class)); - mModel = new LauncherModel(this, mIconCache, mAppFilter); + mModel = new LauncherModel(this, mIconCache, + Utilities.getOverrideObject(AppFilter.class, sContext, R.string.app_filter_class)); LauncherAppsCompat.getInstance(sContext).addOnAppsChangedCallback(mModel); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 416ca8e3ec..197aaf752c 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -60,6 +60,7 @@ import com.android.launcher3.config.ProviderConfig; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.Locale; @@ -655,4 +656,23 @@ public final class Utilities { return e.getCause() instanceof TransactionTooLargeException || e.getCause() instanceof DeadObjectException; } + + public static T getOverrideObject(Class clazz, Context context, int resId) { + String className = context.getString(resId); + if (!TextUtils.isEmpty(className)) { + try { + Class cls = Class.forName(className); + return (T) cls.getDeclaredConstructor(Context.class).newInstance(context); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | ClassCastException | NoSuchMethodException | InvocationTargetException e) { + Log.e(TAG, "Bad overriden class", e); + } + } + + try { + return clazz.newInstance(); + } catch (InstantiationException|IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index 2926a29d6a..f6a4b844f9 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -18,13 +18,11 @@ package com.android.launcher3.graphics; import android.content.Context; import android.graphics.Bitmap; -import android.text.TextUtils; import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; - -import java.lang.reflect.InvocationTargetException; +import com.android.launcher3.Utilities; /** * Factory for creating new drawables. @@ -37,27 +35,13 @@ public class DrawableFactory { public static DrawableFactory get(Context context) { synchronized (LOCK) { if (sInstance == null) { - context = context.getApplicationContext(); - sInstance = loadByName(context.getString(R.string.drawable_factory_class), context); + sInstance = Utilities.getOverrideObject(DrawableFactory.class, + context.getApplicationContext(), R.string.drawable_factory_class); } return sInstance; } } - public static DrawableFactory loadByName(String className, Context context) { - if (!TextUtils.isEmpty(className)) { - try { - Class cls = Class.forName(className); - return (DrawableFactory) - cls.getDeclaredConstructor(Context.class).newInstance(context); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException - | ClassCastException | NoSuchMethodException | InvocationTargetException e) { - return new DrawableFactory(); - } - } - return new DrawableFactory(); - } - /** * Returns a FastBitmapDrawable with the icon. */ diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 64043f4843..5ad6f0fff2 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -117,7 +117,7 @@ public class WidgetsModel { } } - if (mAppFilter != null && !mAppFilter.shouldShowApp(item.componentName)) { + if (!mAppFilter.shouldShowApp(item.componentName)) { if (DEBUG) { Log.d(TAG, String.format("%s is filtered and not added to the widget tray.", item.componentName)); From 0c7852f822497a2189bb6fb778cc14ea776f6fe6 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 2 Dec 2016 14:47:04 -0800 Subject: [PATCH 144/382] Allow long-press on workspace immediately after dropping. Previously the touch was consumed until the transition from spring-loaded to normal workspace finished, leading long presses to trigger on the background rather than on apps. This made it difficult to move multiple icons consecutively. Bug: 29631912 Change-Id: I259e618c81f56bc40d08a5d63ddbbf3c82a76baf --- src/com/android/launcher3/Hotseat.java | 2 +- src/com/android/launcher3/Workspace.java | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 5c96dde43d..eecbe349fa 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -168,7 +168,7 @@ public class Hotseat extends FrameLayout public boolean onInterceptTouchEvent(MotionEvent ev) { // We don't want any clicks to go through to the hotseat unless the workspace is in // the normal state or an accessible drag is in progress. - return mLauncher.getWorkspace().workspaceInModalState() && + return !mLauncher.getWorkspace().workspaceIconsCanBeDragged() && !mLauncher.getAccessibilityDelegate().isInAccessibleDrag(); } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 10680b4e0d..00e458f6a8 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1160,7 +1160,7 @@ public class Workspace extends PagedView } private boolean shouldConsumeTouch(View v) { - return (workspaceInModalState() || !isFinishedSwitchingState()) + return !workspaceIconsCanBeDragged() || (!workspaceInModalState() && indexOfChild(v) != mCurrentPage); } @@ -1826,6 +1826,11 @@ public class Workspace extends PagedView return mState != State.NORMAL; } + /** Returns whether a drag should be allowed to be started from the current workspace state. */ + public boolean workspaceIconsCanBeDragged() { + return mState == State.NORMAL || mState == State.SPRING_LOADED; + } + @Thunk void updateChildrenLayersEnabled(boolean force) { boolean small = mState == State.OVERVIEW || mIsSwitchingState; boolean enableChildrenLayers = force || small || mAnimatingViewIntoPlace || isPageInTransition(); From 251ab6e8476aafe3627b0d9025cd5a7c70128f10 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 2 Dec 2016 18:54:32 -0800 Subject: [PATCH 145/382] Lower the transition threshold for dropping on Workspace. Old threshold: 0.5f New threshold: 0.25f The threshold is used when dragging to Workspace from any drag source other than Workspace, including Hotseat. This lowered threshold is more forgiving for faster drags. Bug: 33210055 Change-Id: Ic121fb4b7caa3ea66abb48a8a3f3bd36f3365749 --- src/com/android/launcher3/Workspace.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 10680b4e0d..2d4af5287f 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -100,6 +100,14 @@ public class Workspace extends PagedView Insettable, DropTargetSource { private static final String TAG = "Launcher.Workspace"; + /** The value that {@link #mTransitionProgress} must be greater than for + * {@link #transitionStateShouldAllowDrop()} to return true. */ + private static final float ALLOW_DROP_TRANSITION_PROGRESS = 0.25f; + + /** The value that {@link #mTransitionProgress} must be greater than for + * {@link #isFinishedSwitchingState()} ()} to return true. */ + private static final float FINISHED_SWITCHING_STATE_TRANSITION_PROGRESS = 0.5f; + private static boolean ENFORCE_DRAG_EVENT_ORDER = false; private static final int SNAP_OFF_EMPTY_SCREEN_DURATION = 400; @@ -1171,7 +1179,8 @@ public class Workspace extends PagedView /** This differs from isSwitchingState in that we take into account how far the transition * has completed. */ public boolean isFinishedSwitchingState() { - return !mIsSwitchingState || (mTransitionProgress > 0.5f); + return !mIsSwitchingState + || (mTransitionProgress > FINISHED_SWITCHING_STATE_TRANSITION_PROGRESS); } protected void onWindowVisibilityChanged (int visibility) { @@ -2273,8 +2282,8 @@ public class Workspace extends PagedView return dv; } - public boolean transitionStateShouldAllowDrop() { - return ((!isSwitchingState() || mTransitionProgress > 0.5f) && + private boolean transitionStateShouldAllowDrop() { + return ((!isSwitchingState() || mTransitionProgress > ALLOW_DROP_TRANSITION_PROGRESS) && (mState == State.NORMAL || mState == State.SPRING_LOADED)); } From df9f14746c41950a18a3ce02e7742a1764c264ff Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Fri, 9 Dec 2016 13:56:15 -0800 Subject: [PATCH 146/382] nav bar on all apps container should use light theme. b/33553066 Change-Id: Ic9eb796a01eaa8d00fbeedeb5456876b668e6db2 --- res/values/colors.xml | 1 + src/com/android/launcher3/Launcher.java | 18 +++++++++++++++--- .../allapps/AllAppsContainerView.java | 4 ++++ .../allapps/AllAppsTransitionController.java | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/res/values/colors.xml b/res/values/colors.xml index d5ce78607f..ccbae58d9b 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -40,6 +40,7 @@ #22000000 #FFF2F2F2 #28000000 + #AAF2F2F2 #40FFFFFF #FFF diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9160a012e7..ee8ddfd46a 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -475,25 +475,37 @@ public class Launcher extends Activity mWorkspace.getPageIndicator().updateColor(mExtractedColors); // It's possible that All Apps is visible when this is run, // so always use light status bar in that case. - activateLightStatusBar(isAllAppsVisible()); + activateLightStatusBar(isAllAppsVisible(), false); } } + // TODO: use platform flag on API >= 26 + private static final int SYSTEM_UI_FLAG_LIGHT_NAV_BAR = 0x10; + /** * Sets the status bar to be light or not. Light status bar means dark icons. * @param activate if true, make sure the status bar is light, otherwise base on wallpaper. + * @param changeNavBar make sure the nav bar is light only if this param and {@param activate} + * is also true. */ - public void activateLightStatusBar(boolean activate) { + public void activateLightStatusBar(boolean activate, boolean changeNavBar) { boolean lightStatusBar = activate || (FeatureFlags.LIGHT_STATUS_BAR && mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX, ExtractedColors.DEFAULT_DARK) == ExtractedColors.DEFAULT_LIGHT); int oldSystemUiFlags = getWindow().getDecorView().getSystemUiVisibility(); int newSystemUiFlags = oldSystemUiFlags; if (lightStatusBar) { - newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR ; } else { newSystemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + if (Utilities.isAtLeastO() && activate) { + if (changeNavBar) { + newSystemUiFlags |= SYSTEM_UI_FLAG_LIGHT_NAV_BAR; + } else { + newSystemUiFlags &= ~(SYSTEM_UI_FLAG_LIGHT_NAV_BAR); + } + } if (newSystemUiFlags != oldSystemUiFlags) { getWindow().getDecorView().setSystemUiVisibility(newSystemUiFlags); } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 5fc1d972c5..f98e0275fe 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -489,6 +489,10 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc setLayoutParams(mlp); } else { View navBarBg = findViewById(R.id.nav_bar_bg); + if (Utilities.isAtLeastO()) { + navBarBg.setBackgroundColor(getResources().getColor( + R.color.all_apps_light_navbar_color)); + } ViewGroup.LayoutParams navBarBgLp = navBarBg.getLayoutParams(); navBarBgLp.height = insets.bottom; navBarBg.setLayoutParams(navBarBgLp); diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index adfad0813c..42f1875d49 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -282,7 +282,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul // Use a light status bar (dark icons) if all apps is behind at least half of the status // bar. If the status bar is already light due to wallpaper extraction, keep it that way. boolean forceLight = shift <= mStatusBarHeight / 2; - mLauncher.activateLightStatusBar(forceLight); + mLauncher.activateLightStatusBar(forceLight, forceLight); } /** From 139a25a7a865f2d0e9abd98b192c65fe0a84b960 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 12 Dec 2016 22:23:28 -0800 Subject: [PATCH 147/382] Don't let AllAppsTransitionController intercept when a floating view is open. Previously we checked for deep shortcuts when closing all apps by swiping down. Now we check any AbstractFloatingView, and when swiping up. Bug: 33542711 Change-Id: I860eb55c69567a92cd626e966bf881b7d1bffc6e --- src/com/android/launcher3/allapps/AllAppsContainerView.java | 5 ----- .../launcher3/allapps/AllAppsTransitionController.java | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 5fc1d972c5..6650abad55 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -208,11 +208,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc return false; } - // IF a shortcuts container is open, container should not be pulled down. - if (DeepShortcutsContainer.getOpen(mLauncher) != null) { - return false; - } - // IF scroller is at the very top OR there is no scroll bar because there is probably not // enough items to scroll, THEN it's okay for the container to be pulled down. if (mAppsRecyclerView.getScrollBar().getThumbOffsetY() <= 0) { diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index adfad0813c..8ab4a619ba 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -17,6 +17,7 @@ import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; @@ -24,6 +25,7 @@ import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; +import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.util.TouchController; @@ -118,6 +120,8 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mNoIntercept = true; } else if (!mLauncher.isAllAppsVisible() && !shouldPossiblyIntercept(ev)) { mNoIntercept = true; + } else if (AbstractFloatingView.getTopOpenView(mLauncher) != null) { + mNoIntercept = true; } else { // Now figure out which direction scroll events the controller will start // calling the callbacks. From 26e4d17a73bc4857d3ae5ddb9858cbea6ed9782a Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 12 Dec 2016 15:43:18 -0800 Subject: [PATCH 148/382] Resize widget frame now wraps the scaled widget view. Previous implementation had space between the frame and the widget ie. letterboxing. Bug: 32176631 Change-Id: Ie50279f4edb94812120dea492aefa4f18218162f --- .../launcher3/AppWidgetResizeFrame.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index c45ff7b0ca..54faca3556 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -354,19 +354,18 @@ public class AppWidgetResizeFrame extends FrameLayout } public void snapToWidget(boolean animate) { - final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); DeviceProfile profile = mLauncher.getDeviceProfile(); - int newWidth = (int) (mWidgetView.getWidth() * profile.appWidgetScale.x) - + 2 * mBackgroundPadding - mWidgetPadding.left - mWidgetPadding.right; - int newHeight = (int) (mWidgetView.getHeight() * profile.appWidgetScale.y) - + 2 * mBackgroundPadding - mWidgetPadding.top - mWidgetPadding.bottom; + float scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); - mTmpPt[0] = mWidgetView.getLeft(); - mTmpPt[1] = mWidgetView.getTop(); - mDragLayer.getDescendantCoordRelativeToSelf(mCellLayout.getShortcutsAndWidgets(), mTmpPt); + mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect); - int newX = mTmpPt[0] - mBackgroundPadding + mWidgetPadding.left; - int newY = mTmpPt[1] - mBackgroundPadding + mWidgetPadding.top; + int newWidth = 2 * mBackgroundPadding + + (int) (scale * (sTmpRect.width() - mWidgetPadding.left - mWidgetPadding.right)); + int newHeight = 2 * mBackgroundPadding + + (int) (scale * (sTmpRect.height() - mWidgetPadding.top - mWidgetPadding.bottom)); + + int newX = (int) (sTmpRect.left - mBackgroundPadding + scale * mWidgetPadding.left); + int newY = (int) (sTmpRect.top - mBackgroundPadding + scale * mWidgetPadding.top); // We need to make sure the frame's touchable regions lie fully within the bounds of the // DragLayer. We allow the actual handles to be clipped, but we shift the touch regions @@ -384,6 +383,7 @@ public class AppWidgetResizeFrame extends FrameLayout mBottomTouchRegionAdjustment = 0; } + final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); if (!animate) { lp.width = newWidth; lp.height = newHeight; From 1cd01b023acc123b771765b7297d8aaedac224e0 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 9 Nov 2016 10:43:58 -0800 Subject: [PATCH 149/382] Ensuring that ShortcutInfo always has an icon > Making iconBitmap public instead of a getter (similar to AppInfo) > Removing getIcon() which can lead to IO on UI thread > Removing updateIcon and handling the update at the caller Bug: 21325319 Change-Id: I6a49b9043f974e9629ea25e77012d97cc04c0594 --- src/com/android/launcher3/AppInfo.java | 9 ++- src/com/android/launcher3/BubbleTextView.java | 12 ++-- src/com/android/launcher3/IconCache.java | 4 +- .../launcher3/InstallShortcutReceiver.java | 5 +- src/com/android/launcher3/Launcher.java | 14 +---- src/com/android/launcher3/LauncherModel.java | 54 +++++++--------- src/com/android/launcher3/ShortcutInfo.java | 61 +++---------------- src/com/android/launcher3/Workspace.java | 8 +-- .../android/launcher3/folder/FolderIcon.java | 2 +- .../launcher3/folder/FolderPagedView.java | 5 +- .../launcher3/graphics/LauncherIcons.java | 8 +-- .../launcher3/model/CacheDataUpdatedTask.java | 10 +-- .../launcher3/model/PackageUpdatedTask.java | 17 +++--- .../launcher3/shortcuts/DeepShortcutView.java | 5 +- .../launcher3/util/CursorIconInfo.java | 2 +- .../util/ManagedProfileHeuristic.java | 10 ++- .../model/CacheDataUpdatedTaskTest.java | 8 +-- 17 files changed, 87 insertions(+), 147 deletions(-) diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 3b22f46f2f..23e2882425 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -81,8 +81,14 @@ public class AppInfo extends ItemInfo { public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, IconCache iconCache, boolean quietModeEnabled) { + this(context, info, user, iconCache, quietModeEnabled, true /* useLowResIcon */); + } + + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, + IconCache iconCache, boolean quietModeEnabled, boolean useLowResIcon) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; + this.user = user; if (PackageManagerHelper.isAppSuspended(info.getApplicationInfo())) { isDisabled |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; } @@ -90,9 +96,8 @@ public class AppInfo extends ItemInfo { isDisabled |= ShortcutInfo.FLAG_DISABLED_QUIET_USER; } - iconCache.getTitleAndIcon(this, info, true /* useLowResIcon */); + iconCache.getTitleAndIcon(this, info, useLowResIcon); intent = makeLaunchIntent(context, info, user); - this.user = user; } public AppInfo(AppInfo info) { diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 51cd0527f1..0c1a156adb 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -155,13 +155,12 @@ public class BubbleTextView extends TextView setAccessibilityDelegate(mLauncher.getAccessibilityDelegate()); } - public void applyFromShortcutInfo(ShortcutInfo info, IconCache iconCache) { - applyFromShortcutInfo(info, iconCache, false); + public void applyFromShortcutInfo(ShortcutInfo info) { + applyFromShortcutInfo(info, false); } - public void applyFromShortcutInfo(ShortcutInfo info, IconCache iconCache, - boolean promiseStateChanged) { - applyIconAndLabel(info.getIcon(iconCache), info); + public void applyFromShortcutInfo(ShortcutInfo info, boolean promiseStateChanged) { + applyIconAndLabel(info.iconBitmap, info); setTag(info); if (promiseStateChanged || info.isPromise()) { applyState(promiseStateChanged); @@ -557,8 +556,7 @@ public class BubbleTextView extends TextView if (info instanceof AppInfo) { applyFromApplicationInfo((AppInfo) info); } else if (info instanceof ShortcutInfo) { - applyFromShortcutInfo((ShortcutInfo) info, - LauncherAppState.getInstance().getIconCache()); + applyFromShortcutInfo((ShortcutInfo) info); if ((info.rank < FolderIcon.NUM_ITEMS_IN_PREVIEW) && (info.container >= 0)) { View folderIcon = mLauncher.getWorkspace().getHomescreenIconByItemId(info.container); diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 4b09bf82d9..9f332a4505 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -490,7 +490,7 @@ public class IconCache { // null info means not installed, but if we have a component from the intent then // we should still look in the cache for restored app icons. if (component == null) { - shortcutInfo.setIcon(getDefaultIcon(user)); + shortcutInfo.iconBitmap = getDefaultIcon(user); shortcutInfo.title = ""; shortcutInfo.contentDescription = ""; shortcutInfo.usingLowResIcon = false; @@ -507,7 +507,7 @@ public class IconCache { ShortcutInfo shortcutInfo, ComponentName component, LauncherActivityInfoCompat info, UserHandleCompat user, boolean usePkgIcon, boolean useLowResIcon) { CacheEntry entry = cacheLocked(component, info, user, usePkgIcon, useLowResIcon); - shortcutInfo.setIcon(getNonNullIcon(entry, user)); + shortcutInfo.iconBitmap = getNonNullIcon(entry, user); shortcutInfo.title = Utilities.trim(entry.title); shortcutInfo.contentDescription = entry.contentDescription; shortcutInfo.usingLowResIcon = entry.isLowResIcon; diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 46bc3b3cda..2f92201e1d 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -433,7 +433,10 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public ItemInfo getItemInfo() { if (activityInfo != null) { - return new ShortcutInfo(activityInfo, mContext); + return new AppInfo(mContext, activityInfo, user, + LauncherAppState.getInstance().getIconCache(), + UserManagerCompat.getInstance(mContext).isQuietModeEnabled(user), + false /* useLowResIcon */).makeShortcut(); } else if (shortcutInfo != null) { return new ShortcutInfo(shortcutInfo, mContext); } else if (providerInfo != null) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index accc3cd616..35d34a3f67 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1424,7 +1424,7 @@ public class Launcher extends Activity public View createShortcut(ViewGroup parent, ShortcutInfo info) { BubbleTextView favorite = (BubbleTextView) getLayoutInflater().inflate(R.layout.app_icon, parent, false); - favorite.applyFromShortcutInfo(info, mIconCache); + favorite.applyFromShortcutInfo(info); favorite.setCompoundDrawablePadding(mDeviceProfile.iconDrawablePaddingPx); favorite.setOnClickListener(this); favorite.setOnFocusChangeListener(mFocusHandler); @@ -2108,8 +2108,7 @@ public class Launcher extends Activity cellX, cellY); // Create the view - FolderIcon newFolder = - FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache); + FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo); mWorkspace.addInScreen(newFolder, folderInfo); // Force measure the new folder icon CellLayout parent = mWorkspace.getParentCellLayoutForView(newFolder); @@ -3346,7 +3345,7 @@ public class Launcher extends Activity case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: { view = FolderIcon.fromXml(R.layout.folder_icon, this, (ViewGroup) workspace.getChildAt(workspace.getCurrentPage()), - (FolderInfo) item, mIconCache); + (FolderInfo) item); break; } case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: { @@ -4037,13 +4036,6 @@ public class Launcher extends Activity return new AppInfo(this, activityInfo, user, mIconCache); } - // TODO: This method should be a part of LauncherSearchCallback - public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption, - Bitmap icon) { - return new ShortcutInfo(shortcutIntent, caption, caption, icon, - UserHandleCompat.myUserHandle()); - } - protected void moveWorkspaceToDefaultScreen() { mWorkspace.moveToDefaultScreen(false); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index cc56d439fe..2a6f56bf0d 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1792,8 +1792,10 @@ public class LauncherModel extends BroadcastReceiver Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); int pos = 0; for (ShortcutInfo info : folder.contents) { - if (info.usingLowResIcon) { - info.updateIcon(mIconCache, false); + if (info.usingLowResIcon && + info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { + mIconCache.getTitleAndIcon( + info, info.getPromisedIntent(), info.user, false); } pos ++; if (pos >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { @@ -2518,13 +2520,10 @@ public class LauncherModel extends BroadcastReceiver int promiseType, int itemType, CursorIconInfo iconInfo) { final ShortcutInfo info = new ShortcutInfo(); info.user = UserHandleCompat.myUserHandle(); - - Bitmap icon = iconInfo.loadIcon(c, info); + info.iconBitmap = iconInfo.loadIcon(c, info); // the fallback icon - if (icon == null) { + if (info.iconBitmap == null) { mIconCache.getTitleAndIcon(info, intent, info.user, false /* useLowResIcon */); - } else { - info.setIcon(icon); } if ((promiseType & ShortcutInfo.FLAG_RESTORED_ICON) != 0) { @@ -2595,9 +2594,9 @@ public class LauncherModel extends BroadcastReceiver final ShortcutInfo info = new ShortcutInfo(); mIconCache.getTitleAndIcon(info, componentName, lai, user, false, useLowResIcon); - if (mIconCache.isDefaultIcon(info.getIcon(mIconCache), user) && c != null) { + if (mIconCache.isDefaultIcon(info.iconBitmap, user) && c != null) { Bitmap icon = iconInfo.loadIcon(c); - info.setIcon(icon == null ? mIconCache.getDefaultIcon(user) : icon); + info.iconBitmap = icon != null ? icon : mIconCache.getDefaultIcon(user); } if (lai != null && PackageManagerHelper.isAppSuspended(lai.getApplicationInfo())) { @@ -2640,12 +2639,11 @@ public class LauncherModel extends BroadcastReceiver */ public void loadInfoFromCursor(ShortcutInfo info, Cursor c, CursorIconInfo iconInfo) { info.title = iconInfo.getTitle(c); - Bitmap icon = iconInfo.loadIcon(c, info); + info.iconBitmap = iconInfo.loadIcon(c, info); // the fallback icon - if (icon == null) { - icon = mIconCache.getDefaultIcon(info.user); + if (info.iconBitmap == null) { + info.iconBitmap = mIconCache.getDefaultIcon(info.user); } - info.setIcon(icon); } ShortcutInfo infoFromShortcutIntent(Context context, Intent data) { @@ -2659,34 +2657,28 @@ public class LauncherModel extends BroadcastReceiver return null; } - Bitmap icon = null; - ShortcutIconResource iconResource = null; - - if (bitmap instanceof Bitmap) { - icon = LauncherIcons.createIconBitmap((Bitmap) bitmap, context); - } else { - Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - if (extra instanceof ShortcutIconResource) { - iconResource = (ShortcutIconResource) extra; - icon = LauncherIcons.createIconBitmap(iconResource.packageName, - iconResource.resourceName, context); - } - } - final ShortcutInfo info = new ShortcutInfo(); // Only support intents for current user for now. Intents sent from other // users wouldn't get here without intent forwarding anyway. info.user = UserHandleCompat.myUserHandle(); - if (icon == null) { - icon = mIconCache.getDefaultIcon(info.user); + + if (bitmap instanceof Bitmap) { + info.iconBitmap = LauncherIcons.createIconBitmap((Bitmap) bitmap, context); + } else { + Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); + if (extra instanceof ShortcutIconResource) { + info.iconResource = (ShortcutIconResource) extra; + info.iconBitmap = LauncherIcons.createIconBitmap(info.iconResource, context); + } + } + if (info.iconBitmap == null) { + info.iconBitmap = mIconCache.getDefaultIcon(info.user); } - info.setIcon(icon); info.title = Utilities.trim(name); info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); info.intent = intent; - info.iconResource = iconResource; return info; } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index d6d03d36c8..fd6533706a 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -26,10 +26,8 @@ import android.os.Build; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -80,7 +78,7 @@ public class ShortcutInfo extends ItemInfo { /** * Indicates whether we're using a low res icon */ - boolean usingLowResIcon; + public boolean usingLowResIcon; /** * If isShortcut=true and customIcon=false, this contains a reference to the @@ -91,7 +89,7 @@ public class ShortcutInfo extends ItemInfo { /** * The application icon. */ - private Bitmap mIcon; + public Bitmap iconBitmap; /** * Indicates that the icon is disabled due to safe mode restrictions. @@ -163,22 +161,12 @@ public class ShortcutInfo extends ItemInfo { return promisedIntent != null ? promisedIntent : intent; } - ShortcutInfo(Intent intent, CharSequence title, CharSequence contentDescription, - Bitmap icon, UserHandleCompat user) { - this(); - this.intent = intent; - this.title = Utilities.trim(title); - this.contentDescription = contentDescription; - mIcon = icon; - this.user = user; - } - public ShortcutInfo(ShortcutInfo info) { super(info); title = info.title; intent = new Intent(info.intent); iconResource = info.iconResource; - mIcon = info.mIcon; // TODO: should make a copy here. maybe we don't need this ctor at all + iconBitmap = info.iconBitmap; status = info.status; mInstallProgress = info.mInstallProgress; isDisabled = info.isDisabled; @@ -190,15 +178,8 @@ public class ShortcutInfo extends ItemInfo { title = Utilities.trim(info.title); intent = new Intent(info.intent); isDisabled = info.isDisabled; - } - - public ShortcutInfo(LauncherActivityInfoCompat info, Context context) { - user = info.getUser(); - title = Utilities.trim(info.getLabel()); - contentDescription = UserManagerCompat.getInstance(context) - .getBadgedLabelForUser(info.getLabel(), info.getUser()); - intent = AppInfo.makeLaunchIntent(context, info, info.getUser()); - itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; + iconBitmap = info.iconBitmap; + usingLowResIcon = info.usingLowResIcon; } /** @@ -211,28 +192,6 @@ public class ShortcutInfo extends ItemInfo { updateFromDeepShortcutInfo(shortcutInfo, context); } - public void setIcon(Bitmap b) { - mIcon = b; - } - - public Bitmap getIcon(IconCache iconCache) { - if (mIcon == null) { - updateIcon(iconCache); - } - return mIcon; - } - - public void updateIcon(IconCache iconCache, boolean useLowRes) { - if (itemType == Favorites.ITEM_TYPE_APPLICATION) { - iconCache.getTitleAndIcon(this, promisedIntent != null ? promisedIntent : intent, user, - useLowRes); - } - } - - public void updateIcon(IconCache iconCache) { - updateIcon(iconCache, shouldUseLowResIcon()); - } - @Override void onAddToDatabase(ContentWriter writer) { super.onAddToDatabase(writer); @@ -241,7 +200,7 @@ public class ShortcutInfo extends ItemInfo { .put(LauncherSettings.Favorites.RESTORED, status); if (!usingLowResIcon) { - writer.putIcon(mIcon, user); + writer.putIcon(iconBitmap, user); } if (iconResource != null) { writer.put(LauncherSettings.BaseLauncherColumns.ICON_PACKAGE, iconResource.packageName) @@ -251,7 +210,7 @@ public class ShortcutInfo extends ItemInfo { } public ComponentName getTargetComponent() { - return promisedIntent != null ? promisedIntent.getComponent() : intent.getComponent(); + return getPromisedIntent().getComponent(); } public boolean hasStatusFlag(int flag) { @@ -272,10 +231,6 @@ public class ShortcutInfo extends ItemInfo { status |= FLAG_INSTALL_SESSION_ACTIVE; } - public boolean shouldUseLowResIcon() { - return usingLowResIcon && container >= 0 && rank >= FolderIcon.NUM_ITEMS_IN_PREVIEW; - } - public void updateFromDeepShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { // {@link ShortcutInfoCompat#getActivity} can change during an update. Recreate the intent intent = shortcutInfo.makeIntent(context); @@ -304,7 +259,7 @@ public class ShortcutInfo extends ItemInfo { Bitmap unbadgedBitmap = unbadgedDrawable == null ? cache.getDefaultIcon(UserHandleCompat.myUserHandle()) : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); - setIcon(getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context)); + iconBitmap = getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context); } protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 13bea2077f..13b3e28f34 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -172,7 +172,6 @@ public class Workspace extends PagedView private CellLayout mDropToLayout = null; @Thunk Launcher mLauncher; - @Thunk IconCache mIconCache; @Thunk DragController mDragController; // These are temporary variables to prevent having to allocate a new object just to @@ -502,9 +501,7 @@ public class Workspace extends PagedView */ protected void initWorkspace() { mCurrentPage = getDefaultPage(); - LauncherAppState app = LauncherAppState.getInstance(); DeviceProfile grid = mLauncher.getDeviceProfile(); - mIconCache = app.getIconCache(); setWillNotDraw(false); setClipChildren(false); setClipToPadding(false); @@ -3397,7 +3394,7 @@ public class Workspace extends PagedView break; case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: view = FolderIcon.fromXml(R.layout.folder_icon, mLauncher, cellLayout, - (FolderInfo) info, mIconCache); + (FolderInfo) info); break; default: throw new IllegalStateException("Unknown item type: " + info.itemType); @@ -4078,8 +4075,7 @@ public class Workspace extends PagedView Drawable oldIcon = getTextViewIcon(shortcut); boolean oldPromiseState = (oldIcon instanceof PreloadIconDrawable) && ((PreloadIconDrawable) oldIcon).hasNotCompleted(); - shortcut.applyFromShortcutInfo(si, mIconCache, - si.isPromise() != oldPromiseState); + shortcut.applyFromShortcutInfo(si, si.isPromise() != oldPromiseState); } // process all the shortcuts return false; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 37453232be..973245b92f 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -146,7 +146,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group, - FolderInfo folderInfo, IconCache iconCache) { + FolderInfo folderInfo) { @SuppressWarnings("all") // suppress dead code warning final boolean error = INITIAL_ITEM_ANIMATION_DURATION >= DROP_IN_ANIMATION_DURATION; if (error) { diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 8aaeb9e376..3a318b58f7 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -31,7 +31,6 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.FocusHelper.PagedFolderKeyEventListener; -import com.android.launcher3.IconCache; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; @@ -73,7 +72,6 @@ public class FolderPagedView extends PagedView { public final boolean mIsRtl; private final LayoutInflater mInflater; - private final IconCache mIconCache; private final ViewGroupFocusHelper mFocusIndicatorHelper; @Thunk final HashMap mPendingAnimations = new HashMap<>(); @@ -107,7 +105,6 @@ public class FolderPagedView extends PagedView { mMaxItemsPerPage = mMaxCountX * mMaxCountY; mInflater = LayoutInflater.from(context); - mIconCache = app.getIconCache(); mIsRtl = Utilities.isRtl(getResources()); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); @@ -231,7 +228,7 @@ public class FolderPagedView extends PagedView { public View createNewView(ShortcutInfo item) { final BubbleTextView textView = (BubbleTextView) mInflater.inflate( R.layout.folder_application, null, false); - textView.applyFromShortcutInfo(item, mIconCache); + textView.applyFromShortcutInfo(item); textView.setOnClickListener(mFolder); textView.setOnLongClickListener(mFolder); textView.setOnFocusChangeListener(mFocusIndicatorHelper); diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 9f3f3571d2..6f9f7ffc92 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -18,6 +18,7 @@ package com.android.launcher3.graphics; import android.annotation.TargetApi; import android.content.Context; +import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.Cursor; @@ -66,14 +67,13 @@ public class LauncherIcons { * Returns a bitmap suitable for the all apps view. If the package or the resource do not * exist, it returns null. */ - public static Bitmap createIconBitmap(String packageName, String resourceName, - Context context) { + public static Bitmap createIconBitmap(ShortcutIconResource iconRes, Context context) { PackageManager packageManager = context.getPackageManager(); // the resource try { - Resources resources = packageManager.getResourcesForApplication(packageName); + Resources resources = packageManager.getResourcesForApplication(iconRes.packageName); if (resources != null) { - final int id = resources.getIdentifier(resourceName, null, null); + final int id = resources.getIdentifier(iconRes.resourceName, null, null); return createIconBitmap( resources.getDrawableForDensity(id, LauncherAppState.getInstance() .getInvariantDeviceProfile().fillResIconDpi), context); diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index 9f24e9035d..64771d530a 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -25,6 +25,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; +import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserHandleCompat; @@ -61,9 +62,10 @@ public class CacheDataUpdatedTask extends ExtendedModelTask { if (info instanceof ShortcutInfo && mUser.equals(info.user)) { ShortcutInfo si = (ShortcutInfo) info; ComponentName cn = si.getTargetComponent(); - if (isValidShortcut(si) && - cn != null && mPackages.contains(cn.getPackageName())) { - si.updateIcon(iconCache); + if (si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION + && isValidShortcut(si) && cn != null + && mPackages.contains(cn.getPackageName())) { + iconCache.getTitleAndIcon(si, si.getPromisedIntent(), si.user, si.usingLowResIcon); updatedShortcuts.add(si); } } @@ -85,7 +87,7 @@ public class CacheDataUpdatedTask extends ExtendedModelTask { public boolean isValidShortcut(ShortcutInfo si) { switch (mOp) { case OP_CACHE_UPDATE: - return si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; + return true; case OP_SESSION_UPDATE: return si.isPromise(); default: diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 176e8ea256..aae3490a7a 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -34,6 +34,7 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; +import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; @@ -209,11 +210,9 @@ public class PackageUpdatedTask extends ExtendedModelTask { // Update shortcuts which use iconResource. if ((si.iconResource != null) && packageSet.contains(si.iconResource.packageName)) { - Bitmap icon = LauncherIcons.createIconBitmap( - si.iconResource.packageName, - si.iconResource.resourceName, context); + Bitmap icon = LauncherIcons.createIconBitmap(si.iconResource, context); if (icon != null) { - si.setIcon(icon); + si.iconBitmap = icon; infoUpdated = true; } } @@ -251,14 +250,16 @@ public class PackageUpdatedTask extends ExtendedModelTask { si.promisedIntent = null; si.status = ShortcutInfo.DEFAULT; infoUpdated = true; - si.updateIcon(iconCache); + if (si.itemType == Favorites.ITEM_TYPE_APPLICATION) { + iconCache.getTitleAndIcon(si, si.getPromisedIntent(), + si.user, si.usingLowResIcon); + } } if (appInfo != null && Intent.ACTION_MAIN.equals(si.intent.getAction()) && si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - si.updateIcon(iconCache); - si.title = Utilities.trim(appInfo.title); - si.contentDescription = appInfo.contentDescription; + iconCache.getTitleAndIcon( + si, si.getPromisedIntent(), si.user, si.usingLowResIcon); infoUpdated = true; } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index e7fc415128..6796137894 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -26,9 +26,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; -import com.android.launcher3.IconCache; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; @@ -95,8 +93,7 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima /** package private **/ void applyShortcutInfo(UnbadgedShortcutInfo info, DeepShortcutsContainer container) { mInfo = info; - IconCache cache = LauncherAppState.getInstance().getIconCache(); - mBubbleText.applyFromShortcutInfo(info, cache); + mBubbleText.applyFromShortcutInfo(info); mIconView.setBackground(mBubbleText.getIcon()); // Use the long label as long as it exists and fits. diff --git a/src/com/android/launcher3/util/CursorIconInfo.java b/src/com/android/launcher3/util/CursorIconInfo.java index 6603ee7658..3bc4eabc5a 100644 --- a/src/com/android/launcher3/util/CursorIconInfo.java +++ b/src/com/android/launcher3/util/CursorIconInfo.java @@ -60,7 +60,7 @@ public class CursorIconInfo { info.iconResource = new ShortcutIconResource(); info.iconResource.packageName = packageName; info.iconResource.resourceName = resourceName; - icon = LauncherIcons.createIconBitmap(packageName, resourceName, mContext); + icon = LauncherIcons.createIconBitmap(info.iconResource, mContext); } if (icon == null) { // Failed to load from resource, try loading from DB. diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index 817a38ad5c..6b4021f31e 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -19,7 +19,9 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; +import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; +import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherFiles; @@ -65,11 +67,13 @@ public class ManagedProfileHeuristic { private final Context mContext; private final LauncherModel mModel; private final UserHandleCompat mUser; + private final IconCache mIconCache; private ManagedProfileHeuristic(Context context, UserHandleCompat user) { mContext = context; mUser = user; mModel = LauncherAppState.getInstance().getModel(); + mIconCache = LauncherAppState.getInstance().getIconCache(); } public void processPackageRemoved(String[] packages) { @@ -108,10 +112,12 @@ public class ManagedProfileHeuristic { long folderCreationTime = mUserManager.getUserCreationTime(user) + AUTO_ADD_TO_FOLDER_DURATION; + boolean quietModeEnabled = UserManagerCompat.getInstance(mContext) + .isQuietModeEnabled(user); for (int i = 0; i < count; i++) { LauncherActivityInstallInfo info = apps.get(i); - - ShortcutInfo si = new ShortcutInfo(info.info, mContext); + ShortcutInfo si = new AppInfo(mContext, info.info, user, mIconCache, + quietModeEnabled, false /* useLowResIcon */).makeShortcut(); ((info.installTime <= folderCreationTime) ? workFolderApps : homescreenApps).add(si); } diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java index 25b8df933d..646ef2794e 100644 --- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +++ b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java @@ -1,15 +1,12 @@ package com.android.launcher3.model; import com.android.launcher3.AppInfo; -import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.ShortcutInfo; import java.util.Arrays; import java.util.HashSet; -import static org.mockito.Mockito.mock; - /** * Tests for {@link CacheDataUpdatedTask} */ @@ -67,14 +64,13 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { private void verifyUpdate(Long... idsUpdated) { HashSet updates = new HashSet<>(Arrays.asList(idsUpdated)); - IconCache noOpIconCache = mock(IconCache.class); for (ItemInfo info : bgDataModel.itemsIdMap) { if (updates.contains(info.id)) { assertEquals(NEW_LABEL_PREFIX + info.id, info.title); - assertNotNull(((ShortcutInfo) info).getIcon(noOpIconCache)); + assertNotNull(((ShortcutInfo) info).iconBitmap); } else { assertNotSame(NEW_LABEL_PREFIX + info.id, info.title); - assertNull(((ShortcutInfo) info).getIcon(noOpIconCache)); + assertNull(((ShortcutInfo) info).iconBitmap); } } } From c1b2399540fb2d9c4830da7ac73cc2fb18c52cdf Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 13 Dec 2016 08:57:36 -0800 Subject: [PATCH 150/382] Scale folders to fit within the available height and width. * In the previous implementation, the folder icon size would not get updated if the cell height/width was set to the minimum value not including the folderChildIconSizePx AND the usedLength was less than the maxLength. * The bug is only really noticeable in an unlikely multi-window landscape mode, which is why it was not noticed before. Change-Id: I776c6f710e081645cff891487022cf787869ee3f --- src/com/android/launcher3/DeviceProfile.java | 34 ++++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index fbff4eb3b7..f79d66659d 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -315,19 +315,28 @@ public class DeviceProfile { + res.getDimensionPixelSize(R.dimen.folder_label_padding_bottom) + Utilities.calculateTextHeight(res.getDimension(R.dimen.folder_label_text_size)); - updateFolderCellSize(1f, dm, res, folderBottomPanelSize); + updateFolderCellSize(1f, dm, res); - // Check to see if the icons fit within the available height. If not, then scale down. - float usedHeight = (folderCellHeightPx * inv.numFolderRows) + folderBottomPanelSize; - int maxHeight = availableHeightPx - getTotalWorkspacePadding().y - (2 * edgeMarginPx); - if (usedHeight > maxHeight) { - float scale = maxHeight / usedHeight; - updateFolderCellSize(scale, dm, res, folderBottomPanelSize); + // Don't let the folder get too close to the edges of the screen. + int folderMargin = 4 * edgeMarginPx; + + // Check if the icons fit within the available height. + float usedHeight = folderCellHeightPx * inv.numFolderRows + folderBottomPanelSize; + int maxHeight = availableHeightPx - getTotalWorkspacePadding().y - folderMargin; + float scaleY = maxHeight / usedHeight; + + // Check if the icons fit within the available width. + float usedWidth = folderCellWidthPx * inv.numFolderColumns; + int maxWidth = availableWidthPx - getTotalWorkspacePadding().x - folderMargin; + float scaleX = maxWidth / usedWidth; + + float scale = Math.min(scaleX, scaleY); + if (scale < 1f) { + updateFolderCellSize(scale, dm, res); } } - private void updateFolderCellSize(float scale, DisplayMetrics dm, Resources res, - int folderBottomPanelSize) { + private void updateFolderCellSize(float scale, DisplayMetrics dm, Resources res) { folderChildIconSizePx = (int) (Utilities.pxFromDp(inv.iconSize, dm) * scale); folderChildTextSizePx = (int) (res.getDimensionPixelSize(R.dimen.folder_child_text_size) * scale); @@ -336,11 +345,8 @@ public class DeviceProfile { int cellPaddingX = (int) (res.getDimensionPixelSize(R.dimen.folder_cell_x_padding) * scale); int cellPaddingY = (int) (res.getDimensionPixelSize(R.dimen.folder_cell_y_padding) * scale); - // Don't let the folder get too close to the edges of the screen. - folderCellWidthPx = Math.min(folderChildIconSizePx + 2 * cellPaddingX, - (availableWidthPx - 4 * edgeMarginPx) / inv.numFolderColumns); - folderCellHeightPx = Math.min(folderChildIconSizePx + 2 * cellPaddingY + textHeight, - (availableHeightPx - 4 * edgeMarginPx - folderBottomPanelSize) / inv.numFolderRows); + folderCellWidthPx = folderChildIconSizePx + 2 * cellPaddingX; + folderCellHeightPx = folderChildIconSizePx + 2 * cellPaddingY + textHeight; folderChildDrawablePaddingPx = Math.max(0, (folderCellHeightPx - folderChildIconSizePx - textHeight) / 3); } From 0f76b56865bd7b63bd21d53aaac47300396aa38f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 13 Dec 2016 19:37:10 -0800 Subject: [PATCH 151/382] Refactoring FlingToDelete > Moving all fling related logic to FlingToDeleteHelper from DragController > Removing fling related methods from DragSource and DropTarget > Moving fling animation logic from DeleteDropTarget to FlingAnimation > Simplifying DropTargetBar to directly look for all valid drop targets. This makes it easier to add new DropTarget in xml. Change-Id: I7214d2d30c907ab93c80d92d9f9be6dda2d63354 --- .../launcher3/AnotherWindowDropTarget.java | 3 - .../android/launcher3/ButtonDropTarget.java | 17 +-- .../android/launcher3/DeleteDropTarget.java | 57 +-------- src/com/android/launcher3/DragSource.java | 12 -- src/com/android/launcher3/DropTarget.java | 11 +- src/com/android/launcher3/DropTargetBar.java | 37 +++--- src/com/android/launcher3/InfoDropTarget.java | 2 +- src/com/android/launcher3/Launcher.java | 2 +- .../launcher3/UninstallDropTarget.java | 2 +- src/com/android/launcher3/Workspace.java | 16 --- .../allapps/AllAppsContainerView.java | 13 -- .../dragndrop/AnotherWindowDragSource.java | 9 -- .../launcher3/dragndrop/DragController.java | 120 +++--------------- .../launcher3/dragndrop/DragDriver.java | 9 +- .../dragndrop/FlingToDeleteHelper.java | 109 ++++++++++++++++ src/com/android/launcher3/folder/Folder.java | 18 --- .../shortcuts/DeepShortcutsContainer.java | 10 -- .../launcher3/util/FlingAnimation.java | 89 +++++++++---- .../widget/WidgetsContainerView.java | 18 +-- 19 files changed, 227 insertions(+), 327 deletions(-) create mode 100644 src/com/android/launcher3/dragndrop/FlingToDeleteHelper.java diff --git a/src/com/android/launcher3/AnotherWindowDropTarget.java b/src/com/android/launcher3/AnotherWindowDropTarget.java index 7074f7838c..052e5d09aa 100644 --- a/src/com/android/launcher3/AnotherWindowDropTarget.java +++ b/src/com/android/launcher3/AnotherWindowDropTarget.java @@ -47,9 +47,6 @@ public class AnotherWindowDropTarget implements DropTarget { @Override public void onDragExit(DragObject dragObject) {} - @Override - public void onFlingToDelete(DragObject dragObject, PointF vec) {} - @Override public boolean acceptDrop(DragObject dragObject) { return dragObject.dragInfo instanceof ShortcutInfo; diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index 60a2cc3259..e613b3b2ff 100644 --- a/src/com/android/launcher3/ButtonDropTarget.java +++ b/src/com/android/launcher3/ButtonDropTarget.java @@ -28,7 +28,6 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; -import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; @@ -118,9 +117,6 @@ public abstract class ButtonDropTarget extends TextView mDropTargetBar = dropTargetBar; } - @Override - public void onFlingToDelete(DragObject d, PointF vec) { } - @Override public final void onDragEnter(DragObject d) { d.dragView.setColor(mHoverColor); @@ -243,10 +239,7 @@ public abstract class ButtonDropTarget extends TextView final Rect from = new Rect(); dragLayer.getViewRectRelativeToSelf(d.dragView, from); - int width = mDrawable.getIntrinsicWidth(); - int height = mDrawable.getIntrinsicHeight(); - final Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(), - width, height); + final Rect to = getIconRect(d); final float scale = (float) to.width() / from.width(); mDropTargetBar.deferOnDragEnd(); @@ -268,7 +261,7 @@ public abstract class ButtonDropTarget extends TextView @Override public void prepareAccessibilityDrop() { } - @Thunk abstract void completeDrop(DragObject d); + public abstract void completeDrop(DragObject d); @Override public void getHitRectRelativeToDragLayer(android.graphics.Rect outRect) { @@ -280,7 +273,11 @@ public abstract class ButtonDropTarget extends TextView outRect.offsetTo(coords[0], coords[1]); } - protected Rect getIconRect(int viewWidth, int viewHeight, int drawableWidth, int drawableHeight) { + public Rect getIconRect(DragObject dragObject) { + int viewWidth = dragObject.dragView.getMeasuredWidth(); + int viewHeight = dragObject.dragView.getMeasuredHeight(); + int drawableWidth = mDrawable.getIntrinsicWidth(); + int drawableHeight = mDrawable.getIntrinsicHeight(); DragLayer dragLayer = mLauncher.getDragLayer(); // Find the rect to animate to (the view is center aligned) diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java index 705f841010..9097ed23d7 100644 --- a/src/com/android/launcher3/DeleteDropTarget.java +++ b/src/com/android/launcher3/DeleteDropTarget.java @@ -16,19 +16,13 @@ package com.android.launcher3; -import android.animation.TimeInterpolator; import android.content.Context; -import android.graphics.PointF; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.view.animation.AnimationUtils; -import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; -import com.android.launcher3.util.FlingAnimation; -import com.android.launcher3.util.Thunk; public class DeleteDropTarget extends ButtonDropTarget { @@ -78,7 +72,7 @@ public class DeleteDropTarget extends ButtonDropTarget { } @Override - @Thunk void completeDrop(DragObject d) { + public void completeDrop(DragObject d) { ItemInfo item = d.dragInfo; if ((d.dragSource instanceof Workspace) || (d.dragSource instanceof Folder)) { removeWorkspaceOrFolderItem(mLauncher, item, null); @@ -96,53 +90,4 @@ public class DeleteDropTarget extends ButtonDropTarget { launcher.getWorkspace().stripEmptyScreens(); launcher.getDragLayer().announceForAccessibility(launcher.getString(R.string.item_removed)); } - - @Override - public void onFlingToDelete(final DragObject d, PointF vel) { - // Don't highlight the icon as it's animating - d.dragView.setColor(0); - - final DragLayer dragLayer = mLauncher.getDragLayer(); - FlingAnimation fling = new FlingAnimation(d, vel, - getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(), - mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight()), - dragLayer); - - final int duration = fling.getDuration(); - final long startTime = AnimationUtils.currentAnimationTimeMillis(); - - // NOTE: Because it takes time for the first frame of animation to actually be - // called and we expect the animation to be a continuation of the fling, we have - // to account for the time that has elapsed since the fling finished. And since - // we don't have a startDelay, we will always get call to update when we call - // start() (which we want to ignore). - final TimeInterpolator tInterpolator = new TimeInterpolator() { - private int mCount = -1; - private float mOffset = 0f; - - @Override - public float getInterpolation(float t) { - if (mCount < 0) { - mCount++; - } else if (mCount == 0) { - mOffset = Math.min(0.5f, (float) (AnimationUtils.currentAnimationTimeMillis() - - startTime) / duration); - mCount++; - } - return Math.min(1f, mOffset + t); - } - }; - - Runnable onAnimationEndRunnable = new Runnable() { - @Override - public void run() { - mLauncher.exitSpringLoadedDragMode(); - completeDrop(d); - mLauncher.getDragController().onDeferredEndFling(d); - } - }; - - dragLayer.animateView(d.dragView, fling, duration, tInterpolator, onAnimationEndRunnable, - DragLayer.ANIMATION_END_DISAPPEAR, null); - } } diff --git a/src/com/android/launcher3/DragSource.java b/src/com/android/launcher3/DragSource.java index 2fb495fddc..dcd8f589a6 100644 --- a/src/com/android/launcher3/DragSource.java +++ b/src/com/android/launcher3/DragSource.java @@ -26,11 +26,6 @@ import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; */ public interface DragSource extends LogContainerProvider { - /** - * @return whether items dragged from this source supports - */ - boolean supportsFlingToDelete(); - /** * @return whether items dragged from this source supports 'App Info' */ @@ -47,13 +42,6 @@ public interface DragSource extends LogContainerProvider { */ float getIntrinsicIconScaleFactor(); - /** - * A callback specifically made back to the source after an item from this source has been flung - * to be deleted on a DropTarget. In such a situation, this method will be called after - * onDropCompleted, and more importantly, after the fling animation has completed. - */ - void onFlingToDeleteCompleted(); - /** * A callback made back to the source after an item from this source has been dropped on a * DropTarget. diff --git a/src/com/android/launcher3/DropTarget.java b/src/com/android/launcher3/DropTarget.java index e91fc15e04..7d047d748d 100644 --- a/src/com/android/launcher3/DropTarget.java +++ b/src/com/android/launcher3/DropTarget.java @@ -16,12 +16,10 @@ package com.android.launcher3; -import com.android.launcher3.dragndrop.DragView; - -import android.graphics.PointF; import android.graphics.Rect; import com.android.launcher3.accessibility.DragViewStateAnnouncer; +import com.android.launcher3.dragndrop.DragView; /** * Interface defining an object that can receive a drag. @@ -116,13 +114,6 @@ public interface DropTarget { void onDragExit(DragObject dragObject); - /** - * Handle an object being dropped as a result of flinging to delete and will be called in place - * of onDrop(). (This is only called on objects that are set as the DragController's - * fling-to-delete target. - */ - void onFlingToDelete(DragObject dragObject, PointF vec); - /** * Check if a drop action can occur at, or near, the requested location. * This will be called just before onDrop. diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java index 42bab47053..0840b70150 100644 --- a/src/com/android/launcher3/DropTargetBar.java +++ b/src/com/android/launcher3/DropTargetBar.java @@ -21,6 +21,7 @@ import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewDebug; +import android.view.ViewGroup; import android.view.ViewPropertyAnimator; import android.view.accessibility.AccessibilityManager; import android.view.animation.AccelerateInterpolator; @@ -56,11 +57,6 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi private ViewPropertyAnimator mCurrentAnimation; - // Drop targets - private ButtonDropTarget mDeleteDropTarget; - private ButtonDropTarget mAppInfoDropTarget; - private ButtonDropTarget mUninstallDropTarget; - public DropTargetBar(Context context, AttributeSet attrs) { super(context, attrs); } @@ -73,30 +69,27 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi protected void onFinishInflate() { super.onFinishInflate(); - // Get the individual components - mDeleteDropTarget = (ButtonDropTarget) findViewById(R.id.delete_target_text); - mAppInfoDropTarget = (ButtonDropTarget) findViewById(R.id.info_target_text); - mUninstallDropTarget = (ButtonDropTarget) findViewById(R.id.uninstall_target_text); - - mDeleteDropTarget.setDropTargetBar(this); - mAppInfoDropTarget.setDropTargetBar(this); - mUninstallDropTarget.setDropTargetBar(this); - // Initialize with hidden state setAlpha(0f); } public void setup(DragController dragController) { dragController.addDragListener(this); - dragController.setFlingToDeleteDropTarget(mDeleteDropTarget); + setupButtonDropTarget(this, dragController); + } - dragController.addDragListener(mDeleteDropTarget); - dragController.addDragListener(mAppInfoDropTarget); - dragController.addDragListener(mUninstallDropTarget); - - dragController.addDropTarget(mDeleteDropTarget); - dragController.addDropTarget(mAppInfoDropTarget); - dragController.addDropTarget(mUninstallDropTarget); + private void setupButtonDropTarget(View view, DragController dragController) { + if (view instanceof ButtonDropTarget) { + ButtonDropTarget bdt = (ButtonDropTarget) view; + bdt.setDropTargetBar(this); + dragController.addDragListener(bdt); + dragController.addDropTarget(bdt); + } else if (view instanceof ViewGroup) { + ViewGroup vg = (ViewGroup) view; + for (int i = vg.getChildCount() - 1; i >= 0; i--) { + setupButtonDropTarget(vg.getChildAt(i), dragController); + } + } } private void animateToVisibility(boolean isVisible) { diff --git a/src/com/android/launcher3/InfoDropTarget.java b/src/com/android/launcher3/InfoDropTarget.java index 398c9d2a29..6a6d2859ab 100644 --- a/src/com/android/launcher3/InfoDropTarget.java +++ b/src/com/android/launcher3/InfoDropTarget.java @@ -49,7 +49,7 @@ public class InfoDropTarget extends UninstallDropTarget { } @Override - void completeDrop(DragObject d) { + public void completeDrop(DragObject d) { DropTargetResultCallback callback = d.dragSource instanceof DropTargetResultCallback ? (DropTargetResultCallback) d.dragSource : null; startDetailsActivityForInfo(d.dragInfo, mLauncher, callback); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index accc3cd616..7775a6bc56 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3068,7 +3068,7 @@ public class Launcher extends Activity || mState == State.WIDGETS_SPRING_LOADED; } - void exitSpringLoadedDragMode() { + public void exitSpringLoadedDragMode() { if (mState == State.APPS_SPRING_LOADED) { showAppsView(true /* animated */, false /* updatePredictedApps */, false /* focusSearchBar */); diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index 7ea9aca7c8..00c613a88f 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -95,7 +95,7 @@ public class UninstallDropTarget extends ButtonDropTarget { } @Override - void completeDrop(final DragObject d) { + public void completeDrop(final DragObject d) { DropTargetResultCallback callback = d.dragSource instanceof DropTargetResultCallback ? (DropTargetResultCallback) d.dragSource : null; startUninstallActivity(mLauncher, d.dragInfo, callback); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 13bea2077f..49e14e4942 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -33,7 +33,6 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Point; -import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; @@ -3721,11 +3720,6 @@ public class Workspace extends PagedView return 1f; } - @Override - public boolean supportsFlingToDelete() { - return true; - } - @Override public boolean supportsAppInfoDropTarget() { return !FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND; @@ -3736,16 +3730,6 @@ public class Workspace extends PagedView return true; } - @Override - public void onFlingToDelete(DragObject d, PointF vec) { - // Do nothing - } - - @Override - public void onFlingToDeleteCompleted() { - // Do nothing - } - public boolean isDropEnabled() { return true; } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index f98e0275fe..6fae7b12d2 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -401,11 +401,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc return false; } - @Override - public boolean supportsFlingToDelete() { - return true; - } - @Override public boolean supportsAppInfoDropTarget() { return true; @@ -422,14 +417,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc return (float) grid.allAppsIconSizePx / grid.iconSizePx; } - @Override - public void onFlingToDeleteCompleted() { - // We just dismiss the drag when we fling, so cleanup here - mLauncher.exitSpringLoadedDragModeDelayed(true, - Launcher.EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); - mLauncher.unlockScreenOrientation(false); - } - @Override public void onDropCompleted(View target, DropTarget.DragObject d, boolean isFlingToDelete, boolean success) { diff --git a/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java b/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java index e968f36a72..1623010691 100644 --- a/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java +++ b/src/com/android/launcher3/dragndrop/AnotherWindowDragSource.java @@ -36,11 +36,6 @@ public class AnotherWindowDragSource implements DragSource { mContext = context; } - @Override - public boolean supportsFlingToDelete() { - return false; - } - @Override public boolean supportsAppInfoDropTarget() { return false; @@ -56,10 +51,6 @@ public class AnotherWindowDragSource implements DragSource { return 1; } - @Override - public void onFlingToDeleteCompleted() { - } - @Override public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success) { diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index 67ef5fc3c7..a5a54c1eca 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -17,11 +17,9 @@ package com.android.launcher3.dragndrop; import android.content.ComponentName; -import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; -import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.IBinder; @@ -29,7 +27,6 @@ import android.view.DragEvent; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; -import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.inputmethod.InputMethodManager; @@ -54,8 +51,6 @@ import java.util.ArrayList; * Class for initiating a drag within a view or across multiple views. */ public class DragController implements DragDriver.EventListener, TouchController { - private static final String TAG = "Launcher.DragController"; - public static final int SCROLL_DELAY = 500; public static final int RESCROLL_DELAY = PagedView.PAGE_SNAP_ANIMATION_DURATION + 150; @@ -68,10 +63,9 @@ public class DragController implements DragDriver.EventListener, TouchController public static final int SCROLL_LEFT = 0; public static final int SCROLL_RIGHT = 1; - private static final float MAX_FLING_DEGREES = 35f; - @Thunk Launcher mLauncher; private Handler mHandler; + private FlingToDeleteHelper mFlingToDeleteHelper; // temporaries to avoid gc thrash private Rect mRectTemp = new Rect(); @@ -103,7 +97,6 @@ public class DragController implements DragDriver.EventListener, TouchController /** Who can receive drop events */ private ArrayList mDropTargets = new ArrayList(); private ArrayList mListeners = new ArrayList(); - private DropTarget mFlingToDeleteDropTarget; /** The window token used as the parent for the DragView. */ private IBinder mWindowToken; @@ -119,8 +112,6 @@ public class DragController implements DragDriver.EventListener, TouchController private DropTarget mLastDropTarget; - private InputMethodManager mInputMethodManager; - @Thunk int mLastTouch[] = new int[2]; @Thunk long mLastTouchUpTime = -1; @Thunk int mDistanceSinceScroll = 0; @@ -128,9 +119,6 @@ public class DragController implements DragDriver.EventListener, TouchController private int mTmpPoint[] = new int[2]; private Rect mDragLayerRect = new Rect(); - protected final int mFlingToDeleteThresholdVelocity; - private VelocityTracker mVelocityTracker; - private boolean mIsInPreDrag; /** @@ -159,11 +147,8 @@ public class DragController implements DragDriver.EventListener, TouchController mLauncher = launcher; mHandler = new Handler(); mScrollZone = r.getDimensionPixelSize(R.dimen.scroll_zone); - mVelocityTracker = VelocityTracker.obtain(); - - mFlingToDeleteThresholdVelocity = - r.getDimensionPixelSize(R.dimen.drag_flingToDeleteMinVelocity); mIsRtl = Utilities.isRtl(r); + mFlingToDeleteHelper = new FlingToDeleteHelper(launcher); } /** @@ -208,11 +193,8 @@ public class DragController implements DragDriver.EventListener, TouchController } // Hide soft keyboard, if visible - if (mInputMethodManager == null) { - mInputMethodManager = (InputMethodManager) - mLauncher.getSystemService(Context.INPUT_METHOD_SERVICE); - } - mInputMethodManager.hideSoftInputFromWindow(mWindowToken, 0); + mLauncher.getSystemService(InputMethodManager.class) + .hideSoftInputFromWindow(mWindowToken, 0); mOptions = options; if (mOptions.systemDndStartPoint != null) { @@ -369,7 +351,7 @@ public class DragController implements DragDriver.EventListener, TouchController } } - releaseVelocityTracker(); + mFlingToDeleteHelper.releaseVelocityTracker(); } public void animateDragViewToOriginalPosition(final Runnable onComplete, @@ -411,10 +393,6 @@ public class DragController implements DragDriver.EventListener, TouchController } } - public void onDeferredEndFling(DropTarget.DragObject d) { - d.dragSource.onFlingToDeleteCompleted(); - } - /** * Clamps the position to the drag layer bounds. */ @@ -453,22 +431,16 @@ public class DragController implements DragDriver.EventListener, TouchController } @Override - public void onDriverDragEnd(float x, float y, DropTarget dropTargetOverride) { + public void onDriverDragEnd(float x, float y) { DropTarget dropTarget; - PointF vec = null; - - if (dropTargetOverride != null) { - dropTarget = dropTargetOverride; + Runnable flingAnimation = mFlingToDeleteHelper.getFlingAnimation(mDragObject); + if (flingAnimation != null) { + dropTarget = mFlingToDeleteHelper.getDropTarget(); } else { - vec = isFlingingToDelete(mDragObject.dragSource); - if (vec != null) { - dropTarget = mFlingToDeleteDropTarget; - } else { - dropTarget = findDropTarget((int) x, (int) y, mCoordinatesTemp); - } + dropTarget = findDropTarget((int) x, (int) y, mCoordinatesTemp); } - drop(dropTarget, x, y, vec); + drop(dropTarget, flingAnimation); endDrag(); } @@ -487,7 +459,7 @@ public class DragController implements DragDriver.EventListener, TouchController } // Update the velocity tracker - acquireVelocityTrackerAndAddMovement(ev); + mFlingToDeleteHelper.recordMotionEvent(ev); final int action = ev.getAction(); final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY()); @@ -635,7 +607,7 @@ public class DragController implements DragDriver.EventListener, TouchController } // Update the velocity tracker - acquireVelocityTrackerAndAddMovement(ev); + mFlingToDeleteHelper.recordMotionEvent(ev); final int action = ev.getAction(); final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY()); @@ -688,47 +660,12 @@ public class DragController implements DragDriver.EventListener, TouchController dropTarget.prepareAccessibilityDrop(); // Perform the drop - drop(dropTarget, location[0], location[1], null); + drop(dropTarget, null); endDrag(); } - /** - * Determines whether the user flung the current item to delete it. - * - * @return the vector at which the item was flung, or null if no fling was detected. - */ - private PointF isFlingingToDelete(DragSource source) { - if (mFlingToDeleteDropTarget == null) return null; - if (!source.supportsFlingToDelete()) return null; - - ViewConfiguration config = ViewConfiguration.get(mLauncher); - mVelocityTracker.computeCurrentVelocity(1000, config.getScaledMaximumFlingVelocity()); - PointF vel = new PointF(mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); - float theta = MAX_FLING_DEGREES + 1; - if (mVelocityTracker.getYVelocity() < mFlingToDeleteThresholdVelocity) { - // Do a quick dot product test to ensure that we are flinging upwards - PointF upVec = new PointF(0f, -1f); - theta = getAngleBetweenVectors(vel, upVec); - } else if (mLauncher.getDeviceProfile().isVerticalBarLayout() && - mVelocityTracker.getXVelocity() < mFlingToDeleteThresholdVelocity) { - // Remove icon is on left side instead of top, so check if we are flinging to the left. - PointF leftVec = new PointF(-1f, 0f); - theta = getAngleBetweenVectors(vel, leftVec); - } - if (theta <= Math.toRadians(MAX_FLING_DEGREES)) { - return vel; - } - return null; - } - - private float getAngleBetweenVectors(PointF vec1, PointF vec2) { - return (float) Math.acos(((vec1.x * vec2.x) + (vec1.y * vec2.y)) / - (vec1.length() * vec2.length())); - } - - private void drop(DropTarget dropTarget, float x, float y, PointF flingVel) { + private void drop(DropTarget dropTarget, Runnable flingAnimation) { final int[] coordinates = mCoordinatesTemp; - mDragObject.x = coordinates[0]; mDragObject.y = coordinates[1]; @@ -750,8 +687,8 @@ public class DragController implements DragDriver.EventListener, TouchController if (dropTarget != null) { dropTarget.onDragExit(mDragObject); if (dropTarget.acceptDrop(mDragObject)) { - if (flingVel != null) { - dropTarget.onFlingToDelete(mDragObject, flingVel); + if (flingAnimation != null) { + flingAnimation.run(); } else if (!mIsInPreDrag) { dropTarget.onDrop(mDragObject); } @@ -762,7 +699,7 @@ public class DragController implements DragDriver.EventListener, TouchController mLauncher.getUserEventDispatcher().logDragNDrop(mDragObject, dropTargetAsView); if (!mIsInPreDrag) { mDragObject.dragSource.onDropCompleted( - dropTargetAsView, mDragObject, flingVel != null, accepted); + dropTargetAsView, mDragObject, flingAnimation != null, accepted); } } @@ -828,27 +765,6 @@ public class DragController implements DragDriver.EventListener, TouchController mDropTargets.remove(target); } - /** - * Sets the current fling-to-delete drop target. - */ - public void setFlingToDeleteDropTarget(DropTarget target) { - mFlingToDeleteDropTarget = target; - } - - private void acquireVelocityTrackerAndAddMovement(MotionEvent ev) { - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain(); - } - mVelocityTracker.addMovement(ev); - } - - private void releaseVelocityTracker() { - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - } - /** * Set which view scrolls for touch events near the edge of the screen. */ diff --git a/src/com/android/launcher3/dragndrop/DragDriver.java b/src/com/android/launcher3/dragndrop/DragDriver.java index d0c8e16905..a90cfffdca 100644 --- a/src/com/android/launcher3/dragndrop/DragDriver.java +++ b/src/com/android/launcher3/dragndrop/DragDriver.java @@ -23,7 +23,6 @@ import android.content.Intent; import android.view.DragEvent; import android.view.MotionEvent; -import com.android.launcher3.DropTarget; import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ShortcutInfo; @@ -40,7 +39,7 @@ public abstract class DragDriver { public interface EventListener { void onDriverDragMove(float x, float y); void onDriverDragExitWindow(); - void onDriverDragEnd(float x, float y, DropTarget dropTargetOverride); + void onDriverDragEnd(float x, float y); void onDriverDragCancel(); } @@ -62,7 +61,7 @@ public abstract class DragDriver { break; case MotionEvent.ACTION_UP: mEventListener.onDriverDragMove(ev.getX(), ev.getY()); - mEventListener.onDriverDragEnd(ev.getX(), ev.getY(), null); + mEventListener.onDriverDragEnd(ev.getX(), ev.getY()); break; case MotionEvent.ACTION_CANCEL: mEventListener.onDriverDragCancel(); @@ -80,7 +79,7 @@ public abstract class DragDriver { switch (action) { case MotionEvent.ACTION_UP: - mEventListener.onDriverDragEnd(ev.getX(), ev.getY(), null); + mEventListener.onDriverDragEnd(ev.getX(), ev.getY()); break; case MotionEvent.ACTION_CANCEL: mEventListener.onDriverDragCancel(); @@ -160,7 +159,7 @@ class SystemDragDriver extends DragDriver { case DragEvent.ACTION_DRAG_ENDED: if (mReceivedDropEvent) { - mEventListener.onDriverDragEnd(mLastX, mLastY, null); + mEventListener.onDriverDragEnd(mLastX, mLastY); } else { mEventListener.onDriverDragCancel(); } diff --git a/src/com/android/launcher3/dragndrop/FlingToDeleteHelper.java b/src/com/android/launcher3/dragndrop/FlingToDeleteHelper.java new file mode 100644 index 0000000000..a2aa27d17b --- /dev/null +++ b/src/com/android/launcher3/dragndrop/FlingToDeleteHelper.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2016 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.launcher3.dragndrop; + +import android.graphics.PointF; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.ViewConfiguration; + +import com.android.launcher3.ButtonDropTarget; +import com.android.launcher3.DropTarget; +import com.android.launcher3.Launcher; +import com.android.launcher3.R; +import com.android.launcher3.util.FlingAnimation; + +/** + * Utility class to manage fling to delete action during drag and drop. + */ +public class FlingToDeleteHelper { + + private static final float MAX_FLING_DEGREES = 35f; + + private final Launcher mLauncher; + private final int mFlingToDeleteThresholdVelocity; + + private ButtonDropTarget mDropTarget; + private VelocityTracker mVelocityTracker; + + public FlingToDeleteHelper(Launcher launcher) { + mLauncher = launcher; + mFlingToDeleteThresholdVelocity = launcher.getResources() + .getDimensionPixelSize(R.dimen.drag_flingToDeleteMinVelocity); + } + + public void recordMotionEvent(MotionEvent ev) { + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + mVelocityTracker.addMovement(ev); + } + + public void releaseVelocityTracker() { + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + } + + public DropTarget getDropTarget() { + return mDropTarget; + } + + public Runnable getFlingAnimation(DropTarget.DragObject dragObject) { + PointF vel = isFlingingToDelete(); + if (vel == null) { + return null; + } + return new FlingAnimation(dragObject, vel, mDropTarget, mLauncher); + } + + /** + * Determines whether the user flung the current item to delete it. + * + * @return the vector at which the item was flung, or null if no fling was detected. + */ + private PointF isFlingingToDelete() { + if (mDropTarget == null) { + mDropTarget = (ButtonDropTarget) mLauncher.findViewById(R.id.delete_target_text); + } + if (mDropTarget == null || !mDropTarget.isDropEnabled()) return null; + ViewConfiguration config = ViewConfiguration.get(mLauncher); + mVelocityTracker.computeCurrentVelocity(1000, config.getScaledMaximumFlingVelocity()); + PointF vel = new PointF(mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); + float theta = MAX_FLING_DEGREES + 1; + if (mVelocityTracker.getYVelocity() < mFlingToDeleteThresholdVelocity) { + // Do a quick dot product test to ensure that we are flinging upwards + PointF upVec = new PointF(0f, -1f); + theta = getAngleBetweenVectors(vel, upVec); + } else if (mLauncher.getDeviceProfile().isVerticalBarLayout() && + mVelocityTracker.getXVelocity() < mFlingToDeleteThresholdVelocity) { + // Remove icon is on left side instead of top, so check if we are flinging to the left. + PointF leftVec = new PointF(-1f, 0f); + theta = getAngleBetweenVectors(vel, leftVec); + } + if (theta <= Math.toRadians(MAX_FLING_DEGREES)) { + return vel; + } + return null; + } + + private float getAngleBetweenVectors(PointF vec1, PointF vec2) { + return (float) Math.acos(((vec1.x * vec2.x) + (vec1.y * vec2.y)) / + (vec1.length() * vec2.length())); + } +} diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index a81b4caba5..315f5118e1 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -25,12 +25,10 @@ import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; -import android.graphics.PointF; import android.graphics.Rect; import android.os.Build; import android.text.InputType; import android.text.Selection; -import android.text.Spannable; import android.util.AttributeSet; import android.util.Log; import android.view.ActionMode; @@ -51,7 +49,6 @@ import android.widget.TextView; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Alarm; import com.android.launcher3.AppInfo; -import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.DragSource; @@ -1009,11 +1006,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC return 1f; } - @Override - public boolean supportsFlingToDelete() { - return true; - } - @Override public boolean supportsAppInfoDropTarget() { return !FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND; @@ -1024,16 +1016,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC return true; } - @Override - public void onFlingToDelete(DragObject d, PointF vec) { - // Do nothing - } - - @Override - public void onFlingToDeleteCompleted() { - // Do nothing - } - private void updateItemLocationsInDatabaseBatch() { ArrayList list = getItemsInReadingOrder(); ArrayList items = new ArrayList(); diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 314a8628be..a2534926f6 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -474,11 +474,6 @@ public class DeepShortcutsContainer extends AbstractFloatingView return false; } - @Override - public boolean supportsFlingToDelete() { - return true; - } - @Override public boolean supportsAppInfoDropTarget() { return true; @@ -494,11 +489,6 @@ public class DeepShortcutsContainer extends AbstractFloatingView return 1f; } - @Override - public void onFlingToDeleteCompleted() { - // Don't care; ignore. - } - @Override public void onDropCompleted(View target, DropTarget.DragObject d, boolean isFlingToDelete, boolean success) { diff --git a/src/com/android/launcher3/util/FlingAnimation.java b/src/com/android/launcher3/util/FlingAnimation.java index da8bae712d..d475ee9dfb 100644 --- a/src/com/android/launcher3/util/FlingAnimation.java +++ b/src/com/android/launcher3/util/FlingAnimation.java @@ -5,13 +5,16 @@ import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.graphics.PointF; import android.graphics.Rect; +import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; +import com.android.launcher3.ButtonDropTarget; import com.android.launcher3.DropTarget.DragObject; +import com.android.launcher3.Launcher; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; -public class FlingAnimation implements AnimatorUpdateListener { +public class FlingAnimation implements AnimatorUpdateListener, Runnable { /** * Maximum acceleration in one dimension (pixels per milliseconds) @@ -19,40 +22,86 @@ public class FlingAnimation implements AnimatorUpdateListener { private static final float MAX_ACCELERATION = 0.5f; private static final int DRAG_END_DELAY = 300; + private final ButtonDropTarget mDropTarget; + private final Launcher mLauncher; + protected final DragObject mDragObject; - protected final Rect mIconRect; protected final DragLayer mDragLayer; - protected final Rect mFrom; - protected final int mDuration; - protected final float mUX, mUY; - protected final float mAnimationTimeFraction; protected final TimeInterpolator mAlphaInterpolator = new DecelerateInterpolator(0.75f); + protected final float mUX, mUY; + + protected Rect mIconRect; + protected Rect mFrom; + protected int mDuration; + protected float mAnimationTimeFraction; protected float mAX, mAY; - /** - * @param vel initial fling velocity in pixels per second. - */ - public FlingAnimation(DragObject d, PointF vel, Rect iconRect, DragLayer dragLayer) { + public FlingAnimation(DragObject d, PointF vel, ButtonDropTarget dropTarget, Launcher launcher) { + mDropTarget = dropTarget; + mLauncher = launcher; mDragObject = d; mUX = vel.x / 1000; mUY = vel.y / 1000; - mIconRect = iconRect; + mDragLayer = mLauncher.getDragLayer(); + } - mDragLayer = dragLayer; + @Override + public void run() { + mIconRect = mDropTarget.getIconRect(mDragObject); + + // Initiate from mFrom = new Rect(); - dragLayer.getViewRectRelativeToSelf(d.dragView, mFrom); - - float scale = d.dragView.getScaleX(); - float xOffset = ((scale - 1f) * d.dragView.getMeasuredWidth()) / 2f; - float yOffset = ((scale - 1f) * d.dragView.getMeasuredHeight()) / 2f; + mDragLayer.getViewRectRelativeToSelf(mDragObject.dragView, mFrom); + float scale = mDragObject.dragView.getScaleX(); + float xOffset = ((scale - 1f) * mDragObject.dragView.getMeasuredWidth()) / 2f; + float yOffset = ((scale - 1f) * mDragObject.dragView.getMeasuredHeight()) / 2f; mFrom.left += xOffset; mFrom.right -= xOffset; mFrom.top += yOffset; mFrom.bottom -= yOffset; + mDuration = Math.abs(mUY) > Math.abs(mUX) ? initFlingUpDuration() : initFlingLeftDuration(); - mDuration = Math.abs(vel.y) > Math.abs(vel.x) ? initFlingUpDuration() : initFlingLeftDuration(); mAnimationTimeFraction = ((float) mDuration) / (mDuration + DRAG_END_DELAY); + + // Don't highlight the icon as it's animating + mDragObject.dragView.setColor(0); + + final int duration = mDuration + DRAG_END_DELAY; + final long startTime = AnimationUtils.currentAnimationTimeMillis(); + + // NOTE: Because it takes time for the first frame of animation to actually be + // called and we expect the animation to be a continuation of the fling, we have + // to account for the time that has elapsed since the fling finished. And since + // we don't have a startDelay, we will always get call to update when we call + // start() (which we want to ignore). + final TimeInterpolator tInterpolator = new TimeInterpolator() { + private int mCount = -1; + private float mOffset = 0f; + + @Override + public float getInterpolation(float t) { + if (mCount < 0) { + mCount++; + } else if (mCount == 0) { + mOffset = Math.min(0.5f, (float) (AnimationUtils.currentAnimationTimeMillis() - + startTime) / duration); + mCount++; + } + return Math.min(1f, mOffset + t); + } + }; + + Runnable onAnimationEndRunnable = new Runnable() { + @Override + public void run() { + mLauncher.exitSpringLoadedDragMode(); + mDropTarget.completeDrop(mDragObject); + } + }; + + mDragLayer.animateView(mDragObject.dragView, this, duration, tInterpolator, + onAnimationEndRunnable, DragLayer.ANIMATION_END_DISAPPEAR, null); } /** @@ -111,10 +160,6 @@ public class FlingAnimation implements AnimatorUpdateListener { return (int) Math.round(t); } - public final int getDuration() { - return mDuration + DRAG_END_DELAY; - } - @Override public void onAnimationUpdate(ValueAnimator animation) { float t = animation.getAnimatedFraction(); diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 2e12942518..165d12ef86 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -31,8 +31,6 @@ import com.android.launcher3.BaseContainerView; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.dragndrop.DragOptions; -import com.android.launcher3.folder.Folder; import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; @@ -42,10 +40,11 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.dragndrop.DragController; +import com.android.launcher3.dragndrop.DragOptions; +import com.android.launcher3.folder.Folder; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.WidgetItem; -import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.MultiHashMap; @@ -245,11 +244,6 @@ public class WidgetsContainerView extends BaseContainerView // Drag related handling methods that implement {@link DragSource} interface. // - @Override - public boolean supportsFlingToDelete() { - return true; - } - @Override public boolean supportsAppInfoDropTarget() { return true; @@ -269,14 +263,6 @@ public class WidgetsContainerView extends BaseContainerView return 0; } - @Override - public void onFlingToDeleteCompleted() { - // We just dismiss the drag when we fling, so cleanup here - mLauncher.exitSpringLoadedDragModeDelayed(true, - Launcher.EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); - mLauncher.unlockScreenOrientation(false); - } - @Override public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success) { From e96798e885e3ac97b6de0a1c598eb09cf62349af Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 7 Dec 2016 12:10:44 -0800 Subject: [PATCH 152/382] Smooth animation when dropping a widget in multi-window mode. Factored in app widget scaling in methods related to estimating widget size and positions. ie. Dropping a widget that needs to be resized to fit in the workspace. Bug: 32176631 Change-Id: I106fe12041565a090047f146a07d4bc80a074b4a --- src/com/android/launcher3/CellLayout.java | 15 ++++--- .../launcher3/ShortcutAndWidgetContainer.java | 11 +++++- src/com/android/launcher3/Utilities.java | 21 +++++----- src/com/android/launcher3/Workspace.java | 39 ++++++++++++++----- .../ExternalDragPreviewProvider.java | 2 +- .../widget/PendingItemPreviewProvider.java | 2 +- .../widget/WidgetHostViewLoader.java | 2 +- .../widget/WidgetsContainerView.java | 2 +- 8 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index c0087c45e0..2eed264928 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -951,7 +951,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { lp.tmpCellX = cellX; lp.tmpCellY = cellY; } - clc.setupLp(lp); + clc.setupLp(child); lp.isLockedToGrid = false; final int newX = lp.x; final int newY = lp.y; @@ -972,7 +972,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { va.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { - float r = ((Float) animation.getAnimatedValue()).floatValue(); + float r = (Float) animation.getAnimatedValue(); lp.x = (int) ((1 - r) * oldX + r * newX); lp.y = (int) ((1 - r) * oldY + r * newY); child.requestLayout(); @@ -1027,6 +1027,11 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { if (resize) { cellToRect(cellX, cellY, spanX, spanY, r); + if (v instanceof LauncherAppWidgetHostView) { + DeviceProfile profile = mLauncher.getDeviceProfile(); + Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, + profile.appWidgetScale.y); + } } else { // Find the top left corner of the rect the object will occupy final int[] topLeft = mTmpPoint; @@ -1065,7 +1070,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight()); } - Utilities.scaleRectAboutCenter(r, mChildScale); + Utilities.shrinkRectAboutCenter(r, mChildScale, mChildScale); mDragOutlineAnims[mDragOutlineCurrent].setTag(dragOutline); mDragOutlineAnims[mDragOutlineCurrent].animateIn(); @@ -1836,7 +1841,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { * the provided point and the provided cell */ private void computeDirectionVector(float deltaX, float deltaY, int[] result) { - double angle = Math.atan(((float) deltaY) / deltaX); + double angle = Math.atan(deltaY / deltaX); result[0] = 0; result[1] = 0; @@ -2051,7 +2056,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { va.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { - float r = ((Float) animation.getAnimatedValue()).floatValue(); + float r = (Float) animation.getAnimatedValue(); float r1 = (mode == MODE_HINT && repeating) ? 1.0f : r; float x = r1 * finalDeltaX + (1 - r1) * initDeltaX; float y = r1 * finalDeltaY + (1 - r1) * initDeltaY; diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index 6c73762308..eebce4542b 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -86,8 +86,15 @@ public class ShortcutAndWidgetContainer extends ViewGroup { } } - public void setupLp(CellLayout.LayoutParams lp) { - lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX); + public void setupLp(View child) { + CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); + if (child instanceof LauncherAppWidgetHostView) { + DeviceProfile profile = mLauncher.getDeviceProfile(); + lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, + profile.appWidgetScale.x, profile.appWidgetScale.y); + } else { + lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX); + } } // Set whether or not to invert the layout horizontally if the layout is in RTL mode. diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 197aaf752c..ce6d5a40fc 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -249,19 +249,18 @@ public final class Utilities { return delta; } - public static void scaleRectAboutCenter(Rect r, float scale) { - if (scale != 1.0f) { - int cx = r.centerX(); - int cy = r.centerY(); - r.offset(-cx, -cy); + public static float shrinkRectAboutCenter(Rect r, float scaleX, float scaleY) { + float scale = Math.min(Math.min(scaleX, scaleY), 1.0f); + if (scale < 1.0f) { + int deltaX = (int) (r.width() * (scaleX - scale) * 0.5f); + r.left += deltaX; + r.right -= deltaX; - r.left = (int) (r.left * scale + 0.5f); - r.top = (int) (r.top * scale + 0.5f); - r.right = (int) (r.right * scale + 0.5f); - r.bottom = (int) (r.bottom * scale + 0.5f); - - r.offset(cx, cy); + int deltaY = (int) (r.height() * (scaleY - scale) * 0.5f); + r.top += deltaY; + r.bottom -= deltaY; } + return scale; } public static void startActivityForResultSafely( diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 49e14e4942..3ba461a1ac 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -383,17 +383,37 @@ public class Workspace extends PagedView mOnStateChangeListener = listener; } - // estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each - // dimension if unsuccessful - public int[] estimateItemSize(ItemInfo itemInfo, boolean springLoaded) { + /** + * Estimates the size of an item using spans: hSpan, vSpan. + * + * @param springLoaded True if we are in spring loaded mode. + * @param unscaledSize True if caller wants to return the unscaled size + * @return MAX_VALUE for each dimension if unsuccessful. + */ + public int[] estimateItemSize(ItemInfo itemInfo, boolean springLoaded, boolean unscaledSize) { float shrinkFactor = mLauncher.getDeviceProfile().workspaceSpringLoadShrinkFactor; int[] size = new int[2]; if (getChildCount() > 0) { // Use the first non-custom page to estimate the child position CellLayout cl = (CellLayout) getChildAt(numCustomPages()); + boolean isWidget = itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; + Rect r = estimateItemPosition(cl, 0, 0, itemInfo.spanX, itemInfo.spanY); + + float scale = 1; + if (isWidget) { + DeviceProfile profile = mLauncher.getDeviceProfile(); + scale = Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, + profile.appWidgetScale.y); + } size[0] = r.width(); size[1] = r.height(); + + if (isWidget && unscaledSize) { + size[0] /= scale; + size[1] /= scale; + } + if (springLoaded) { size[0] *= shrinkFactor; size[1] *= shrinkFactor; @@ -3451,7 +3471,7 @@ public class Workspace extends PagedView } public Bitmap createWidgetBitmap(ItemInfo widgetInfo, View layout) { - int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(widgetInfo, false); + int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(widgetInfo, false, true); int visibility = layout.getVisibility(); layout.setVisibility(VISIBLE); @@ -3477,6 +3497,10 @@ public class Workspace extends PagedView int spanY = info.spanY; Rect r = estimateItemPosition(layout, targetCell[0], targetCell[1], spanX, spanY); + if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET) { + DeviceProfile profile = mLauncher.getDeviceProfile(); + Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, profile.appWidgetScale.y); + } loc[0] = r.left; loc[1] = r.top; @@ -3488,11 +3512,8 @@ public class Workspace extends PagedView float dragViewScaleX = 1f; float dragViewScaleY = 1f; if (scale) { - float width = info.spanX * layout.mCellWidth; - float height = info.spanY * layout.mCellHeight; - - dragViewScaleX = r.width() / width; - dragViewScaleY = r.height() / height; + dragViewScaleX = (1.0f * r.width()) / dragView.getMeasuredWidth(); + dragViewScaleY = (1.0f * r.height()) / dragView.getMeasuredHeight(); } // The animation will scale the dragView about its center, so we need to center about diff --git a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java index ac50332bf8..37cc9ad306 100644 --- a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java +++ b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java @@ -45,7 +45,7 @@ public class ExternalDragPreviewProvider extends DragPreviewProvider { mLauncher = launcher; mAddInfo = addInfo; - mOutlineSize = mLauncher.getWorkspace().estimateItemSize(mAddInfo, false); + mOutlineSize = mLauncher.getWorkspace().estimateItemSize(mAddInfo, false, false); } public Rect getPreviewBounds() { diff --git a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java index 7c06701e88..722fbb8872 100644 --- a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java +++ b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java @@ -45,7 +45,7 @@ public class PendingItemPreviewProvider extends DragPreviewProvider { @Override public Bitmap createDragOutline(Canvas canvas) { Workspace workspace = Launcher.getLauncher(mView.getContext()).getWorkspace(); - int[] size = workspace.estimateItemSize(mAddInfo, false); + int[] size = workspace.estimateItemSize(mAddInfo, false, false); int w = size[0]; int h = size[1]; diff --git a/src/com/android/launcher3/widget/WidgetHostViewLoader.java b/src/com/android/launcher3/widget/WidgetHostViewLoader.java index 049871f986..b196053367 100644 --- a/src/com/android/launcher3/widget/WidgetHostViewLoader.java +++ b/src/com/android/launcher3/widget/WidgetHostViewLoader.java @@ -130,7 +130,7 @@ public class WidgetHostViewLoader implements DragController.DragListener { mWidgetLoadingId = -1; hostView.setVisibility(View.INVISIBLE); - int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(mInfo, false); + int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(mInfo, false, true); // We want the first widget layout to be the correct size. This will be important // for width size reporting to the AppWidgetManager. DragLayer.LayoutParams lp = new DragLayer.LayoutParams(unScaledSize[0], diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 165d12ef86..d0ead487a3 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -200,7 +200,7 @@ public class WidgetsContainerView extends BaseContainerView // the widget if this is null, so we break out. PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) createItemInfo; - int[] size = mLauncher.getWorkspace().estimateItemSize(createWidgetInfo, true); + int[] size = mLauncher.getWorkspace().estimateItemSize(createWidgetInfo, true, false); Bitmap icon = image.getBitmap(); float minScale = 1.25f; From f5440cbd6c0525769d24b890e16313a728831e04 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 14 Dec 2016 15:13:00 -0800 Subject: [PATCH 153/382] Removing FeatureFlag.LAUNCHER3_LEGACY_WORKSPACE_DND and corresponding logic Change-Id: Ie10c087b4f72ee27be5bf12e2c81be5b7a3a6176 --- res/drawable-hdpi/page_hover_left.9.png | Bin 102 -> 0 bytes .../page_hover_left_active.9.png | Bin 102 -> 0 bytes res/drawable-hdpi/page_hover_right.9.png | Bin 100 -> 0 bytes .../page_hover_right_active.9.png | Bin 100 -> 0 bytes res/drawable-hdpi/screenpanel.9.png | Bin 132 -> 0 bytes res/drawable-hdpi/screenpanel_hover.9.png | Bin 133 -> 0 bytes res/drawable-mdpi/page_hover_left.9.png | Bin 99 -> 0 bytes .../page_hover_left_active.9.png | Bin 99 -> 0 bytes res/drawable-mdpi/page_hover_right.9.png | Bin 97 -> 0 bytes .../page_hover_right_active.9.png | Bin 98 -> 0 bytes res/drawable-mdpi/screenpanel.9.png | Bin 131 -> 0 bytes res/drawable-mdpi/screenpanel_hover.9.png | Bin 131 -> 0 bytes res/drawable-xhdpi/page_hover_left.9.png | Bin 104 -> 0 bytes .../page_hover_left_active.9.png | Bin 104 -> 0 bytes res/drawable-xhdpi/page_hover_right.9.png | Bin 108 -> 0 bytes .../page_hover_right_active.9.png | Bin 108 -> 0 bytes res/drawable-xhdpi/screenpanel.9.png | Bin 172 -> 0 bytes res/drawable-xhdpi/screenpanel_hover.9.png | Bin 174 -> 0 bytes res/drawable-xxhdpi/page_hover_left.9.png | Bin 116 -> 0 bytes .../page_hover_left_active.9.png | Bin 116 -> 0 bytes res/drawable-xxhdpi/page_hover_right.9.png | Bin 122 -> 0 bytes .../page_hover_right_active.9.png | Bin 122 -> 0 bytes res/drawable-xxhdpi/screenpanel.9.png | Bin 214 -> 0 bytes res/drawable-xxhdpi/screenpanel_hover.9.png | Bin 211 -> 0 bytes res/drawable/bg_celllayout.xml | 20 ++- res/drawable/bg_screenpanel.xml | 27 ---- res/values-sw720dp-land/dimens.xml | 21 --- res/values-sw720dp-port/dimens.xml | 22 --- res/values/dimens.xml | 8 -- src/com/android/launcher3/CellLayout.java | 23 +-- src/com/android/launcher3/DeviceProfile.java | 9 +- src/com/android/launcher3/Launcher.java | 13 +- src/com/android/launcher3/Workspace.java | 99 ++----------- .../allapps/AllAppsContainerView.java | 7 - .../launcher3/dragndrop/DragController.java | 136 +----------------- .../launcher3/dragndrop/DragLayer.java | 75 +--------- .../launcher3/dragndrop/DragScroller.java | 40 ------ src/com/android/launcher3/folder/Folder.java | 44 +++--- .../launcher3/folder/FolderPagedView.java | 2 +- .../launcher3/config/FeatureFlags.java | 2 - 40 files changed, 54 insertions(+), 494 deletions(-) delete mode 100644 res/drawable-hdpi/page_hover_left.9.png delete mode 100644 res/drawable-hdpi/page_hover_left_active.9.png delete mode 100644 res/drawable-hdpi/page_hover_right.9.png delete mode 100644 res/drawable-hdpi/page_hover_right_active.9.png delete mode 100644 res/drawable-hdpi/screenpanel.9.png delete mode 100644 res/drawable-hdpi/screenpanel_hover.9.png delete mode 100644 res/drawable-mdpi/page_hover_left.9.png delete mode 100644 res/drawable-mdpi/page_hover_left_active.9.png delete mode 100644 res/drawable-mdpi/page_hover_right.9.png delete mode 100644 res/drawable-mdpi/page_hover_right_active.9.png delete mode 100644 res/drawable-mdpi/screenpanel.9.png delete mode 100644 res/drawable-mdpi/screenpanel_hover.9.png delete mode 100644 res/drawable-xhdpi/page_hover_left.9.png delete mode 100644 res/drawable-xhdpi/page_hover_left_active.9.png delete mode 100644 res/drawable-xhdpi/page_hover_right.9.png delete mode 100644 res/drawable-xhdpi/page_hover_right_active.9.png delete mode 100644 res/drawable-xhdpi/screenpanel.9.png delete mode 100644 res/drawable-xhdpi/screenpanel_hover.9.png delete mode 100644 res/drawable-xxhdpi/page_hover_left.9.png delete mode 100644 res/drawable-xxhdpi/page_hover_left_active.9.png delete mode 100644 res/drawable-xxhdpi/page_hover_right.9.png delete mode 100644 res/drawable-xxhdpi/page_hover_right_active.9.png delete mode 100644 res/drawable-xxhdpi/screenpanel.9.png delete mode 100644 res/drawable-xxhdpi/screenpanel_hover.9.png delete mode 100644 res/drawable/bg_screenpanel.xml delete mode 100644 res/values-sw720dp-land/dimens.xml delete mode 100644 res/values-sw720dp-port/dimens.xml delete mode 100644 src/com/android/launcher3/dragndrop/DragScroller.java diff --git a/res/drawable-hdpi/page_hover_left.9.png b/res/drawable-hdpi/page_hover_left.9.png deleted file mode 100644 index 3f11d0b33dd91dcea948106329ccb8964027ee63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eQ!2%@X47W}MQo5cljv*C{$qY^ZJtk;;kY_fy z!TdF8YQaHeMxlNehdDxvg`TwN&FfI&37E{naNw=uMh4*@d_av1p00i_>zopr0KCr| A?f?J) diff --git a/res/drawable-hdpi/page_hover_left_active.9.png b/res/drawable-hdpi/page_hover_left_active.9.png deleted file mode 100644 index abe4c31a97611d422a31bc8f32e21b52816d3d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eQ!2%@X47W}MQo5cljv*C{$qY^ZJtk;;kY_fy z!TdF8YQaHeMxp!t4Hl|yswX&OZ3JB<7N~JD{4k44oL=#&52%sB)78&qol`;+0Iz%- AzyJUM diff --git a/res/drawable-hdpi/page_hover_right.9.png b/res/drawable-hdpi/page_hover_right.9.png deleted file mode 100644 index 3bcf191958abeea6a7bfd8fd12a00b96714b37bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eQ!2%@X47W}MQrey_jv*C{$qr2aCo0q>{Fj$? y__|}F#z%QQ!OjK=p~XT^TJ+v^9OB-f%ETak+3{kiT0$dG8-u5-pUXO@geCx-;v4J$ diff --git a/res/drawable-hdpi/page_hover_right_active.9.png b/res/drawable-hdpi/page_hover_right_active.9.png deleted file mode 100644 index 101e4dc0f69fd7ba51ecb4fda4389205196e7f92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eQ!2%@X47W}MQrey_jv*C{$qr2aCo0q>{Fj$? y__|}F#z%R*jq;3!DsHMLIAiY!wu&csvoK`##x<61KJE|H#^CAd=d#Wzp$PzY0UGrH diff --git a/res/drawable-hdpi/screenpanel.9.png b/res/drawable-hdpi/screenpanel.9.png deleted file mode 100644 index 5bccd33569f036bced307b5f4a718b839364a5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2yggkULn;`P9hm$(bFP`~dS{49}W$<+Mb6Mw<&;$UKkS44E diff --git a/res/drawable-hdpi/screenpanel_hover.9.png b/res/drawable-hdpi/screenpanel_hover.9.png deleted file mode 100644 index f6b8c62ff3677a5c0c8b5a32a472dabf8527aece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2d^}woLn;`P9hmgTe~DWM4f4+$v9 diff --git a/res/drawable-mdpi/page_hover_left.9.png b/res/drawable-mdpi/page_hover_left.9.png deleted file mode 100644 index 2b6094cf65491623d9208b874f73c9f9cc44b4d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!2%@n9Os?@Qd*uajv*C{$qY^Z13JY2xHIwa xIb6+f(sNK;;Gx38r>E$%Jn6H5Tmy#!LrT(&eUWdzTnFl6@O1TaS?83{1OO=C8U+9V diff --git a/res/drawable-mdpi/page_hover_left_active.9.png b/res/drawable-mdpi/page_hover_left_active.9.png deleted file mode 100644 index 9eb00a28205b45ae9c0794b0f78e4858be2f036d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!2%@n9Os?@Qd*uajv*C{$qY^Z13JY2xHIwa wIb6+f(sNK;aH5VwCdO%o-_d7^HVlFe3}U;M)@{D+12Tfa)78&qol`;+07cds3jhEB diff --git a/res/drawable-mdpi/page_hover_right.9.png b/res/drawable-mdpi/page_hover_right.9.png deleted file mode 100644 index c2e598351b7498188b4673763b8a2b23af4082d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!2%@n9Os?@QW~Bvjv*C{$qmi_13I`Z{<$-( vure=M_&;Ew2ZxM~(+t0(&lF`COd}XxX3V&vv{+>uP!EHrtDnm{r-UW|SWg>3 diff --git a/res/drawable-mdpi/page_hover_right_active.9.png b/res/drawable-mdpi/page_hover_right_active.9.png deleted file mode 100644 index d2771a1a54e75c6585d49322ad454a8791f82ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!2%@n9Os?@QktGFjv*C{$qmi_13I`Z{<$-( wure=M_&;FbUjd7V7K6E6XPqq=vNkX<_&Y3}vg@08A5as6r>mdKI;Vst0GNdwrvLx| diff --git a/res/drawable-mdpi/screenpanel.9.png b/res/drawable-mdpi/screenpanel.9.png deleted file mode 100644 index 9603c122a1dd71dff8e0e63eac73d8874a77f04d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6ygXeTLn;`P9hm-4RNzY3rC91I zC46r}QbLo))Bp0FvPK`AMK~UXC~$-@xGd)C;M7nMIIz-zVNrwaU7M3!!pmkGZ#ewu dt34mk%vmr0mNS0;r2#aR!PC{xWt~$(695D-DD?mU diff --git a/res/drawable-mdpi/screenpanel_hover.9.png b/res/drawable-mdpi/screenpanel_hover.9.png deleted file mode 100644 index 7f28ce0e04f9d8e9284e6e0244e2f59e063f3ada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6ygXeTLn;`P9hm-4RNzXe%KgN| zU6Xt0088Mh|Mm7|Cl2rjDs%)lDg-bJ^lB-nEog9HSkA=Q!SwBAh1z>xdWre#-I^je^)44$rjF6*2UngC?XDro=! diff --git a/res/drawable-xhdpi/page_hover_left.9.png b/res/drawable-xhdpi/page_hover_left.9.png deleted file mode 100644 index dbcc0abd2d2bddd7f6c3b0d23c4c784943674afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+r!2%@jAN&^xr1U*q978G?lNp-+XH1y&z@G0w z!r2e<^S5v>y`*r{Bg7(Ssr%B*IWss^Q-m1O;+Pr2ebvA5FU_z7YGv?r^>bP0l+XkK Ds+S)e diff --git a/res/drawable-xhdpi/page_hover_left_active.9.png b/res/drawable-xhdpi/page_hover_left_active.9.png deleted file mode 100644 index 3233efe281c4ae0b037eddd77a9e1ffb07f99bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+r!2%@jAN&^xr1U*q978G?lNp-+XH1y&z@G0w z!r2e<^S5v>y`*sS?}~yOUj1H|Eer*{PN*=P*~7-L{aMsE&W3%{fm#_nUHx3vIVCg! E01<>E8UO$Q diff --git a/res/drawable-xhdpi/page_hover_right.9.png b/res/drawable-xhdpi/page_hover_right.9.png deleted file mode 100644 index d82f809bfdc67a31e711e57b54f7fef06631013c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+r!2%@jAN&^xq>MdX978G?lN}iUUsMonI9vaQ zA#0CzU8XtLlK;w{?u!m3YS?P|T5O##SAbP0 Hl+XkK@`fM~ diff --git a/res/drawable-xhdpi/page_hover_right_active.9.png b/res/drawable-xhdpi/page_hover_right_active.9.png deleted file mode 100644 index 819ea195ce9999129d57e97a09489ee3f94c37db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+r!2%@jAN&^xq>MdX978G?lN}iUUsMonI9vaQ zA#0CzU8XtLlK;w{@7-Gu2ULa3D#%i_))ewN(Zcv{4l9F)Q?$}%o;8br+8I1u{an^L HB{Ts54QC*c diff --git a/res/drawable-xhdpi/screenpanel.9.png b/res/drawable-xhdpi/screenpanel.9.png deleted file mode 100644 index 75343f78db58499cdab4bb7505ea29c9c3818944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC0wn*;THgYsialK%Ln;{GUfIg%WXRxpQ98FE zojYZAiI3y##Fs`apVt2ByS@8sraY_l)DWXiCvzXgM&X77ZC?{_@7ds{9%5*_v&`_s zi$$igY9X6*eBI42T|R!n{_kb`r!T)eix%$Ld;9&Y=dyQOno>?Iadl2{dw9j@0gqgC W#^3qL>Xkt289ZJ6T-G@yGywn<-b9T6 diff --git a/res/drawable-xhdpi/screenpanel_hover.9.png b/res/drawable-xhdpi/screenpanel_hover.9.png deleted file mode 100644 index 55b4d6ed25b5b052e04d6d3d635a5792a1c57f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC0wn*;THgYsNs?}? zj+COT$g;EAS9!QEU+ewy!SIX!|1bWPR(pS5W66F0Z1bN=_pe@#mzD%CP%~OmpdnGf Z68<|R1BA^2pJYD@<);T3K0RW%YM%@4a diff --git a/res/drawable-xxhdpi/page_hover_left.9.png b/res/drawable-xxhdpi/page_hover_left.9.png deleted file mode 100644 index c81f86c023ba177be8357e4aea23b206fe5e00c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3T!2%?&MQ%6@q^vz%978G?lNp-+TPV~XtXE=a z)^8R$T%RPm+)#tx_o%|wi53dW9t9p<+~qFXuO-LGs+@WC$O6_K+0hIRhFhgSO=>m( P8pGh}>gTe~DWM4f#NHxR diff --git a/res/drawable-xxhdpi/page_hover_left_active.9.png b/res/drawable-xxhdpi/page_hover_left_active.9.png deleted file mode 100644 index 858a3b2ab0820fb0416301d1872f4f078c0ca273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3T!2%?&MQ%6@q^vz%978G?lNp-+TPV~XtXE=a z)^8R$T%RPm+)#tx_o%|w--Ql7M;CXwi}q{Dh1xK2xm{Y->BwDheH%k%llm)9A>JuK PV;DSL{an^LB{Ts5!QmnP diff --git a/res/drawable-xxhdpi/page_hover_right.9.png b/res/drawable-xxhdpi/page_hover_right.9.png deleted file mode 100644 index c5297703e06abe68a15b8e1c00c9a4250b894b8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3T!2%?&MQ%6@q#Qk6978G?lMgWcd)#2cX2i4a zKPU4F=MafY9pP(EO|Uy6^8a{%Os8z07Tck~ql>%TMfrbi>icwP&X%mC0LDjIAqBCFK4%0P#^CAd=d#Wzp$PzcAt^Ng diff --git a/res/drawable-xxhdpi/page_hover_right_active.9.png b/res/drawable-xxhdpi/page_hover_right_active.9.png deleted file mode 100644 index 99005536b2c44ca1f216452d605077db59f7beff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3T!2%?&MQ%6@q#Qk6978G?lMgWcd)#2cX2i4a zKPU4F=MafY9pP(EO|Uy6^8a|i9(ik-P@a~>UGAd&T5?}fWuLZMW?ntAfa%E96$~2! WH3Hh2w{idtWAJqKb6Mw<&;$Th6ev&t diff --git a/res/drawable-xxhdpi/screenpanel.9.png b/res/drawable-xxhdpi/screenpanel.9.png deleted file mode 100644 index b221b378fcb78f2a1a2cc37dd379b87b174478cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq0wlddc6tM;xt=bLAr*{oubVD9o68tv#U9|Jl!#8eD z4Ha?H|8RZvchMgU-Q}CDHa^HOO!{-qZHvc(hPTWAolf}eICnd9<%8n5BYUD#fDUEw MboFyt=akR{0I5A+TL1t6 diff --git a/res/drawable-xxhdpi/screenpanel_hover.9.png b/res/drawable-xxhdpi/screenpanel_hover.9.png deleted file mode 100644 index 418cf0a62767a2c343c7b506302d0e7b8a40e4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq0wlddc6tM;S)MMAAr*{ouODSR#K7ZlF<$)6 z-MNm|4mTGne>s)5V{SqFll$@OIMvhYwryU#z)pdcHDPm{shHgLVX z!2KtoD825*MW@?;`4R$_dcQxnE2J>6;b-uFqZ#(gWVbV{C~ZCP_%P=Jpeq?XUHx3v IIVCg!06M={N&o-= diff --git a/res/drawable/bg_celllayout.xml b/res/drawable/bg_celllayout.xml index d2219b36cf..b81b37f06f 100644 --- a/res/drawable/bg_celllayout.xml +++ b/res/drawable/bg_celllayout.xml @@ -18,20 +18,18 @@ */ --> - - - - + + + + - - - + + - - \ No newline at end of file + diff --git a/res/drawable/bg_screenpanel.xml b/res/drawable/bg_screenpanel.xml deleted file mode 100644 index 346fca013c..0000000000 --- a/res/drawable/bg_screenpanel.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/res/values-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml deleted file mode 100644 index 514980fe0b..0000000000 --- a/res/values-sw720dp-land/dimens.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 100dip - diff --git a/res/values-sw720dp-port/dimens.xml b/res/values-sw720dp-port/dimens.xml deleted file mode 100644 index 6f594d5188..0000000000 --- a/res/values-sw720dp-port/dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - 40dp - diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 188f98fa65..a8a25af3e2 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -109,14 +109,6 @@ 30dp - - 20dp - - - 12dp - 30dp diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 2eed264928..aef94c1eb0 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -33,7 +33,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.TransitionDrawable; import android.os.Build; import android.os.Parcelable; import android.support.annotation.IntDef; @@ -53,7 +52,6 @@ import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate; import com.android.launcher3.accessibility.FolderAccessibilityHelper; import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; @@ -112,9 +110,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private float mBackgroundAlpha; - private static final int BACKGROUND_ACTIVATE_DURATION = - FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND ? 120 : 0; - private final TransitionDrawable mBackground; + private static final int[] BACKGROUND_STATE_ACTIVE = new int[] { android.R.attr.state_active }; + private static final int[] BACKGROUND_STATE_DEFAULT = new int[0]; + private final Drawable mBackground; // These values allow a fixed measurement to be set on the CellLayout. private int mFixedWidth = -1; @@ -227,9 +225,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { setAlwaysDrawnWithCacheEnabled(false); final Resources res = getResources(); - mBackground = (TransitionDrawable) res.getDrawable( - FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND ? R.drawable.bg_screenpanel - : R.drawable.bg_celllayout); + mBackground = res.getDrawable(R.drawable.bg_celllayout); mBackground.setCallback(this); mBackground.setAlpha((int) (mBackgroundAlpha * 255)); @@ -424,15 +420,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { void setIsDragOverlapping(boolean isDragOverlapping) { if (mIsDragOverlapping != isDragOverlapping) { mIsDragOverlapping = isDragOverlapping; - if (mIsDragOverlapping) { - mBackground.startTransition(BACKGROUND_ACTIVATE_DURATION); - } else { - if (mBackgroundAlpha > 0f) { - mBackground.reverseTransition(BACKGROUND_ACTIVATE_DURATION); - } else { - mBackground.resetTransition(); - } - } + mBackground.setState(mIsDragOverlapping + ? BACKGROUND_STATE_ACTIVE : BACKGROUND_STATE_DEFAULT); invalidate(); } } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index f79d66659d..27afdc03dc 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -75,7 +75,6 @@ public class DeviceProfile { public final Rect defaultWidgetPadding; private final int defaultPageSpacingPx; private final int topWorkspacePadding; - private float dragViewScale; public float workspaceSpringLoadShrinkFactor; public final int workspaceSpringLoadedBottomSpace; @@ -284,9 +283,6 @@ public class DeviceProfile { cellWidthPx = iconSizePx; cellHeightPx = iconSizePx + iconDrawablePaddingPx + Utilities.calculateTextHeight(iconTextSizePx); - final float scaleDps = !FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND ? 0f - : res.getDimensionPixelSize(R.dimen.dragViewScale); - dragViewScale = (iconSizePx + scaleDps) / iconSizePx; // Hotseat hotseatCellWidthPx = iconSizePx; @@ -417,12 +413,11 @@ public class DeviceProfile { if (isTablet) { // Pad the left and right of the workspace to ensure consistent spacing // between all icons - float gapScale = 1f + (dragViewScale - 1f) / 2f; int width = getCurrentWidth(); int height = getCurrentHeight(); // The amount of screen space available for left/right padding. - int availablePaddingX = Math.max(0, width - (int) ((inv.numColumns * cellWidthPx) + - ((inv.numColumns - 1) * gapScale * cellWidthPx))); + int availablePaddingX = Math.max(0, width - ((inv.numColumns * cellWidthPx) + + ((inv.numColumns - 1) * cellWidthPx))); availablePaddingX = (int) Math.min(availablePaddingX, width * MAX_HORIZONTAL_PADDING_PERCENT); int availablePaddingY = Math.max(0, height - topWorkspacePadding - paddingBottom diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 7775a6bc56..8bb4a5b8f6 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1332,8 +1332,6 @@ public class Launcher extends Activity } // Setup the drag controller (drop targets have to be added in reverse order in priority) - mDragController.setDragScroller(mWorkspace); - mDragController.setScrollView(mDragLayer); mDragController.setMoveTarget(mWorkspace); mDragController.addDropTarget(mWorkspace); mDropTargetBar.setup(mDragController); @@ -3024,16 +3022,7 @@ public class Launcher extends Activity mStateTransitionAnimation.startAnimationToWorkspace(mState, mWorkspace.getState(), Workspace.State.SPRING_LOADED, true /* animated */, null /* onCompleteRunnable */); - - if (isAppsViewVisible()) { - mState = State.APPS_SPRING_LOADED; - } else if (isWidgetsViewVisible()) { - mState = State.WIDGETS_SPRING_LOADED; - } else if (!FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { - mState = State.WORKSPACE_SPRING_LOADED; - } else { - mState = State.WORKSPACE; - } + mState = State.WORKSPACE_SPRING_LOADED; } public void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, int delay, diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 3ba461a1ac..6520a2b6fc 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -67,7 +67,6 @@ import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; -import com.android.launcher3.dragndrop.DragScroller; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dragndrop.SpringLoadedDragController; import com.android.launcher3.folder.Folder; @@ -94,7 +93,7 @@ import java.util.HashSet; * interact with. A workspace is meant to be used with a fixed width only. */ public class Workspace extends PagedView - implements DropTarget, DragSource, DragScroller, View.OnTouchListener, + implements DropTarget, DragSource, View.OnTouchListener, DragController.DragListener, ViewGroup.OnHierarchyChangeListener, Insettable, DropTargetSource { private static final String TAG = "Launcher.Workspace"; @@ -248,9 +247,6 @@ public class Workspace extends PagedView private boolean mStripScreensOnPageStopMoving = false; - /** Is the user is dragging an item near the edge of a page? */ - private boolean mInScrollArea = false; - private DragPreviewProvider mOutlineProvider = null; public static final int DRAG_BITMAP_PADDING = DragPreviewProvider.DRAG_BITMAP_PADDING; private boolean mWorkspaceFadeInAdjacentScreens; @@ -484,10 +480,8 @@ public class Workspace extends PagedView } } - if (!FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { - // Always enter the spring loaded mode - mLauncher.enterSpringLoadedDragMode(); - } + // Always enter the spring loaded mode + mLauncher.enterSpringLoadedDragMode(); } public void deferRemoveExtraEmptyScreen() { @@ -2572,7 +2566,7 @@ public class Workspace extends PagedView // If the item being dropped is a shortcut and the nearest drop // cell also contains a shortcut, then create a folder with the two shortcuts. - if (!mInScrollArea && createUserFolderIfNecessary(cell, container, + if (createUserFolderIfNecessary(cell, container, dropTargetLayout, mTargetCell, distance, false, d.dragView, null)) { return; } @@ -2787,10 +2781,6 @@ public class Workspace extends PagedView mDropToLayout = null; setDropLayoutForDragObject(d); - - if (!workspaceInModalState() && FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { - mLauncher.getDragLayer().showPageHints(); - } } @Override @@ -2801,32 +2791,18 @@ public class Workspace extends PagedView // Here we store the final page that will be dropped to, if the workspace in fact // receives the drop - if (mInScrollArea) { - if (isPageInTransition()) { - // If the user drops while the page is scrolling, we should use that page as the - // destination instead of the page that is being hovered over. - mDropToLayout = (CellLayout) getPageAt(getNextPage()); - } else { - mDropToLayout = mDragOverlappingLayout; - } - } else { - mDropToLayout = mDragTargetLayout; - } - + mDropToLayout = mDragTargetLayout; if (mDragMode == DRAG_MODE_CREATE_FOLDER) { mCreateUserFolderOnDrop = true; } else if (mDragMode == DRAG_MODE_ADD_TO_FOLDER) { mAddToExistingFolderOnDrop = true; } - // Reset the scroll area and previous drag target - onResetScrollArea(); + // Reset the previous drag target setCurrentDropLayout(null); setCurrentDragOverlappingLayout(null); mSpringLoadedDragController.cancel(); - - mLauncher.getDragLayer().hidePageHints(); } private void enforceDragParity(String event, int update, int expectedValue) { @@ -3043,7 +3019,7 @@ public class Workspace extends PagedView public void onDragOver(DragObject d) { // Skip drag over events while we are dragging over side pages - if (mInScrollArea || !transitionStateShouldAllowDrop()) return; + if (!transitionStateShouldAllowDrop()) return; ItemInfo item = d.dragInfo; if (item == null) { @@ -3743,7 +3719,7 @@ public class Workspace extends PagedView @Override public boolean supportsAppInfoDropTarget() { - return !FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND; + return true; } @Override @@ -3806,65 +3782,6 @@ public class Workspace extends PagedView } } - @Override - public boolean onEnterScrollArea(int x, int y, int direction) { - // Ignore the scroll area if we are dragging over the hot seat - boolean isPortrait = !mLauncher.getDeviceProfile().isLandscape; - if (mLauncher.getHotseat() != null && isPortrait) { - Rect r = new Rect(); - mLauncher.getHotseat().getHitRect(r); - if (r.contains(x, y)) { - return false; - } - } - - boolean result = false; - if (!workspaceInModalState() && !mIsSwitchingState && Folder.getOpen(mLauncher) == null) { - mInScrollArea = true; - - final int page = getNextPage() + - (direction == DragController.SCROLL_LEFT ? -1 : 1); - // We always want to exit the current layout to ensure parity of enter / exit - setCurrentDropLayout(null); - - if (0 <= page && page < getChildCount()) { - // Ensure that we are not dragging over to the custom content screen - if (getScreenIdForPageIndex(page) == CUSTOM_CONTENT_SCREEN_ID) { - return false; - } - - CellLayout layout = (CellLayout) getChildAt(page); - setCurrentDragOverlappingLayout(layout); - - // Workspace is responsible for drawing the edge glow on adjacent pages, - // so we need to redraw the workspace when this may have changed. - invalidate(); - result = true; - } - } - return result; - } - - @Override - public boolean onExitScrollArea() { - boolean result = false; - if (mInScrollArea) { - invalidate(); - CellLayout layout = getCurrentDropLayout(); - setCurrentDropLayout(layout); - setCurrentDragOverlappingLayout(layout); - - result = true; - mInScrollArea = false; - } - return result; - } - - private void onResetScrollArea() { - setCurrentDragOverlappingLayout(null); - mInScrollArea = false; - } - /** * Returns a specific CellLayout */ diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 24fb066011..97e0d984a0 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -51,7 +51,6 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; import com.android.launcher3.graphics.TintedDrawableSpan; import com.android.launcher3.keyboard.FocusedItemDecorator; -import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -387,12 +386,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } }); mLauncher.getWorkspace().beginDragShared(v, this, new DragOptions()); - if (FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { - // Enter spring loaded mode (the new workspace does this in - // onDragStart(), so we don't want to do it here) - mLauncher.enterSpringLoadedDragMode(); - } - return false; } diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index a5a54c1eca..745776db3d 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -21,24 +21,20 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; -import android.os.Handler; import android.os.IBinder; import android.view.DragEvent; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; import android.view.inputmethod.InputMethodManager; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.PagedView; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.Utilities; import com.android.launcher3.accessibility.DragViewStateAnnouncer; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.ItemInfoMatcher; @@ -51,26 +47,14 @@ import java.util.ArrayList; * Class for initiating a drag within a view or across multiple views. */ public class DragController implements DragDriver.EventListener, TouchController { - public static final int SCROLL_DELAY = 500; - public static final int RESCROLL_DELAY = PagedView.PAGE_SNAP_ANIMATION_DURATION + 150; - private static final boolean PROFILE_DRAWING_DURING_DRAG = false; - private static final int SCROLL_OUTSIDE_ZONE = 0; - private static final int SCROLL_WAITING_IN_ZONE = 1; - - public static final int SCROLL_NONE = -1; - public static final int SCROLL_LEFT = 0; - public static final int SCROLL_RIGHT = 1; - @Thunk Launcher mLauncher; - private Handler mHandler; private FlingToDeleteHelper mFlingToDeleteHelper; // temporaries to avoid gc thrash private Rect mRectTemp = new Rect(); private final int[] mCoordinatesTemp = new int[2]; - private final boolean mIsRtl; /** * Drag driver for the current drag/drop operation, or null if there is no active DND operation. @@ -87,29 +71,17 @@ public class DragController implements DragDriver.EventListener, TouchController /** Y coordinate of the down event. */ private int mMotionDownY; - /** the area at the edge of the screen that makes the workspace go left - * or right while you're dragging. - */ - private final int mScrollZone; - private DropTarget.DragObject mDragObject; /** Who can receive drop events */ - private ArrayList mDropTargets = new ArrayList(); - private ArrayList mListeners = new ArrayList(); + private ArrayList mDropTargets = new ArrayList<>(); + private ArrayList mListeners = new ArrayList<>(); /** The window token used as the parent for the DragView. */ private IBinder mWindowToken; - /** The view that will be scrolled when dragging to the left and right edges of the screen. */ - private View mScrollView; - private View mMoveTarget; - @Thunk DragScroller mDragScroller; - @Thunk int mScrollState = SCROLL_OUTSIDE_ZONE; - private ScrollRunnable mScrollRunnable = new ScrollRunnable(); - private DropTarget mLastDropTarget; @Thunk int mLastTouch[] = new int[2]; @@ -143,11 +115,7 @@ public class DragController implements DragDriver.EventListener, TouchController * Used to create a new DragLayer from XML. */ public DragController(Launcher launcher) { - Resources r = launcher.getResources(); mLauncher = launcher; - mHandler = new Handler(); - mScrollZone = r.getDimensionPixelSize(R.dimen.scroll_zone); - mIsRtl = Utilities.isRtl(r); mFlingToDeleteHelper = new FlingToDeleteHelper(launcher); } @@ -216,11 +184,8 @@ public class DragController implements DragDriver.EventListener, TouchController && !mOptions.preDragCondition.shouldStartDrag(0); final Resources res = mLauncher.getResources(); - final float scaleDps = FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND - ? res.getDimensionPixelSize(R.dimen.dragViewScale) - : mIsInPreDrag - ? res.getDimensionPixelSize(R.dimen.pre_drag_view_scale) - : 0f; + final float scaleDps = mIsInPreDrag + ? res.getDimensionPixelSize(R.dimen.pre_drag_view_scale) : 0f; final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX, registrationY, initialDragViewScale, scaleDps); @@ -333,7 +298,6 @@ public class DragController implements DragDriver.EventListener, TouchController private void endDrag() { if (isDragging()) { mDragDriver = null; - clearScrollRunnable(); boolean isDeferred = false; if (mDragObject.dragView != null) { isDeferred = mDragObject.deferDragViewCleanupPostAnimation; @@ -507,16 +471,6 @@ public class DragController implements DragDriver.EventListener, TouchController return mMoveTarget != null && mMoveTarget.dispatchUnhandledMove(focused, direction); } - private void clearScrollRunnable() { - mHandler.removeCallbacks(mScrollRunnable); - if (mScrollState == SCROLL_WAITING_IN_ZONE) { - mScrollState = SCROLL_OUTSIDE_ZONE; - mScrollRunnable.setDirection(SCROLL_RIGHT); - mDragScroller.onExitScrollArea(); - mLauncher.getDragLayer().onExitScrollArea(); - } - } - private void handleMoveEvent(int x, int y) { mDragObject.dragView.move(x, y); @@ -531,7 +485,6 @@ public class DragController implements DragDriver.EventListener, TouchController mDistanceSinceScroll += Math.hypot(mLastTouch[0] - x, mLastTouch[1] - y); mLastTouch[0] = x; mLastTouch[1] = y; - checkScrollState(x, y); if (mIsInPreDrag && mOptions.preDragCondition != null && mOptions.preDragCondition.shouldStartDrag(mDistanceSinceScroll)) { @@ -568,36 +521,6 @@ public class DragController implements DragDriver.EventListener, TouchController mLastDropTarget = dropTarget; } - @Thunk void checkScrollState(int x, int y) { - final int slop = ViewConfiguration.get(mLauncher).getScaledWindowTouchSlop(); - final int delay = mDistanceSinceScroll < slop ? RESCROLL_DELAY : SCROLL_DELAY; - final DragLayer dragLayer = mLauncher.getDragLayer(); - final int forwardDirection = mIsRtl ? SCROLL_RIGHT : SCROLL_LEFT; - final int backwardsDirection = mIsRtl ? SCROLL_LEFT : SCROLL_RIGHT; - - if (x < mScrollZone) { - if (mScrollState == SCROLL_OUTSIDE_ZONE) { - mScrollState = SCROLL_WAITING_IN_ZONE; - if (mDragScroller.onEnterScrollArea(x, y, forwardDirection)) { - dragLayer.onEnterScrollArea(); - mScrollRunnable.setDirection(forwardDirection); - mHandler.postDelayed(mScrollRunnable, delay); - } - } - } else if (x > mScrollView.getWidth() - mScrollZone) { - if (mScrollState == SCROLL_OUTSIDE_ZONE) { - mScrollState = SCROLL_WAITING_IN_ZONE; - if (mDragScroller.onEnterScrollArea(x, y, backwardsDirection)) { - dragLayer.onEnterScrollArea(); - mScrollRunnable.setDirection(backwardsDirection); - mHandler.postDelayed(mScrollRunnable, delay); - } - } - } else { - clearScrollRunnable(); - } - } - /** * Call this from a drag source view. */ @@ -619,17 +542,6 @@ public class DragController implements DragDriver.EventListener, TouchController // Remember where the motion event started mMotionDownX = dragLayerX; mMotionDownY = dragLayerY; - - if ((dragLayerX < mScrollZone) || (dragLayerX > mScrollView.getWidth() - mScrollZone)) { - mScrollState = SCROLL_WAITING_IN_ZONE; - mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY); - } else { - mScrollState = SCROLL_OUTSIDE_ZONE; - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - mHandler.removeCallbacks(mScrollRunnable); break; } @@ -729,10 +641,6 @@ public class DragController implements DragDriver.EventListener, TouchController return null; } - public void setDragScroller(DragScroller scroller) { - mDragScroller = scroller; - } - public void setWindowToken(IBinder token) { mWindowToken = token; } @@ -765,40 +673,4 @@ public class DragController implements DragDriver.EventListener, TouchController mDropTargets.remove(target); } - /** - * Set which view scrolls for touch events near the edge of the screen. - */ - public void setScrollView(View v) { - mScrollView = v; - } - - private class ScrollRunnable implements Runnable { - private int mDirection; - - ScrollRunnable() { - } - - public void run() { - if (mDragScroller != null) { - if (mDirection == SCROLL_LEFT) { - mDragScroller.scrollLeft(); - } else { - mDragScroller.scrollRight(); - } - mScrollState = SCROLL_OUTSIDE_ZONE; - mDistanceSinceScroll = 0; - mDragScroller.onExitScrollArea(); - mLauncher.getDragLayer().onExitScrollArea(); - - if (isDragging()) { - // Check the scroll again so that we can requeue the scroller if necessary - checkScrollState(mLastTouch[0], mLastTouch[1]); - } - } - } - - void setDirection(int direction) { - mDirection = direction; - } - } } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 9de44526d6..d656c8446a 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -33,7 +33,6 @@ import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; -import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.view.DragEvent; @@ -117,13 +116,6 @@ public class DragLayer extends InsettableFrameLayout { private final Rect mScrollChildPosition = new Rect(); private final ViewGroupFocusHelper mFocusIndicatorHelper; - private boolean mInScrollArea; - private boolean mShowPageHints; - private Drawable mLeftHoverDrawable; - private Drawable mRightHoverDrawable; - private Drawable mLeftHoverDrawableActive; - private Drawable mRightHoverDrawableActive; - // Related to pinch-to-go-to-overview gesture. private PinchToOverviewListener mPinchListener = null; @@ -144,14 +136,7 @@ public class DragLayer extends InsettableFrameLayout { setMotionEventSplittingEnabled(false); setChildrenDrawingOrderEnabled(true); - final Resources res = getResources(); - if (FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) { - mLeftHoverDrawable = res.getDrawable(R.drawable.page_hover_left); - mRightHoverDrawable = res.getDrawable(R.drawable.page_hover_right); - mLeftHoverDrawableActive = res.getDrawable(R.drawable.page_hover_left_active); - mRightHoverDrawableActive = res.getDrawable(R.drawable.page_hover_right_active); - } - mIsRtl = Utilities.isRtl(res); + mIsRtl = Utilities.isRtl(getResources()); mFocusIndicatorHelper = new ViewGroupFocusHelper(this); } @@ -911,29 +896,6 @@ public class DragLayer extends InsettableFrameLayout { } } - void onEnterScrollArea() { - mInScrollArea = true; - invalidate(); - } - - void onExitScrollArea() { - mInScrollArea = false; - invalidate(); - } - - public void showPageHints() { - mShowPageHints = true; - Workspace workspace = mLauncher.getWorkspace(); - getDescendantRectRelativeToSelf(workspace.getChildAt(workspace.numCustomPages()), - mScrollChildPosition); - invalidate(); - } - - public void hidePageHints() { - mShowPageHints = false; - invalidate(); - } - public void invalidateScrim() { if (mBackgroundAlpha > 0.0f) { invalidate(); @@ -963,41 +925,6 @@ public class DragLayer extends InsettableFrameLayout { super.dispatchDraw(canvas); } - private void drawPageHints(Canvas canvas) { - if (mShowPageHints) { - Workspace workspace = mLauncher.getWorkspace(); - int width = getMeasuredWidth(); - int page = workspace.getNextPage(); - CellLayout leftPage = (CellLayout) workspace.getChildAt(mIsRtl ? page + 1 : page - 1); - CellLayout rightPage = (CellLayout) workspace.getChildAt(mIsRtl ? page - 1 : page + 1); - - if (leftPage != null && leftPage.isDragTarget()) { - Drawable left = mInScrollArea && leftPage.getIsDragOverlapping() ? - mLeftHoverDrawableActive : mLeftHoverDrawable; - left.setBounds(0, mScrollChildPosition.top, - left.getIntrinsicWidth(), mScrollChildPosition.bottom); - left.draw(canvas); - } - if (rightPage != null && rightPage.isDragTarget()) { - Drawable right = mInScrollArea && rightPage.getIsDragOverlapping() ? - mRightHoverDrawableActive : mRightHoverDrawable; - right.setBounds(width - right.getIntrinsicWidth(), - mScrollChildPosition.top, width, mScrollChildPosition.bottom); - right.draw(canvas); - } - } - } - - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - boolean ret = super.drawChild(canvas, child, drawingTime); - - // We want to draw the page hints above the workspace, but below the drag view. - if (child instanceof Workspace) { - drawPageHints(canvas); - } - return ret; - } - public void setBackgroundAlpha(float alpha) { if (alpha != mBackgroundAlpha) { mBackgroundAlpha = alpha; diff --git a/src/com/android/launcher3/dragndrop/DragScroller.java b/src/com/android/launcher3/dragndrop/DragScroller.java deleted file mode 100644 index 165d0b11c5..0000000000 --- a/src/com/android/launcher3/dragndrop/DragScroller.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008 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.launcher3.dragndrop; - -/** - * Handles scrolling while dragging - * - */ -public interface DragScroller { - void scrollLeft(); - void scrollRight(); - - /** - * The touch point has entered the scroll area; a scroll is imminent. - * This event will only occur while a drag is active. - * - * @param direction The scroll direction - */ - boolean onEnterScrollArea(int x, int y, int direction); - - /** - * The touch point has left the scroll area. - * NOTE: This may not be called, if a drop occurs inside the scroll area. - */ - boolean onExitScrollArea(); -} diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 315f5118e1..7018811d56 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -43,7 +43,6 @@ import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import com.android.launcher3.AbstractFloatingView; @@ -63,6 +62,7 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LogDecelerateInterpolator; import com.android.launcher3.OnAlarmListener; +import com.android.launcher3.PagedView; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.UninstallDropTarget.DropTargetSource; @@ -108,7 +108,12 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC /** * Time for which the scroll hint is shown before automatically changing page. */ - public static final int SCROLL_HINT_DURATION = DragController.SCROLL_DELAY; + public static final int SCROLL_HINT_DURATION = 500; + public static final int RESCROLL_DELAY = PagedView.PAGE_SNAP_ANIMATION_DURATION + 150; + + public static final int SCROLL_NONE = -1; + public static final int SCROLL_LEFT = 0; + public static final int SCROLL_RIGHT = 1; /** * Fraction of icon width which behave as scroll region. @@ -135,8 +140,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC private final int mMaterialExpandDuration; private final int mMaterialExpandStagger; - private final InputMethodManager mInputMethodManager; - protected final Launcher mLauncher; protected DragController mDragController; public FolderInfo mInfo; @@ -184,8 +187,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC // Folder scrolling private int mScrollAreaOffset; - @Thunk int mScrollHintDir = DragController.SCROLL_NONE; - @Thunk int mCurrentScrollDir = DragController.SCROLL_NONE; + @Thunk int mScrollHintDir = SCROLL_NONE; + @Thunk int mCurrentScrollDir = SCROLL_NONE; /** * Used to inflate the Workspace from XML. @@ -196,9 +199,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC public Folder(Context context, AttributeSet attrs) { super(context, attrs); setAlwaysDrawnWithCacheEnabled(false); - mInputMethodManager = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - Resources res = getResources(); mExpandDuration = res.getInteger(R.integer.config_folderExpandDuration); mMaterialExpandDuration = res.getInteger(R.integer.config_materialFolderExpandDuration); @@ -833,15 +833,15 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC boolean isOutsideRightEdge = x > (getWidth() - cellOverlap); if (currentPage > 0 && (mContent.mIsRtl ? isOutsideRightEdge : isOutsideLeftEdge)) { - showScrollHint(DragController.SCROLL_LEFT, d); + showScrollHint(SCROLL_LEFT, d); } else if (currentPage < (mContent.getPageCount() - 1) && (mContent.mIsRtl ? isOutsideLeftEdge : isOutsideRightEdge)) { - showScrollHint(DragController.SCROLL_RIGHT, d); + showScrollHint(SCROLL_RIGHT, d); } else { mOnScrollHintAlarm.cancelAlarm(); - if (mScrollHintDir != DragController.SCROLL_NONE) { + if (mScrollHintDir != SCROLL_NONE) { mContent.clearScrollHint(); - mScrollHintDir = DragController.SCROLL_NONE; + mScrollHintDir = SCROLL_NONE; } } } @@ -899,9 +899,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mOnScrollHintAlarm.cancelAlarm(); mScrollPauseAlarm.cancelAlarm(); - if (mScrollHintDir != DragController.SCROLL_NONE) { + if (mScrollHintDir != SCROLL_NONE) { mContent.clearScrollHint(); - mScrollHintDir = DragController.SCROLL_NONE; + mScrollHintDir = SCROLL_NONE; } } @@ -1008,7 +1008,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC @Override public boolean supportsAppInfoDropTarget() { - return !FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND; + return true; } @Override @@ -1464,21 +1464,21 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC */ @Override public void onAlarm(Alarm alarm) { - if (mCurrentScrollDir == DragController.SCROLL_LEFT) { + if (mCurrentScrollDir == SCROLL_LEFT) { mContent.scrollLeft(); - mScrollHintDir = DragController.SCROLL_NONE; - } else if (mCurrentScrollDir == DragController.SCROLL_RIGHT) { + mScrollHintDir = SCROLL_NONE; + } else if (mCurrentScrollDir == SCROLL_RIGHT) { mContent.scrollRight(); - mScrollHintDir = DragController.SCROLL_NONE; + mScrollHintDir = SCROLL_NONE; } else { // This should not happen return; } - mCurrentScrollDir = DragController.SCROLL_NONE; + mCurrentScrollDir = SCROLL_NONE; // Pause drag event until the scrolling is finished mScrollPauseAlarm.setOnAlarmListener(new OnScrollFinishedListener(mDragObject)); - mScrollPauseAlarm.setAlarm(DragController.RESCROLL_DELAY); + mScrollPauseAlarm.setAlarm(RESCROLL_DELAY); } } diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 8aaeb9e376..650ca19314 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -486,7 +486,7 @@ public class FolderPagedView extends PagedView { * Scrolls the current view by a fraction */ public void showScrollHint(int direction) { - float fraction = (direction == DragController.SCROLL_LEFT) ^ mIsRtl + float fraction = (direction == Folder.SCROLL_LEFT) ^ mIsRtl ? -SCROLL_HINT_FRACTION : SCROLL_HINT_FRACTION; int hint = (int) (fraction * getWidth()); int scroll = getScrollForPage(getNextPage()) + hint; diff --git a/src_config/com/android/launcher3/config/FeatureFlags.java b/src_config/com/android/launcher3/config/FeatureFlags.java index 8ee549753a..99d2654a49 100644 --- a/src_config/com/android/launcher3/config/FeatureFlags.java +++ b/src_config/com/android/launcher3/config/FeatureFlags.java @@ -24,8 +24,6 @@ public final class FeatureFlags { // Custom flags go below this public static boolean LAUNCHER3_DISABLE_ICON_NORMALIZATION = false; - // As opposed to the new spring-loaded workspace. - public static boolean LAUNCHER3_LEGACY_WORKSPACE_DND = false; public static boolean LAUNCHER3_LEGACY_FOLDER_ICON = false; public static boolean LAUNCHER3_USE_SYSTEM_DRAG_DRIVER = true; public static boolean LAUNCHER3_DISABLE_PINCH_TO_OVERVIEW = false; From fa94c79ca62cb1b7257d6ed4cc8684bb38a20a1f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 Nov 2016 23:49:52 +0530 Subject: [PATCH 154/382] Consolidating a few log util methods LoggerUtils had a lot of methods with same name and similar arguments but completely different behavior. Instead only defining macros in LoggerUtils and movoing the action logic in the UserEventDispatcher. Change-Id: Ibce8ea1a0890499b47c950930accb9b28473f44c --- .../launcher3/logging/LoggerUtils.java | 134 ++++++------------ .../logging/UserEventDispatcher.java | 64 ++++----- 2 files changed, 71 insertions(+), 127 deletions(-) diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 395daa5f09..f1a12ff22e 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -10,6 +10,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.UninstallDropTarget; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; /** @@ -153,88 +154,14 @@ public class LoggerUtils { return str + " id=" + t.pageIndex; } - /** - * Used for launching an event by tapping on an icon. - */ - public static LauncherLogProto.LauncherEvent initLauncherEvent( - int actionType, - View v, - int parentTargetType){ - LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); - - event.srcTarget = new LauncherLogProto.Target[2]; - event.srcTarget[0] = initTarget(v); - event.srcTarget[1] = new LauncherLogProto.Target(); - event.srcTarget[1].type = parentTargetType; - - event.action = new LauncherLogProto.Action(); - event.action.type = actionType; - return event; + public static Target newItemTarget(View v) { + return (v.getTag() instanceof ItemInfo) + ? newItemTarget((ItemInfo) v.getTag()) + : newTarget(Target.ITEM); } - /** - * Used for clicking on controls and buttons. - */ - public static LauncherLogProto.LauncherEvent initLauncherEvent( - int actionType, - int childTargetType){ - LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); - - event.srcTarget = new LauncherLogProto.Target[1]; - event.srcTarget[0] = new LauncherLogProto.Target(); - event.srcTarget[0].type = childTargetType; - - event.action = new LauncherLogProto.Action(); - event.action.type = actionType; - return event; - } - - /** - * Used for commands. - */ - public static LauncherLogProto.LauncherEvent initLauncherEvent(int command, - boolean createSrcTarget) { - LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); - event.action = new LauncherLogProto.Action(); - event.action.type = Action.COMMAND; - event.action.command = command; - event.srcTarget = null; - - if (createSrcTarget) { - event.srcTarget = new LauncherLogProto.Target[1]; - event.srcTarget[0] = new LauncherLogProto.Target(); - event.srcTarget[0].type = Target.CONTAINER; - } - return event; - } - - /** - * Used for drag and drop interaction. - */ - public static LauncherLogProto.LauncherEvent initLauncherEvent( - int actionType, - ItemInfo info, - int parentSrcTargetType, - View parentDestTargetType){ - LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); - - event.srcTarget = new LauncherLogProto.Target[2]; - event.srcTarget[0] = initTarget(info); - event.srcTarget[1] = new LauncherLogProto.Target(); - event.srcTarget[1].type = parentSrcTargetType; - - event.destTarget = new LauncherLogProto.Target[2]; - event.destTarget[0] = initTarget(info); - event.destTarget[1] = initDropTarget(parentDestTargetType); - - event.action = new LauncherLogProto.Action(); - event.action.type = actionType; - return event; - } - - private static Target initTarget(ItemInfo info) { - Target t = new LauncherLogProto.Target(); - t.type = Target.ITEM; + public static Target newItemTarget(ItemInfo info) { + Target t = newTarget(Target.ITEM); switch (info.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: t.itemType = LauncherLogProto.APP_ICON; @@ -255,13 +182,11 @@ public class LoggerUtils { return t; } - private static Target initDropTarget(View v) { - Target t = new LauncherLogProto.Target(); - t.type = (v instanceof ButtonDropTarget)? Target.CONTROL : Target.CONTAINER; - if (t.type == Target.CONTAINER) { - return t; + public static Target newDropTarget(View v) { + if (!(v instanceof ButtonDropTarget)) { + return newTarget(Target.CONTAINER); } - + Target t = newTarget(Target.CONTROL); if (v instanceof InfoDropTarget) { t.controlType = LauncherLogProto.APPINFO_TARGET; } else if (v instanceof UninstallDropTarget) { @@ -272,12 +197,37 @@ public class LoggerUtils { return t; } - private static Target initTarget(View v) { + public static Target newTarget(int targetType) { Target t = new LauncherLogProto.Target(); - t.type = Target.ITEM; - if (!(v.getTag() instanceof ItemInfo)) { - return t; - } - return initTarget((ItemInfo) v.getTag()); + t.type = targetType; + return t; + } + public static Target newContainerTarget(int containerType) { + Target t = newTarget(Target.CONTAINER); + t.containerType = containerType; + return t; + } + + public static Action newAction(int type) { + Action a = new Action(); + a.type = type; + return a; + } + public static Action newCommandAction(int command) { + Action a = newAction(Action.COMMAND); + a.command = command; + return a; + } + public static Action newTouchAction(int touch) { + Action a = newAction(Action.TOUCH); + a.touch = touch; + return a; + } + + public static LauncherEvent newLauncherEvent(Action action, Target... srcTargets) { + LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); + event.srcTarget = srcTargets; + event.action = action; + return event; } } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 2fcdd3970d..4bc5819387 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -36,6 +36,14 @@ import com.android.launcher3.util.ComponentKey; import java.util.List; import java.util.Locale; +import static com.android.launcher3.logging.LoggerUtils.newCommandAction; +import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; +import static com.android.launcher3.logging.LoggerUtils.newDropTarget; +import static com.android.launcher3.logging.LoggerUtils.newItemTarget; +import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent; +import static com.android.launcher3.logging.LoggerUtils.newTarget; +import static com.android.launcher3.logging.LoggerUtils.newTouchAction; + /** * Manages the creation of {@link LauncherEvent}. * To debug this class, execute following command before side loading a new apk. @@ -113,9 +121,8 @@ public class UserEventDispatcher { // -------------------------------------------------------------- protected LauncherEvent createLauncherEvent(View v, Intent intent) { - LauncherEvent event = LoggerUtils.initLauncherEvent( - Action.TOUCH, v, Target.CONTAINER); - event.action.touch = Action.TAP; + LauncherEvent event = newLauncherEvent(newTouchAction(Action.TAP), + newItemTarget(v), newTarget(Target.CONTAINER)); // TODO: make idx percolate up the view hierarchy if needed. int idx = 0; @@ -159,8 +166,8 @@ public class UserEventDispatcher { } public void logActionCommand(int command, int containerType, int pageIndex) { - LauncherEvent event = LoggerUtils.initLauncherEvent(command, true); - event.srcTarget[0].containerType = containerType; + LauncherEvent event = newLauncherEvent( + newCommandAction(command), newContainerTarget(containerType)); event.srcTarget[0].pageIndex = pageIndex; dispatchUserEvent(event, null); } @@ -169,9 +176,9 @@ public class UserEventDispatcher { * TODO: Make this function work when a container view is passed as the 2nd param. */ public void logActionCommand(int command, View itemView, int containerType) { - LauncherEvent event = LoggerUtils.initLauncherEvent(Action.COMMAND, itemView, - Target.CONTAINER); - event.action.command = command; + LauncherEvent event = newLauncherEvent( + newCommandAction(command), newItemTarget(itemView), newTarget(Target.CONTAINER)); + if (fillInLogContainerData(event, itemView)) { // TODO: Remove the following two lines once fillInLogContainerData can take in a // container view. @@ -182,8 +189,7 @@ public class UserEventDispatcher { } public void logActionOnControl(int action, int controlType) { - LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTROL); - event.action.touch = action; + LauncherEvent event = newLauncherEvent(newTouchAction(action), newTarget(Target.CONTROL)); event.srcTarget[0].controlType = controlType; dispatchUserEvent(event, null); } @@ -193,24 +199,22 @@ public class UserEventDispatcher { } public void logActionOnContainer(int action, int dir, int containerType, int pageIndex) { - LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTAINER); - event.action.touch = action; + LauncherEvent event = newLauncherEvent(newTouchAction(action), + newContainerTarget(containerType)); event.action.dir = dir; - event.srcTarget[0].containerType = containerType; event.srcTarget[0].pageIndex = pageIndex; dispatchUserEvent(event, null); } public void logDeepShortcutsOpen(View icon) { - LauncherEvent event = LoggerUtils.initLauncherEvent( - Action.TOUCH, icon, Target.CONTAINER); LogContainerProvider provider = getLaunchProviderRecursive(icon); if (icon == null && !(icon.getTag() instanceof ItemInfo)) { return; } ItemInfo info = (ItemInfo) icon.getTag(); + LauncherEvent event = newLauncherEvent( + newTouchAction(Action.LONGPRESS), newItemTarget(info), newTarget(Target.CONTAINER)); provider.fillInLogContainerData(icon, info, event.srcTarget[0], event.srcTarget[1]); - event.action.touch = Action.LONGPRESS; dispatchUserEvent(event, null); resetElapsedContainerMillis(); @@ -223,28 +227,18 @@ public class UserEventDispatcher { /* Currently we are only interested in whether this event happens or not and don't * care about which screen moves to where. */ public void logOverviewReorder() { - LauncherEvent event = new LauncherLogProto.LauncherEvent(); - - event.srcTarget = new LauncherLogProto.Target[2]; - event.srcTarget[0] = new LauncherLogProto.Target(); - event.srcTarget[0].type = Target.CONTAINER; - event.srcTarget[0].containerType = LauncherLogProto.WORKSPACE; - event.srcTarget[1] = new LauncherLogProto.Target(); - event.srcTarget[1].type = Target.CONTAINER; - event.srcTarget[1].containerType = LauncherLogProto.OVERVIEW; - - event.action = new LauncherLogProto.Action(); - event.action.type = Action.TOUCH; - event.action.touch = Action.DRAGDROP; + LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP), + newContainerTarget(LauncherLogProto.WORKSPACE), + newContainerTarget(LauncherLogProto.OVERVIEW)); dispatchUserEvent(event, null); - } + public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { - LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, - dragObj.originalDragInfo, - Target.CONTAINER, - dropTargetAsView); - event.action.touch = Action.DRAGDROP; + LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP), + newItemTarget(dragObj.originalDragInfo), newTarget(Target.CONTAINER)); + event.destTarget = new LauncherLogProto.Target[] { + newItemTarget(dragObj.originalDragInfo), newDropTarget(dropTargetAsView) + }; dragObj.dragSource.fillInLogContainerData(null, dragObj.originalDragInfo, event.srcTarget[0], event.srcTarget[1]); From 6c46a6d324310bd2fc0ea223c9782ba6394512e7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 23 Nov 2016 02:24:32 +0530 Subject: [PATCH 155/382] Using java_style enum generation for proto This makes it easier to track various method parameters and simplifies debug logging Change-Id: Ib7c3d52590d0c36b2c8460c889ee3bead3454569 --- Android.mk | 3 + build.gradle | 1 + proguard.flags | 3 + src/com/android/launcher3/Hotseat.java | 4 +- src/com/android/launcher3/Launcher.java | 54 ++--- .../OverviewButtonClickListener.java | 8 +- .../launcher3/PinchAnimationManager.java | 11 +- src/com/android/launcher3/Workspace.java | 18 +- .../allapps/AllAppsRecyclerView.java | 8 +- .../allapps/AllAppsTransitionController.java | 14 +- src/com/android/launcher3/folder/Folder.java | 4 +- .../launcher3/logging/LoggerUtils.java | 184 ++++++------------ .../logging/UserEventDispatcher.java | 80 ++++---- .../shortcuts/DeepShortcutsContainer.java | 7 +- .../widget/WidgetsContainerView.java | 3 +- .../launcher3/config/ProviderConfig.java | 2 +- 16 files changed, 174 insertions(+), 230 deletions(-) diff --git a/Android.mk b/Android.mk index 28beff24bd..713d0828ad 100644 --- a/Android.mk +++ b/Android.mk @@ -41,6 +41,8 @@ LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PROTOC_OPTIMIZE_TYPE := nano LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/ +LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java + LOCAL_AAPT_FLAGS := \ --auto-add-overlay \ --extra-packages android.support.v7.recyclerview \ @@ -66,6 +68,7 @@ LOCAL_SRC_FILES := $(call all-proto-files-under, protos) LOCAL_PROTOC_OPTIMIZE_TYPE := nano LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/ +LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java LOCAL_MODULE_TAGS := optional LOCAL_MODULE := launcher_proto_lib diff --git a/build.gradle b/build.gradle index 4629caae38..982ae2ee41 100644 --- a/build.gradle +++ b/build.gradle @@ -85,6 +85,7 @@ protobuf { remove java javanano { option "java_package=launcher_log.proto|com.android.launcher3.userevent.nano" + option "enum_style=java" } } } diff --git a/proguard.flags b/proguard.flags index f1a3eaf2f3..6cbab08e2c 100644 --- a/proguard.flags +++ b/proguard.flags @@ -91,3 +91,6 @@ #} -keep class android.support.v7.widget.RecyclerView { *; } +-keep interface com.android.launcher3.userevent.nano.LauncherLogProto.** { + *; +} diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 3648fb7938..4a8a27278a 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -38,7 +38,7 @@ import android.widget.TextView; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dynamicui.ExtractedColors; import com.android.launcher3.logging.UserEventDispatcher; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; public class Hotseat extends FrameLayout @@ -175,7 +175,7 @@ public class Hotseat extends FrameLayout public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; - targetParent.containerType = LauncherLogProto.HOTSEAT; + targetParent.containerType = ContainerType.HOTSEAT; } public void updateColor(ExtractedColors extractedColors, boolean animate) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8bb4a5b8f6..75534b2f53 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -111,7 +111,9 @@ import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.shortcuts.ShortcutKey; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.util.ActivityResultInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.ItemInfoMatcher; @@ -1350,7 +1352,7 @@ public class Launcher extends Activity // Bind wallpaper button actions View wallpaperButton = findViewById(R.id.wallpaper_button); - new OverviewButtonClickListener(LauncherLogProto.WALLPAPER_BUTTON) { + new OverviewButtonClickListener(ControlType.WALLPAPER_BUTTON) { @Override public void handleViewClick(View view) { onClickWallpaperPicker(view); @@ -1360,7 +1362,7 @@ public class Launcher extends Activity // Bind widget button actions mWidgetsButton = findViewById(R.id.widget_button); - new OverviewButtonClickListener(LauncherLogProto.WIDGETS_BUTTON) { + new OverviewButtonClickListener(ControlType.WIDGETS_BUTTON) { @Override public void handleViewClick(View view) { onClickAddWidgetButton(view); @@ -1372,7 +1374,7 @@ public class Launcher extends Activity View settingsButton = findViewById(R.id.settings_button); boolean hasSettings = hasSettings(); if (hasSettings) { - new OverviewButtonClickListener(LauncherLogProto.SETTINGS_BUTTON) { + new OverviewButtonClickListener(ControlType.SETTINGS_BUTTON) { @Override public void handleViewClick(View view) { onClickSettingsButton(view); @@ -1694,13 +1696,13 @@ public class Launcher extends Activity AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(this); if (topOpenView instanceof DeepShortcutsContainer) { - ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, - topOpenView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS); + ued.logActionCommand(Action.Command.HOME_INTENT, + topOpenView.getExtendedTouchView(), ContainerType.DEEPSHORTCUTS); } else if (topOpenView instanceof Folder) { - ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, - ((Folder) topOpenView).getFolderIcon(), LauncherLogProto.FOLDER); + ued.logActionCommand(Action.Command.HOME_INTENT, + ((Folder) topOpenView).getFolderIcon(), ContainerType.FOLDER); } else if (alreadyOnHome) { - ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT, + ued.logActionCommand(Action.Command.HOME_INTENT, mWorkspace.getState().containerType, mWorkspace.getCurrentPage()); } @@ -2216,22 +2218,22 @@ public class Launcher extends Activity topView.getActiveTextView().dispatchBackKey(); } else { if (topView instanceof DeepShortcutsContainer) { - ued.logActionCommand(LauncherLogProto.Action.BACK, - topView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS); + ued.logActionCommand(Action.Command.BACK, + topView.getExtendedTouchView(), ContainerType.DEEPSHORTCUTS); } else if (topView instanceof Folder) { - ued.logActionCommand(LauncherLogProto.Action.BACK, - ((Folder) topView).getFolderIcon(), LauncherLogProto.FOLDER); + ued.logActionCommand(Action.Command.BACK, + ((Folder) topView).getFolderIcon(), ContainerType.FOLDER); } topView.close(true); } } else if (isAppsViewVisible()) { - ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.ALLAPPS); + ued.logActionCommand(Action.Command.BACK, ContainerType.ALLAPPS); showWorkspace(true); } else if (isWidgetsViewVisible()) { - ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.WIDGETS); + ued.logActionCommand(Action.Command.BACK, ContainerType.WIDGETS); showOverviewMode(true); } else if (mWorkspace.isInOverviewMode()) { - ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.OVERVIEW); + ued.logActionCommand(Action.Command.BACK, ContainerType.OVERVIEW); showWorkspace(true); } else { // TODO: Log this case. @@ -2365,8 +2367,8 @@ public class Launcher extends Activity protected void onClickAllAppsButton(View v) { if (LOGD) Log.d(TAG, "onClickAllAppsButton"); if (!isAppsViewVisible()) { - getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.TAP, - LauncherLogProto.ALL_APPS_BUTTON); + getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, + ControlType.ALL_APPS_BUTTON); showAppsView(true /* animated */, true /* updatePredictedApps */, false /* focusSearchBar */); } @@ -2375,8 +2377,8 @@ public class Launcher extends Activity protected void onLongClickAllAppsButton(View v) { if (LOGD) Log.d(TAG, "onLongClickAllAppsButton"); if (!isAppsViewVisible()) { - getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.LONGPRESS, - LauncherLogProto.ALL_APPS_BUTTON); + getUserEventDispatcher().logActionOnControl(Action.Touch.LONGPRESS, + ControlType.ALL_APPS_BUTTON); showAppsView(true /* animated */, true /* updatePredictedApps */, true /* focusSearchBar */); } @@ -2759,8 +2761,8 @@ public class Launcher extends Activity if (v instanceof Workspace) { if (!mWorkspace.isInOverviewMode()) { if (!mWorkspace.isTouchActive() && !ignoreLongPressToOverview) { - getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, - LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE, + getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS, + Action.Direction.NONE, ContainerType.WORKSPACE, mWorkspace.getCurrentPage()); showOverviewMode(true); mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, @@ -2790,14 +2792,14 @@ public class Launcher extends Activity // User long pressed on empty space if (mWorkspace.isInOverviewMode()) { mWorkspace.startReordering(v); - getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, - LauncherLogProto.Action.NONE, LauncherLogProto.OVERVIEW); + getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS, + Action.Direction.NONE, ContainerType.OVERVIEW); } else { if (ignoreLongPressToOverview) { return false; } - getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS, - LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE, + getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS, + Action.Direction.NONE, ContainerType.WORKSPACE, mWorkspace.getCurrentPage()); showOverviewMode(true); } diff --git a/src/com/android/launcher3/OverviewButtonClickListener.java b/src/com/android/launcher3/OverviewButtonClickListener.java index c98f1d7bc6..dd670d2a7b 100644 --- a/src/com/android/launcher3/OverviewButtonClickListener.java +++ b/src/com/android/launcher3/OverviewButtonClickListener.java @@ -2,7 +2,7 @@ package com.android.launcher3; import android.view.View; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; /** * A specialized listener for Overview buttons where both clicks and long clicks are logged @@ -11,7 +11,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto; public abstract class OverviewButtonClickListener implements View.OnClickListener, View.OnLongClickListener { - private int mControlType; /** ControlType enum as defined in {@link LauncherLogProto} */ + private int mControlType; /** ControlType enum as defined in {@link Action.Touch} */ public OverviewButtonClickListener(int controlType) { mControlType = controlType; @@ -25,14 +25,14 @@ public abstract class OverviewButtonClickListener implements View.OnClickListene @Override public void onClick(View view) { if (shouldPerformClick(view)) { - handleViewClick(view, LauncherLogProto.Action.TAP); + handleViewClick(view, Action.Touch.TAP); } } @Override public boolean onLongClick(View view) { if (shouldPerformClick(view)) { - handleViewClick(view, LauncherLogProto.Action.LONGPRESS); + handleViewClick(view, Action.Touch.LONGPRESS); } return true; } diff --git a/src/com/android/launcher3/PinchAnimationManager.java b/src/com/android/launcher3/PinchAnimationManager.java index 41074bea01..bae246e9e9 100644 --- a/src/com/android/launcher3/PinchAnimationManager.java +++ b/src/com/android/launcher3/PinchAnimationManager.java @@ -24,7 +24,8 @@ import android.util.Log; import android.view.View; import android.view.animation.LinearInterpolator; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import static com.android.launcher3.Workspace.State.NORMAL; import static com.android.launcher3.Workspace.State.OVERVIEW; @@ -164,14 +165,14 @@ public class PinchAnimationManager { // Passing threshold 3 ends the pinch and snaps to the new state. if (startState == OVERVIEW && goingTowards == NORMAL) { mLauncher.getUserEventDispatcher().logActionOnContainer( - LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE, - LauncherLogProto.OVERVIEW, mWorkspace.getCurrentPage()); + Action.Touch.PINCH, Action.Direction.NONE, + ContainerType.OVERVIEW, mWorkspace.getCurrentPage()); mLauncher.showWorkspace(true); mWorkspace.snapToPage(mWorkspace.getCurrentPage()); } else if (startState == NORMAL && goingTowards == OVERVIEW) { mLauncher.getUserEventDispatcher().logActionOnContainer( - LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE, - LauncherLogProto.WORKSPACE, mWorkspace.getCurrentPage()); + Action.Touch.PINCH, Action.Direction.NONE, + ContainerType.WORKSPACE, mWorkspace.getCurrentPage()); mLauncher.showOverviewMode(true); } } else { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 6520a2b6fc..3cfb3e1eb8 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -73,7 +73,7 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.shortcuts.DeepShortcutsContainer; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; @@ -188,11 +188,11 @@ public class Workspace extends PagedView // in all apps or customize mode) public enum State { - NORMAL (false, false, LauncherLogProto.WORKSPACE), - NORMAL_HIDDEN (false, false, LauncherLogProto.ALLAPPS), - SPRING_LOADED (false, true, LauncherLogProto.WORKSPACE), - OVERVIEW (true, true, LauncherLogProto.OVERVIEW), - OVERVIEW_HIDDEN (true, false, LauncherLogProto.WIDGETS); + NORMAL (false, false, ContainerType.WORKSPACE), + NORMAL_HIDDEN (false, false, ContainerType.ALLAPPS), + SPRING_LOADED (false, true, ContainerType.WORKSPACE), + OVERVIEW (true, true, ContainerType.OVERVIEW), + OVERVIEW_HIDDEN (true, false, ContainerType.WIDGETS); public final boolean shouldUpdateWidget; public final boolean hasMultipleVisiblePages; @@ -4155,12 +4155,12 @@ public class Workspace extends PagedView target.gridX = info.cellX; target.gridY = info.cellY; target.pageIndex = getCurrentPage(); - targetParent.containerType = LauncherLogProto.WORKSPACE; + targetParent.containerType = ContainerType.WORKSPACE; if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { target.rank = info.rank; - targetParent.containerType = LauncherLogProto.HOTSEAT; + targetParent.containerType = ContainerType.HOTSEAT; } else if (info.container >= 0) { - targetParent.containerType = LauncherLogProto.FOLDER; + targetParent.containerType = ContainerType.FOLDER; } } diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index ab34287eb9..10d4c1506a 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -29,7 +29,7 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.R; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import java.util.List; @@ -184,7 +184,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView { public int getContainerType(View v) { if (mApps.hasFilter()) { - return LauncherLogProto.SEARCHRESULT; + return ContainerType.SEARCHRESULT; } else { if (v instanceof BubbleTextView) { BubbleTextView icon = (BubbleTextView) v; @@ -193,11 +193,11 @@ public class AllAppsRecyclerView extends BaseRecyclerView { List items = mApps.getAdapterItems(); AlphabeticalAppsList.AdapterItem item = items.get(position); if (item.viewType == AllAppsGridAdapter.VIEW_TYPE_PREDICTION_ICON) { - return LauncherLogProto.PREDICTION; + return ContainerType.PREDICTION; } } } - return LauncherLogProto.ALLAPPS; + return ContainerType.ALLAPPS; } } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 4667806ff8..99cac41934 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -27,6 +27,8 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.TouchController; /** @@ -225,9 +227,9 @@ public class AllAppsTransitionController implements TouchController, VerticalPul if (!mLauncher.isAllAppsVisible()) { mLauncher.getUserEventDispatcher().logActionOnContainer( - LauncherLogProto.Action.FLING, - LauncherLogProto.Action.UP, - LauncherLogProto.HOTSEAT); + Action.Touch.FLING, + Action.Direction.UP, + ContainerType.HOTSEAT); } mLauncher.showAppsView(true /* animated */, false /* updatePredictedApps */, @@ -245,9 +247,9 @@ public class AllAppsTransitionController implements TouchController, VerticalPul calculateDuration(velocity, Math.abs(mAppsView.getTranslationY())); if (!mLauncher.isAllAppsVisible()) { mLauncher.getUserEventDispatcher().logActionOnContainer( - LauncherLogProto.Action.SWIPE, - LauncherLogProto.Action.UP, - LauncherLogProto.HOTSEAT); + Action.Touch.SWIPE, + Action.Direction.UP, + ContainerType.HOTSEAT); } mLauncher.showAppsView(true, /* animated */ false /* updatePredictedApps */, diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 7018811d56..52c6abc21e 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -76,7 +76,7 @@ import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.pageindicators.PageIndicatorDots; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.CircleRevealOutlineProvider; import com.android.launcher3.util.Thunk; @@ -1448,7 +1448,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC target.gridX = info.cellX; target.gridY = info.cellY; target.pageIndex = mContent.getCurrentPage(); - targetParent.containerType = LauncherLogProto.FOLDER; + targetParent.containerType = ContainerType.FOLDER; } private class OnScrollHintListener implements OnAlarmListener { diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index f1a12ff22e..c13e8b3367 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -1,5 +1,7 @@ package com.android.launcher3.logging; +import android.util.ArrayMap; +import android.util.SparseArray; import android.view.View; import com.android.launcher3.ButtonDropTarget; @@ -8,81 +10,73 @@ import com.android.launcher3.InfoDropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.UninstallDropTarget; -import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; +import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + /** - * Debugging helper methods. - * toString() cannot be overriden inside auto generated {@link LauncherLogProto}. - * Note: switch statement cannot be replaced with reflection as proguard strips the constants + * Helper methods for logging. */ public class LoggerUtils { - private static final String TAG = "LoggerUtils"; + private static final ArrayMap> sNameCache = new ArrayMap<>(); + private static final String UNKNOWN = "UNKNOWN"; - private static String getCommandStr(Action action) { - switch (action.command) { - case Action.HOME_INTENT: return "HOME_INTENT"; - case Action.BACK: return "BACK"; - default: return "UNKNOWN"; + private static String getFieldName(int value, Class c) { + SparseArray cache; + synchronized (sNameCache) { + cache = sNameCache.get(c); + if (cache == null) { + cache = new SparseArray<>(); + for (Field f : c.getDeclaredFields()) { + if (f.getType() == int.class && Modifier.isStatic(f.getModifiers())) { + try { + f.setAccessible(true); + cache.put(f.getInt(null), f.getName()); + } catch (IllegalAccessException e) { + // Ignore + } + } + } + sNameCache.put(c, cache); + } } + String result = cache.get(value); + return result != null ? result : UNKNOWN; } - private static String getTouchStr(Action action) { - switch (action.touch) { - case Action.TAP: return "TAP"; - case Action.LONGPRESS: return "LONGPRESS"; - case Action.DRAGDROP: return "DRAGDROP"; - case Action.PINCH: return "PINCH"; - case Action.SWIPE: return "SWIPE"; - case Action.FLING: return "FLING"; - default: return "UNKNOWN"; - } - } - - public static String getActionStr(LauncherLogProto.Action action) { + public static String getActionStr(Action action) { switch (action.type) { - case Action.TOUCH: return getTouchStr(action); - case Action.COMMAND: return getCommandStr(action); - default: return "UNKNOWN"; + case Action.Type.TOUCH: return getFieldName(action.touch, Action.Touch.class); + case Action.Type.COMMAND: return getFieldName(action.command, Action.Command.class); + default: return UNKNOWN; } } public static String getTargetStr(Target t) { - String typeStr = ""; if (t == null){ - return typeStr; + return ""; } switch (t.type) { - case Target.ITEM: + case Target.Type.ITEM: return getItemStr(t); - case Target.CONTROL: - return getControlStr(t); - case Target.CONTAINER: - return getContainerStr(t); + case Target.Type.CONTROL: + return getFieldName(t.controlType, ControlType.class); + case Target.Type.CONTAINER: + return getFieldName(t.containerType, ContainerType.class) + + " id=" + t.pageIndex; default: return "UNKNOWN TARGET TYPE"; } } private static String getItemStr(Target t) { - String typeStr = ""; - if (t == null){ - return typeStr; - } - switch(t.itemType){ - case LauncherLogProto.APP_ICON: typeStr = "APPICON"; break; - case LauncherLogProto.SHORTCUT: typeStr = "SHORTCUT"; break; - case LauncherLogProto.WIDGET: typeStr = "WIDGET"; break; - case LauncherLogProto.DEEPSHORTCUT: typeStr = "DEEPSHORTCUT"; break; - case LauncherLogProto.FOLDER_ICON: typeStr = "FOLDERICON"; break; - case LauncherLogProto.SEARCHBOX: typeStr = "SEARCHBOX"; break; - case LauncherLogProto.EDITTEXT: typeStr = "EDITTEXT"; break; - - default: typeStr = "UNKNOWN"; - } - + String typeStr = getFieldName(t.itemType, ItemType.class); if (t.packageNameHash != 0) { typeStr += ", packageHash=" + t.packageNameHash; } @@ -95,88 +89,32 @@ public class LoggerUtils { if (t.spanX != 0) { typeStr += ", spanX=" + t.spanX; } - return typeStr += ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex; - } - - private static String getControlStr(Target t) { - if (t == null){ - return ""; - } - switch(t.controlType) { - case LauncherLogProto.ALL_APPS_BUTTON: return "ALL_APPS_BUTTON"; - case LauncherLogProto.WIDGETS_BUTTON: return "WIDGETS_BUTTON"; - case LauncherLogProto.WALLPAPER_BUTTON: return "WALLPAPER_BUTTON"; - case LauncherLogProto.SETTINGS_BUTTON: return "SETTINGS_BUTTON"; - case LauncherLogProto.REMOVE_TARGET: return "REMOVE_TARGET"; - case LauncherLogProto.UNINSTALL_TARGET: return "UNINSTALL_TARGET"; - case LauncherLogProto.APPINFO_TARGET: return "APPINFO_TARGET"; - case LauncherLogProto.RESIZE_HANDLE: return "RESIZE_HANDLE"; - default: return "UNKNOWN"; - } - } - - private static String getContainerStr(LauncherLogProto.Target t) { - String str = ""; - if (t == null) { - return str; - } - switch (t.containerType) { - case LauncherLogProto.WORKSPACE: - str = "WORKSPACE"; - break; - case LauncherLogProto.HOTSEAT: - str = "HOTSEAT"; - break; - case LauncherLogProto.FOLDER: - str = "FOLDER"; - break; - case LauncherLogProto.ALLAPPS: - str = "ALLAPPS"; - break; - case LauncherLogProto.WIDGETS: - str = "WIDGETS"; - break; - case LauncherLogProto.OVERVIEW: - str = "OVERVIEW"; - break; - case LauncherLogProto.PREDICTION: - str = "PREDICTION"; - break; - case LauncherLogProto.SEARCHRESULT: - str = "SEARCHRESULT"; - break; - case LauncherLogProto.DEEPSHORTCUTS: - str = "DEEPSHORTCUTS"; - break; - default: - str = "UNKNOWN"; - } - return str + " id=" + t.pageIndex; + return typeStr + ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex; } public static Target newItemTarget(View v) { return (v.getTag() instanceof ItemInfo) ? newItemTarget((ItemInfo) v.getTag()) - : newTarget(Target.ITEM); + : newTarget(Target.Type.ITEM); } public static Target newItemTarget(ItemInfo info) { - Target t = newTarget(Target.ITEM); + Target t = newTarget(Target.Type.ITEM); switch (info.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - t.itemType = LauncherLogProto.APP_ICON; + t.itemType = ItemType.APP_ICON; break; case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - t.itemType = LauncherLogProto.SHORTCUT; + t.itemType = ItemType.SHORTCUT; break; case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - t.itemType = LauncherLogProto.FOLDER_ICON; + t.itemType = ItemType.FOLDER_ICON; break; case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - t.itemType = LauncherLogProto.WIDGET; + t.itemType = ItemType.WIDGET; break; case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - t.itemType = LauncherLogProto.DEEPSHORTCUT; + t.itemType = ItemType.DEEPSHORTCUT; break; } return t; @@ -184,26 +122,26 @@ public class LoggerUtils { public static Target newDropTarget(View v) { if (!(v instanceof ButtonDropTarget)) { - return newTarget(Target.CONTAINER); + return newTarget(Target.Type.CONTAINER); } - Target t = newTarget(Target.CONTROL); + Target t = newTarget(Target.Type.CONTROL); if (v instanceof InfoDropTarget) { - t.controlType = LauncherLogProto.APPINFO_TARGET; + t.controlType = ControlType.APPINFO_TARGET; } else if (v instanceof UninstallDropTarget) { - t.controlType = LauncherLogProto.UNINSTALL_TARGET; + t.controlType = ControlType.UNINSTALL_TARGET; } else if (v instanceof DeleteDropTarget) { - t.controlType = LauncherLogProto.REMOVE_TARGET; + t.controlType = ControlType.REMOVE_TARGET; } return t; } public static Target newTarget(int targetType) { - Target t = new LauncherLogProto.Target(); + Target t = new Target(); t.type = targetType; return t; } public static Target newContainerTarget(int containerType) { - Target t = newTarget(Target.CONTAINER); + Target t = newTarget(Target.Type.CONTAINER); t.containerType = containerType; return t; } @@ -214,18 +152,18 @@ public class LoggerUtils { return a; } public static Action newCommandAction(int command) { - Action a = newAction(Action.COMMAND); + Action a = newAction(Action.Type.COMMAND); a.command = command; return a; } public static Action newTouchAction(int touch) { - Action a = newAction(Action.TOUCH); + Action a = newAction(Action.Type.TOUCH); a.touch = touch; return a; } public static LauncherEvent newLauncherEvent(Action action, Target... srcTargets) { - LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); + LauncherEvent event = new LauncherEvent(); event.srcTarget = srcTargets; event.action = action; return event; diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 4bc5819387..8ded6b8f69 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -27,8 +27,8 @@ import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.Utilities; import com.android.launcher3.config.ProviderConfig; -import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -54,7 +54,9 @@ public class UserEventDispatcher { private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; - private final boolean mIsVerbose; + private static final String TAG = "UserEvent"; + private static final boolean IS_VERBOSE = + ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(TAG); /** * Implemented by containers to provide a container source for a given child. @@ -76,8 +78,7 @@ public class UserEventDispatcher { * Recursively finds the parent of the given child which implements IconLogInfoProvider */ public static LogContainerProvider getLaunchProviderRecursive(View v) { - ViewParent parent = null; - + ViewParent parent; if (v != null) { parent = v.getParent(); } else { @@ -96,8 +97,6 @@ public class UserEventDispatcher { return null; } - private String TAG = "UserEvent"; - private long mElapsedContainerMillis; private long mElapsedSessionMillis; private long mActionDurationMillis; @@ -105,14 +104,6 @@ public class UserEventDispatcher { // Used for filling in predictedRank on {@link Target}s. private List mPredictedApps; - public UserEventDispatcher() { - if (ProviderConfig.IS_DOGFOOD_BUILD) { - mIsVerbose = Utilities.isPropertyEnabled(TAG); - } else { - mIsVerbose = false; - } - } - // APP_ICON SHORTCUT WIDGET // -------------------------------------------------------------- // packageNameHash required optional required @@ -121,8 +112,8 @@ public class UserEventDispatcher { // -------------------------------------------------------------- protected LauncherEvent createLauncherEvent(View v, Intent intent) { - LauncherEvent event = newLauncherEvent(newTouchAction(Action.TAP), - newItemTarget(v), newTarget(Target.CONTAINER)); + LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.TAP), + newItemTarget(v), newTarget(Target.Type.CONTAINER)); // TODO: make idx percolate up the view hierarchy if needed. int idx = 0; @@ -176,20 +167,21 @@ public class UserEventDispatcher { * TODO: Make this function work when a container view is passed as the 2nd param. */ public void logActionCommand(int command, View itemView, int containerType) { - LauncherEvent event = newLauncherEvent( - newCommandAction(command), newItemTarget(itemView), newTarget(Target.CONTAINER)); + LauncherEvent event = newLauncherEvent(newCommandAction(command), + newItemTarget(itemView), newTarget(Target.Type.CONTAINER)); if (fillInLogContainerData(event, itemView)) { // TODO: Remove the following two lines once fillInLogContainerData can take in a // container view. - event.srcTarget[0].type = Target.CONTAINER; + event.srcTarget[0].type = Target.Type.CONTAINER; event.srcTarget[0].containerType = containerType; } dispatchUserEvent(event, null); } public void logActionOnControl(int action, int controlType) { - LauncherEvent event = newLauncherEvent(newTouchAction(action), newTarget(Target.CONTROL)); + LauncherEvent event = newLauncherEvent( + newTouchAction(action), newTarget(Target.Type.CONTROL)); event.srcTarget[0].controlType = controlType; dispatchUserEvent(event, null); } @@ -212,8 +204,8 @@ public class UserEventDispatcher { return; } ItemInfo info = (ItemInfo) icon.getTag(); - LauncherEvent event = newLauncherEvent( - newTouchAction(Action.LONGPRESS), newItemTarget(info), newTarget(Target.CONTAINER)); + LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.LONGPRESS), + newItemTarget(info), newTarget(Target.Type.CONTAINER)); provider.fillInLogContainerData(icon, info, event.srcTarget[0], event.srcTarget[1]); dispatchUserEvent(event, null); @@ -227,16 +219,16 @@ public class UserEventDispatcher { /* Currently we are only interested in whether this event happens or not and don't * care about which screen moves to where. */ public void logOverviewReorder() { - LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP), - newContainerTarget(LauncherLogProto.WORKSPACE), - newContainerTarget(LauncherLogProto.OVERVIEW)); + LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), + newContainerTarget(ContainerType.WORKSPACE), + newContainerTarget(ContainerType.OVERVIEW)); dispatchUserEvent(event, null); } public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { - LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP), - newItemTarget(dragObj.originalDragInfo), newTarget(Target.CONTAINER)); - event.destTarget = new LauncherLogProto.Target[] { + LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), + newItemTarget(dragObj.originalDragInfo), newTarget(Target.Type.CONTAINER)); + event.destTarget = new Target[] { newItemTarget(dragObj.originalDragInfo), newDropTarget(dropTargetAsView) }; @@ -272,26 +264,26 @@ public class UserEventDispatcher { ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; ev.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; - if (!mIsVerbose) { + if (!IS_VERBOSE) { return; } - Log.d(TAG, String.format(Locale.US, - "\naction:%s\n Source child:%s\tparent:%s", - LoggerUtils.getActionStr(ev.action), - LoggerUtils.getTargetStr(ev.srcTarget != null ? ev.srcTarget[0] : null), - LoggerUtils.getTargetStr(ev.srcTarget != null && ev.srcTarget.length > 1 ? - ev.srcTarget[1] : null))); - if (ev.destTarget != null && ev.destTarget.length > 0) { - Log.d(TAG, String.format(Locale.US, - " Destination child:%s\tparent:%s", - LoggerUtils.getTargetStr(ev.destTarget != null ? ev.destTarget[0] : null), - LoggerUtils.getTargetStr(ev.destTarget != null && ev.destTarget.length > 1 ? - ev.destTarget[1] : null))); + String log = "action:" + LoggerUtils.getActionStr(ev.action); + if (ev.srcTarget != null && ev.srcTarget.length > 0) { + log += "\n Source " + getTargetsStr(ev.srcTarget); } - Log.d(TAG, String.format(Locale.US, - " Elapsed container %d ms session %d ms action %d ms", + if (ev.destTarget != null && ev.destTarget.length > 0) { + log += "\n Destination " + getTargetsStr(ev.destTarget); + } + log += String.format(Locale.US, + "\n Elapsed container %d ms session %d ms action %d ms", ev.elapsedContainerMillis, ev.elapsedSessionMillis, - ev.actionDurationMillis)); + ev.actionDurationMillis); + Log.d(TAG, log); + } + + private static String getTargetsStr(Target[] targets) { + return "child:" + LoggerUtils.getTargetStr(targets[0]) + + (targets.length > 1 ? "\tparent:" + LoggerUtils.getTargetStr(targets[1]) : ""); } } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index a2534926f6..9cbd5f8f29 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -66,7 +66,8 @@ import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.graphics.TriangleShape; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import java.util.Collections; @@ -523,9 +524,9 @@ public class DeepShortcutsContainer extends AbstractFloatingView @Override public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { - target.itemType = LauncherLogProto.DEEPSHORTCUT; + target.itemType = ItemType.DEEPSHORTCUT; // TODO: add target.rank - targetParent.containerType = LauncherLogProto.DEEPSHORTCUTS; + targetParent.containerType = ContainerType.DEEPSHORTCUTS; } @Override diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index d0ead487a3..310c1dfb96 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -46,6 +46,7 @@ import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.Thunk; @@ -309,6 +310,6 @@ public class WidgetsContainerView extends BaseContainerView @Override public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { - targetParent.containerType = LauncherLogProto.WIDGETS; + targetParent.containerType = ContainerType.WIDGETS; } } \ No newline at end of file diff --git a/src_config/com/android/launcher3/config/ProviderConfig.java b/src_config/com/android/launcher3/config/ProviderConfig.java index 1d964b1b2c..491fa657a8 100644 --- a/src_config/com/android/launcher3/config/ProviderConfig.java +++ b/src_config/com/android/launcher3/config/ProviderConfig.java @@ -20,5 +20,5 @@ public class ProviderConfig { public static final String AUTHORITY = "com.android.launcher3.settings".intern(); - public static boolean IS_DOGFOOD_BUILD = true; + public static final boolean IS_DOGFOOD_BUILD = true; } From 6f6a06ac470df4f58a6eea902b79a8813c44c8f7 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 15 Dec 2016 11:24:18 -0800 Subject: [PATCH 156/382] Restore original scaleRectAboutCenter method. Change-Id: Ibb49c56aab29d1223a0ab36476a32d565566eb25 --- src/com/android/launcher3/CellLayout.java | 5 ++--- src/com/android/launcher3/Utilities.java | 17 ++++++++++++++++- src/com/android/launcher3/Workspace.java | 5 ++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 2eed264928..11273fab6d 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -1029,8 +1029,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { cellToRect(cellX, cellY, spanX, spanY, r); if (v instanceof LauncherAppWidgetHostView) { DeviceProfile profile = mLauncher.getDeviceProfile(); - Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, - profile.appWidgetScale.y); + Utilities.shrinkRect(r, profile.appWidgetScale.x, profile.appWidgetScale.y); } } else { // Find the top left corner of the rect the object will occupy @@ -1070,7 +1069,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight()); } - Utilities.shrinkRectAboutCenter(r, mChildScale, mChildScale); + Utilities.scaleRectAboutCenter(r, mChildScale); mDragOutlineAnims[mDragOutlineCurrent].setTag(dragOutline); mDragOutlineAnims[mDragOutlineCurrent].animateIn(); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index ce6d5a40fc..3e44e33be6 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -249,7 +249,22 @@ public final class Utilities { return delta; } - public static float shrinkRectAboutCenter(Rect r, float scaleX, float scaleY) { + public static void scaleRectAboutCenter(Rect r, float scale) { + if (scale != 1.0f) { + int cx = r.centerX(); + int cy = r.centerY(); + r.offset(-cx, -cy); + + r.left = (int) (r.left * scale + 0.5f); + r.top = (int) (r.top * scale + 0.5f); + r.right = (int) (r.right * scale + 0.5f); + r.bottom = (int) (r.bottom * scale + 0.5f); + + r.offset(cx, cy); + } + } + + public static float shrinkRect(Rect r, float scaleX, float scaleY) { float scale = Math.min(Math.min(scaleX, scaleY), 1.0f); if (scale < 1.0f) { int deltaX = (int) (r.width() * (scaleX - scale) * 0.5f); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 3ba461a1ac..d019e59c81 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -403,8 +403,7 @@ public class Workspace extends PagedView float scale = 1; if (isWidget) { DeviceProfile profile = mLauncher.getDeviceProfile(); - scale = Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, - profile.appWidgetScale.y); + scale = Utilities.shrinkRect(r, profile.appWidgetScale.x, profile.appWidgetScale.y); } size[0] = r.width(); size[1] = r.height(); @@ -3499,7 +3498,7 @@ public class Workspace extends PagedView Rect r = estimateItemPosition(layout, targetCell[0], targetCell[1], spanX, spanY); if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET) { DeviceProfile profile = mLauncher.getDeviceProfile(); - Utilities.shrinkRectAboutCenter(r, profile.appWidgetScale.x, profile.appWidgetScale.y); + Utilities.shrinkRect(r, profile.appWidgetScale.x, profile.appWidgetScale.y); } loc[0] = r.left; loc[1] = r.top; From 7c74e4ae641e76f73d74348e293c244a157f6585 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 15 Dec 2016 15:53:17 -0800 Subject: [PATCH 157/382] No more UserHandleCompat Bug: 32745285 Change-Id: I762fb4e268c1afe48a1860ab12a4ccb3f626aa95 --- build.gradle | 2 +- src/com/android/launcher3/AllAppsList.java | 16 +-- src/com/android/launcher3/AppInfo.java | 10 +- src/com/android/launcher3/FolderInfo.java | 4 +- src/com/android/launcher3/IconCache.java | 45 ++++---- .../launcher3/InstallShortcutReceiver.java | 19 ++-- src/com/android/launcher3/ItemInfo.java | 7 +- src/com/android/launcher3/Launcher.java | 50 ++------- .../launcher3/LauncherAppWidgetInfo.java | 4 +- src/com/android/launcher3/LauncherModel.java | 69 ++++++------ .../android/launcher3/LauncherProvider.java | 6 +- src/com/android/launcher3/ShortcutInfo.java | 5 +- .../launcher3/UninstallDropTarget.java | 9 +- .../launcher3/WidgetPreviewLoader.java | 10 +- src/com/android/launcher3/Workspace.java | 4 +- .../allapps/AlphabeticalAppsList.java | 10 +- .../launcher3/allapps/AppInfoComparator.java | 7 +- .../compat/AppWidgetManagerCompat.java | 5 +- .../compat/AppWidgetManagerCompatV16.java | 10 +- .../compat/AppWidgetManagerCompatVL.java | 14 +-- .../compat/DeferredLauncherActivityInfo.java | 8 +- .../compat/LauncherActivityInfoCompat.java | 3 +- .../compat/LauncherActivityInfoCompatV16.java | 12 +- .../compat/LauncherActivityInfoCompatVL.java | 5 +- .../launcher3/compat/LauncherAppsCompat.java | 33 +++--- .../compat/LauncherAppsCompatV16.java | 21 ++-- .../compat/LauncherAppsCompatVL.java | 46 ++++---- .../compat/PackageInstallerCompatVL.java | 8 +- .../launcher3/compat/UserHandleCompat.java | 106 ------------------ .../launcher3/compat/UserManagerCompat.java | 15 +-- .../compat/UserManagerCompatV16.java | 23 ++-- .../compat/UserManagerCompatV17.java | 18 +-- .../launcher3/compat/UserManagerCompatVL.java | 27 ++--- .../launcher3/compat/UserManagerCompatVM.java | 5 +- .../launcher3/compat/UserManagerCompatVN.java | 11 +- .../launcher3/graphics/LauncherIcons.java | 11 +- .../model/AddWorkspaceItemsTask.java | 4 +- .../android/launcher3/model/BgDataModel.java | 4 +- .../launcher3/model/CacheDataUpdatedTask.java | 6 +- .../launcher3/model/ExtendedModelTask.java | 9 +- .../launcher3/model/PackageUpdatedTask.java | 6 +- .../model/SdCardAvailableReceiver.java | 11 +- .../launcher3/model/ShortcutsChangedTask.java | 6 +- .../model/UserLockStateChangedTask.java | 6 +- .../android/launcher3/model/WidgetItem.java | 9 +- .../android/launcher3/model/WidgetsModel.java | 5 +- .../launcher3/provider/ImportDataTask.java | 3 +- .../shortcuts/DeepShortcutManager.java | 27 +++-- .../shortcuts/DeepShortcutsContainer.java | 4 +- .../shortcuts/ShortcutInfoCompat.java | 6 +- .../launcher3/shortcuts/ShortcutKey.java | 6 +- .../launcher3/util/CachedPackageTracker.java | 22 ++-- .../android/launcher3/util/ComponentKey.java | 9 +- .../android/launcher3/util/ContentWriter.java | 8 +- .../launcher3/util/ItemInfoMatcher.java | 8 +- .../util/ManagedProfileHeuristic.java | 29 ++--- .../widget/WidgetItemComparator.java | 6 +- .../model/BaseModelUpdateTaskTestCase.java | 13 ++- .../launcher3/ui/AllAppsAppLaunchTest.java | 4 +- .../launcher3/ui/AllAppsIconToHomeTest.java | 4 +- .../launcher3/ui/ShortcutsLaunchTest.java | 4 +- .../launcher3/ui/ShortcutsToHomeTest.java | 4 +- 62 files changed, 376 insertions(+), 505 deletions(-) delete mode 100644 src/com/android/launcher3/compat/UserHandleCompat.java diff --git a/build.gradle b/build.gradle index 982ae2ee41..4d700c5b23 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index bbc865036d..34a44fc052 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -18,10 +18,10 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; +import android.os.UserHandle; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; @@ -95,7 +95,7 @@ public class AllAppsList { /** * Add the icons for the supplied apk called packageName. */ - public void addPackage(Context context, String packageName, UserHandleCompat user) { + public void addPackage(Context context, String packageName, UserHandle user) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final List matches = launcherApps.getActivityList(packageName, user); @@ -108,7 +108,7 @@ public class AllAppsList { /** * Remove the apps for the given apk identified by packageName. */ - public void removePackage(String packageName, UserHandleCompat user) { + public void removePackage(String packageName, UserHandle user) { final List data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); @@ -133,7 +133,7 @@ public class AllAppsList { } } - public void updateIconsAndLabels(HashSet packages, UserHandleCompat user, + public void updateIconsAndLabels(HashSet packages, UserHandle user, ArrayList outUpdates) { for (AppInfo info : data) { if (info.user.equals(user) && packages.contains(info.componentName.getPackageName())) { @@ -146,7 +146,7 @@ public class AllAppsList { /** * Add and remove icons for this package which has been updated. */ - public void updatePackage(Context context, String packageName, UserHandleCompat user) { + public void updatePackage(Context context, String packageName, UserHandle user) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final List matches = launcherApps.getActivityList(packageName, user); @@ -210,7 +210,7 @@ public class AllAppsList { * MAIN/LAUNCHER activities in the supplied package. */ static boolean packageHasActivities(Context context, String packageName, - UserHandleCompat user) { + UserHandle user) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); return launcherApps.getActivityList(packageName, user).size() > 0; } @@ -219,7 +219,7 @@ public class AllAppsList { * Returns whether apps contains component. */ private static boolean findActivity(ArrayList apps, ComponentName component, - UserHandleCompat user) { + UserHandle user) { final int N = apps.size(); for (int i = 0; i < N; i++) { final AppInfo info = apps.get(i); @@ -233,7 +233,7 @@ public class AllAppsList { /** * Find an ApplicationInfo object for the given packageName and className. */ - private AppInfo findApplicationInfoLocked(String packageName, UserHandleCompat user, + private AppInfo findApplicationInfoLocked(String packageName, UserHandle user, String className) { for (AppInfo info: data) { if (user.equals(info.user) && packageName.equals(info.componentName.getPackageName()) diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 23e2882425..f7c51847e8 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -20,10 +20,10 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.os.UserHandle; import android.util.Log; import com.android.launcher3.compat.LauncherActivityInfoCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageManagerHelper; @@ -73,18 +73,18 @@ public class AppInfo extends ItemInfo { /** * Must not hold the Context. */ - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, IconCache iconCache) { this(context, info, user, iconCache, UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); } - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, IconCache iconCache, boolean quietModeEnabled) { this(context, info, user, iconCache, quietModeEnabled, true /* useLowResIcon */); } - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, IconCache iconCache, boolean quietModeEnabled, boolean useLowResIcon) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; @@ -134,7 +134,7 @@ public class AppInfo extends ItemInfo { } public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info, - UserHandleCompat user) { + UserHandle user) { long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); return new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index c24423589d..4c88e7eeaf 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -17,8 +17,8 @@ package com.android.launcher3; import android.content.Context; +import android.os.Process; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ContentWriter; import java.util.ArrayList; @@ -56,7 +56,7 @@ public class FolderInfo extends ItemInfo { public FolderInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_FOLDER; - user = UserHandleCompat.myUserHandle(); + user = Process.myUserHandle(); } /** diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 9f332a4505..3557447f53 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -38,13 +38,14 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; +import android.os.Process; import android.os.SystemClock; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; @@ -86,7 +87,7 @@ public class IconCache { public boolean isLowResIcon; } - private final HashMap mDefaultIcons = new HashMap<>(); + private final HashMap mDefaultIcons = new HashMap<>(); @Thunk final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); private final Context mContext; @@ -185,7 +186,7 @@ public class IconCache { return getFullResDefaultActivityIcon(); } - private Bitmap makeDefaultIcon(UserHandleCompat user) { + private Bitmap makeDefaultIcon(UserHandle user) { Drawable unbadged = getFullResDefaultActivityIcon(); return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext); } @@ -193,14 +194,14 @@ public class IconCache { /** * Remove any records for the supplied ComponentName. */ - public synchronized void remove(ComponentName componentName, UserHandleCompat user) { + public synchronized void remove(ComponentName componentName, UserHandle user) { mCache.remove(new ComponentKey(componentName, user)); } /** * Remove any records for the supplied package name from memory. */ - private void removeFromMemCacheLocked(String packageName, UserHandleCompat user) { + private void removeFromMemCacheLocked(String packageName, UserHandle user) { HashSet forDeletion = new HashSet(); for (ComponentKey key: mCache.keySet()) { if (key.componentName.getPackageName().equals(packageName) @@ -216,7 +217,7 @@ public class IconCache { /** * Updates the entries related to the given package in memory and persistent DB. */ - public synchronized void updateIconsForPkg(String packageName, UserHandleCompat user) { + public synchronized void updateIconsForPkg(String packageName, UserHandle user) { removeIconsForPkg(packageName, user); try { PackageInfo info = mPackageManager.getPackageInfo(packageName, @@ -234,7 +235,7 @@ public class IconCache { /** * Removes the entries related to the given package in memory and persistent DB. */ - public synchronized void removeIconsForPkg(String packageName, UserHandleCompat user) { + public synchronized void removeIconsForPkg(String packageName, UserHandle user) { removeFromMemCacheLocked(packageName, user); long userSerial = mUserManager.getSerialNumberForUser(user); mIconDb.delete( @@ -247,7 +248,7 @@ public class IconCache { mWorkerHandler.removeCallbacksAndMessages(ICON_UPDATE_TOKEN); mIconProvider.updateSystemStateString(); - for (UserHandleCompat user : mUserManager.getUserProfiles()) { + for (UserHandle user : mUserManager.getUserProfiles()) { // Query for the set of apps final List apps = mLauncherApps.getActivityList(null, user); // Fail if we don't have any apps @@ -258,7 +259,7 @@ public class IconCache { // Update icon cache. This happens in segments and {@link #onPackageIconsUpdated} // is called by the icon cache when the job is complete. - updateDBIcons(user, apps, UserHandleCompat.myUserHandle().equals(user) + updateDBIcons(user, apps, Process.myUserHandle().equals(user) ? ignorePackagesForMainUser : Collections.emptySet()); } } @@ -268,7 +269,7 @@ public class IconCache { * the DB and are updated. * @return The set of packages for which icons have updated. */ - private void updateDBIcons(UserHandleCompat user, List apps, + private void updateDBIcons(UserHandle user, List apps, Set ignorePackages) { long userSerial = mUserManager.getSerialNumberForUser(user); PackageManager pm = mContext.getPackageManager(); @@ -432,7 +433,7 @@ public class IconCache { return new IconLoadRequest(request, mWorkerHandler); } - private Bitmap getNonNullIcon(CacheEntry entry, UserHandleCompat user) { + private Bitmap getNonNullIcon(CacheEntry entry, UserHandle user) { return entry.icon == null ? getDefaultIcon(user) : entry.icon; } @@ -441,7 +442,7 @@ public class IconCache { */ public synchronized void getTitleAndIcon(AppInfo application, LauncherActivityInfoCompat info, boolean useLowResIcon) { - UserHandleCompat user = info == null ? application.user : info.getUser(); + UserHandle user = info == null ? application.user : info.getUser(); CacheEntry entry = cacheLocked(application.componentName, info, user, false, useLowResIcon); application.title = Utilities.trim(entry.title); @@ -467,7 +468,7 @@ public class IconCache { /** * Returns a high res icon for the given intent and user */ - public synchronized Bitmap getIcon(Intent intent, UserHandleCompat user) { + public synchronized Bitmap getIcon(Intent intent, UserHandle user) { ComponentName component = intent.getComponent(); // null info means not installed, but if we have a component from the intent then // we should still look in the cache for restored app icons. @@ -485,7 +486,7 @@ public class IconCache { * corresponding activity is not found, it reverts to the package icon. */ public synchronized void getTitleAndIcon(ShortcutInfo shortcutInfo, Intent intent, - UserHandleCompat user, boolean useLowResIcon) { + UserHandle user, boolean useLowResIcon) { ComponentName component = intent.getComponent(); // null info means not installed, but if we have a component from the intent then // we should still look in the cache for restored app icons. @@ -505,7 +506,7 @@ public class IconCache { */ public synchronized void getTitleAndIcon( ShortcutInfo shortcutInfo, ComponentName component, LauncherActivityInfoCompat info, - UserHandleCompat user, boolean usePkgIcon, boolean useLowResIcon) { + UserHandle user, boolean usePkgIcon, boolean useLowResIcon) { CacheEntry entry = cacheLocked(component, info, user, usePkgIcon, useLowResIcon); shortcutInfo.iconBitmap = getNonNullIcon(entry, user); shortcutInfo.title = Utilities.trim(entry.title); @@ -526,14 +527,14 @@ public class IconCache { infoInOut.usingLowResIcon = entry.isLowResIcon; } - public synchronized Bitmap getDefaultIcon(UserHandleCompat user) { + public synchronized Bitmap getDefaultIcon(UserHandle user) { if (!mDefaultIcons.containsKey(user)) { mDefaultIcons.put(user, makeDefaultIcon(user)); } return mDefaultIcons.get(user); } - public boolean isDefaultIcon(Bitmap icon, UserHandleCompat user) { + public boolean isDefaultIcon(Bitmap icon, UserHandle user) { return mDefaultIcons.get(user) == icon; } @@ -542,7 +543,7 @@ public class IconCache { * This method is not thread safe, it must be called from a synchronized method. */ protected CacheEntry cacheLocked(ComponentName componentName, LauncherActivityInfoCompat info, - UserHandleCompat user, boolean usePackageIcon, boolean useLowResIcon) { + UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { ComponentKey cacheKey = new ComponentKey(componentName, user); CacheEntry entry = mCache.get(cacheKey); if (entry == null || (entry.isLowResIcon && !useLowResIcon)) { @@ -587,7 +588,7 @@ public class IconCache { * Adds a default package entry in the cache. This entry is not persisted and will be removed * when the cache is flushed. */ - public synchronized void cachePackageInstallInfo(String packageName, UserHandleCompat user, + public synchronized void cachePackageInstallInfo(String packageName, UserHandle user, Bitmap icon, CharSequence title) { removeFromMemCacheLocked(packageName, user); @@ -607,7 +608,7 @@ public class IconCache { } } - private static ComponentKey getPackageKey(String packageName, UserHandleCompat user) { + private static ComponentKey getPackageKey(String packageName, UserHandle user) { ComponentName cn = new ComponentName(packageName, packageName + EMPTY_CLASS_NAME); return new ComponentKey(cn, user); } @@ -616,7 +617,7 @@ public class IconCache { * Gets an entry for the package, which can be used as a fallback entry for various components. * This method is not thread safe, it must be called from a synchronized method. */ - private CacheEntry getEntryForPackageLocked(String packageName, UserHandleCompat user, + private CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, boolean useLowResIcon) { ComponentKey cacheKey = getPackageKey(packageName, user); CacheEntry entry = mCache.get(cacheKey); @@ -628,7 +629,7 @@ public class IconCache { // Check the DB first. if (!getEntryFromDB(cacheKey, entry, useLowResIcon)) { try { - int flags = UserHandleCompat.myUserHandle().equals(user) ? 0 : + int flags = Process.myUserHandle().equals(user) ? 0 : PackageManager.GET_UNINSTALLED_PACKAGES; PackageInfo info = mPackageManager.getPackageInfo(packageName, flags); ApplicationInfo appInfo = info.applicationInfo; diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 2f92201e1d..df2deb8ca6 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -26,13 +26,14 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Process; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -94,7 +95,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } public static void removeFromInstallQueue(Context context, HashSet packageNames, - UserHandleCompat user) { + UserHandle user) { if (packageNames.isEmpty()) { return; } @@ -192,7 +193,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } PendingInstallShortcutInfo info = new PendingInstallShortcutInfo( - data, UserHandleCompat.myUserHandle(), context); + data, Process.myUserHandle(), context); if (info.launchIntent == null || info.label == null) { if (DBG) Log.e(TAG, "Invalid install shortcut intent"); return null; @@ -289,12 +290,12 @@ public class InstallShortcutReceiver extends BroadcastReceiver { final Context mContext; final Intent launchIntent; final String label; - final UserHandleCompat user; + final UserHandle user; /** * Initializes a PendingInstallShortcutInfo received from a different app. */ - public PendingInstallShortcutInfo(Intent data, UserHandleCompat user, Context context) { + public PendingInstallShortcutInfo(Intent data, UserHandle user, Context context) { activityInfo = null; shortcutInfo = null; providerInfo = null; @@ -351,7 +352,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { data = null; mContext = context; - user = UserHandleCompat.fromUser(info.getProfile()); + user = info.getProfile(); launchIntent = new Intent().setComponent(info.provider) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); @@ -490,7 +491,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { AppWidgetProviderInfo info = AppWidgetManager.getInstance(context) .getAppWidgetInfo(widgetId); if (info == null || !info.provider.equals(decoder.launcherIntent.getComponent()) || - !info.getProfile().equals(decoder.user.getUser())) { + !info.getProfile().equals(decoder.user)) { return null; } return new PendingInstallShortcutInfo(info, widgetId, context); @@ -524,14 +525,14 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static class Decoder extends JSONObject { public final Intent launcherIntent; - public final UserHandleCompat user; + public final UserHandle user; private Decoder(String encoded, Context context) throws JSONException, URISyntaxException { super(encoded); launcherIntent = Intent.parseUri(getString(LAUNCH_INTENT_KEY), 0); user = has(USER_HANDLE_KEY) ? UserManagerCompat.getInstance(context) .getUserForSerialNumber(getLong(USER_HANDLE_KEY)) - : UserHandleCompat.myUserHandle(); + : Process.myUserHandle(); if (user == null) { throw new JSONException("Invalid user"); } diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index 3e0ae4ffc6..82c7ab8de3 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -19,8 +19,9 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.ContentValues; import android.content.Intent; +import android.os.Process; +import android.os.UserHandle; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ContentWriter; /** @@ -106,10 +107,10 @@ public class ItemInfo { */ public CharSequence contentDescription; - public UserHandleCompat user; + public UserHandle user; public ItemInfo() { - user = UserHandleCompat.myUserHandle(); + user = Process.myUserHandle(); } ItemInfo(ItemInfo info) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 85e6a77fbf..8aa41588bd 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -52,6 +52,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.Process; import android.os.StrictMode; import android.os.SystemClock; import android.os.Trace; @@ -90,7 +91,6 @@ import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; @@ -2089,8 +2089,8 @@ public class Launcher extends Activity Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); - mAppWidgetManager.getUser(info.info) - .addToIntent(intent, AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE, + mAppWidgetManager.getUser(info.info)); // TODO: we need to make sure that this accounts for the options bundle. // intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); startActivityForResult(intent, REQUEST_BIND_APPWIDGET); @@ -2323,8 +2323,8 @@ public class Launcher extends Activity Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, info.appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, appWidgetInfo.provider); - mAppWidgetManager.getUser(appWidgetInfo) - .addToIntent(intent, AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE, + mAppWidgetManager.getUser(appWidgetInfo)); startActivityForResult(intent, REQUEST_BIND_PENDING_APPWIDGET); } } else { @@ -2392,7 +2392,7 @@ public class Launcher extends Activity .setNeutralButton(R.string.abandoned_clean_this, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - final UserHandleCompat user = UserHandleCompat.myUserHandle(); + final UserHandle user = Process.myUserHandle(); mWorkspace.removeAbandonedPromise(packageName, user); } }) @@ -2702,7 +2702,7 @@ public class Launcher extends Activity !intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION); Bundle optsBundle = useLaunchAnimation ? getActivityLaunchOptions(v) : null; - UserHandleCompat user = null; + UserHandle user = null; if (intent.hasExtra(AppInfo.EXTRA_PROFILE)) { long serialNumber = intent.getLongExtra(AppInfo.EXTRA_PROFILE, -1); user = UserManagerCompat.getInstance(this).getUserForSerialNumber(serialNumber); @@ -2720,7 +2720,7 @@ public class Launcher extends Activity && ((ShortcutInfo) item).promisedIntent == null) { // Shortcuts need some special checks due to legacy reasons. startShortcutIntentSafely(intent, optsBundle, item); - } else if (user == null || user.equals(UserHandleCompat.myUserHandle())) { + } else if (user == null || user.equals(Process.myUserHandle())) { // Could be launching some bookkeeping activity startActivity(intent, optsBundle); } else { @@ -3782,7 +3782,7 @@ public class Launcher extends Activity */ @Override public void bindShortcutsChanged(final ArrayList updated, - final ArrayList removed, final UserHandleCompat user) { + final ArrayList removed, final UserHandle user) { Runnable r = new Runnable() { public void run() { bindShortcutsChanged(updated, removed, user); @@ -3851,7 +3851,7 @@ public class Launcher extends Activity @Override public void bindWorkspaceComponentsRemoved( final HashSet packageNames, final HashSet components, - final UserHandleCompat user) { + final UserHandle user) { Runnable r = new Runnable() { public void run() { bindWorkspaceComponentsRemoved(packageNames, components, user); @@ -3997,36 +3997,6 @@ public class Launcher extends Activity return true; } - // TODO: These method should be a part of LauncherSearchCallback - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public ItemInfo createAppDragInfo(Intent appLaunchIntent) { - // Called from search suggestion - UserHandleCompat user = null; - if (Utilities.ATLEAST_LOLLIPOP) { - UserHandle userHandle = appLaunchIntent.getParcelableExtra(Intent.EXTRA_USER); - if (userHandle != null) { - user = UserHandleCompat.fromUser(userHandle); - } - } - return createAppDragInfo(appLaunchIntent, user); - } - - // TODO: This method should be a part of LauncherSearchCallback - public ItemInfo createAppDragInfo(Intent intent, UserHandleCompat user) { - if (user == null) { - user = UserHandleCompat.myUserHandle(); - } - - // Called from search suggestion, add the profile extra to the intent to ensure that we - // can launch it correctly - LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); - LauncherActivityInfoCompat activityInfo = launcherApps.resolveActivity(intent, user); - if (activityInfo == null) { - return null; - } - return new AppInfo(this, activityInfo, user, mIconCache); - } - protected void moveWorkspaceToDefaultScreen() { mWorkspace.moveToDefaultScreen(false); } diff --git a/src/com/android/launcher3/LauncherAppWidgetInfo.java b/src/com/android/launcher3/LauncherAppWidgetInfo.java index 2218767114..b68a64b63e 100644 --- a/src/com/android/launcher3/LauncherAppWidgetInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetInfo.java @@ -19,8 +19,8 @@ package com.android.launcher3; import android.appwidget.AppWidgetHostView; import android.content.ComponentName; import android.content.Intent; +import android.os.Process; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ContentWriter; /** @@ -112,7 +112,7 @@ public class LauncherAppWidgetInfo extends ItemInfo { spanX = -1; spanY = -1; // We only support app widgets on current user. - user = UserHandleCompat.myUserHandle(); + user = Process.myUserHandle(); restoreStatus = RESTORE_COMPLETED; } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2a6f56bf0d..0dc91e3a8e 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -37,6 +37,7 @@ import android.os.Parcelable; import android.os.Process; import android.os.SystemClock; import android.os.Trace; +import android.os.UserHandle; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; @@ -48,7 +49,6 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; @@ -58,17 +58,17 @@ import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; -import com.android.launcher3.model.ExtendedModelTask; import com.android.launcher3.model.BgDataModel; import com.android.launcher3.model.CacheDataUpdatedTask; +import com.android.launcher3.model.ExtendedModelTask; import com.android.launcher3.model.GridSizeMigrationTask; -import com.android.launcher3.model.PackageItemInfo; -import com.android.launcher3.model.SdCardAvailableReceiver; -import com.android.launcher3.model.WidgetItem; import com.android.launcher3.model.PackageInstallStateChangedTask; +import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.PackageUpdatedTask; +import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.ShortcutsChangedTask; import com.android.launcher3.model.UserLockStateChangedTask; +import com.android.launcher3.model.WidgetItem; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.provider.ImportDataTask; import com.android.launcher3.provider.LauncherDbUtils; @@ -197,12 +197,12 @@ public class LauncherModel extends BroadcastReceiver ArrayList addedApps); public void bindAppsUpdated(ArrayList apps); public void bindShortcutsChanged(ArrayList updated, - ArrayList removed, UserHandleCompat user); + ArrayList removed, UserHandle user); public void bindWidgetsRestored(ArrayList widgets); public void bindRestoreItemsChange(HashSet updates); public void bindWorkspaceComponentsRemoved( HashSet packageNames, HashSet components, - UserHandleCompat user); + UserHandle user); public void bindAppInfosRemoved(ArrayList appInfos); public void notifyWidgetProvidersChanged(); public void bindAllWidgets(MultiHashMap widgets); @@ -255,7 +255,7 @@ public class LauncherModel extends BroadcastReceiver HashSet packages = new HashSet<>(); packages.add(packageName); enqueueModelUpdateTask(new CacheDataUpdatedTask( - CacheDataUpdatedTask.OP_SESSION_UPDATE, UserHandleCompat.myUserHandle(), packages)); + CacheDataUpdatedTask.OP_SESSION_UPDATE, Process.myUserHandle(), packages)); } /** @@ -692,36 +692,36 @@ public class LauncherModel extends BroadcastReceiver } @Override - public void onPackageChanged(String packageName, UserHandleCompat user) { + public void onPackageChanged(String packageName, UserHandle user) { int op = PackageUpdatedTask.OP_UPDATE; enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName)); } @Override - public void onPackageRemoved(String packageName, UserHandleCompat user) { + public void onPackageRemoved(String packageName, UserHandle user) { onPackagesRemoved(user, packageName); } - public void onPackagesRemoved(UserHandleCompat user, String... packages) { + public void onPackagesRemoved(UserHandle user, String... packages) { int op = PackageUpdatedTask.OP_REMOVE; enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packages)); } @Override - public void onPackageAdded(String packageName, UserHandleCompat user) { + public void onPackageAdded(String packageName, UserHandle user) { int op = PackageUpdatedTask.OP_ADD; enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName)); } @Override - public void onPackagesAvailable(String[] packageNames, UserHandleCompat user, + public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) { enqueueModelUpdateTask( new PackageUpdatedTask(PackageUpdatedTask.OP_UPDATE, user, packageNames)); } @Override - public void onPackagesUnavailable(String[] packageNames, UserHandleCompat user, + public void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing) { if (!replacing) { enqueueModelUpdateTask(new PackageUpdatedTask( @@ -730,25 +730,25 @@ public class LauncherModel extends BroadcastReceiver } @Override - public void onPackagesSuspended(String[] packageNames, UserHandleCompat user) { + public void onPackagesSuspended(String[] packageNames, UserHandle user) { enqueueModelUpdateTask(new PackageUpdatedTask( PackageUpdatedTask.OP_SUSPEND, user, packageNames)); } @Override - public void onPackagesUnsuspended(String[] packageNames, UserHandleCompat user) { + public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { enqueueModelUpdateTask(new PackageUpdatedTask( PackageUpdatedTask.OP_UNSUSPEND, user, packageNames)); } @Override public void onShortcutsChanged(String packageName, List shortcuts, - UserHandleCompat user) { + UserHandle user) { enqueueModelUpdateTask(new ShortcutsChangedTask(packageName, shortcuts, user, true)); } public void updatePinnedShortcuts(String packageName, List shortcuts, - UserHandleCompat user) { + UserHandle user) { enqueueModelUpdateTask(new ShortcutsChangedTask(packageName, shortcuts, user, false)); } @@ -771,7 +771,7 @@ public class LauncherModel extends BroadcastReceiver } else if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action) || Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) { - UserHandleCompat user = UserHandleCompat.fromIntent(intent); + UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); if (user != null) { if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { @@ -1199,7 +1199,7 @@ public class LauncherModel extends BroadcastReceiver final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(context); final boolean isSdCardReady = Utilities.isBootCompleted(); - final MultiHashMap pendingPackages = new MultiHashMap<>(); + final MultiHashMap pendingPackages = new MultiHashMap<>(); LauncherAppState app = LauncherAppState.getInstance(); InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); @@ -1282,10 +1282,10 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites.OPTIONS); final CursorIconInfo cursorIconInfo = new CursorIconInfo(mContext, c); - final LongSparseArray allUsers = new LongSparseArray<>(); + final LongSparseArray allUsers = new LongSparseArray<>(); final LongSparseArray quietMode = new LongSparseArray<>(); final LongSparseArray unlockedUsers = new LongSparseArray<>(); - for (UserHandleCompat user : mUserManager.getUserProfiles()) { + for (UserHandle user : mUserManager.getUserProfiles()) { long serialNo = mUserManager.getSerialNumberForUser(user); allUsers.put(serialNo, user); quietMode.put(serialNo, mUserManager.isQuietModeEnabled(user)); @@ -1318,7 +1318,7 @@ public class LauncherModel extends BroadcastReceiver long id; long serialNumber; Intent intent; - UserHandleCompat user; + UserHandle user; String targetPackage; while (!mStopped && c.moveToNext()) { @@ -1465,7 +1465,7 @@ public class LauncherModel extends BroadcastReceiver c.getInt(rankIndex) >= FolderIcon.NUM_ITEMS_IN_PREVIEW; if (itemReplaced) { - if (user.equals(UserHandleCompat.myUserHandle())) { + if (user.equals(Process.myUserHandle())) { info = getAppShortcutInfo(intent, user, null, cursorIconInfo, false, useLowResIcon); } else { @@ -1474,7 +1474,7 @@ public class LauncherModel extends BroadcastReceiver continue; } } else if (restored) { - if (user.equals(UserHandleCompat.myUserHandle())) { + if (user.equals(Process.myUserHandle())) { info = getRestoredItemInfo(c, intent, promiseType, itemType, cursorIconInfo); intent = getRestoredItemIntent(c, context, intent); @@ -2251,11 +2251,11 @@ public class LauncherModel extends BroadcastReceiver return; } - final List profiles = mUserManager.getUserProfiles(); + final List profiles = mUserManager.getUserProfiles(); // Clear the list of apps mBgAllAppsList.clear(); - for (UserHandleCompat user : profiles) { + for (UserHandle user : profiles) { // Query for the set of apps final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; final List apps = mLauncherApps.getActivityList(null, user); @@ -2341,7 +2341,7 @@ public class LauncherModel extends BroadcastReceiver DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(mContext); mHasShortcutHostPermission = shortcutManager.hasHostPermission(); if (mHasShortcutHostPermission) { - for (UserHandleCompat user : mUserManager.getUserProfiles()) { + for (UserHandle user : mUserManager.getUserProfiles()) { if (mUserManager.isUserUnlocked(user)) { List shortcuts = shortcutManager.queryForAllShortcuts(user); @@ -2399,7 +2399,7 @@ public class LauncherModel extends BroadcastReceiver /** * Called when the icons for packages have been updated in the icon cache. */ - public void onPackageIconsUpdated(HashSet updatedPackages, UserHandleCompat user) { + public void onPackageIconsUpdated(HashSet updatedPackages, UserHandle user) { // If any package icon has changed (app was updated while launcher was dead), // update the corresponding shortcuts. enqueueModelUpdateTask(new CacheDataUpdatedTask( @@ -2519,7 +2519,7 @@ public class LauncherModel extends BroadcastReceiver public ShortcutInfo getRestoredItemInfo(Cursor c, Intent intent, int promiseType, int itemType, CursorIconInfo iconInfo) { final ShortcutInfo info = new ShortcutInfo(); - info.user = UserHandleCompat.myUserHandle(); + info.user = Process.myUserHandle(); info.iconBitmap = iconInfo.loadIcon(c, info); // the fallback icon if (info.iconBitmap == null) { @@ -2569,9 +2569,8 @@ public class LauncherModel extends BroadcastReceiver * * If c is not null, then it will be used to fill in missing data like the title and icon. */ - public ShortcutInfo getAppShortcutInfo(Intent intent, - UserHandleCompat user, Cursor c, CursorIconInfo iconInfo, - boolean allowMissingTarget, boolean useLowResIcon) { + public ShortcutInfo getAppShortcutInfo(Intent intent, UserHandle user, Cursor c, + CursorIconInfo iconInfo, boolean allowMissingTarget, boolean useLowResIcon) { if (user == null) { Log.d(TAG, "Null user found in getShortcutInfo"); return null; @@ -2625,7 +2624,7 @@ public class LauncherModel extends BroadcastReceiver @Thunk ShortcutInfo getShortcutInfo(Cursor c, CursorIconInfo iconInfo) { final ShortcutInfo info = new ShortcutInfo(); // Non-app shortcuts are only supported for current user. - info.user = UserHandleCompat.myUserHandle(); + info.user = Process.myUserHandle(); info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; // TODO: If there's an explicit component and we can't install that, delete it. @@ -2661,7 +2660,7 @@ public class LauncherModel extends BroadcastReceiver // Only support intents for current user for now. Intents sent from other // users wouldn't get here without intent forwarding anyway. - info.user = UserHandleCompat.myUserHandle(); + info.user = Process.myUserHandle(); if (bitmap instanceof Bitmap) { info.iconBitmap = LauncherIcons.createIconBitmap((Bitmap) bitmap, context); diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index b30c3f3cc5..c6edae9c19 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -45,6 +45,7 @@ import android.os.Handler; import android.os.Message; import android.os.Process; import android.os.Trace; +import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; @@ -52,7 +53,6 @@ import android.util.Log; import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.LauncherSettings.WorkspaceScreens; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; @@ -657,13 +657,13 @@ public class LauncherProvider extends ContentProvider { Utilities.getPrefs(mContext).edit().putBoolean(EMPTY_DATABASE_CREATED, true).commit(); // When a new DB is created, remove all previously stored managed profile information. - ManagedProfileHeuristic.processAllUsers(Collections.emptyList(), + ManagedProfileHeuristic.processAllUsers(Collections.emptyList(), mContext); } public long getDefaultUserSerial() { return UserManagerCompat.getInstance(mContext).getSerialNumberForUser( - UserHandleCompat.myUserHandle()); + Process.myUserHandle()); } private void addFavoritesTable(SQLiteDatabase db, boolean optional) { diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index fd6533706a..b9010c76e2 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -23,10 +23,11 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Process; +import android.os.UserHandle; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; @@ -257,7 +258,7 @@ public class ShortcutInfo extends ItemInfo { IconCache cache = launcherAppState.getIconCache(); Bitmap unbadgedBitmap = unbadgedDrawable == null - ? cache.getDefaultIcon(UserHandleCompat.myUserHandle()) + ? cache.getDefaultIcon(Process.myUserHandle()) : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); iconBitmap = getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context); } diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index 00c613a88f..a7839ec290 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -8,14 +8,13 @@ import android.content.pm.ApplicationInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.UserHandle; import android.os.UserManager; import android.util.AttributeSet; -import android.util.Pair; import android.widget.Toast; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; public class UninstallDropTarget extends ButtonDropTarget { @@ -60,7 +59,7 @@ public class UninstallDropTarget extends ButtonDropTarget { */ private static ComponentName getUninstallTarget(Context context, Object item) { Intent intent = null; - UserHandleCompat user = null; + UserHandle user = null; if (item instanceof AppInfo) { AppInfo info = (AppInfo) item; intent = info.intent; @@ -120,7 +119,7 @@ public class UninstallDropTarget extends ButtonDropTarget { Uri.fromParts("package", cn.getPackageName(), cn.getClassName())) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - info.user.addToIntent(intent, Intent.EXTRA_USER); + intent.putExtra(Intent.EXTRA_USER, info.user); launcher.startActivity(intent); isUninstallable = true; } @@ -139,7 +138,7 @@ public class UninstallDropTarget extends ButtonDropTarget { */ protected static void sendUninstallResult( final Launcher launcher, boolean activityStarted, - final ComponentName cn, final UserHandleCompat user, + final ComponentName cn, final UserHandle user, final DropTargetResultCallback callback) { if (activityStarted) { final Runnable checkIfUninstallWasSuccess = new Runnable() { diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 354b8ec41e..399920e655 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -25,11 +25,11 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Handler; +import android.os.UserHandle; import android.util.Log; import android.util.LongSparseArray; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.util.ComponentKey; @@ -149,11 +149,11 @@ public class WidgetPreviewLoader { mDb.insertOrReplace(values); } - public void removePackage(String packageName, UserHandleCompat user) { + public void removePackage(String packageName, UserHandle user) { removePackage(packageName, user, mUserManager.getSerialNumberForUser(user)); } - private void removePackage(String packageName, UserHandleCompat user, long userSerial) { + private void removePackage(String packageName, UserHandle user, long userSerial) { synchronized(mPackageVersions) { mPackageVersions.remove(packageName); } @@ -217,7 +217,7 @@ public class WidgetPreviewLoader { for (int i = 0; i < packagesToDelete.size(); i++) { long userId = packagesToDelete.keyAt(i); - UserHandleCompat user = mUserManager.getUserForSerialNumber(userId); + UserHandle user = mUserManager.getUserForSerialNumber(userId); for (String pkg : packagesToDelete.valueAt(i)) { removePackage(pkg, user, userId); } @@ -652,7 +652,7 @@ public class WidgetPreviewLoader { // TODO: remove dependency on size @Thunk final String size; - public WidgetCacheKey(ComponentName componentName, UserHandleCompat user, String size) { + public WidgetCacheKey(ComponentName componentName, UserHandle user, String size) { super(componentName, user); this.size = size; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index ab98367575..cbea7e0783 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -38,6 +38,7 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; import android.os.Parcelable; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; import android.util.Property; @@ -61,7 +62,6 @@ import com.android.launcher3.accessibility.OverviewScreenAccessibilityDelegate; import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper; import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; @@ -4016,7 +4016,7 @@ public class Workspace extends PagedView }); } - public void removeAbandonedPromise(String packageName, UserHandleCompat user) { + public void removeAbandonedPromise(String packageName, UserHandle user) { HashSet packages = new HashSet<>(1); packages.add(packageName); ItemInfoMatcher matcher = ItemInfoMatcher.ofPackages(packages, user); diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java index 8b7a6ba4d7..0bfbd3ebaa 100644 --- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java +++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java @@ -16,12 +16,12 @@ package com.android.launcher3.allapps; import android.content.Context; +import android.os.Process; import android.util.Log; import com.android.launcher3.AppInfo; import com.android.launcher3.Launcher; import com.android.launcher3.compat.AlphabeticIndexCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.LabelComparator; @@ -363,13 +363,13 @@ public class AlphabeticalAppsList { if (DEBUG_PREDICTIONS) { if (mPredictedAppComponents.isEmpty() && !mApps.isEmpty()) { mPredictedAppComponents.add(new ComponentKey(mApps.get(0).componentName, - UserHandleCompat.myUserHandle())); + Process.myUserHandle())); mPredictedAppComponents.add(new ComponentKey(mApps.get(0).componentName, - UserHandleCompat.myUserHandle())); + Process.myUserHandle())); mPredictedAppComponents.add(new ComponentKey(mApps.get(0).componentName, - UserHandleCompat.myUserHandle())); + Process.myUserHandle())); mPredictedAppComponents.add(new ComponentKey(mApps.get(0).componentName, - UserHandleCompat.myUserHandle())); + Process.myUserHandle())); } } diff --git a/src/com/android/launcher3/allapps/AppInfoComparator.java b/src/com/android/launcher3/allapps/AppInfoComparator.java index 1f5fece5fe..80577a76d5 100644 --- a/src/com/android/launcher3/allapps/AppInfoComparator.java +++ b/src/com/android/launcher3/allapps/AppInfoComparator.java @@ -16,9 +16,10 @@ package com.android.launcher3.allapps; import android.content.Context; +import android.os.Process; +import android.os.UserHandle; import com.android.launcher3.AppInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.LabelComparator; @@ -30,12 +31,12 @@ import java.util.Comparator; public class AppInfoComparator implements Comparator { private final UserManagerCompat mUserManager; - private final UserHandleCompat mMyUser; + private final UserHandle mMyUser; private final LabelComparator mLabelComparator; public AppInfoComparator(Context context) { mUserManager = UserManagerCompat.getInstance(context); - mMyUser = UserHandleCompat.myUserHandle(); + mMyUser = Process.myUserHandle(); mLabelComparator = new LabelComparator(); } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index 811cacfc09..5388f2a3cf 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -25,6 +25,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.UserHandle; import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppWidgetProviderInfo; @@ -77,7 +78,7 @@ public abstract class AppWidgetManagerCompat { public abstract boolean bindAppWidgetIdIfAllowed( int appWidgetId, AppWidgetProviderInfo info, Bundle options); - public abstract UserHandleCompat getUser(LauncherAppWidgetProviderInfo info); + public abstract UserHandle getUser(LauncherAppWidgetProviderInfo info); public abstract void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, AppWidgetHost host, int requestCode); @@ -90,7 +91,7 @@ public abstract class AppWidgetManagerCompat { int imageWidth, int imageHeight); public abstract LauncherAppWidgetProviderInfo findProvider( - ComponentName provider, UserHandleCompat user); + ComponentName provider, UserHandle user); public abstract HashMap getAllProvidersMap(); } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java index de9414ed27..e7d8e29432 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java @@ -28,6 +28,8 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.os.Process; +import android.os.UserHandle; import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppWidgetProviderInfo; @@ -65,8 +67,8 @@ class AppWidgetManagerCompatV16 extends AppWidgetManagerCompat { } @Override - public UserHandleCompat getUser(LauncherAppWidgetProviderInfo info) { - return UserHandleCompat.myUserHandle(); + public UserHandle getUser(LauncherAppWidgetProviderInfo info) { + return Process.myUserHandle(); } @Override @@ -97,7 +99,7 @@ class AppWidgetManagerCompatV16 extends AppWidgetManagerCompat { @Override public LauncherAppWidgetProviderInfo findProvider( - ComponentName provider, UserHandleCompat user) { + ComponentName provider, UserHandle user) { for (AppWidgetProviderInfo info : mAppWidgetManager.getInstalledProviders()) { if (info.provider.equals(provider)) { return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); @@ -109,7 +111,7 @@ class AppWidgetManagerCompatV16 extends AppWidgetManagerCompat { @Override public HashMap getAllProvidersMap() { HashMap result = new HashMap<>(); - UserHandleCompat user = UserHandleCompat.myUserHandle(); + UserHandle user = Process.myUserHandle(); for (AppWidgetProviderInfo info : mAppWidgetManager.getInstalledProviders()) { result.put(new ComponentKey(info.provider, user), info); } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java index a1570e66a1..0acf75373f 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java @@ -33,6 +33,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.view.View; @@ -81,11 +82,11 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } @Override - public UserHandleCompat getUser(LauncherAppWidgetProviderInfo info) { + public UserHandle getUser(LauncherAppWidgetProviderInfo info) { if (info.isCustomWidget) { - return UserHandleCompat.myUserHandle(); + return Process.myUserHandle(); } - return UserHandleCompat.fromUser(info.getProfile()); + return info.getProfile(); } @Override @@ -150,9 +151,9 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } @Override - public LauncherAppWidgetProviderInfo findProvider(ComponentName provider, UserHandleCompat user) { + public LauncherAppWidgetProviderInfo findProvider(ComponentName provider, UserHandle user) { for (AppWidgetProviderInfo info : mAppWidgetManager - .getInstalledProvidersForProfile(user.getUser())) { + .getInstalledProvidersForProfile(user)) { if (info.provider.equals(provider)) { return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); } @@ -164,10 +165,9 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { public HashMap getAllProvidersMap() { HashMap result = new HashMap<>(); for (UserHandle user : mUserManager.getUserProfiles()) { - UserHandleCompat userHandle = UserHandleCompat.fromUser(user); for (AppWidgetProviderInfo info : mAppWidgetManager.getInstalledProvidersForProfile(user)) { - result.put(new ComponentKey(info.provider, userHandle), info); + result.put(new ComponentKey(info.provider, user), info); } } return result; diff --git a/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java b/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java index 46d36d1b00..4dd05bb00d 100644 --- a/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java +++ b/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java @@ -21,7 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.graphics.drawable.Drawable; -import android.util.Log; +import android.os.UserHandle; /** * {@link LauncherActivityInfoCompat} which loads its data only when needed. @@ -29,13 +29,13 @@ import android.util.Log; public class DeferredLauncherActivityInfo extends LauncherActivityInfoCompat { private final ComponentName mComponent; - private final UserHandleCompat mUser; + private final UserHandle mUser; private final Context mContext; private LauncherActivityInfoCompat mActualInfo; public DeferredLauncherActivityInfo( - ComponentName component, UserHandleCompat user, Context context) { + ComponentName component, UserHandle user, Context context) { mComponent = component; mUser = user; mContext = context; @@ -47,7 +47,7 @@ public class DeferredLauncherActivityInfo extends LauncherActivityInfoCompat { } @Override - public UserHandleCompat getUser() { + public UserHandle getUser() { return mUser; } diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java index 65af4eaea8..830b60acc4 100644 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java +++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java @@ -19,6 +19,7 @@ package com.android.launcher3.compat; import android.content.ComponentName; import android.content.pm.ApplicationInfo; import android.graphics.drawable.Drawable; +import android.os.UserHandle; public abstract class LauncherActivityInfoCompat { @@ -26,7 +27,7 @@ public abstract class LauncherActivityInfoCompat { } public abstract ComponentName getComponentName(); - public abstract UserHandleCompat getUser(); + public abstract UserHandle getUser(); public abstract CharSequence getLabel(); public abstract Drawable getIcon(int density); public abstract ApplicationInfo getApplicationInfo(); diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java index fee0376bd3..d6978030f0 100644 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java +++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java @@ -18,14 +18,16 @@ package com.android.launcher3.compat; import android.content.ComponentName; import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.os.Process; +import android.os.UserHandle; public class LauncherActivityInfoCompatV16 extends LauncherActivityInfoCompat { @@ -46,8 +48,8 @@ public class LauncherActivityInfoCompatV16 extends LauncherActivityInfoCompat { return mComponentName; } - public UserHandleCompat getUser() { - return UserHandleCompat.myUserHandle(); + public UserHandle getUser() { + return Process.myUserHandle(); } public CharSequence getLabel() { diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java index 67c5c27951..874b3c3ac8 100644 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java @@ -22,6 +22,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.UserHandle; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class LauncherActivityInfoCompatVL extends LauncherActivityInfoCompat { @@ -36,8 +37,8 @@ public class LauncherActivityInfoCompatVL extends LauncherActivityInfoCompat { return mLauncherActivityInfo.getComponentName(); } - public UserHandleCompat getUser() { - return UserHandleCompat.fromUser(mLauncherActivityInfo.getUser()); + public UserHandle getUser() { + return mLauncherActivityInfo.getUser(); } public CharSequence getLabel() { diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 645e68a8fa..c75298b0d7 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -19,10 +19,9 @@ package com.android.launcher3.compat; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.LauncherApps; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.UserHandle; import com.android.launcher3.Utilities; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -32,15 +31,15 @@ import java.util.List; public abstract class LauncherAppsCompat { public interface OnAppsChangedCallbackCompat { - void onPackageRemoved(String packageName, UserHandleCompat user); - void onPackageAdded(String packageName, UserHandleCompat user); - void onPackageChanged(String packageName, UserHandleCompat user); - void onPackagesAvailable(String[] packageNames, UserHandleCompat user, boolean replacing); - void onPackagesUnavailable(String[] packageNames, UserHandleCompat user, boolean replacing); - void onPackagesSuspended(String[] packageNames, UserHandleCompat user); - void onPackagesUnsuspended(String[] packageNames, UserHandleCompat user); + void onPackageRemoved(String packageName, UserHandle user); + void onPackageAdded(String packageName, UserHandle user); + void onPackageChanged(String packageName, UserHandle user); + void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing); + void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing); + void onPackagesSuspended(String[] packageNames, UserHandle user); + void onPackagesUnsuspended(String[] packageNames, UserHandle user); void onShortcutsChanged(String packageName, List shortcuts, - UserHandleCompat user); + UserHandle user); } protected LauncherAppsCompat() { @@ -63,16 +62,16 @@ public abstract class LauncherAppsCompat { } public abstract List getActivityList(String packageName, - UserHandleCompat user); + UserHandle user); public abstract LauncherActivityInfoCompat resolveActivity(Intent intent, - UserHandleCompat user); - public abstract void startActivityForProfile(ComponentName component, UserHandleCompat user, + UserHandle user); + public abstract void startActivityForProfile(ComponentName component, UserHandle user, Rect sourceBounds, Bundle opts); - public abstract void showAppDetailsForProfile(ComponentName component, UserHandleCompat user); + public abstract void showAppDetailsForProfile(ComponentName component, UserHandle user); public abstract void addOnAppsChangedCallback(OnAppsChangedCallbackCompat listener); public abstract void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat listener); - public abstract boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user); + public abstract boolean isPackageEnabledForProfile(String packageName, UserHandle user); public abstract boolean isActivityEnabledForProfile(ComponentName component, - UserHandleCompat user); - public abstract boolean isPackageSuspendedForProfile(String packageName, UserHandleCompat user); + UserHandle user); + public abstract boolean isPackageSuspendedForProfile(String packageName, UserHandle user); } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java index 49a0df6761..0d1efa85ee 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java @@ -22,18 +22,17 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; -import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.Process; +import android.os.UserHandle; import android.provider.Settings; import com.android.launcher3.Utilities; -import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Thunk; @@ -60,7 +59,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { } public List getActivityList(String packageName, - UserHandleCompat user) { + UserHandle user) { final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); mainIntent.setPackage(packageName); @@ -73,7 +72,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { return list; } - public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandleCompat user) { + public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandle user) { ResolveInfo info = mPm.resolveActivity(intent, 0); if (info != null) { return new LauncherActivityInfoCompatV16(mContext, info); @@ -81,7 +80,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { return null; } - public void startActivityForProfile(ComponentName component, UserHandleCompat user, + public void startActivityForProfile(ComponentName component, UserHandle user, Rect sourceBounds, Bundle opts) { Intent launchIntent = new Intent(Intent.ACTION_MAIN); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); @@ -91,7 +90,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { mContext.startActivity(launchIntent, opts); } - public void showAppDetailsForProfile(ComponentName component, UserHandleCompat user) { + public void showAppDetailsForProfile(ComponentName component, UserHandle user) { String packageName = component.getPackageName(); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", packageName, null)); @@ -116,11 +115,11 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { } } - public boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user) { + public boolean isPackageEnabledForProfile(String packageName, UserHandle user) { return PackageManagerHelper.isAppEnabled(mPm, packageName); } - public boolean isActivityEnabledForProfile(ComponentName component, UserHandleCompat user) { + public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) { try { ActivityInfo info = mPm.getActivityInfo(component, 0); return info != null && info.isEnabled(); @@ -129,7 +128,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { } } - public boolean isPackageSuspendedForProfile(String packageName, UserHandleCompat user) { + public boolean isPackageSuspendedForProfile(String packageName, UserHandle user) { return false; } @@ -156,7 +155,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { @Thunk class PackageMonitor extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - final UserHandleCompat user = UserHandleCompat.myUserHandle(); + final UserHandle user = Process.myUserHandle(); if (Intent.ACTION_PACKAGE_CHANGED.equals(action) || Intent.ACTION_PACKAGE_REMOVED.equals(action) diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index d97bf2f745..f408da0aab 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -49,10 +49,8 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { mLauncherApps = (LauncherApps) context.getSystemService("launcherapps"); } - public List getActivityList(String packageName, - UserHandleCompat user) { - List list = mLauncherApps.getActivityList(packageName, - user.getUser()); + public List getActivityList(String packageName, UserHandle user) { + List list = mLauncherApps.getActivityList(packageName, user); if (list.size() == 0) { return Collections.emptyList(); } @@ -64,8 +62,8 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { return compatList; } - public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandleCompat user) { - LauncherActivityInfo activity = mLauncherApps.resolveActivity(intent, user.getUser()); + public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandle user) { + LauncherActivityInfo activity = mLauncherApps.resolveActivity(intent, user); if (activity != null) { return new LauncherActivityInfoCompatVL(activity); } else { @@ -73,13 +71,13 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { } } - public void startActivityForProfile(ComponentName component, UserHandleCompat user, + public void startActivityForProfile(ComponentName component, UserHandle user, Rect sourceBounds, Bundle opts) { - mLauncherApps.startMainActivity(component, user.getUser(), sourceBounds, opts); + mLauncherApps.startMainActivity(component, user, sourceBounds, opts); } - public void showAppDetailsForProfile(ComponentName component, UserHandleCompat user) { - mLauncherApps.startAppDetailsActivity(component, user.getUser(), null, null); + public void showAppDetailsForProfile(ComponentName component, UserHandle user) { + mLauncherApps.startAppDetailsActivity(component, user, null, null); } public void addOnAppsChangedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) { @@ -101,15 +99,15 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { } } - public boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user) { - return mLauncherApps.isPackageEnabled(packageName, user.getUser()); + public boolean isPackageEnabledForProfile(String packageName, UserHandle user) { + return mLauncherApps.isPackageEnabled(packageName, user); } - public boolean isActivityEnabledForProfile(ComponentName component, UserHandleCompat user) { - return mLauncherApps.isActivityEnabled(component, user.getUser()); + public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) { + return mLauncherApps.isActivityEnabled(component, user); } - public boolean isPackageSuspendedForProfile(String packageName, UserHandleCompat user) { + public boolean isPackageSuspendedForProfile(String packageName, UserHandle user) { return false; } @@ -121,33 +119,32 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { } public void onPackageRemoved(String packageName, UserHandle user) { - mCallback.onPackageRemoved(packageName, UserHandleCompat.fromUser(user)); + mCallback.onPackageRemoved(packageName, user); } public void onPackageAdded(String packageName, UserHandle user) { - mCallback.onPackageAdded(packageName, UserHandleCompat.fromUser(user)); + mCallback.onPackageAdded(packageName, user); } public void onPackageChanged(String packageName, UserHandle user) { - mCallback.onPackageChanged(packageName, UserHandleCompat.fromUser(user)); + mCallback.onPackageChanged(packageName, user); } public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) { - mCallback.onPackagesAvailable(packageNames, UserHandleCompat.fromUser(user), replacing); + mCallback.onPackagesAvailable(packageNames, user, replacing); } public void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing) { - mCallback.onPackagesUnavailable(packageNames, UserHandleCompat.fromUser(user), - replacing); + mCallback.onPackagesUnavailable(packageNames, user, replacing); } public void onPackagesSuspended(String[] packageNames, UserHandle user) { - mCallback.onPackagesSuspended(packageNames, UserHandleCompat.fromUser(user)); + mCallback.onPackagesSuspended(packageNames, user); } public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { - mCallback.onPackagesUnsuspended(packageNames, UserHandleCompat.fromUser(user)); + mCallback.onPackagesUnsuspended(packageNames, user); } @Override @@ -158,8 +155,7 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo)); } - mCallback.onShortcutsChanged(packageName, shortcutInfoCompats, - UserHandleCompat.fromUser(user)); + mCallback.onShortcutsChanged(packageName, shortcutInfoCompats, user); } } } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 948471c5e8..192cb0cf14 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -23,6 +23,8 @@ import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageInstaller.SessionInfo; import android.os.Build; import android.os.Handler; +import android.os.Process; +import android.os.UserHandle; import android.util.SparseArray; import com.android.launcher3.IconCache; @@ -52,7 +54,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public HashMap updateAndGetActiveSessionCache() { HashMap activePackages = new HashMap<>(); - UserHandleCompat user = UserHandleCompat.myUserHandle(); + UserHandle user = Process.myUserHandle(); for (SessionInfo info : mInstaller.getAllSessions()) { addSessionInfoToCache(info, user); if (info.getAppPackageName() != null) { @@ -63,7 +65,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { return activePackages; } - @Thunk void addSessionInfoToCache(SessionInfo info, UserHandleCompat user) { + @Thunk void addSessionInfoToCache(SessionInfo info, UserHandle user) { String packageName = info.getAppPackageName(); if (packageName != null) { mCache.cachePackageInstallInfo(packageName, user, info.getAppIcon(), @@ -124,7 +126,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { private void pushSessionDisplayToLauncher(int sessionId) { SessionInfo session = mInstaller.getSessionInfo(sessionId); if (session != null && session.getAppPackageName() != null) { - addSessionInfoToCache(session, UserHandleCompat.myUserHandle()); + addSessionInfoToCache(session, Process.myUserHandle()); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); if (app != null) { diff --git a/src/com/android/launcher3/compat/UserHandleCompat.java b/src/com/android/launcher3/compat/UserHandleCompat.java deleted file mode 100644 index 50af21b968..0000000000 --- a/src/com/android/launcher3/compat/UserHandleCompat.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.annotation.TargetApi; -import android.content.Intent; -import android.os.Build; -import android.os.UserHandle; -import com.android.launcher3.Utilities; - -public class UserHandleCompat { - private UserHandle mUser; - - private UserHandleCompat(UserHandle user) { - mUser = user; - } - - private UserHandleCompat() { - } - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) - public static UserHandleCompat myUserHandle() { - if (Utilities.ATLEAST_JB_MR1) { - return new UserHandleCompat(android.os.Process.myUserHandle()); - } else { - return new UserHandleCompat(); - } - } - - public static UserHandleCompat fromUser(UserHandle user) { - if (user == null) { - return null; - } else { - return new UserHandleCompat(user); - } - } - - public UserHandle getUser() { - return mUser; - } - - @Override - public String toString() { - if (Utilities.ATLEAST_JB_MR1) { - return mUser.toString(); - } else { - return ""; - } - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof UserHandleCompat)) { - return false; - } - if (Utilities.ATLEAST_JB_MR1) { - return mUser.equals(((UserHandleCompat) other).mUser); - } else { - return true; - } - } - - @Override - public int hashCode() { - if (Utilities.ATLEAST_JB_MR1) { - return mUser.hashCode(); - } else { - return 0; - } - } - - /** - * Adds {@link UserHandle} to the intent in for L or above. - * Pre-L the launcher doesn't support showing apps for multiple - * profiles so this is a no-op. - */ - public void addToIntent(Intent intent, String name) { - if (Utilities.ATLEAST_LOLLIPOP && mUser != null) { - intent.putExtra(name, mUser); - } - } - - public static UserHandleCompat fromIntent(Intent intent) { - if (Utilities.ATLEAST_LOLLIPOP) { - UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); - if (user != null) { - return UserHandleCompat.fromUser(user); - } - } - return null; - } -} diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index b40eaa2608..24c95b11e7 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -17,6 +17,7 @@ package com.android.launcher3.compat; import android.content.Context; +import android.os.UserHandle; import com.android.launcher3.Utilities; @@ -55,13 +56,13 @@ public abstract class UserManagerCompat { */ public abstract void enableAndResetCache(); - public abstract List getUserProfiles(); - public abstract long getSerialNumberForUser(UserHandleCompat user); - public abstract UserHandleCompat getUserForSerialNumber(long serialNumber); - public abstract CharSequence getBadgedLabelForUser(CharSequence label, UserHandleCompat user); - public abstract long getUserCreationTime(UserHandleCompat user); - public abstract boolean isQuietModeEnabled(UserHandleCompat user); - public abstract boolean isUserUnlocked(UserHandleCompat user); + public abstract List getUserProfiles(); + public abstract long getSerialNumberForUser(UserHandle user); + public abstract UserHandle getUserForSerialNumber(long serialNumber); + public abstract CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user); + public abstract long getUserCreationTime(UserHandle user); + public abstract boolean isQuietModeEnabled(UserHandle user); + public abstract boolean isUserUnlocked(UserHandle user); public abstract boolean isDemoUser(); } diff --git a/src/com/android/launcher3/compat/UserManagerCompatV16.java b/src/com/android/launcher3/compat/UserManagerCompatV16.java index 9bd4567a1e..60374aa151 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatV16.java +++ b/src/com/android/launcher3/compat/UserManagerCompatV16.java @@ -16,6 +16,9 @@ package com.android.launcher3.compat; +import android.os.Process; +import android.os.UserHandle; + import java.util.ArrayList; import java.util.List; @@ -24,26 +27,26 @@ public class UserManagerCompatV16 extends UserManagerCompat { UserManagerCompatV16() { } - public List getUserProfiles() { - List profiles = new ArrayList(1); - profiles.add(UserHandleCompat.myUserHandle()); + public List getUserProfiles() { + List profiles = new ArrayList(1); + profiles.add(Process.myUserHandle()); return profiles; } - public UserHandleCompat getUserForSerialNumber(long serialNumber) { - return UserHandleCompat.myUserHandle(); + public UserHandle getUserForSerialNumber(long serialNumber) { + return Process.myUserHandle(); } - public long getSerialNumberForUser(UserHandleCompat user) { + public long getSerialNumberForUser(UserHandle user) { return 0; } - public CharSequence getBadgedLabelForUser(CharSequence label, UserHandleCompat user) { + public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { return label; } @Override - public long getUserCreationTime(UserHandleCompat user) { + public long getUserCreationTime(UserHandle user) { return 0; } @@ -52,12 +55,12 @@ public class UserManagerCompatV16 extends UserManagerCompat { } @Override - public boolean isQuietModeEnabled(UserHandleCompat user) { + public boolean isQuietModeEnabled(UserHandle user) { return false; } @Override - public boolean isUserUnlocked(UserHandleCompat user) { + public boolean isUserUnlocked(UserHandle user) { return true; } diff --git a/src/com/android/launcher3/compat/UserManagerCompatV17.java b/src/com/android/launcher3/compat/UserManagerCompatV17.java index 75203b7f3e..08e8947503 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatV17.java +++ b/src/com/android/launcher3/compat/UserManagerCompatV17.java @@ -19,6 +19,8 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; +import android.os.Process; +import android.os.UserHandle; import android.os.UserManager; import com.android.launcher3.util.LongArrayMap; @@ -28,10 +30,10 @@ import java.util.HashMap; @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public class UserManagerCompatV17 extends UserManagerCompatV16 { - protected LongArrayMap mUsers; + protected LongArrayMap mUsers; // Create a separate reverse map as LongArrayMap.indexOfValue checks if objects are same // and not {@link Object#equals} - protected HashMap mUserToSerialMap; + protected HashMap mUserToSerialMap; protected UserManager mUserManager; @@ -39,23 +41,23 @@ public class UserManagerCompatV17 extends UserManagerCompatV16 { mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); } - public long getSerialNumberForUser(UserHandleCompat user) { + public long getSerialNumberForUser(UserHandle user) { synchronized (this) { if (mUserToSerialMap != null) { Long serial = mUserToSerialMap.get(user); return serial == null ? 0 : serial; } } - return mUserManager.getSerialNumberForUser(user.getUser()); + return mUserManager.getSerialNumberForUser(user); } - public UserHandleCompat getUserForSerialNumber(long serialNumber) { + public UserHandle getUserForSerialNumber(long serialNumber) { synchronized (this) { if (mUsers != null) { return mUsers.get(serialNumber); } } - return UserHandleCompat.fromUser(mUserManager.getUserForSerialNumber(serialNumber)); + return mUserManager.getUserForSerialNumber(serialNumber); } @Override @@ -63,8 +65,8 @@ public class UserManagerCompatV17 extends UserManagerCompatV16 { synchronized (this) { mUsers = new LongArrayMap<>(); mUserToSerialMap = new HashMap<>(); - UserHandleCompat myUser = UserHandleCompat.myUserHandle(); - long serial = mUserManager.getSerialNumberForUser(myUser.getUser()); + UserHandle myUser = Process.myUserHandle(); + long serial = mUserManager.getSerialNumberForUser(myUser); mUsers.put(serial, myUser); mUserToSerialMap.put(myUser, serial); } diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index 2552b0c2cf..277460281d 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -53,46 +53,35 @@ public class UserManagerCompatVL extends UserManagerCompatV17 { if (users != null) { for (UserHandle user : users) { long serial = mUserManager.getSerialNumberForUser(user); - UserHandleCompat userCompat = UserHandleCompat.fromUser(user); - mUsers.put(serial, userCompat); - mUserToSerialMap.put(userCompat, serial); + mUsers.put(serial, user); + mUserToSerialMap.put(user, serial); } } } } @Override - public List getUserProfiles() { + public List getUserProfiles() { synchronized (this) { if (mUsers != null) { - List users = new ArrayList<>(); - users.addAll(mUserToSerialMap.keySet()); - return users; + return new ArrayList<>(mUserToSerialMap.keySet()); } } List users = mUserManager.getUserProfiles(); - if (users == null) { - return Collections.emptyList(); - } - ArrayList compatUsers = new ArrayList( - users.size()); - for (UserHandle user : users) { - compatUsers.add(UserHandleCompat.fromUser(user)); - } - return compatUsers; + return users == null ? Collections.emptyList() : users; } @Override - public CharSequence getBadgedLabelForUser(CharSequence label, UserHandleCompat user) { + public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { if (user == null) { return label; } - return mPm.getUserBadgedLabel(label, user.getUser()); + return mPm.getUserBadgedLabel(label, user); } @Override - public long getUserCreationTime(UserHandleCompat user) { + public long getUserCreationTime(UserHandle user) { SharedPreferences prefs = Utilities.getPrefs(mContext); String key = USER_CREATION_TIME_KEY + getSerialNumberForUser(user); if (!prefs.contains(key)) { diff --git a/src/com/android/launcher3/compat/UserManagerCompatVM.java b/src/com/android/launcher3/compat/UserManagerCompatVM.java index 81d67ea435..75c1877139 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVM.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVM.java @@ -19,6 +19,7 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; +import android.os.UserHandle; @TargetApi(Build.VERSION_CODES.M) public class UserManagerCompatVM extends UserManagerCompatVL { @@ -28,7 +29,7 @@ public class UserManagerCompatVM extends UserManagerCompatVL { } @Override - public long getUserCreationTime(UserHandleCompat user) { - return mUserManager.getUserCreationTime(user.getUser()); + public long getUserCreationTime(UserHandle user) { + return mUserManager.getUserCreationTime(user); } } diff --git a/src/com/android/launcher3/compat/UserManagerCompatVN.java b/src/com/android/launcher3/compat/UserManagerCompatVN.java index 4edac0522b..50a02178d5 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVN.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVN.java @@ -19,8 +19,7 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; - -import com.android.launcher3.Utilities; +import android.os.UserHandle; @TargetApi(Build.VERSION_CODES.N) public class UserManagerCompatVN extends UserManagerCompatVM { @@ -30,13 +29,13 @@ public class UserManagerCompatVN extends UserManagerCompatVM { } @Override - public boolean isQuietModeEnabled(UserHandleCompat user) { - return mUserManager.isQuietModeEnabled(user.getUser()); + public boolean isQuietModeEnabled(UserHandle user) { + return mUserManager.isQuietModeEnabled(user); } @Override - public boolean isUserUnlocked(UserHandleCompat user) { - return mUserManager.isUserUnlocked(user.getUser()); + public boolean isUserUnlocked(UserHandle user) { + return mUserManager.isUserUnlocked(user); } } diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 6f9f7ffc92..c59b3a3a6a 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -33,11 +33,12 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; import android.os.Build; +import android.os.Process; +import android.os.UserHandle; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.FeatureFlags; /** @@ -105,7 +106,7 @@ public class LauncherIcons { */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static Bitmap createBadgedIconBitmap( - Drawable icon, UserHandleCompat user, Context context) { + Drawable icon, UserHandle user, Context context) { float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? 1 : IconNormalizer.getInstance().getScale(icon, null); Bitmap bitmap = createIconBitmap(icon, context, scale); @@ -115,12 +116,12 @@ public class LauncherIcons { /** * Badges the provided icon with the user badge if required. */ - public static Bitmap badgeIconForUser(Bitmap icon, UserHandleCompat user, Context context) { + public static Bitmap badgeIconForUser(Bitmap icon, UserHandle user, Context context) { if (Utilities.ATLEAST_LOLLIPOP && user != null - && !UserHandleCompat.myUserHandle().equals(user)) { + && !Process.myUserHandle().equals(user)) { BitmapDrawable drawable = new FixedSizeBitmapDrawable(icon); Drawable badged = context.getPackageManager().getUserBadgedIcon( - drawable, user.getUser()); + drawable, user); if (badged instanceof BitmapDrawable) { return ((BitmapDrawable) badged).getBitmap(); } else { diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 4cbb0879b6..a9ceb0256a 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -17,6 +17,7 @@ package com.android.launcher3.model; import android.content.Context; import android.content.Intent; +import android.os.UserHandle; import android.util.LongSparseArray; import android.util.Pair; @@ -32,7 +33,6 @@ import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.Provider; @@ -141,7 +141,7 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { * Returns true if the shortcuts already exists on the workspace. This must be called after * the workspace has been loaded. We identify a shortcut by its intent. */ - protected boolean shortcutExists(BgDataModel dataModel, Intent intent, UserHandleCompat user) { + protected boolean shortcutExists(BgDataModel dataModel, Intent intent, UserHandle user) { final String intentWithPkg, intentWithoutPkg; if (intent.getComponent() != null) { // If component is not null, an intent with null package will produce diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 3d54637244..05f43aff4c 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; import android.content.Context; +import android.os.UserHandle; import android.util.Log; import android.util.MutableInt; @@ -26,7 +27,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -216,7 +216,7 @@ public class BgDataModel { * Clear all the deep shortcuts for the given package, and re-add the new shortcuts. */ public synchronized void updateDeepShortcutMap( - String packageName, UserHandleCompat user, List shortcuts) { + String packageName, UserHandle user, List shortcuts) { if (packageName != null) { Iterator keysIter = deepShortcutMap.keySet().iterator(); while (keysIter.hasNext()) { diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index 64771d530a..9d693a40ee 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; import android.content.ComponentName; +import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.AppInfo; @@ -27,7 +28,6 @@ import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import java.util.ArrayList; import java.util.HashSet; @@ -41,10 +41,10 @@ public class CacheDataUpdatedTask extends ExtendedModelTask { public static final int OP_SESSION_UPDATE = 2; private final int mOp; - private final UserHandleCompat mUser; + private final UserHandle mUser; private final HashSet mPackages; - public CacheDataUpdatedTask(int op, UserHandleCompat user, HashSet packages) { + public CacheDataUpdatedTask(int op, UserHandle user, HashSet packages) { mOp = op; mUser = user; mPackages = packages; diff --git a/src/com/android/launcher3/model/ExtendedModelTask.java b/src/com/android/launcher3/model/ExtendedModelTask.java index ccc6007685..05419662bc 100644 --- a/src/com/android/launcher3/model/ExtendedModelTask.java +++ b/src/com/android/launcher3/model/ExtendedModelTask.java @@ -15,11 +15,12 @@ */ package com.android.launcher3.model; +import android.os.UserHandle; + +import com.android.launcher3.LauncherModel.BaseModelUpdateTask; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; -import com.android.launcher3.LauncherModel.BaseModelUpdateTask; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.MultiHashMap; @@ -31,14 +32,14 @@ import java.util.ArrayList; public abstract class ExtendedModelTask extends BaseModelUpdateTask { public void bindUpdatedShortcuts( - ArrayList updatedShortcuts, UserHandleCompat user) { + ArrayList updatedShortcuts, UserHandle user) { bindUpdatedShortcuts(updatedShortcuts, new ArrayList(), user); } public void bindUpdatedShortcuts( final ArrayList updatedShortcuts, final ArrayList removedShortcuts, - final UserHandleCompat user) { + final UserHandle user) { if (!updatedShortcuts.isEmpty() || !removedShortcuts.isEmpty()) { scheduleCallbackTask(new CallbackTask() { @Override diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index aae3490a7a..bafa95b6c6 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; +import android.os.UserHandle; import android.util.Log; import com.android.launcher3.AllAppsList; @@ -38,7 +39,6 @@ import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; @@ -70,10 +70,10 @@ public class PackageUpdatedTask extends ExtendedModelTask { public static final int OP_USER_AVAILABILITY_CHANGE = 7; // user available/unavailable private final int mOp; - private final UserHandleCompat mUser; + private final UserHandle mUser; private final String[] mPackages; - public PackageUpdatedTask(int op, UserHandleCompat user, String... packages) { + public PackageUpdatedTask(int op, UserHandle user, String... packages) { mOp = op; mUser = user; mPackages = packages; diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java index 54260c9153..d710de84ee 100644 --- a/src/com/android/launcher3/model/SdCardAvailableReceiver.java +++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java @@ -20,11 +20,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.UserHandle; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; @@ -43,10 +42,10 @@ public class SdCardAvailableReceiver extends BroadcastReceiver { private final LauncherModel mModel; private final Context mContext; - private final MultiHashMap mPackages; + private final MultiHashMap mPackages; public SdCardAvailableReceiver(LauncherModel model, Context context, - MultiHashMap packages) { + MultiHashMap packages) { mModel = model; mContext = context; mPackages = packages; @@ -56,8 +55,8 @@ public class SdCardAvailableReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final PackageManager manager = context.getPackageManager(); - for (Entry> entry : mPackages.entrySet()) { - UserHandleCompat user = entry.getKey(); + for (Entry> entry : mPackages.entrySet()) { + UserHandle user = entry.getKey(); final ArrayList packagesRemoved = new ArrayList<>(); final ArrayList packagesUnavailable = new ArrayList<>(); diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 3314353b76..3750a7e638 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; import android.content.Context; +import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.ItemInfo; @@ -23,7 +24,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.MultiHashMap; @@ -38,11 +38,11 @@ public class ShortcutsChangedTask extends ExtendedModelTask { private final String mPackageName; private final List mShortcuts; - private final UserHandleCompat mUser; + private final UserHandle mUser; private final boolean mUpdateIdMap; public ShortcutsChangedTask(String packageName, List shortcuts, - UserHandleCompat user, boolean updateIdMap) { + UserHandle user, boolean updateIdMap) { mPackageName = packageName; mShortcuts = shortcuts; mUser = user; diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index a89fe0bd7c..15496b8963 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; import android.content.Context; +import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.ItemInfo; @@ -23,7 +24,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -40,9 +40,9 @@ import java.util.List; */ public class UserLockStateChangedTask extends ExtendedModelTask { - private final UserHandleCompat mUser; + private final UserHandle mUser; - public UserLockStateChangedTask(UserHandleCompat user) { + public UserLockStateChangedTask(UserHandle user) { mUser = user; } diff --git a/src/com/android/launcher3/model/WidgetItem.java b/src/com/android/launcher3/model/WidgetItem.java index 0d7ba1e112..a079301bc9 100644 --- a/src/com/android/launcher3/model/WidgetItem.java +++ b/src/com/android/launcher3/model/WidgetItem.java @@ -4,13 +4,14 @@ import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.Process; +import android.os.UserHandle; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ComponentKey; import java.text.Collator; @@ -22,7 +23,7 @@ import java.text.Collator; */ public class WidgetItem extends ComponentKey implements Comparable { - private static UserHandleCompat sMyUserHandle; + private static UserHandle sMyUserHandle; private static Collator sCollator; public final LauncherAppWidgetProviderInfo widgetInfo; @@ -45,7 +46,7 @@ public class WidgetItem extends ComponentKey implements Comparable { public WidgetItem(ResolveInfo info, PackageManager pm) { super(new ComponentName(info.activityInfo.packageName, info.activityInfo.name), - UserHandleCompat.myUserHandle()); + Process.myUserHandle()); label = Utilities.trim(info.loadLabel(pm)); widgetInfo = null; activityInfo = info.activityInfo; @@ -56,7 +57,7 @@ public class WidgetItem extends ComponentKey implements Comparable { public int compareTo(WidgetItem another) { if (sMyUserHandle == null) { // Delay these object creation until required. - sMyUserHandle = UserHandleCompat.myUserHandle(); + sMyUserHandle = Process.myUserHandle(); sCollator = Collator.getInstance(); } diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 5ad6f0fff2..59dc859afe 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -6,6 +6,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.Process; +import android.os.UserHandle; import android.util.Log; import com.android.launcher3.AppFilter; @@ -15,7 +17,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.Preconditions; @@ -99,7 +100,7 @@ public class WidgetsModel { mWidgetsList.clear(); InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); - UserHandleCompat myUser = UserHandleCompat.myUserHandle(); + UserHandle myUser = Process.myUserHandle(); // add and update. for (WidgetItem item: rawWidgetsShortcuts) { diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 5cb34e856e..9d8e62ae5f 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -44,7 +44,6 @@ import com.android.launcher3.LauncherSettings.WorkspaceScreens; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; @@ -130,7 +129,7 @@ public class ImportDataTask { private void importWorkspaceItems( long firsetScreenId, LongSparseArray screenIdMap) throws Exception { String profileId = Long.toString(UserManagerCompat.getInstance(mContext) - .getSerialNumberForUser(UserHandleCompat.myUserHandle())); + .getSerialNumberForUser(Process.myUserHandle())); boolean createEmptyRowOnFirstScreen = false; if (FeatureFlags.QSB_ON_FIRST_SCREEN) { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 41f1a47af1..941391362a 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -25,12 +25,12 @@ import android.content.pm.ShortcutInfo; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.UserHandle; import android.util.Log; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.UserHandleCompat; import java.util.ArrayList; import java.util.Collections; @@ -83,7 +83,7 @@ public class DeepShortcutManager { * because we only get "key" fields in onShortcutsChanged(). */ public List queryForFullDetails(String packageName, - List shortcutIds, UserHandleCompat user) { + List shortcutIds, UserHandle user) { return query(FLAG_GET_ALL, packageName, null, shortcutIds, user); } @@ -92,7 +92,7 @@ public class DeepShortcutManager { * to be displayed in the shortcuts container on long press. */ public List queryForShortcutsContainer(ComponentName activity, - List ids, UserHandleCompat user) { + List ids, UserHandle user) { return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC, activity.getPackageName(), activity, ids, user); } @@ -106,11 +106,11 @@ public class DeepShortcutManager { if (Utilities.ATLEAST_NOUGAT_MR1) { String packageName = key.componentName.getPackageName(); String id = key.getId(); - UserHandleCompat user = key.user; + UserHandle user = key.user; List pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); pinnedIds.remove(id); try { - mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); + mLauncherApps.pinShortcuts(packageName, pinnedIds, user); mWasLastCallSuccess = true; } catch (SecurityException|IllegalStateException e) { Log.w(TAG, "Failed to unpin shortcut", e); @@ -128,11 +128,11 @@ public class DeepShortcutManager { if (Utilities.ATLEAST_NOUGAT_MR1) { String packageName = key.componentName.getPackageName(); String id = key.getId(); - UserHandleCompat user = key.user; + UserHandle user = key.user; List pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); pinnedIds.add(id); try { - mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); + mLauncherApps.pinShortcuts(packageName, pinnedIds, user); mWasLastCallSuccess = true; } catch (SecurityException|IllegalStateException e) { Log.w(TAG, "Failed to pin shortcut", e); @@ -143,11 +143,11 @@ public class DeepShortcutManager { @TargetApi(25) public void startShortcut(String packageName, String id, Rect sourceBounds, - Bundle startActivityOptions, UserHandleCompat user) { + Bundle startActivityOptions, UserHandle user) { if (Utilities.ATLEAST_NOUGAT_MR1) { try { mLauncherApps.startShortcut(packageName, id, sourceBounds, - startActivityOptions, user.getUser()); + startActivityOptions, user); mWasLastCallSuccess = true; } catch (SecurityException|IllegalStateException e) { Log.e(TAG, "Failed to start shortcut", e); @@ -177,12 +177,11 @@ public class DeepShortcutManager { * * If packageName is null, returns all pinned shortcuts regardless of package. */ - public List queryForPinnedShortcuts(String packageName, - UserHandleCompat user) { + public List queryForPinnedShortcuts(String packageName, UserHandle user) { return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user); } - public List queryForAllShortcuts(UserHandleCompat user) { + public List queryForAllShortcuts(UserHandle user) { return query(FLAG_GET_ALL, null, null, null, user); } @@ -202,7 +201,7 @@ public class DeepShortcutManager { */ @TargetApi(25) private List query(int flags, String packageName, - ComponentName activity, List shortcutIds, UserHandleCompat user) { + ComponentName activity, List shortcutIds, UserHandle user) { if (Utilities.ATLEAST_NOUGAT_MR1) { ShortcutQuery q = new ShortcutQuery(); q.setQueryFlags(flags); @@ -213,7 +212,7 @@ public class DeepShortcutManager { } List shortcutInfos = null; try { - shortcutInfos = mLauncherApps.getShortcuts(q, user.getUser()); + shortcutInfos = mLauncherApps.getShortcuts(q, user); mWasLastCallSuccess = true; } catch (SecurityException|IllegalStateException e) { Log.e(TAG, "Failed to query for shortcuts", e); diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 9cbd5f8f29..e547f44689 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -34,6 +34,7 @@ import android.graphics.drawable.ShapeDrawable; import android.os.Build; import android.os.Handler; import android.os.Looper; +import android.os.UserHandle; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; @@ -60,7 +61,6 @@ import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.accessibility.ShortcutMenuAccessibilityDelegate; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; @@ -161,7 +161,7 @@ public class DeepShortcutsContainer extends AbstractFloatingView final Looper workerLooper = LauncherModel.getWorkerLooper(); final Handler uiHandler = new Handler(Looper.getMainLooper()); final ItemInfo originalInfo = (ItemInfo) originalIcon.getTag(); - final UserHandleCompat user = originalInfo.user; + final UserHandle user = originalInfo.user; final ComponentName activity = originalInfo.getTargetComponent(); new Handler(workerLooper).postAtFrontOfQueue(new Runnable() { @Override diff --git a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java index a6da6683c3..acc632c36f 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java +++ b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java @@ -22,11 +22,11 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.os.Build; +import android.os.UserHandle; import com.android.launcher3.ItemInfo; import com.android.launcher3.compat.DeferredLauncherActivityInfo; import com.android.launcher3.compat.LauncherActivityInfoCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; /** @@ -86,8 +86,8 @@ public class ShortcutInfoCompat { return mShortcutInfo.getActivity(); } - public UserHandleCompat getUserHandle() { - return UserHandleCompat.fromUser(mShortcutInfo.getUserHandle()); + public UserHandle getUserHandle() { + return mShortcutInfo.getUserHandle(); } public boolean hasKeyFieldsOnly() { diff --git a/src/com/android/launcher3/shortcuts/ShortcutKey.java b/src/com/android/launcher3/shortcuts/ShortcutKey.java index a219c54944..8f72666323 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutKey.java +++ b/src/com/android/launcher3/shortcuts/ShortcutKey.java @@ -2,9 +2,9 @@ package com.android.launcher3.shortcuts; import android.content.ComponentName; import android.content.Intent; +import android.os.UserHandle; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.util.ComponentKey; /** @@ -12,7 +12,7 @@ import com.android.launcher3.util.ComponentKey; */ public class ShortcutKey extends ComponentKey { - public ShortcutKey(String packageName, UserHandleCompat user, String id) { + public ShortcutKey(String packageName, UserHandle user, String id) { // Use the id as the class name. super(new ComponentName(packageName, id), user); } @@ -26,7 +26,7 @@ public class ShortcutKey extends ComponentKey { shortcutInfo.getId()); } - public static ShortcutKey fromIntent(Intent intent, UserHandleCompat user) { + public static ShortcutKey fromIntent(Intent intent, UserHandle user) { String shortcutId = intent.getStringExtra( ShortcutInfoCompat.EXTRA_SHORTCUT_ID); return new ShortcutKey(intent.getPackage(), user, shortcutId); diff --git a/src/com/android/launcher3/util/CachedPackageTracker.java b/src/com/android/launcher3/util/CachedPackageTracker.java index 293714eb9f..ab5f44ff24 100644 --- a/src/com/android/launcher3/util/CachedPackageTracker.java +++ b/src/com/android/launcher3/util/CachedPackageTracker.java @@ -18,12 +18,12 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; +import android.os.UserHandle; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.LauncherAppsCompat.OnAppsChangedCallbackCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import java.util.ArrayList; @@ -55,7 +55,7 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa * Checks the list of user apps, and generates package event accordingly. * {@see #onLauncherAppsAdded}, {@see #onLauncherPackageRemoved} */ - public void processUserApps(List apps, UserHandleCompat user) { + public void processUserApps(List apps, UserHandle user) { String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); HashSet oldPackageSet = new HashSet<>(); final boolean userAppsExisted = getUserApps(oldPackageSet, prefKey); @@ -107,7 +107,7 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa } @Override - public void onPackageRemoved(String packageName, UserHandleCompat user) { + public void onPackageRemoved(String packageName, UserHandle user) { String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); HashSet packageSet = new HashSet<>(); if (getUserApps(packageSet, prefKey) && packageSet.remove(packageName)) { @@ -118,7 +118,7 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa } @Override - public void onPackageAdded(String packageName, UserHandleCompat user) { + public void onPackageAdded(String packageName, UserHandle user) { String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); HashSet packageSet = new HashSet<>(); final boolean userAppsExisted = getUserApps(packageSet, prefKey); @@ -138,21 +138,21 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa } @Override - public void onPackageChanged(String packageName, UserHandleCompat user) { } + public void onPackageChanged(String packageName, UserHandle user) { } @Override public void onPackagesAvailable( - String[] packageNames, UserHandleCompat user, boolean replacing) { } + String[] packageNames, UserHandle user, boolean replacing) { } @Override public void onPackagesUnavailable( - String[] packageNames, UserHandleCompat user, boolean replacing) { } + String[] packageNames, UserHandle user, boolean replacing) { } @Override - public void onPackagesSuspended(String[] packageNames, UserHandleCompat user) { } + public void onPackagesSuspended(String[] packageNames, UserHandle user) { } @Override - public void onPackagesUnsuspended(String[] packageNames, UserHandleCompat user) { } + public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { } /** * Called when new launcher apps are added. @@ -163,12 +163,12 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa * when Launcher was newly installed or a new user was added. */ protected abstract void onLauncherAppsAdded(List apps, - UserHandleCompat user, boolean userAppsExisted); + UserHandle user, boolean userAppsExisted); /** * Called when apps are removed from the system. */ - protected abstract void onLauncherPackageRemoved(String packageName, UserHandleCompat user); + protected abstract void onLauncherPackageRemoved(String packageName, UserHandle user); public static class LauncherActivityInstallInfo implements Comparable { diff --git a/src/com/android/launcher3/util/ComponentKey.java b/src/com/android/launcher3/util/ComponentKey.java index 5882f217d3..242df2eb5f 100644 --- a/src/com/android/launcher3/util/ComponentKey.java +++ b/src/com/android/launcher3/util/ComponentKey.java @@ -18,8 +18,9 @@ package com.android.launcher3.util; import android.content.ComponentName; import android.content.Context; +import android.os.Process; +import android.os.UserHandle; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; import java.util.Arrays; @@ -27,11 +28,11 @@ import java.util.Arrays; public class ComponentKey { public final ComponentName componentName; - public final UserHandleCompat user; + public final UserHandle user; private final int mHashCode; - public ComponentKey(ComponentName componentName, UserHandleCompat user) { + public ComponentKey(ComponentName componentName, UserHandle user) { Preconditions.assertNotNull(componentName); Preconditions.assertNotNull(user); this.componentName = componentName; @@ -56,7 +57,7 @@ public class ComponentKey { } else { // No user provided, default to the current user componentName = ComponentName.unflattenFromString(componentKeyStr); - user = UserHandleCompat.myUserHandle(); + user = Process.myUserHandle(); } Preconditions.assertNotNull(componentName); Preconditions.assertNotNull(user); diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java index 33d979c189..1c347c0a41 100644 --- a/src/com/android/launcher3/util/ContentWriter.java +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -20,11 +20,11 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.os.UserHandle; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; /** @@ -36,7 +36,7 @@ public class ContentWriter { private final Context mContext; private Bitmap mIcon; - private UserHandleCompat mUser; + private UserHandle mUser; public ContentWriter(Context context) { this(new ContentValues(), context); @@ -72,13 +72,13 @@ public class ContentWriter { return this; } - public ContentWriter putIcon(Bitmap value, UserHandleCompat user) { + public ContentWriter putIcon(Bitmap value, UserHandle user) { mIcon = value; mUser = user; return this; } - public ContentWriter put(String key, UserHandleCompat user) { + public ContentWriter put(String key, UserHandle user) { return put(key, UserManagerCompat.getInstance(mContext).getSerialNumberForUser(user)); } diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index 8f985c344b..b6e0e6e295 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -17,13 +17,13 @@ package com.android.launcher3.util; import android.content.ComponentName; +import android.os.UserHandle; import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.shortcuts.ShortcutKey; import java.util.HashSet; @@ -66,7 +66,7 @@ public abstract class ItemInfoMatcher { return filtered; } - public static ItemInfoMatcher ofUser(final UserHandleCompat user) { + public static ItemInfoMatcher ofUser(final UserHandle user) { return new ItemInfoMatcher() { @Override public boolean matches(ItemInfo info, ComponentName cn) { @@ -76,7 +76,7 @@ public abstract class ItemInfoMatcher { } public static ItemInfoMatcher ofComponents( - final HashSet components, final UserHandleCompat user) { + final HashSet components, final UserHandle user) { return new ItemInfoMatcher() { @Override public boolean matches(ItemInfo info, ComponentName cn) { @@ -86,7 +86,7 @@ public abstract class ItemInfoMatcher { } public static ItemInfoMatcher ofPackages( - final HashSet packageNames, final UserHandleCompat user) { + final HashSet packageNames, final UserHandle user) { return new ItemInfoMatcher() { @Override public boolean matches(ItemInfo info, ComponentName cn) { diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index 6b4021f31e..2d9e368d43 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -18,6 +18,8 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; +import android.os.Process; +import android.os.UserHandle; import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; @@ -31,9 +33,8 @@ import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherActivityInfoCompat; -import com.android.launcher3.shortcuts.ShortcutInfoCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; import java.util.ArrayList; import java.util.HashSet; @@ -57,8 +58,8 @@ public class ManagedProfileHeuristic { */ private static final long AUTO_ADD_TO_FOLDER_DURATION = 8 * 60 * 60 * 1000; - public static ManagedProfileHeuristic get(Context context, UserHandleCompat user) { - if (Utilities.ATLEAST_LOLLIPOP && !UserHandleCompat.myUserHandle().equals(user)) { + public static ManagedProfileHeuristic get(Context context, UserHandle user) { + if (!Process.myUserHandle().equals(user)) { return new ManagedProfileHeuristic(context, user); } return null; @@ -66,10 +67,10 @@ public class ManagedProfileHeuristic { private final Context mContext; private final LauncherModel mModel; - private final UserHandleCompat mUser; + private final UserHandle mUser; private final IconCache mIconCache; - private ManagedProfileHeuristic(Context context, UserHandleCompat user) { + private ManagedProfileHeuristic(Context context, UserHandle user) { mContext = context; mUser = user; mModel = LauncherAppState.getInstance().getModel(); @@ -104,7 +105,7 @@ public class ManagedProfileHeuristic { } protected void onLauncherAppsAdded( - List apps, UserHandleCompat user, boolean userAppsExisted) { + List apps, UserHandle user, boolean userAppsExisted) { ArrayList workFolderApps = new ArrayList<>(); ArrayList homescreenApps = new ArrayList<>(); @@ -132,14 +133,14 @@ public class ManagedProfileHeuristic { } @Override - protected void onLauncherPackageRemoved(String packageName, UserHandleCompat user) { + protected void onLauncherPackageRemoved(String packageName, UserHandle user) { } /** * Adds and binds shortcuts marked to be added to the work folder. */ private void finalizeWorkFolder( - UserHandleCompat user, final ArrayList workFolderApps, + UserHandle user, final ArrayList workFolderApps, ArrayList homescreenApps) { if (workFolderApps.isEmpty()) { return; @@ -190,7 +191,7 @@ public class ManagedProfileHeuristic { @Override public void onShortcutsChanged(String packageName, List shortcuts, - UserHandleCompat user) { + UserHandle user) { // Do nothing } } @@ -209,13 +210,13 @@ public class ManagedProfileHeuristic { /** * Verifies that entries corresponding to {@param users} exist and removes all invalid entries. */ - public static void processAllUsers(List users, Context context) { + public static void processAllUsers(List users, Context context) { if (!Utilities.ATLEAST_LOLLIPOP) { return; } UserManagerCompat userManager = UserManagerCompat.getInstance(context); HashSet validKeys = new HashSet(); - for (UserHandleCompat user : users) { + for (UserHandle user : users) { addAllUserKeys(userManager.getSerialNumberForUser(user), validKeys); } @@ -242,10 +243,10 @@ public class ManagedProfileHeuristic { */ public static void markExistingUsersForNoFolderCreation(Context context) { UserManagerCompat userManager = UserManagerCompat.getInstance(context); - UserHandleCompat myUser = UserHandleCompat.myUserHandle(); + UserHandle myUser = Process.myUserHandle(); SharedPreferences prefs = null; - for (UserHandleCompat user : userManager.getUserProfiles()) { + for (UserHandle user : userManager.getUserProfiles()) { if (myUser.equals(user)) { continue; } diff --git a/src/com/android/launcher3/widget/WidgetItemComparator.java b/src/com/android/launcher3/widget/WidgetItemComparator.java index b5aaeb9fed..ee23cfbb16 100644 --- a/src/com/android/launcher3/widget/WidgetItemComparator.java +++ b/src/com/android/launcher3/widget/WidgetItemComparator.java @@ -15,7 +15,9 @@ */ package com.android.launcher3.widget; -import com.android.launcher3.compat.UserHandleCompat; +import android.os.Process; +import android.os.UserHandle; + import com.android.launcher3.model.WidgetItem; import java.text.Collator; @@ -26,7 +28,7 @@ import java.util.Comparator; */ public class WidgetItemComparator implements Comparator { - private final UserHandleCompat mMyUserHandle = UserHandleCompat.myUserHandle(); + private final UserHandle mMyUserHandle = Process.myUserHandle(); private final Collator mCollator = Collator.getInstance(); @Override diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 5628e82912..f23a574e95 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -6,6 +6,8 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; +import android.os.Process; +import android.os.UserHandle; import android.support.test.InstrumentationRegistry; import android.test.ProviderTestCase2; @@ -17,10 +19,9 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; -import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherModel.BaseModelUpdateTask; +import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.compat.LauncherActivityInfoCompat; -import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.TestLauncherProvider; @@ -46,7 +47,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2> fieldCache = new HashMap<>(); public Context targetContext; - public UserHandleCompat myUser; + public UserHandle myUser; public InvariantDeviceProfile idp; public LauncherAppState appState; @@ -66,7 +67,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 Date: Fri, 16 Dec 2016 09:15:32 -0800 Subject: [PATCH 158/382] Using support lib for isAtleastO check Bug: 32610406 Change-Id: I89b3c4f0c99ac605883677cf0becaab0fbf48a86 --- src/com/android/launcher3/Utilities.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 3e44e33be6..6485fc1373 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -41,6 +41,7 @@ import android.os.Bundle; import android.os.DeadObjectException; import android.os.PowerManager; import android.os.TransactionTooLargeException; +import android.support.v4.os.BuildCompat; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; @@ -89,9 +90,7 @@ public final class Utilities { private static final Matrix sInverseMatrix = new Matrix(); public static boolean isAtLeastO() { - // TODO: Clean this up: b/32610406 - return !"REL".equals(Build.VERSION.CODENAME) - && "O".compareTo(Build.VERSION.CODENAME) <= 0; + return BuildCompat.isAtLeastO(); } public static final boolean ATLEAST_NOUGAT_MR1 = From aecb7cf97c822fd1fd3df2a366618f9d7a2ba579 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 15 Dec 2016 11:02:21 -0800 Subject: [PATCH 159/382] Updating edge scrolling logic during drag and drop Activating scroll to left when the either the visualCenter or the touchX enters the left screen first or right screen. Previously only the touch point was being considered to activating the scroll zone. But visual center is used everywhere else for actual drop location. So depending on the touch point relative to the picked icon, the touch zone could seem smaller or larger. Using both points (touch and visualCenter) will increase the scroll zone area with minimal effect on the drop location calculation. Bug: 31946075 Change-Id: I4eb5146c0f0a05e8d024313d67f8e040e0b29dec --- src/com/android/launcher3/Workspace.java | 131 ++++++++--------------- 1 file changed, 44 insertions(+), 87 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index cbea7e0783..8a423e3a59 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -178,7 +178,7 @@ public class Workspace extends PagedView private final int[] mTempXY = new int[2]; @Thunk float[] mDragViewVisualCenter = new float[2]; - private float[] mTempCellLayoutCenterCoordinates = new float[2]; + private float[] mTempTouchCoordinates = new float[2]; private SpringLoadedDragController mSpringLoadedDragController; private float mOverviewModeShrinkFactor; @@ -2776,7 +2776,8 @@ public class Workspace extends PagedView mAddToExistingFolderOnDrop = false; mDropToLayout = null; - setDropLayoutForDragObject(d); + mDragViewVisualCenter = d.getVisualCenter(mDragViewVisualCenter); + setDropLayoutForDragObject(d, mDragViewVisualCenter[0], mDragViewVisualCenter[1]); } @Override @@ -2946,68 +2947,6 @@ public class Workspace extends PagedView xy[1] += v.getTop(); } - static private float squaredDistance(float[] point1, float[] point2) { - float distanceX = point1[0] - point2[0]; - float distanceY = point2[1] - point2[1]; - return distanceX * distanceX + distanceY * distanceY; - } - - /* - * - * This method returns the CellLayout that is currently being dragged to. In order to drag - * to a CellLayout, either the touch point must be directly over the CellLayout, or as a second - * strategy, we see if the dragView is overlapping any CellLayout and choose the closest one - * - * Return null if no CellLayout is currently being dragged over - * - */ - private CellLayout findMatchingPageForDragOver( - DragView dragView, float originX, float originY, boolean exact) { - // We loop through all the screens (ie CellLayouts) and see which ones overlap - // with the item being dragged and then choose the one that's closest to the touch point - final int screenCount = getChildCount(); - CellLayout bestMatchingScreen = null; - float smallestDistSoFar = Float.MAX_VALUE; - - for (int i = 0; i < screenCount; i++) { - // The custom content screen is not a valid drag over option - if (mScreenOrder.get(i) == CUSTOM_CONTENT_SCREEN_ID) { - continue; - } - - CellLayout cl = (CellLayout) getChildAt(i); - - final float[] touchXy = {originX, originY}; - mapPointFromSelfToChild(cl, touchXy); - - if (touchXy[0] >= 0 && touchXy[0] <= cl.getWidth() && - touchXy[1] >= 0 && touchXy[1] <= cl.getHeight()) { - return cl; - } - - if (!exact) { - // Get the center of the cell layout in screen coordinates - final float[] cellLayoutCenter = mTempCellLayoutCenterCoordinates; - cellLayoutCenter[0] = cl.getWidth()/2; - cellLayoutCenter[1] = cl.getHeight()/2; - mapPointFromChildToSelf(cl, cellLayoutCenter); - - touchXy[0] = originX; - touchXy[1] = originY; - - // Calculate the distance between the center of the CellLayout - // and the touch point - float dist = squaredDistance(touchXy, cellLayoutCenter); - - if (dist < smallestDistSoFar) { - smallestDistSoFar = dist; - bestMatchingScreen = cl; - } - } - } - return bestMatchingScreen; - } - private boolean isDragWidget(DragObject d) { return (d.dragInfo instanceof LauncherAppWidgetInfo || d.dragInfo instanceof PendingAddWidgetInfo); @@ -3030,14 +2969,11 @@ public class Workspace extends PagedView mDragViewVisualCenter = d.getVisualCenter(mDragViewVisualCenter); final View child = (mDragInfo == null) ? null : mDragInfo.cell; - if (setDropLayoutForDragObject(d)) { - boolean isInSpringLoadedMode = (mState == State.SPRING_LOADED); - if (isInSpringLoadedMode) { - if (mLauncher.isHotseatLayout(mDragTargetLayout)) { - mSpringLoadedDragController.cancel(); - } else { - mSpringLoadedDragController.setAlarm(mDragTargetLayout); - } + if (setDropLayoutForDragObject(d, mDragViewVisualCenter[0], mDragViewVisualCenter[1])) { + if (mLauncher.isHotseatLayout(mDragTargetLayout)) { + mSpringLoadedDragController.cancel(); + } else { + mSpringLoadedDragController.setAlarm(mDragTargetLayout); } } @@ -3114,7 +3050,7 @@ public class Workspace extends PagedView * * @return whether the layout is different from the current {@link #mDragTargetLayout}. */ - private boolean setDropLayoutForDragObject(DragObject d) { + private boolean setDropLayoutForDragObject(DragObject d, float centerX, float centerY) { CellLayout layout = null; // Test to see if we are over the hotseat first if (mLauncher.getHotseat() != null && !isDragWidget(d)) { @@ -3122,12 +3058,25 @@ public class Workspace extends PagedView layout = mLauncher.getHotseat().getLayout(); } } - if (layout == null) { - // Identify whether we have dragged over a side page, - // otherwise just use the current page - layout = workspaceInModalState() ? - findMatchingPageForDragOver(d.dragView, d.x, d.y, false) - : getCurrentDropLayout(); + + int nextPage = getNextPage(); + if (layout == null && !isPageInTransition()) { + // Check if the item is dragged over left page + mTempTouchCoordinates[0] = Math.min(centerX, d.x); + mTempTouchCoordinates[1] = d.y; + layout = verifyInsidePage(nextPage + (mIsRtl ? 1 : -1), mTempTouchCoordinates); + } + + if (layout == null && !isPageInTransition()) { + // Check if the item is dragged over right page + mTempTouchCoordinates[0] = Math.max(centerX, d.x); + mTempTouchCoordinates[1] = d.y; + layout = verifyInsidePage(nextPage + (mIsRtl ? -1 : 1), mTempTouchCoordinates); + } + + // Always pick the current page. + if (layout == null && nextPage >= numCustomPages() && nextPage < getPageCount()) { + layout = (CellLayout) getChildAt(nextPage); } if (layout != mDragTargetLayout) { setCurrentDropLayout(layout); @@ -3137,6 +3086,22 @@ public class Workspace extends PagedView return false; } + /** + * Returns the child CellLayout if the point is inside the page coordinates, null otherwise. + */ + private CellLayout verifyInsidePage(int pageNo, float[] touchXy) { + if (pageNo >= numCustomPages() && pageNo < getPageCount()) { + CellLayout cl = (CellLayout) getChildAt(pageNo); + mapPointFromSelfToChild(cl, touchXy); + if (touchXy[0] >= 0 && touchXy[0] <= cl.getWidth() && + touchXy[1] >= 0 && touchXy[1] <= cl.getHeight()) { + // This point is inside the cell layout + return cl; + } + } + return null; + } + private void manageFolderFeedback(CellLayout targetLayout, int[] targetCell, float distance, DragObject dragObject) { if (distance > mMaxDistanceForFolderCreation) return; @@ -3570,14 +3535,6 @@ public class Workspace extends PagedView return mStateTransitionAnimation; } - /** - * Return the current {@link CellLayout}, correctly picking the destination - * screen while a scroll is in progress. - */ - public CellLayout getCurrentDropLayout() { - return (CellLayout) getChildAt(getNextPage()); - } - /** * Return the current CellInfo describing our current drag; this method exists * so that Launcher can sync this object with the correct info when the activity is created/ From a52ecb0390c85afb385371bb844bb496c59ddf87 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 16 Dec 2016 15:04:51 -0800 Subject: [PATCH 160/382] Removing all compatibility code below Lollipop Bug: 32745285 Change-Id: I62971908e3e4402941fab627bbdfd47be64473a3 --- build.gradle | 11 +- src/com/android/launcher3/BubbleTextView.java | 6 +- .../android/launcher3/ButtonDropTarget.java | 29 +-- src/com/android/launcher3/CellLayout.java | 3 - src/com/android/launcher3/Launcher.java | 51 +--- .../android/launcher3/LauncherAppState.java | 18 -- .../LauncherAppWidgetProviderInfo.java | 10 +- .../android/launcher3/LauncherProvider.java | 8 - .../LauncherStateTransitionAnimation.java | 103 +++------ src/com/android/launcher3/PagedView.java | 7 +- .../launcher3/PendingAppWidgetHostView.java | 8 +- .../launcher3/UninstallDropTarget.java | 15 +- src/com/android/launcher3/Utilities.java | 45 +--- .../launcher3/WidgetPreviewLoader.java | 4 +- src/com/android/launcher3/Workspace.java | 24 +- .../LauncherAccessibilityDelegate.java | 9 +- .../OverviewScreenAccessibilityDelegate.java | 4 +- .../allapps/AllAppsContainerView.java | 4 +- .../allapps/HeaderElevationController.java | 124 +++------- .../compat/AppWidgetManagerCompat.java | 18 +- .../compat/AppWidgetManagerCompatV16.java | 120 ---------- .../compat/AppWidgetManagerCompatVL.java | 28 --- .../compat/LauncherActivityInfoCompatV16.java | 98 -------- .../compat/LauncherActivityInfoCompatVL.java | 3 - .../launcher3/compat/LauncherAppsCompat.java | 8 +- .../compat/LauncherAppsCompatV16.java | 218 ------------------ .../compat/LauncherAppsCompatVL.java | 32 ++- .../compat/PackageInstallerCompat.java | 8 +- .../compat/PackageInstallerCompatV16.java | 32 --- .../compat/PackageInstallerCompatVL.java | 3 - .../launcher3/compat/UserManagerCompat.java | 6 +- .../compat/UserManagerCompatV16.java | 71 ------ .../compat/UserManagerCompatV17.java | 75 ------ .../launcher3/compat/UserManagerCompatVL.java | 50 +++- .../android/launcher3/dragndrop/DragView.java | 18 +- src/com/android/launcher3/folder/Folder.java | 9 +- .../launcher3/graphics/LauncherIcons.java | 8 +- .../keyboard/FocusIndicatorHelper.java | 3 - .../android/launcher3/model/WidgetItem.java | 7 +- .../android/launcher3/model/WidgetsModel.java | 10 +- .../util/CircleRevealOutlineProvider.java | 4 - .../android/launcher3/util/ConfigMonitor.java | 10 +- .../util/ManagedProfileHeuristic.java | 4 - .../util/PillRevealOutlineProvider.java | 3 - .../widget/PendingAddWidgetInfo.java | 12 +- .../android/launcher3/widget/WidgetCell.java | 2 +- .../widget/WidgetHostViewLoader.java | 38 ++- .../launcher3/widget/WidgetsListAdapter.java | 10 +- .../com/android/launcher3/BindWidgetTest.java | 7 +- 49 files changed, 220 insertions(+), 1178 deletions(-) delete mode 100644 src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java delete mode 100644 src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java delete mode 100644 src/com/android/launcher3/compat/LauncherAppsCompatV16.java delete mode 100644 src/com/android/launcher3/compat/PackageInstallerCompatV16.java delete mode 100644 src/com/android/launcher3/compat/UserManagerCompatV16.java delete mode 100644 src/com/android/launcher3/compat/UserManagerCompatV17.java diff --git a/build.gradle b/build.gradle index 4d700c5b23..00667f17df 100644 --- a/build.gradle +++ b/build.gradle @@ -12,12 +12,12 @@ apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' android { - compileSdkVersion 25 + compileSdkVersion 26 buildToolsVersion '24.0.0' defaultConfig { minSdkVersion 21 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName "1.0" @@ -59,10 +59,11 @@ repositories { mavenCentral() } +final String SUPPORT_LIBS_VERSION = '26.0.0-SNAPSHOT' dependencies { - compile 'com.android.support:support-v4:23.1.1' - compile 'com.android.support:recyclerview-v7:23.1.1' - compile 'com.android.support:palette-v7:23.2.0' + compile "com.android.support:support-v4:${SUPPORT_LIBS_VERSION}" + compile "com.android.support:recyclerview-v7:${SUPPORT_LIBS_VERSION}" + compile "com.android.support:palette-v7:${SUPPORT_LIBS_VERSION}" compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-2' testCompile 'junit:junit:4.12' diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 0c1a156adb..5e9e7e2074 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -524,11 +524,7 @@ public class BubbleTextView extends TextView protected void applyCompoundDrawables(Drawable icon) { if (mLayoutHorizontal) { - if (Utilities.ATLEAST_JB_MR1) { - setCompoundDrawablesRelative(icon, null, null, null); - } else { - setCompoundDrawables(icon, null, null, null); - } + setCompoundDrawablesRelative(icon, null, null, null); } else { setCompoundDrawables(null, icon, null, null); } diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index e613b3b2ff..85b08d1164 100644 --- a/src/com/android/launcher3/ButtonDropTarget.java +++ b/src/com/android/launcher3/ButtonDropTarget.java @@ -21,7 +21,6 @@ import android.animation.FloatArrayEvaluator; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -30,7 +29,6 @@ import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; @@ -100,17 +98,11 @@ public abstract class ButtonDropTarget extends TextView mOriginalTextColor = getTextColors(); } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) protected void setDrawable(int resId) { // We do not set the drawable in the xml as that inflates two drawables corresponding to // drawableLeft and drawableStart. mDrawable = getResources().getDrawable(resId); - - if (Utilities.ATLEAST_JB_MR1) { - setCompoundDrawablesRelativeWithIntrinsicBounds(mDrawable, null, null, null); - } else { - setCompoundDrawablesWithIntrinsicBounds(mDrawable, null, null, null); - } + setCompoundDrawablesRelativeWithIntrinsicBounds(mDrawable, null, null, null); } public void setDropTargetBar(DropTargetBar dropTargetBar) { @@ -120,16 +112,7 @@ public abstract class ButtonDropTarget extends TextView @Override public final void onDragEnter(DragObject d) { d.dragView.setColor(mHoverColor); - if (Utilities.ATLEAST_LOLLIPOP) { - animateTextColor(mHoverColor); - } else { - if (mCurrentFilter == null) { - mCurrentFilter = new ColorMatrix(); - } - DragView.setColorScale(mHoverColor, mCurrentFilter); - mDrawable.setColorFilter(new ColorMatrixColorFilter(mCurrentFilter)); - setTextColor(mHoverColor); - } + animateTextColor(mHoverColor); if (d.stateAnnouncer != null) { d.stateAnnouncer.cancel(); } @@ -142,15 +125,9 @@ public abstract class ButtonDropTarget extends TextView } protected void resetHoverColor() { - if (Utilities.ATLEAST_LOLLIPOP) { - animateTextColor(mOriginalTextColor.getDefaultColor()); - } else { - mDrawable.setColorFilter(null); - setTextColor(mOriginalTextColor); - } + animateTextColor(mOriginalTextColor.getDefaultColor()); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void animateTextColor(int targetColor) { if (mCurrentColorAnim != null) { mCurrentColorAnim.cancel(); diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 1e212bfd8b..abf5515f1a 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -21,7 +21,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; @@ -33,7 +32,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Parcelable; import android.support.annotation.IntDef; import android.support.v4.view.ViewCompat; @@ -297,7 +295,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { addView(mShortcutsAndWidgets); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void enableAccessibleDrag(boolean enable, int dragType) { mUseTouchHelper = enable; if (!enable) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8aa41588bd..e0c86e2dab 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -44,7 +44,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; -import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -69,7 +68,6 @@ import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; import android.view.Menu; import android.view.MotionEvent; -import android.view.Surface; import android.view.View; import android.view.View.OnLongClickListener; import android.view.ViewGroup; @@ -89,7 +87,6 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DefaultAppSearchController; import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; @@ -1507,7 +1504,7 @@ public class Launcher extends Activity launcherInfo.spanY = itemInfo.spanY; launcherInfo.minSpanX = itemInfo.minSpanX; launcherInfo.minSpanY = itemInfo.minSpanY; - launcherInfo.user = mAppWidgetManager.getUser(appWidgetInfo); + launcherInfo.user = appWidgetInfo.getUser(); LauncherModel.addItemToDatabase(this, launcherInfo, itemInfo.container, itemInfo.screenId, itemInfo.cellX, itemInfo.cellY); @@ -2090,7 +2087,7 @@ public class Launcher extends Activity intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE, - mAppWidgetManager.getUser(info.info)); + info.info.getUser()); // TODO: we need to make sure that this accounts for the options bundle. // intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); startActivityForResult(intent, REQUEST_BIND_APPWIDGET); @@ -2324,7 +2321,7 @@ public class Launcher extends Activity intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, info.appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, appWidgetInfo.provider); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE, - mAppWidgetManager.getUser(appWidgetInfo)); + appWidgetInfo.getUser()); startActivityForResult(intent, REQUEST_BIND_PENDING_APPWIDGET); } } else { @@ -3483,7 +3480,7 @@ public class Launcher extends Activity // Also try to bind the widget. If the bind fails, the user will be shown // a click to setup UI, which will ask for the bind permission. - PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(this, appWidgetInfo); + PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(appWidgetInfo); pendingInfo.spanX = item.spanX; pendingInfo.spanY = item.spanY; pendingInfo.minSpanX = item.minSpanX; @@ -3916,47 +3913,9 @@ public class Launcher extends Activity } } - private int mapConfigurationOriActivityInfoOri(int configOri) { - final Display d = getWindowManager().getDefaultDisplay(); - int naturalOri = Configuration.ORIENTATION_LANDSCAPE; - switch (d.getRotation()) { - case Surface.ROTATION_0: - case Surface.ROTATION_180: - // We are currently in the same basic orientation as the natural orientation - naturalOri = configOri; - break; - case Surface.ROTATION_90: - case Surface.ROTATION_270: - // We are currently in the other basic orientation to the natural orientation - naturalOri = (configOri == Configuration.ORIENTATION_LANDSCAPE) ? - Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE; - break; - } - - int[] oriMap = { - ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, - ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, - ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, - ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE - }; - // Since the map starts at portrait, we need to offset if this device's natural orientation - // is landscape. - int indexOffset = 0; - if (naturalOri == Configuration.ORIENTATION_LANDSCAPE) { - indexOffset = 1; - } - return oriMap[(d.getRotation() + indexOffset) % 4]; - } - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public void lockScreenOrientation() { if (mRotationEnabled) { - if (Utilities.ATLEAST_JB_MR2) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); - } else { - setRequestedOrientation(mapConfigurationOriActivityInfoOri(getResources() - .getConfiguration().orientation)); - } + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); } } diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index ca5cd74304..00e4bf4dc9 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -42,8 +41,6 @@ public class LauncherAppState { private final IconCache mIconCache; private final WidgetPreviewLoader mWidgetCache; - @Thunk boolean mWallpaperChangedSinceLastCheck; - private static WeakReference sLauncherProvider; private static Context sContext; @@ -117,15 +114,6 @@ public class LauncherAppState { sContext.registerReceiver(mModel, filter); UserManagerCompat.getInstance(sContext).enableAndResetCache(); - if (!Utilities.ATLEAST_KITKAT) { - sContext.registerReceiver(new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - mWallpaperChangedSinceLastCheck = true; - } - }, new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED)); - } new ConfigMonitor(sContext).register(); ExtractionUtils.startColorExtractionServiceIfNecessary(sContext); @@ -168,12 +156,6 @@ public class LauncherAppState { return mWidgetCache; } - public boolean hasWallpaperChangedSinceLastCheck() { - boolean result = mWallpaperChangedSinceLastCheck; - mWallpaperChangedSinceLastCheck = false; - return result; - } - public InvariantDeviceProfile getInvariantDeviceProfile() { return mInvariantDeviceProfile; } diff --git a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java index 1a4153f75d..01e26241eb 100644 --- a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java @@ -1,6 +1,5 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; @@ -9,8 +8,9 @@ import android.content.pm.PackageManager; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Parcel; +import android.os.Process; +import android.os.UserHandle; /** * This class is a thin wrapper around the framework AppWidgetProviderInfo class. This class affords @@ -92,7 +92,6 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { (minResizeHeight + widgetPadding.top + widgetPadding.bottom) / smallestCellHeight)); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public String getLabel(PackageManager packageManager) { if (isCustomWidget) { return Utilities.trim(label); @@ -100,7 +99,6 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { return super.loadLabel(packageManager); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public Drawable getIcon(Context context, IconCache cache) { if (isCustomWidget) { return cache.getFullResIcon(provider.getPackageName(), icon); @@ -122,4 +120,8 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { (resizeMode & RESIZE_HORIZONTAL) != 0 ? minSpanX : -1, (resizeMode & RESIZE_VERTICAL) != 0 ? minSpanY : -1); } + + public UserHandle getUser() { + return isCustomWidget ? Process.myUserHandle() : getProfile(); + } } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index c6edae9c19..0865925ff4 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.content.ComponentName; @@ -39,7 +38,6 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.database.sqlite.SQLiteStatement; import android.net.Uri; import android.os.Binder; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -534,13 +532,7 @@ public class LauncherProvider extends ContentProvider { * * @return the loader if the restrictions are set and the resource exists; null otherwise. */ - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) private AutoInstallsLayout createWorkspaceLoaderFromAppRestriction(AppWidgetHost widgetHost) { - // UserManager.getApplicationRestrictions() requires minSdkVersion >= 18 - if (!Utilities.ATLEAST_JB_MR2) { - return null; - } - Context ctx = getContext(); UserManager um = (UserManager) ctx.getSystemService(Context.USER_SERVICE); Bundle bundle = um.getApplicationRestrictions(ctx.getPackageName()); diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index 19cc0fbe57..39c466db88 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -23,14 +23,10 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; -import android.annotation.TargetApi; import android.content.res.Resources; -import android.os.Build; import android.util.Log; import android.view.View; import android.view.animation.AccelerateInterpolator; -import android.view.animation.Animation; -import android.view.animation.DecelerateInterpolator; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; @@ -229,7 +225,6 @@ public class LauncherStateTransitionAnimation { final boolean animated, int animType, final PrivateTransitionCallbacks pCb) { final AnimatorSet animation = LauncherAnimUtils.createAnimatorSet(); final Resources res = mLauncher.getResources(); - final boolean material = Utilities.ATLEAST_LOLLIPOP; final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime); final int revealDurationSlide = res.getInteger(R.integer.config_overlaySlideRevealTime); @@ -276,20 +271,11 @@ public class LauncherStateTransitionAnimation { revealView.setTranslationX(0f); // Calculate the final animation values - final float revealViewToAlpha; - final float revealViewToXDrift; - final float revealViewToYDrift; - if (material) { - int[] buttonViewToPanelDelta = Utilities.getCenterDeltaInScreenSpace( - revealView, buttonView, null); - revealViewToAlpha = pCb.materialRevealViewFinalAlpha; - revealViewToYDrift = buttonViewToPanelDelta[1]; - revealViewToXDrift = buttonViewToPanelDelta[0]; - } else { - revealViewToAlpha = 0f; - revealViewToYDrift = 2 * height / 3; - revealViewToXDrift = 0; - } + int[] buttonViewToPanelDelta = + Utilities.getCenterDeltaInScreenSpace(revealView, buttonView); + final float revealViewToAlpha = pCb.materialRevealViewFinalAlpha; + final float revealViewToXDrift = buttonViewToPanelDelta[0]; + final float revealViewToYDrift = buttonViewToPanelDelta[1]; // Create the animators PropertyValuesHolder panelAlpha = @@ -327,19 +313,17 @@ public class LauncherStateTransitionAnimation { itemsAlpha.setStartDelay(itemsAlphaStagger); animation.play(itemsAlpha); - if (material) { - float startRadius = pCb.getMaterialRevealViewStartFinalRadius(); - AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener( - revealView, buttonView); - Animator reveal = new CircleRevealOutlineProvider(width / 2, height / 2, - startRadius, revealRadius).createRevealAnimator(revealView); - reveal.setDuration(revealDuration); - reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); - if (listener != null) { - reveal.addListener(listener); - } - animation.play(reveal); + float startRadius = pCb.getMaterialRevealViewStartFinalRadius(); + AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener( + revealView, buttonView); + Animator reveal = new CircleRevealOutlineProvider(width / 2, height / 2, + startRadius, revealRadius).createRevealAnimator(revealView); + reveal.setDuration(revealDuration); + reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); + if (listener != null) { + reveal.addListener(listener); } + animation.play(reveal); animation.addListener(new AnimatorListenerAdapter() { @Override @@ -531,11 +515,9 @@ public class LauncherStateTransitionAnimation { final PrivateTransitionCallbacks pCb) { final AnimatorSet animation = LauncherAnimUtils.createAnimatorSet(); final Resources res = mLauncher.getResources(); - final boolean material = Utilities.ATLEAST_LOLLIPOP; final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime); final int revealDurationSlide = res.getInteger(R.integer.config_overlaySlideRevealTime); - final int itemsAlphaStagger = - res.getInteger(R.integer.config_overlayItemsAlphaStagger); + final int itemsAlphaStagger = res.getInteger(R.integer.config_overlayItemsAlphaStagger); final View toView = mLauncher.getWorkspace(); final View revealView = fromView.getRevealView(); @@ -579,24 +561,14 @@ public class LauncherStateTransitionAnimation { layerViews.addView(revealView); // Calculate the final animation values - final float revealViewToXDrift; - final float revealViewToYDrift; - if (material) { - int[] buttonViewToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView, - buttonView, null); - revealViewToYDrift = buttonViewToPanelDelta[1]; - revealViewToXDrift = buttonViewToPanelDelta[0]; - } else { - revealViewToYDrift = 2 * height / 3; - revealViewToXDrift = 0; - } + int[] buttonViewToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView, buttonView); + final float revealViewToXDrift = buttonViewToPanelDelta[0]; + final float revealViewToYDrift = buttonViewToPanelDelta[1]; // The vertical motion of the apps panel should be delayed by one frame // from the conceal animation in order to give the right feel. We correspondingly // shorten the duration so that the slide and conceal end at the same time. - TimeInterpolator decelerateInterpolator = material ? - new LogDecelerateInterpolator(100, 0) : - new DecelerateInterpolator(1f); + TimeInterpolator decelerateInterpolator = new LogDecelerateInterpolator(100, 0); ObjectAnimator panelDriftY = ObjectAnimator.ofFloat(revealView, "translationY", 0, revealViewToYDrift); panelDriftY.setDuration(revealDuration - SINGLE_FRAME_DELAY); @@ -612,13 +584,10 @@ public class LauncherStateTransitionAnimation { animation.play(panelDriftX); // Setup animation for the reveal panel alpha - final float revealViewToAlpha = !material ? 0f : - pCb.materialRevealViewFinalAlpha; - if (revealViewToAlpha != 1f) { + if (pCb.materialRevealViewFinalAlpha != 1f) { ObjectAnimator panelAlpha = ObjectAnimator.ofFloat(revealView, "alpha", - 1f, revealViewToAlpha); - panelAlpha.setDuration(material ? revealDuration : 150); - panelAlpha.setStartDelay(material ? 0 : itemsAlphaStagger + SINGLE_FRAME_DELAY); + 1f, pCb.materialRevealViewFinalAlpha); + panelAlpha.setDuration(revealDuration); panelAlpha.setInterpolator(decelerateInterpolator); animation.play(panelAlpha); } @@ -652,21 +621,19 @@ public class LauncherStateTransitionAnimation { }); animation.play(invalidateScrim); - if (material) { - // Animate the all apps button - float finalRadius = pCb.getMaterialRevealViewStartFinalRadius(); - AnimatorListenerAdapter listener = - pCb.getMaterialRevealViewAnimatorListener(revealView, buttonView); - Animator reveal = new CircleRevealOutlineProvider(width / 2, height / 2, - revealRadius, finalRadius).createRevealAnimator(revealView); - reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); - reveal.setDuration(revealDuration); - reveal.setStartDelay(itemsAlphaStagger); - if (listener != null) { - reveal.addListener(listener); - } - animation.play(reveal); + // Animate the all apps button + float finalRadius = pCb.getMaterialRevealViewStartFinalRadius(); + AnimatorListenerAdapter listener = + pCb.getMaterialRevealViewAnimatorListener(revealView, buttonView); + Animator reveal = new CircleRevealOutlineProvider(width / 2, height / 2, + revealRadius, finalRadius).createRevealAnimator(revealView); + reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); + reveal.setDuration(revealDuration); + reveal.setStartDelay(itemsAlphaStagger); + if (listener != null) { + reveal.addListener(listener); } + animation.play(reveal); } animation.addListener(new AnimatorListenerAdapter() { diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index ee7f9f805c..7ce33c6ac9 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -22,13 +22,11 @@ import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -2100,7 +2098,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc /* Accessibility */ @SuppressWarnings("deprecation") - @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); @@ -2117,9 +2114,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Besides disabling the accessibility long-click, this also prevents this view from getting // accessibility focus. info.setLongClickable(false); - if (Utilities.ATLEAST_LOLLIPOP) { - info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK); - } + info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK); } @Override diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java index 7c92f80f07..2976807a4a 100644 --- a/src/com/android/launcher3/PendingAppWidgetHostView.java +++ b/src/com/android/launcher3/PendingAppWidgetHostView.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.res.Resources.Theme; @@ -26,7 +25,6 @@ import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.text.Layout; import android.text.StaticLayout; @@ -63,7 +61,6 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen private final TextPaint mPaint; private Layout mSetupTextLayout; - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public PendingAppWidgetHostView(Context context, LauncherAppWidgetInfo info, IconCache cache, boolean disabledForSafeMode) { super(new ContextThemeWrapper(context, R.style.WidgetContainerTheme)); @@ -81,10 +78,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen setBackgroundResource(R.drawable.quantum_panel_dark); setWillNotDraw(false); - if (Utilities.ATLEAST_LOLLIPOP) { - setElevation(getResources().getDimension(R.dimen.pending_widget_elevation)); - } - + setElevation(getResources().getDimension(R.dimen.pending_widget_elevation)); updateIcon(cache); updateAppWidget(null); setOnClickListener(mLauncher); diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index a7839ec290..73a9f6417f 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -1,12 +1,10 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -40,15 +38,12 @@ public class UninstallDropTarget extends ButtonDropTarget { return supportsDrop(getContext(), info); } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public static boolean supportsDrop(Context context, Object info) { - if (Utilities.ATLEAST_JB_MR2) { - UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - Bundle restrictions = userManager.getUserRestrictions(); - if (restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false) - || restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false)) { - return false; - } + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + Bundle restrictions = userManager.getUserRestrictions(); + if (restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false) + || restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false)) { + return false; } return getUninstallTarget(context, info) != null; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 6485fc1373..2cb913858c 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.app.Activity; import android.app.WallpaperManager; import android.content.ActivityNotFoundException; @@ -105,18 +104,6 @@ public final class Utilities { public static final boolean ATLEAST_LOLLIPOP_MR1 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1; - public static final boolean ATLEAST_LOLLIPOP = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - - public static final boolean ATLEAST_KITKAT = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - - public static final boolean ATLEAST_JB_MR1 = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; - - public static final boolean ATLEAST_JB_MR2 = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; - // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; @@ -229,7 +216,7 @@ public final class Utilities { localY < (v.getHeight() + slop); } - public static int[] getCenterDeltaInScreenSpace(View v0, View v1, int[] delta) { + public static int[] getCenterDeltaInScreenSpace(View v0, View v1) { v0.getLocationInWindow(sLoc0); v1.getLocationInWindow(sLoc1); @@ -237,15 +224,7 @@ public final class Utilities { sLoc0[1] += (v0.getMeasuredHeight() * v0.getScaleY()) / 2; sLoc1[0] += (v1.getMeasuredWidth() * v1.getScaleX()) / 2; sLoc1[1] += (v1.getMeasuredHeight() * v1.getScaleY()) / 2; - - if (delta == null) { - delta = new int[2]; - } - - delta[0] = sLoc1[0] - sLoc0[0]; - delta[1] = sLoc1[1] - sLoc0[1]; - - return delta; + return new int[] {sLoc1[0] - sLoc0[0], sLoc1[1] - sLoc0[1]}; } public static void scaleRectAboutCenter(Rect r, float scale) { @@ -479,10 +458,8 @@ public final class Utilities { System.out.println(b.toString()); } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public static boolean isRtl(Resources res) { - return ATLEAST_JB_MR1 && - (res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL); + return res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; } /** @@ -569,16 +546,11 @@ public final class Utilities { * @param msg original message * @param ttsMsg message to be spoken */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static CharSequence wrapForTts(CharSequence msg, String ttsMsg) { - if (Utilities.ATLEAST_LOLLIPOP) { - SpannableString spanned = new SpannableString(msg); - spanned.setSpan(new TtsSpan.TextBuilder(ttsMsg).build(), - 0, spanned.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); - return spanned; - } else { - return msg; - } + SpannableString spanned = new SpannableString(msg); + spanned.setSpan(new TtsSpan.TextBuilder(ttsMsg).build(), + 0, spanned.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); + return spanned; } /** @@ -593,10 +565,9 @@ public final class Utilities { LauncherFiles.SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isPowerSaverOn(Context context) { PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - return ATLEAST_LOLLIPOP && powerManager.isPowerSaveMode(); + return powerManager.isPowerSaveMode(); } public static boolean isWallpaperAllowed(Context context) { diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 399920e655..0f62b31c17 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -302,7 +302,7 @@ public class WidgetPreviewLoader { Drawable drawable = null; if (info.previewImage != 0) { try { - drawable = mWidgetManager.loadPreview(info); + drawable = info.loadPreviewImage(launcher.getApplicationContext(), 0); } catch (OutOfMemoryError e) { Log.w(TAG, "Error loading widget preview for: " + info.provider, e); // During OutOfMemoryError, the previous heap stack is not affected. Catching @@ -395,7 +395,7 @@ public class WidgetPreviewLoader { float iconScale = Math.min((float) smallestSide / (appIconSize + 2 * minOffset), scale); try { - Drawable icon = mWidgetManager.loadIcon(info, mIconCache); + Drawable icon = info.getIcon(launcher, mIconCache); if (icon != null) { icon = mutateOnMainThread(icon); int hoffset = (int) ((tileW - appIconSize * iconScale) / 2) + x; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 8a423e3a59..ed148fe061 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1782,11 +1782,6 @@ public class Workspace extends PagedView } protected void onResume() { - // Update wallpaper dimensions if they were changed since last onResume - // (we also always set the wallpaper dimensions in the constructor) - if (LauncherAppState.getInstance().hasWallpaperChangedSinceLastCheck()) { - setWallpaperDimension(); - } mWallpaperOffset.onResume(); } @@ -2091,20 +2086,13 @@ public class Workspace extends PagedView public void updateAccessibilityFlags() { // TODO: Update the accessibility flags appropriately when dragging. if (!mLauncher.getAccessibilityDelegate().isInAccessibleDrag()) { - if (Utilities.ATLEAST_LOLLIPOP) { - int total = getPageCount(); - for (int i = numCustomPages(); i < total; i++) { - updateAccessibilityFlags((CellLayout) getPageAt(i), i); - } - setImportantForAccessibility((mState == State.NORMAL || mState == State.OVERVIEW) - ? IMPORTANT_FOR_ACCESSIBILITY_AUTO - : IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - } else { - int accessible = mState == State.NORMAL ? - IMPORTANT_FOR_ACCESSIBILITY_AUTO : - IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS; - setImportantForAccessibility(accessible); + int total = getPageCount(); + for (int i = numCustomPages(); i < total; i++) { + updateAccessibilityFlags((CellLayout) getPageAt(i), i); } + setImportantForAccessibility((mState == State.NORMAL || mState == State.OVERVIEW) + ? IMPORTANT_FOR_ACCESSIBILITY_AUTO + : IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); } } diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index 83391f3ec4..f5ffec7c44 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -1,11 +1,9 @@ package com.android.launcher3.accessibility; -import android.annotation.TargetApi; import android.app.AlertDialog; import android.appwidget.AppWidgetProviderInfo; import android.content.DialogInterface; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; @@ -21,10 +19,7 @@ import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeleteDropTarget; -import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.dragndrop.DragOptions; -import com.android.launcher3.folder.Folder; import com.android.launcher3.FolderInfo; import com.android.launcher3.InfoDropTarget; import com.android.launcher3.ItemInfo; @@ -39,13 +34,13 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.UninstallDropTarget; import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragController.DragListener; -import com.android.launcher3.shortcuts.DeepShortcutTextView; +import com.android.launcher3.dragndrop.DragOptions; +import com.android.launcher3.folder.Folder; import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.util.Thunk; import java.util.ArrayList; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class LauncherAccessibilityDelegate extends AccessibilityDelegate implements DragListener { private static final String TAG = "LauncherAccessibilityDelegate"; diff --git a/src/com/android/launcher3/accessibility/OverviewScreenAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/OverviewScreenAccessibilityDelegate.java index 5f68f90b1d..edb0b168d0 100644 --- a/src/com/android/launcher3/accessibility/OverviewScreenAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/OverviewScreenAccessibilityDelegate.java @@ -16,21 +16,19 @@ package com.android.launcher3.accessibility; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.os.Bundle; import android.util.SparseArray; import android.view.View; import android.view.View.AccessibilityDelegate; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; + import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.config.FeatureFlags; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class OverviewScreenAccessibilityDelegate extends AccessibilityDelegate { private static final int MOVE_BACKWARD = R.id.action_move_screen_backwards; diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 97e0d984a0..a2266fef13 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -261,9 +261,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc 0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); mSearchInput.setHint(spanned); - mElevationController = Utilities.ATLEAST_LOLLIPOP - ? new HeaderElevationController.ControllerVL(mSearchContainer) - : new HeaderElevationController.ControllerV16(mSearchContainer); + mElevationController = new HeaderElevationController(mSearchContainer); // Load the all apps recycler view mAppsRecyclerView = (AllAppsRecyclerView) findViewById(R.id.apps_list_view); diff --git a/src/com/android/launcher3/allapps/HeaderElevationController.java b/src/com/android/launcher3/allapps/HeaderElevationController.java index e79e5c762e..b167fed335 100644 --- a/src/com/android/launcher3/allapps/HeaderElevationController.java +++ b/src/com/android/launcher3/allapps/HeaderElevationController.java @@ -1,16 +1,10 @@ package com.android.launcher3.allapps; -import android.annotation.TargetApi; import android.content.res.Resources; import android.graphics.Outline; -import android.graphics.Rect; -import android.graphics.drawable.GradientDrawable; -import android.os.Build; import android.support.v7.widget.RecyclerView; import android.view.View; -import android.view.ViewGroup; import android.view.ViewOutlineProvider; -import android.widget.FrameLayout; import com.android.launcher3.BaseRecyclerView; import com.android.launcher3.R; @@ -19,10 +13,40 @@ import com.android.launcher3.Utilities; /** * Helper class for controlling the header elevation in response to RecyclerView scroll. */ -public abstract class HeaderElevationController extends RecyclerView.OnScrollListener { +public class HeaderElevationController extends RecyclerView.OnScrollListener { + + private final View mHeader; + private final float mMaxElevation; + private final float mScrollToElevation; private int mCurrentY = 0; + public HeaderElevationController(View header) { + mHeader = header; + final Resources res = mHeader.getContext().getResources(); + mMaxElevation = res.getDimension(R.dimen.all_apps_header_max_elevation); + mScrollToElevation = res.getDimension(R.dimen.all_apps_header_scroll_to_elevation); + + // We need to provide a custom outline so the shadow only appears on the bottom edge. + // The top, left and right edges are all extended out, and the shadow is clipped + // by the parent. + final ViewOutlineProvider vop = new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + final View parent = (View) mHeader.getParent(); + + final int left = parent.getLeft(); // Use the parent to account for offsets + final int top = view.getTop(); + final int right = left + view.getWidth(); + final int bottom = view.getBottom(); + + final int offset = Utilities.pxFromDp(mMaxElevation, res.getDisplayMetrics()); + outline.setRect(left - offset, top - offset, right + offset, bottom); + } + }; + mHeader.setOutlineProvider(vop); + } + public void reset() { mCurrentY = 0; onScroll(mCurrentY); @@ -34,88 +58,12 @@ public abstract class HeaderElevationController extends RecyclerView.OnScrollLis onScroll(mCurrentY); } - public void updateBackgroundPadding(Rect bgPadding) { } - - abstract void onScroll(int scrollY); - - public static class ControllerV16 extends HeaderElevationController { - - private final View mShadow; - private final float mScrollToElevation; - - public ControllerV16(View header) { - Resources res = header.getContext().getResources(); - mScrollToElevation = res.getDimension(R.dimen.all_apps_header_scroll_to_elevation); - - mShadow = new View(header.getContext()); - mShadow.setBackground(new GradientDrawable( - GradientDrawable.Orientation.TOP_BOTTOM, new int[] {0x1E000000, 0x00000000})); - mShadow.setAlpha(0); - - FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, - res.getDimensionPixelSize(R.dimen.all_apps_header_shadow_height)); - lp.topMargin = ((FrameLayout.LayoutParams) header.getLayoutParams()).height; - - ((ViewGroup) header.getParent()).addView(mShadow, lp); - } - - @Override - public void onScroll(int scrollY) { - float elevationPct = (float) Math.min(scrollY, mScrollToElevation) / - mScrollToElevation; - mShadow.setAlpha(elevationPct); - } - - @Override - public void updateBackgroundPadding(Rect bgPadding) { - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mShadow.getLayoutParams(); - lp.leftMargin = bgPadding.left; - lp.rightMargin = bgPadding.right; - mShadow.requestLayout(); + private void onScroll(int scrollY) { + float elevationPct = Math.min(scrollY, mScrollToElevation) / mScrollToElevation; + float newElevation = mMaxElevation * elevationPct; + if (Float.compare(mHeader.getElevation(), newElevation) != 0) { + mHeader.setElevation(newElevation); } } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static class ControllerVL extends HeaderElevationController { - - private final View mHeader; - private final float mMaxElevation; - private final float mScrollToElevation; - - public ControllerVL(View header) { - mHeader = header; - final Resources res = mHeader.getContext().getResources(); - mMaxElevation = res.getDimension(R.dimen.all_apps_header_max_elevation); - mScrollToElevation = res.getDimension(R.dimen.all_apps_header_scroll_to_elevation); - - // We need to provide a custom outline so the shadow only appears on the bottom edge. - // The top, left and right edges are all extended out, and the shadow is clipped - // by the parent. - final ViewOutlineProvider vop = new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - final View parent = (View) mHeader.getParent(); - - final int left = parent.getLeft(); // Use the parent to account for offsets - final int top = view.getTop(); - final int right = left + view.getWidth(); - final int bottom = view.getBottom(); - - final int offset = Utilities.pxFromDp(mMaxElevation, res.getDisplayMetrics()); - outline.setRect(left - offset, top - offset, right + offset, bottom); - } - }; - mHeader.setOutlineProvider(vop); - } - - @Override - public void onScroll(int scrollY) { - float elevationPct = Math.min(scrollY, mScrollToElevation) / mScrollToElevation; - float newElevation = mMaxElevation * elevationPct; - if (Float.compare(mHeader.getElevation(), newElevation) != 0) { - mHeader.setElevation(newElevation); - } - } - } } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index 5388f2a3cf..af43c02a75 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -23,13 +23,10 @@ import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; -import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.Utilities; import com.android.launcher3.util.ComponentKey; import java.util.HashMap; @@ -40,15 +37,10 @@ public abstract class AppWidgetManagerCompat { private static final Object sInstanceLock = new Object(); private static AppWidgetManagerCompat sInstance; - public static AppWidgetManagerCompat getInstance(Context context) { synchronized (sInstanceLock) { if (sInstance == null) { - if (Utilities.ATLEAST_LOLLIPOP) { - sInstance = new AppWidgetManagerCompatVL(context.getApplicationContext()); - } else { - sInstance = new AppWidgetManagerCompatV16(context.getApplicationContext()); - } + sInstance = new AppWidgetManagerCompatVL(context.getApplicationContext()); } return sInstance; } @@ -73,20 +65,12 @@ public abstract class AppWidgetManagerCompat { public abstract List getAllProviders(); - public abstract String loadLabel(LauncherAppWidgetProviderInfo info); - public abstract boolean bindAppWidgetIdIfAllowed( int appWidgetId, AppWidgetProviderInfo info, Bundle options); - public abstract UserHandle getUser(LauncherAppWidgetProviderInfo info); - public abstract void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, AppWidgetHost host, int requestCode); - public abstract Drawable loadPreview(AppWidgetProviderInfo info); - - public abstract Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache); - public abstract Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap, int imageWidth, int imageHeight); diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java deleted file mode 100644 index e7d8e29432..0000000000 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatV16.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.appwidget.AppWidgetHost; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProviderInfo; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Bundle; -import android.os.Process; -import android.os.UserHandle; - -import com.android.launcher3.IconCache; -import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.Utilities; -import com.android.launcher3.util.ComponentKey; - -import java.util.HashMap; -import java.util.List; - -class AppWidgetManagerCompatV16 extends AppWidgetManagerCompat { - - AppWidgetManagerCompatV16(Context context) { - super(context); - } - - @Override - public List getAllProviders() { - return mAppWidgetManager.getInstalledProviders(); - } - - @Override - public String loadLabel(LauncherAppWidgetProviderInfo info) { - return Utilities.trim(info.label); - } - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) - @Override - public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info, - Bundle options) { - if (Utilities.ATLEAST_JB_MR1) { - return mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, info.provider, options); - } else { - return mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, info.provider); - } - } - - @Override - public UserHandle getUser(LauncherAppWidgetProviderInfo info) { - return Process.myUserHandle(); - } - - @Override - public void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, - AppWidgetHost host, int requestCode) { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); - intent.setComponent(info.configure); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); - Utilities.startActivityForResultSafely(activity, intent, requestCode); - } - - @Override - public Drawable loadPreview(AppWidgetProviderInfo info) { - return mContext.getPackageManager().getDrawable( - info.provider.getPackageName(), info.previewImage, null); - } - - @Override - public Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache) { - return cache.getFullResIcon(info.provider.getPackageName(), info.icon); - } - - @Override - public Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap, - int imageWidth, int imageHeight) { - return bitmap; - } - - @Override - public LauncherAppWidgetProviderInfo findProvider( - ComponentName provider, UserHandle user) { - for (AppWidgetProviderInfo info : mAppWidgetManager.getInstalledProviders()) { - if (info.provider.equals(provider)) { - return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); - } - } - return null; - } - - @Override - public HashMap getAllProvidersMap() { - HashMap result = new HashMap<>(); - UserHandle user = Process.myUserHandle(); - for (AppWidgetProviderInfo info : mAppWidgetManager.getInstalledProviders()) { - result.put(new ComponentKey(info.provider, user), info); - } - return result; - } -} diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java index 0acf75373f..56a7f46c02 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java @@ -16,7 +16,6 @@ package com.android.launcher3.compat; -import android.annotation.TargetApi; import android.app.Activity; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetProviderInfo; @@ -31,15 +30,12 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; -import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.view.View; import android.widget.Toast; -import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.R; import com.android.launcher3.util.ComponentKey; @@ -48,7 +44,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { private final UserManager mUserManager; @@ -69,11 +64,6 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { return providers; } - @Override - public String loadLabel(LauncherAppWidgetProviderInfo info) { - return info.getLabel(mPm); - } - @Override public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info, Bundle options) { @@ -81,14 +71,6 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { appWidgetId, info.getProfile(), info.provider, options); } - @Override - public UserHandle getUser(LauncherAppWidgetProviderInfo info) { - if (info.isCustomWidget) { - return Process.myUserHandle(); - } - return info.getProfile(); - } - @Override public void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, AppWidgetHost host, int requestCode) { @@ -99,16 +81,6 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } } - @Override - public Drawable loadPreview(AppWidgetProviderInfo info) { - return info.loadPreviewImage(mContext, 0); - } - - @Override - public Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache) { - return info.getIcon(mContext, cache); - } - @Override public Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap, int imageWidth, int imageHeight) { diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java deleted file mode 100644 index d6978030f0..0000000000 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.os.Process; -import android.os.UserHandle; - - -public class LauncherActivityInfoCompatV16 extends LauncherActivityInfoCompat { - private final ResolveInfo mResolveInfo; - private final ActivityInfo mActivityInfo; - private final ComponentName mComponentName; - private final PackageManager mPm; - - LauncherActivityInfoCompatV16(Context context, ResolveInfo info) { - super(); - mResolveInfo = info; - mActivityInfo = info.activityInfo; - mComponentName = new ComponentName(mActivityInfo.packageName, mActivityInfo.name); - mPm = context.getPackageManager(); - } - - public ComponentName getComponentName() { - return mComponentName; - } - - public UserHandle getUser() { - return Process.myUserHandle(); - } - - public CharSequence getLabel() { - return mResolveInfo.loadLabel(mPm); - } - - public Drawable getIcon(int density) { - int iconRes = mResolveInfo.getIconResource(); - Resources resources = null; - Drawable icon = null; - // Get the preferred density icon from the app's resources - if (density != 0 && iconRes != 0) { - try { - resources = mPm.getResourcesForApplication(mActivityInfo.applicationInfo); - icon = resources.getDrawableForDensity(iconRes, density); - } catch (NameNotFoundException | Resources.NotFoundException exc) { - } - } - // Get the default density icon - if (icon == null) { - icon = mResolveInfo.loadIcon(mPm); - } - if (icon == null) { - resources = Resources.getSystem(); - icon = resources.getDrawableForDensity(android.R.mipmap.sym_def_app_icon, density); - } - return icon; - } - - public ApplicationInfo getApplicationInfo() { - return mActivityInfo.applicationInfo; - } - - public long getFirstInstallTime() { - try { - PackageInfo info = mPm.getPackageInfo(mActivityInfo.packageName, 0); - return info != null ? info.firstInstallTime : 0; - } catch (NameNotFoundException e) { - return 0; - } - } - - public String getName() { - return mActivityInfo.name; - } -} diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java index 874b3c3ac8..c3b9592735 100644 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java @@ -16,15 +16,12 @@ package com.android.launcher3.compat; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.UserHandle; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class LauncherActivityInfoCompatVL extends LauncherActivityInfoCompat { private LauncherActivityInfo mLauncherActivityInfo; diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index c75298b0d7..73ab36c8a3 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -23,7 +23,6 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.UserHandle; -import com.android.launcher3.Utilities; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import java.util.List; @@ -51,11 +50,7 @@ public abstract class LauncherAppsCompat { public static LauncherAppsCompat getInstance(Context context) { synchronized (sInstanceLock) { if (sInstance == null) { - if (Utilities.ATLEAST_LOLLIPOP) { - sInstance = new LauncherAppsCompatVL(context.getApplicationContext()); - } else { - sInstance = new LauncherAppsCompatV16(context.getApplicationContext()); - } + sInstance = new LauncherAppsCompatVL(context.getApplicationContext()); } return sInstance; } @@ -73,5 +68,4 @@ public abstract class LauncherAppsCompat { public abstract boolean isPackageEnabledForProfile(String packageName, UserHandle user); public abstract boolean isActivityEnabledForProfile(ComponentName component, UserHandle user); - public abstract boolean isPackageSuspendedForProfile(String packageName, UserHandle user); } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java deleted file mode 100644 index 0d1efa85ee..0000000000 --- a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; -import android.graphics.Rect; -import android.net.Uri; -import android.os.Bundle; -import android.os.Process; -import android.os.UserHandle; -import android.provider.Settings; - -import com.android.launcher3.Utilities; -import com.android.launcher3.util.PackageManagerHelper; -import com.android.launcher3.util.Thunk; - -import java.util.ArrayList; -import java.util.List; - -/** - * Version of {@link LauncherAppsCompat} for devices with API level 16. - * Devices Pre-L don't support multiple profiles in one launcher so - * user parameters are ignored and all methods operate on the current user. - */ -public class LauncherAppsCompatV16 extends LauncherAppsCompat { - - private PackageManager mPm; - private Context mContext; - private List mCallbacks - = new ArrayList(); - private PackageMonitor mPackageMonitor; - - LauncherAppsCompatV16(Context context) { - mPm = context.getPackageManager(); - mContext = context; - mPackageMonitor = new PackageMonitor(); - } - - public List getActivityList(String packageName, - UserHandle user) { - final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); - mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); - mainIntent.setPackage(packageName); - List infos = mPm.queryIntentActivities(mainIntent, 0); - List list = - new ArrayList(infos.size()); - for (ResolveInfo info : infos) { - list.add(new LauncherActivityInfoCompatV16(mContext, info)); - } - return list; - } - - public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandle user) { - ResolveInfo info = mPm.resolveActivity(intent, 0); - if (info != null) { - return new LauncherActivityInfoCompatV16(mContext, info); - } - return null; - } - - public void startActivityForProfile(ComponentName component, UserHandle user, - Rect sourceBounds, Bundle opts) { - Intent launchIntent = new Intent(Intent.ACTION_MAIN); - launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); - launchIntent.setComponent(component); - launchIntent.setSourceBounds(sourceBounds); - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(launchIntent, opts); - } - - public void showAppDetailsForProfile(ComponentName component, UserHandle user) { - String packageName = component.getPackageName(); - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - Uri.fromParts("package", packageName, null)); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | - Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - mContext.startActivity(intent, null); - } - - public synchronized void addOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) { - if (callback != null && !mCallbacks.contains(callback)) { - mCallbacks.add(callback); - if (mCallbacks.size() == 1) { - registerForPackageIntents(); - } - } - } - - public synchronized void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) { - mCallbacks.remove(callback); - if (mCallbacks.size() == 0) { - unregisterForPackageIntents(); - } - } - - public boolean isPackageEnabledForProfile(String packageName, UserHandle user) { - return PackageManagerHelper.isAppEnabled(mPm, packageName); - } - - public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) { - try { - ActivityInfo info = mPm.getActivityInfo(component, 0); - return info != null && info.isEnabled(); - } catch (NameNotFoundException e) { - return false; - } - } - - public boolean isPackageSuspendedForProfile(String packageName, UserHandle user) { - return false; - } - - private void unregisterForPackageIntents() { - mContext.unregisterReceiver(mPackageMonitor); - } - - private void registerForPackageIntents() { - IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); - filter.addAction(Intent.ACTION_PACKAGE_REMOVED); - filter.addAction(Intent.ACTION_PACKAGE_CHANGED); - filter.addDataScheme("package"); - mContext.registerReceiver(mPackageMonitor, filter); - filter = new IntentFilter(); - filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); - filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); - mContext.registerReceiver(mPackageMonitor, filter); - } - - @Thunk synchronized List getCallbacks() { - return new ArrayList(mCallbacks); - } - - @Thunk class PackageMonitor extends BroadcastReceiver { - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - final UserHandle user = Process.myUserHandle(); - - if (Intent.ACTION_PACKAGE_CHANGED.equals(action) - || Intent.ACTION_PACKAGE_REMOVED.equals(action) - || Intent.ACTION_PACKAGE_ADDED.equals(action)) { - final String packageName = intent.getData().getSchemeSpecificPart(); - final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); - - if (packageName == null || packageName.length() == 0) { - // they sent us a bad intent - return; - } - if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) { - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackageChanged(packageName, user); - } - } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { - if (!replacing) { - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackageRemoved(packageName, user); - } - } - // else, we are replacing the package, so a PACKAGE_ADDED will be sent - // later, we will update the package at this time - } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { - if (!replacing) { - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackageAdded(packageName, user); - } - } else { - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackageChanged(packageName, user); - } - } - } - } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { - // EXTRA_REPLACING is available Kitkat onwards. For lower devices, it is broadcasted - // when moving a package or mounting/un-mounting external storage. Assume that - // it is a replacing operation. - final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, - !Utilities.ATLEAST_KITKAT); - String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackagesAvailable(packages, user, replacing); - } - } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { - // This intent is broadcasted when moving a package or mounting/un-mounting - // external storage. - // However on Kitkat this is also sent when a package is being updated, and - // contains an extra Intent.EXTRA_REPLACING=true for that case. - // Using false as default for Intent.EXTRA_REPLACING gives correct value on - // lower devices as the intent is not sent when the app is updating/replacing. - final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); - String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); - for (OnAppsChangedCallbackCompat callback : getCallbacks()) { - callback.onPackagesUnavailable(packages, user, replacing); - } - } - } - } -} diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index f408da0aab..60f9fabf02 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -16,7 +16,6 @@ package com.android.launcher3.compat; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -24,7 +23,6 @@ import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.os.UserHandle; @@ -36,32 +34,30 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) -public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { +public class LauncherAppsCompatVL extends LauncherAppsCompat { protected LauncherApps mLauncherApps; - private Map mCallbacks - = new HashMap(); + private Map mCallbacks = new HashMap<>(); LauncherAppsCompatVL(Context context) { - super(context); - mLauncherApps = (LauncherApps) context.getSystemService("launcherapps"); + mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE); } + @Override public List getActivityList(String packageName, UserHandle user) { List list = mLauncherApps.getActivityList(packageName, user); if (list.size() == 0) { return Collections.emptyList(); } - ArrayList compatList = - new ArrayList(list.size()); + ArrayList compatList = new ArrayList<>(list.size()); for (LauncherActivityInfo info : list) { compatList.add(new LauncherActivityInfoCompatVL(info)); } return compatList; } + @Override public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandle user) { LauncherActivityInfo activity = mLauncherApps.resolveActivity(intent, user); if (activity != null) { @@ -71,15 +67,18 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { } } + @Override public void startActivityForProfile(ComponentName component, UserHandle user, Rect sourceBounds, Bundle opts) { mLauncherApps.startMainActivity(component, user, sourceBounds, opts); } + @Override public void showAppDetailsForProfile(ComponentName component, UserHandle user) { mLauncherApps.startAppDetailsActivity(component, user, null, null); } + @Override public void addOnAppsChangedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) { WrappedCallback wrappedCallback = new WrappedCallback(callback); synchronized (mCallbacks) { @@ -88,9 +87,9 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { mLauncherApps.registerCallback(wrappedCallback); } - public void removeOnAppsChangedCallback( - LauncherAppsCompat.OnAppsChangedCallbackCompat callback) { - WrappedCallback wrappedCallback = null; + @Override + public void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) { + final WrappedCallback wrappedCallback; synchronized (mCallbacks) { wrappedCallback = mCallbacks.remove(callback); } @@ -99,18 +98,16 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { } } + @Override public boolean isPackageEnabledForProfile(String packageName, UserHandle user) { return mLauncherApps.isPackageEnabled(packageName, user); } + @Override public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) { return mLauncherApps.isActivityEnabled(component, user); } - public boolean isPackageSuspendedForProfile(String packageName, UserHandle user) { - return false; - } - private static class WrappedCallback extends LauncherApps.Callback { private LauncherAppsCompat.OnAppsChangedCallbackCompat mCallback; @@ -147,7 +144,6 @@ public class LauncherAppsCompatVL extends LauncherAppsCompatV16 { mCallback.onPackagesUnsuspended(packageNames, user); } - @Override public void onShortcutsChanged(String packageName, List shortcuts, UserHandle user) { List shortcutInfoCompats = new ArrayList<>(shortcuts.size()); diff --git a/src/com/android/launcher3/compat/PackageInstallerCompat.java b/src/com/android/launcher3/compat/PackageInstallerCompat.java index ec5014d7c3..c7fe0cec83 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompat.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompat.java @@ -18,8 +18,6 @@ package com.android.launcher3.compat; import android.content.Context; -import com.android.launcher3.Utilities; - import java.util.HashMap; public abstract class PackageInstallerCompat { @@ -34,11 +32,7 @@ public abstract class PackageInstallerCompat { public static PackageInstallerCompat getInstance(Context context) { synchronized (sInstanceLock) { if (sInstance == null) { - if (Utilities.ATLEAST_LOLLIPOP) { - sInstance = new PackageInstallerCompatVL(context); - } else { - sInstance = new PackageInstallerCompatV16(); - } + sInstance = new PackageInstallerCompatVL(context); } return sInstance; } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatV16.java b/src/com/android/launcher3/compat/PackageInstallerCompatV16.java deleted file mode 100644 index 654e349685..0000000000 --- a/src/com/android/launcher3/compat/PackageInstallerCompatV16.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import java.util.HashMap; - -public class PackageInstallerCompatV16 extends PackageInstallerCompat { - - PackageInstallerCompatV16() { } - - @Override - public void onStop() { } - - @Override - public HashMap updateAndGetActiveSessionCache() { - return new HashMap<>(); - } -} diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 192cb0cf14..953d93df9c 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -16,12 +16,10 @@ package com.android.launcher3.compat; -import android.annotation.TargetApi; import android.content.Context; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageInstaller.SessionInfo; -import android.os.Build; import android.os.Handler; import android.os.Process; import android.os.UserHandle; @@ -34,7 +32,6 @@ import com.android.launcher3.util.Thunk; import java.util.HashMap; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class PackageInstallerCompatVL extends PackageInstallerCompat { @Thunk final SparseArray mActiveSessions = new SparseArray<>(); diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index 24c95b11e7..25808d21c0 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -39,12 +39,8 @@ public abstract class UserManagerCompat { sInstance = new UserManagerCompatVN(context.getApplicationContext()); } else if (Utilities.ATLEAST_MARSHMALLOW) { sInstance = new UserManagerCompatVM(context.getApplicationContext()); - } else if (Utilities.ATLEAST_LOLLIPOP) { - sInstance = new UserManagerCompatVL(context.getApplicationContext()); - } else if (Utilities.ATLEAST_JB_MR1) { - sInstance = new UserManagerCompatV17(context.getApplicationContext()); } else { - sInstance = new UserManagerCompatV16(); + sInstance = new UserManagerCompatVL(context.getApplicationContext()); } } return sInstance; diff --git a/src/com/android/launcher3/compat/UserManagerCompatV16.java b/src/com/android/launcher3/compat/UserManagerCompatV16.java deleted file mode 100644 index 60374aa151..0000000000 --- a/src/com/android/launcher3/compat/UserManagerCompatV16.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.os.Process; -import android.os.UserHandle; - -import java.util.ArrayList; -import java.util.List; - -public class UserManagerCompatV16 extends UserManagerCompat { - - UserManagerCompatV16() { - } - - public List getUserProfiles() { - List profiles = new ArrayList(1); - profiles.add(Process.myUserHandle()); - return profiles; - } - - public UserHandle getUserForSerialNumber(long serialNumber) { - return Process.myUserHandle(); - } - - public long getSerialNumberForUser(UserHandle user) { - return 0; - } - - public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { - return label; - } - - @Override - public long getUserCreationTime(UserHandle user) { - return 0; - } - - @Override - public void enableAndResetCache() { - } - - @Override - public boolean isQuietModeEnabled(UserHandle user) { - return false; - } - - @Override - public boolean isUserUnlocked(UserHandle user) { - return true; - } - - @Override - public boolean isDemoUser() { - return false; - } -} diff --git a/src/com/android/launcher3/compat/UserManagerCompatV17.java b/src/com/android/launcher3/compat/UserManagerCompatV17.java deleted file mode 100644 index 08e8947503..0000000000 --- a/src/com/android/launcher3/compat/UserManagerCompatV17.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build; -import android.os.Process; -import android.os.UserHandle; -import android.os.UserManager; - -import com.android.launcher3.util.LongArrayMap; - -import java.util.HashMap; - -@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) -public class UserManagerCompatV17 extends UserManagerCompatV16 { - - protected LongArrayMap mUsers; - // Create a separate reverse map as LongArrayMap.indexOfValue checks if objects are same - // and not {@link Object#equals} - protected HashMap mUserToSerialMap; - - protected UserManager mUserManager; - - UserManagerCompatV17(Context context) { - mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - } - - public long getSerialNumberForUser(UserHandle user) { - synchronized (this) { - if (mUserToSerialMap != null) { - Long serial = mUserToSerialMap.get(user); - return serial == null ? 0 : serial; - } - } - return mUserManager.getSerialNumberForUser(user); - } - - public UserHandle getUserForSerialNumber(long serialNumber) { - synchronized (this) { - if (mUsers != null) { - return mUsers.get(serialNumber); - } - } - return mUserManager.getUserForSerialNumber(serialNumber); - } - - @Override - public void enableAndResetCache() { - synchronized (this) { - mUsers = new LongArrayMap<>(); - mUserToSerialMap = new HashMap<>(); - UserHandle myUser = Process.myUserHandle(); - long serial = mUserManager.getSerialNumberForUser(myUser); - mUsers.put(serial, myUser); - mUserToSerialMap.put(myUser, serial); - } - } -} - diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index 277460281d..45525f5214 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -16,12 +16,11 @@ package com.android.launcher3.compat; -import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.os.Build; import android.os.UserHandle; +import android.os.UserManager; import com.android.launcher3.Utilities; import com.android.launcher3.util.LongArrayMap; @@ -31,19 +30,60 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) -public class UserManagerCompatVL extends UserManagerCompatV17 { +public class UserManagerCompatVL extends UserManagerCompat { private static final String USER_CREATION_TIME_KEY = "user_creation_time_"; + protected final UserManager mUserManager; private final PackageManager mPm; private final Context mContext; + protected LongArrayMap mUsers; + // Create a separate reverse map as LongArrayMap.indexOfValue checks if objects are same + // and not {@link Object#equals} + protected HashMap mUserToSerialMap; + UserManagerCompatVL(Context context) { - super(context); + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mPm = context.getPackageManager(); mContext = context; } + @Override + public long getSerialNumberForUser(UserHandle user) { + synchronized (this) { + if (mUserToSerialMap != null) { + Long serial = mUserToSerialMap.get(user); + return serial == null ? 0 : serial; + } + } + return mUserManager.getSerialNumberForUser(user); + } + + @Override + public UserHandle getUserForSerialNumber(long serialNumber) { + synchronized (this) { + if (mUsers != null) { + return mUsers.get(serialNumber); + } + } + return mUserManager.getUserForSerialNumber(serialNumber); + } + + @Override + public boolean isQuietModeEnabled(UserHandle user) { + return false; + } + + @Override + public boolean isUserUnlocked(UserHandle user) { + return true; + } + + @Override + public boolean isDemoUser() { + return false; + } + @Override public void enableAndResetCache() { synchronized (this) { diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 22e077bb17..93f5be5266 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -22,7 +22,6 @@ import android.animation.FloatArrayEvaluator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -31,14 +30,12 @@ import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; -import android.os.Build; import android.view.View; import android.view.animation.DecelerateInterpolator; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.util.Thunk; import java.util.Arrays; @@ -88,7 +85,6 @@ public class DragView extends View { * @param registrationX The x coordinate of the registration point. * @param registrationY The y coordinate of the registration point. */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY, final float initialScale, final float finalScaleDps) { super(launcher); @@ -144,9 +140,7 @@ public class DragView extends View { measure(ms, ms); mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); - if (Utilities.ATLEAST_LOLLIPOP) { - setElevation(getResources().getDimension(R.dimen.drag_elevation)); - } + setElevation(getResources().getDimension(R.dimen.drag_elevation)); } /** Sets the scale of the view over the normal workspace icon size. */ @@ -265,14 +259,9 @@ public class DragView extends View { setColorScale(color, m2); m1.postConcat(m2); - if (Utilities.ATLEAST_LOLLIPOP) { - animateFilterTo(m1.getArray()); - } else { - mPaint.setColorFilter(new ColorMatrixColorFilter(m1)); - invalidate(); - } + animateFilterTo(m1.getArray()); } else { - if (!Utilities.ATLEAST_LOLLIPOP || mCurrentFilter == null) { + if (mCurrentFilter == null) { mPaint.setColorFilter(null); invalidate(); } else { @@ -281,7 +270,6 @@ public class DragView extends View { } } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void animateFilterTo(float[] targetFilter) { float[] oldFilter = mCurrentFilter == null ? new ColorMatrix().getArray() : mCurrentFilter; mCurrentFilter = Arrays.copyOf(oldFilter, oldFilter.length); diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 52c6abc21e..876c3c4de3 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -22,11 +22,9 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; -import android.os.Build; import android.text.InputType; import android.text.Selection; import android.util.AttributeSet; @@ -643,10 +641,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC public void onAnimationEnd(Animator animation) { mFolderName.animate().setDuration(FOLDER_NAME_ANIMATION_DURATION) .translationX(0) - .setInterpolator(Utilities.ATLEAST_LOLLIPOP ? - AnimationUtils.loadInterpolator(mLauncher, - android.R.interpolator.fast_out_slow_in) - : new LogDecelerateInterpolator(100, 0)); + .setInterpolator(AnimationUtils.loadInterpolator( + mLauncher, android.R.interpolator.fast_out_slow_in)); mPageIndicator.playEntryAnimation(); if (updateAnimationFlag) { @@ -789,7 +785,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } }; - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public boolean isLayoutRtl() { return (getLayoutDirection() == LAYOUT_DIRECTION_RTL); } diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index c59b3a3a6a..3f191bdc35 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -16,7 +16,6 @@ package com.android.launcher3.graphics; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageManager; @@ -32,13 +31,11 @@ import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; -import android.os.Build; import android.os.Process; import android.os.UserHandle; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; /** @@ -104,7 +101,6 @@ public class LauncherIcons { * Returns a bitmap suitable for the all apps view. The icon is badged for {@param user}. * The bitmap is also visually normalized with other icons. */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static Bitmap createBadgedIconBitmap( Drawable icon, UserHandle user, Context context) { float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? @@ -117,8 +113,7 @@ public class LauncherIcons { * Badges the provided icon with the user badge if required. */ public static Bitmap badgeIconForUser(Bitmap icon, UserHandle user, Context context) { - if (Utilities.ATLEAST_LOLLIPOP && user != null - && !Process.myUserHandle().equals(user)) { + if (user != null && !Process.myUserHandle().equals(user)) { BitmapDrawable drawable = new FixedSizeBitmapDrawable(icon); Drawable badged = context.getPackageManager().getUserBadgedIcon( drawable, user); @@ -155,7 +150,6 @@ public class LauncherIcons { /** * Adds the {@param badge} on top of {@param srcTgt} using the badge dimensions. */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static Bitmap badgeWithBitmap(Bitmap srcTgt, Bitmap badge, Context context) { int badgeSize = context.getResources().getDimensionPixelSize(R.dimen.profile_badge_size); synchronized (sCanvas) { diff --git a/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java b/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java index b0d6b2dbfd..c07ab084c9 100644 --- a/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java +++ b/src/com/android/launcher3/keyboard/FocusIndicatorHelper.java @@ -23,12 +23,10 @@ import android.animation.PropertyValuesHolder; import android.animation.RectEvaluator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.TargetApi; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; -import android.os.Build.VERSION_CODES; import android.util.Property; import android.view.View; import android.view.View.OnFocusChangeListener; @@ -38,7 +36,6 @@ import com.android.launcher3.R; /** * A helper class to draw background of a focused view. */ -@TargetApi(VERSION_CODES.LOLLIPOP) public abstract class FocusIndicatorHelper implements OnFocusChangeListener, AnimatorUpdateListener { diff --git a/src/com/android/launcher3/model/WidgetItem.java b/src/com/android/launcher3/model/WidgetItem.java index a079301bc9..452dbe2ad6 100644 --- a/src/com/android/launcher3/model/WidgetItem.java +++ b/src/com/android/launcher3/model/WidgetItem.java @@ -11,7 +11,6 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.util.ComponentKey; import java.text.Collator; @@ -32,10 +31,10 @@ public class WidgetItem extends ComponentKey implements Comparable { public final String label; public final int spanX, spanY; - public WidgetItem(LauncherAppWidgetProviderInfo info, AppWidgetManagerCompat widgetManager) { - super(info.provider, widgetManager.getUser(info)); + public WidgetItem(LauncherAppWidgetProviderInfo info, PackageManager pm) { + super(info.provider, info.getProfile()); - label = Utilities.trim(widgetManager.loadLabel(info)); + label = Utilities.trim(info.getLabel(pm)); widgetInfo = info; activityInfo = null; diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 59dc859afe..2565985544 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -59,16 +59,16 @@ public class WidgetsModel { final ArrayList widgetsAndShortcuts = new ArrayList<>(); try { + PackageManager pm = context.getPackageManager(); + // Widgets - AppWidgetManagerCompat widgetManager = AppWidgetManagerCompat.getInstance(context); - for (AppWidgetProviderInfo widgetInfo : widgetManager.getAllProviders()) { + for (AppWidgetProviderInfo widgetInfo : + AppWidgetManagerCompat.getInstance(context).getAllProviders()) { widgetsAndShortcuts.add(new WidgetItem( - LauncherAppWidgetProviderInfo.fromProviderInfo(context, widgetInfo), - widgetManager)); + LauncherAppWidgetProviderInfo.fromProviderInfo(context, widgetInfo), pm)); } // Shortcuts - PackageManager pm = context.getPackageManager(); for (ResolveInfo info : pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0)) { widgetsAndShortcuts.add(new WidgetItem(info, pm)); diff --git a/src/com/android/launcher3/util/CircleRevealOutlineProvider.java b/src/com/android/launcher3/util/CircleRevealOutlineProvider.java index c192120197..9fe51476da 100644 --- a/src/com/android/launcher3/util/CircleRevealOutlineProvider.java +++ b/src/com/android/launcher3/util/CircleRevealOutlineProvider.java @@ -16,10 +16,6 @@ package com.android.launcher3.util; -import android.annotation.TargetApi; -import android.os.Build; - -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class CircleRevealOutlineProvider extends RevealOutlineAnimation { private int mCenterX; diff --git a/src/com/android/launcher3/util/ConfigMonitor.java b/src/com/android/launcher3/util/ConfigMonitor.java index bdb16390b2..2489d3048e 100644 --- a/src/com/android/launcher3/util/ConfigMonitor.java +++ b/src/com/android/launcher3/util/ConfigMonitor.java @@ -23,8 +23,6 @@ import android.content.IntentFilter; import android.content.res.Configuration; import android.util.Log; -import com.android.launcher3.Utilities; - /** * {@link BroadcastReceiver} which watches configuration changes and * restarts the process in case changes which affect the device profile occur. @@ -40,13 +38,13 @@ public class ConfigMonitor extends BroadcastReceiver { Configuration config = context.getResources().getConfiguration(); mFontScale = config.fontScale; - mDensity = getDensity(config); + mDensity = config.densityDpi; } @Override public void onReceive(Context context, Intent intent) { Configuration config = context.getResources().getConfiguration(); - if (mFontScale != config.fontScale || mDensity != getDensity(config)) { + if (mFontScale != config.fontScale || mDensity != config.densityDpi) { Log.d("ConfigMonitor", "Configuration changed, restarting launcher"); mContext.unregisterReceiver(this); android.os.Process.killProcess(android.os.Process.myPid()); @@ -56,8 +54,4 @@ public class ConfigMonitor extends BroadcastReceiver { public void register() { mContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED)); } - - private static int getDensity(Configuration config) { - return Utilities.ATLEAST_JB_MR1 ? config.densityDpi : 0; - } } diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index 2d9e368d43..ce42bcd60a 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -31,7 +31,6 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -211,9 +210,6 @@ public class ManagedProfileHeuristic { * Verifies that entries corresponding to {@param users} exist and removes all invalid entries. */ public static void processAllUsers(List users, Context context) { - if (!Utilities.ATLEAST_LOLLIPOP) { - return; - } UserManagerCompat userManager = UserManagerCompat.getInstance(context); HashSet validKeys = new HashSet(); for (UserHandle user : users) { diff --git a/src/com/android/launcher3/util/PillRevealOutlineProvider.java b/src/com/android/launcher3/util/PillRevealOutlineProvider.java index 3f1e11a510..1a3b486658 100644 --- a/src/com/android/launcher3/util/PillRevealOutlineProvider.java +++ b/src/com/android/launcher3/util/PillRevealOutlineProvider.java @@ -16,12 +16,9 @@ package com.android.launcher3.util; -import android.annotation.TargetApi; import android.graphics.Rect; -import android.os.Build; import android.view.ViewOutlineProvider; -@TargetApi(Build.VERSION_CODES.LOLLIPOP) /** * A {@link ViewOutlineProvider} that animates a reveal in a "pill" shape. * A pill is simply a round rect, but we assume the width is greater than diff --git a/src/com/android/launcher3/widget/PendingAddWidgetInfo.java b/src/com/android/launcher3/widget/PendingAddWidgetInfo.java index f800ac44dc..7968684f93 100644 --- a/src/com/android/launcher3/widget/PendingAddWidgetInfo.java +++ b/src/com/android/launcher3/widget/PendingAddWidgetInfo.java @@ -16,15 +16,11 @@ package com.android.launcher3.widget; import android.appwidget.AppWidgetHostView; -import android.content.Context; import android.os.Bundle; -import android.os.Parcelable; -import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.PendingAddItemInfo; -import com.android.launcher3.compat.AppWidgetManagerCompat; /** * Meta data used for late binding of {@link LauncherAppWidgetProviderInfo}. @@ -38,14 +34,14 @@ public class PendingAddWidgetInfo extends PendingAddItemInfo { public AppWidgetHostView boundWidget; public Bundle bindOptions = null; - public PendingAddWidgetInfo(Context context, LauncherAppWidgetProviderInfo i) { + public PendingAddWidgetInfo(LauncherAppWidgetProviderInfo i) { if (i.isCustomWidget) { itemType = LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; } else { itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; } this.info = i; - user = AppWidgetManagerCompat.getInstance(context).getUser(i); + user = i.getUser(); componentName = i.provider; previewImage = i.previewImage; icon = i.icon; @@ -55,8 +51,4 @@ public class PendingAddWidgetInfo extends PendingAddItemInfo { minSpanX = i.minSpanX; minSpanY = i.minSpanY; } - - public boolean isCustomWidget() { - return itemType == LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; - } } diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index 07f59a576e..5eeae87e22 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -140,7 +140,7 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { if (item.activityInfo != null) { setTag(new PendingAddShortcutInfo(item.activityInfo)); } else { - setTag(new PendingAddWidgetInfo(mLauncher, item.widgetInfo)); + setTag(new PendingAddWidgetInfo(item.widgetInfo)); } } diff --git a/src/com/android/launcher3/widget/WidgetHostViewLoader.java b/src/com/android/launcher3/widget/WidgetHostViewLoader.java index b196053367..56112b21ea 100644 --- a/src/com/android/launcher3/widget/WidgetHostViewLoader.java +++ b/src/com/android/launcher3/widget/WidgetHostViewLoader.java @@ -10,12 +10,9 @@ import android.util.Log; import android.view.View; import com.android.launcher3.AppWidgetResizeFrame; -import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; -import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; @@ -154,27 +151,24 @@ public class WidgetHostViewLoader implements DragController.DragListener { } public static Bundle getDefaultOptionsForWidget(Context context, PendingAddWidgetInfo info) { - Bundle options = null; - if (Utilities.ATLEAST_JB_MR1) { - Rect rect = new Rect(); - AppWidgetResizeFrame.getWidgetSizeRanges(context, info.spanX, info.spanY, rect); - Rect padding = AppWidgetHostView.getDefaultPaddingForWidget(context, - info.componentName, null); + Rect rect = new Rect(); + AppWidgetResizeFrame.getWidgetSizeRanges(context, info.spanX, info.spanY, rect); + Rect padding = AppWidgetHostView.getDefaultPaddingForWidget(context, + info.componentName, null); - float density = context.getResources().getDisplayMetrics().density; - int xPaddingDips = (int) ((padding.left + padding.right) / density); - int yPaddingDips = (int) ((padding.top + padding.bottom) / density); + float density = context.getResources().getDisplayMetrics().density; + int xPaddingDips = (int) ((padding.left + padding.right) / density); + int yPaddingDips = (int) ((padding.top + padding.bottom) / density); - options = new Bundle(); - options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, - rect.left - xPaddingDips); - options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, - rect.top - yPaddingDips); - options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, - rect.right - xPaddingDips); - options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, - rect.bottom - yPaddingDips); - } + Bundle options = new Bundle(); + options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, + rect.left - xPaddingDips); + options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, + rect.top - yPaddingDips); + options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, + rect.right - xPaddingDips); + options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, + rect.bottom - yPaddingDips); return options; } } diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index a5846ec336..f18313fdf3 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -15,9 +15,7 @@ */ package com.android.launcher3.widget; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.util.Log; @@ -29,7 +27,6 @@ import android.widget.LinearLayout; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.compat.AlphabeticIndexCompat; import com.android.launcher3.model.PackageItemInfo; @@ -152,7 +149,6 @@ public class WidgetsListAdapter extends Adapter { } } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public WidgetsRowViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (DEBUG) { @@ -165,11 +161,7 @@ public class WidgetsListAdapter extends Adapter { // if the end padding is 0, then container view (horizontal scroll view) doesn't respect // the end of the linear layout width + the start padding and doesn't allow scrolling. - if (Utilities.ATLEAST_JB_MR1) { - cellList.setPaddingRelative(mIndent, 0, 1, 0); - } else { - cellList.setPadding(mIndent, 0, 1, 0); - } + cellList.setPaddingRelative(mIndent, 0, 1, 0); return new WidgetsRowViewHolder(container); } diff --git a/tests/src/com/android/launcher3/BindWidgetTest.java b/tests/src/com/android/launcher3/BindWidgetTest.java index 6be252234b..72533e7e15 100644 --- a/tests/src/com/android/launcher3/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/BindWidgetTest.java @@ -1,6 +1,5 @@ package com.android.launcher3; -import android.annotation.TargetApi; import android.appwidget.AppWidgetHost; import android.content.ComponentName; import android.content.ContentResolver; @@ -9,7 +8,6 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager; import android.database.Cursor; -import android.os.Build; import android.os.Bundle; import android.support.test.uiautomator.UiSelector; import android.test.suitebuilder.annotation.LargeTest; @@ -33,7 +31,6 @@ import java.util.concurrent.TimeUnit; * Note running these tests will clear the workspace on the device. */ @LargeTest -@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class BindWidgetTest extends LauncherInstrumentationTestCase { private ContentResolver mResolver; @@ -264,13 +261,13 @@ public class BindWidgetTest extends LauncherInstrumentationTestCase { item.spanY = info.minSpanY; item.minSpanX = info.minSpanX; item.minSpanY = info.minSpanY; - item.user = mWidgetManager.getUser(info); + item.user = info.getUser(); item.cellX = 0; item.cellY = 1; item.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; if (bindWidget) { - PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(mTargetContext, info); + PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(info); pendingInfo.spanX = item.spanX; pendingInfo.spanY = item.spanY; pendingInfo.minSpanX = item.minSpanX; From 3285da35cb357d09a98ff7bdf6c5b9f6fabbee8b Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 19 Dec 2016 14:46:21 -0800 Subject: [PATCH 161/382] Nav bar should change to light theme in sync with the status bar b/33708486 Nav bar should be in sync with status bar in all apps screen. Nave bar should not change with status bar when in workspace mode. Change-Id: Ib5a0d33d3e38f1b3ffa9693657ba7de3b6e01fed --- src/com/android/launcher3/Launcher.java | 28 +++++++++---------- .../allapps/AllAppsTransitionController.java | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8aa41588bd..08f56d11d9 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -475,9 +475,13 @@ public class Launcher extends Activity mExtractedColors.load(this); mHotseat.updateColor(mExtractedColors, !mPaused); mWorkspace.getPageIndicator().updateColor(mExtractedColors); + boolean lightStatusBar = (FeatureFlags.LIGHT_STATUS_BAR + && mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX, + ExtractedColors.DEFAULT_DARK) == ExtractedColors.DEFAULT_LIGHT); // It's possible that All Apps is visible when this is run, - // so always use light status bar in that case. - activateLightStatusBar(isAllAppsVisible(), false); + // so always use light status bar in that case. Only change nav bar color to status bar + // color when All Apps is visible. + activateLightStatusBar(lightStatusBar || isAllAppsVisible(), isAllAppsVisible()); } } @@ -486,28 +490,24 @@ public class Launcher extends Activity /** * Sets the status bar to be light or not. Light status bar means dark icons. - * @param activate if true, make sure the status bar is light, otherwise base on wallpaper. - * @param changeNavBar make sure the nav bar is light only if this param and {@param activate} - * is also true. + * @param lightStatusBar make sure the status bar is light + * @param changeNavBar if true, make the nav bar theme in sync with status bar. */ - public void activateLightStatusBar(boolean activate, boolean changeNavBar) { - boolean lightStatusBar = activate || (FeatureFlags.LIGHT_STATUS_BAR - && mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX, - ExtractedColors.DEFAULT_DARK) == ExtractedColors.DEFAULT_LIGHT); + public void activateLightStatusBar(boolean lightStatusBar, boolean changeNavBar) { int oldSystemUiFlags = getWindow().getDecorView().getSystemUiVisibility(); int newSystemUiFlags = oldSystemUiFlags; if (lightStatusBar) { newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR ; + if (changeNavBar && Utilities.isAtLeastO()) { + newSystemUiFlags |= SYSTEM_UI_FLAG_LIGHT_NAV_BAR; + } } else { newSystemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - } - if (Utilities.isAtLeastO() && activate) { - if (changeNavBar) { - newSystemUiFlags |= SYSTEM_UI_FLAG_LIGHT_NAV_BAR; - } else { + if (changeNavBar && Utilities.isAtLeastO()) { newSystemUiFlags &= ~(SYSTEM_UI_FLAG_LIGHT_NAV_BAR); } } + if (newSystemUiFlags != oldSystemUiFlags) { getWindow().getDecorView().setSystemUiVisibility(newSystemUiFlags); } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 99cac41934..c199fef09b 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -288,7 +288,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul // Use a light status bar (dark icons) if all apps is behind at least half of the status // bar. If the status bar is already light due to wallpaper extraction, keep it that way. boolean forceLight = shift <= mStatusBarHeight / 2; - mLauncher.activateLightStatusBar(forceLight, forceLight); + mLauncher.activateLightStatusBar(forceLight, true); } /** From 2126691ce23b4c62e6d17cb9643faf4c2b3886da Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 19 Dec 2016 14:12:05 -0800 Subject: [PATCH 162/382] Fix widget reorder animations in multi-window mode. The original animation assumed that the views are not translated and not scaled. In multi-window mode this assumption is no longer valid, because app widgets are scaled and translated to fit center within their cells. Bug: 32176631 Change-Id: Id60c793730d982277c9d91860e9fb0e6a0df7d38 --- .../launcher3/AppWidgetResizeFrame.java | 3 +- src/com/android/launcher3/CellLayout.java | 62 ++++++++++++------- .../launcher3/LauncherAppWidgetHostView.java | 31 ++++++++++ .../launcher3/ShortcutAndWidgetContainer.java | 12 ++-- .../graphics/DragPreviewProvider.java | 10 +-- 5 files changed, 81 insertions(+), 37 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 54faca3556..90dcc80deb 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -354,8 +354,7 @@ public class AppWidgetResizeFrame extends FrameLayout } public void snapToWidget(boolean animate) { - DeviceProfile profile = mLauncher.getDeviceProfile(); - float scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + float scale = mWidgetView.getScaleToFit(); mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect); diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 1e212bfd8b..c100ddc4da 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -1975,6 +1975,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final int PREVIEW_DURATION = 300; private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT; + private static final float CHILD_DIVIDEND = 4.0f; + public static final int MODE_HINT = 0; public static final int MODE_PREVIEW = 1; @@ -1990,42 +1992,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int y1 = mTmpPoint[1]; final int dX = x1 - x0; final int dY = y1 - y0; - finalDeltaX = 0; - finalDeltaY = 0; + + this.child = child; + this.mode = mode; + setInitialAnimationValues(false); + finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale; + finalDeltaX = initDeltaX; + finalDeltaY = initDeltaY; int dir = mode == MODE_HINT ? -1 : 1; if (dX == dY && dX == 0) { } else { if (dY == 0) { - finalDeltaX = - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; + finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; } else if (dX == 0) { - finalDeltaY = - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; + finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; } else { double angle = Math.atan( (float) (dY) / dX); - finalDeltaX = (int) (- dir * Math.signum(dX) * + finalDeltaX += (int) (- dir * Math.signum(dX) * Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude)); - finalDeltaY = (int) (- dir * Math.signum(dY) * + finalDeltaY += (int) (- dir * Math.signum(dY) * Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude)); } } - this.mode = mode; - initDeltaX = child.getTranslationX(); - initDeltaY = child.getTranslationY(); - finalScale = mChildScale - 4.0f / child.getWidth(); - initScale = child.getScaleX(); - this.child = child; + } + + void setInitialAnimationValues(boolean restoreOriginalValues) { + if (restoreOriginalValues) { + if (child instanceof LauncherAppWidgetHostView) { + LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; + initScale = lahv.getScaleToFit(); + initDeltaX = lahv.getTranslationForCentering().x; + initDeltaY = lahv.getTranslationForCentering().y; + } else { + initScale = mChildScale; + initDeltaX = 0; + initDeltaY = 0; + } + } else { + initScale = child.getScaleX(); + initDeltaX = child.getTranslationX(); + initDeltaY = child.getTranslationY(); + } } void animate() { + boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY); + if (mShakeAnimators.containsKey(child)) { ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child); oldAnimation.cancel(); mShakeAnimators.remove(child); - if (finalDeltaX == 0 && finalDeltaY == 0) { + if (noMovement) { completeAnimationImmediately(); return; } } - if (finalDeltaX == 0 && finalDeltaY == 0) { + if (noMovement) { return; } ValueAnimator va = LauncherAnimUtils.ofFloat(child, 0f, 1f); @@ -2058,9 +2080,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { va.addListener(new AnimatorListenerAdapter() { public void onAnimationRepeat(Animator animation) { // We make sure to end only after a full period - initDeltaX = 0; - initDeltaY = 0; - initScale = mChildScale; + setInitialAnimationValues(true); repeating = true; } }); @@ -2080,10 +2100,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } a = new LauncherViewPropertyAnimator(child) - .scaleX(mChildScale) - .scaleY(mChildScale) - .translationX(0) - .translationY(0) + .scaleX(initScale) + .scaleY(initScale) + .translationX(initDeltaX) + .translationY(initDeltaY) .setDuration(REORDER_ANIMATION_DURATION); a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f)); a.start(); diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index a4ea449164..49bbfd0972 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -19,6 +19,7 @@ package com.android.launcher3; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; +import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.SystemClock; @@ -72,6 +73,16 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; + /** + * The scaleX and scaleY value such that the widget fits within its cellspans, scaleX = scaleY. + */ + private float mScaleToFit = 1f; + + /** + * The translation values to center the widget within its cellspans. + */ + private final PointF mTranslationForCentering = new PointF(0, 0); + public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; @@ -415,4 +426,24 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc } scheduleNextAdvance(); } + + public void setScaleToFit(float scale) { + mScaleToFit = scale; + setScaleX(scale); + setScaleY(scale); + } + + public float getScaleToFit() { + return mScaleToFit; + } + + public void setTranslationForCentering(float x, float y) { + mTranslationForCentering.set(x, y); + setTranslationX(x); + setTranslationY(y); + } + + public PointF getTranslationForCentering() { + return mTranslationForCentering; + } } diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index eebce4542b..f8742f8958 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -18,7 +18,6 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; -import android.graphics.PointF; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; @@ -148,17 +147,16 @@ public class ShortcutAndWidgetContainer extends ViewGroup { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); if (child instanceof LauncherAppWidgetHostView) { + LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; + // Scale and center the widget to fit within its cells. DeviceProfile profile = mLauncher.getDeviceProfile(); float scaleX = profile.appWidgetScale.x; float scaleY = profile.appWidgetScale.y; - float scale = Math.min(scaleX, scaleY); - child.setScaleX(scale); - child.setScaleY(scale); - - child.setTranslationX(-(lp.width - (lp.width * scaleX)) / 2.0f); - child.setTranslationY(-(lp.height - (lp.height * scaleY)) / 2.0f); + lahv.setScaleToFit(Math.min(scaleX, scaleY)); + lahv.setTranslationForCentering(-(lp.width - (lp.width * scaleX)) / 2.0f, + -(lp.height - (lp.height * scaleY)) / 2.0f); } int childLeft = lp.x; diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index e205c42113..cbf30c66a5 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PreloadIconDrawable; @@ -112,8 +111,7 @@ public class DragPreviewProvider { width = bounds.width(); height = bounds.height(); } else if (mView instanceof LauncherAppWidgetHostView) { - DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); - scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) (mView.getWidth() * scale); height = (int) (mView.getHeight() * scale); } @@ -150,8 +148,7 @@ public class DragPreviewProvider { int height = mView.getHeight(); if (mView instanceof LauncherAppWidgetHostView) { - DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); - scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) Math.floor(mView.getWidth() * scale); height = (int) Math.floor(mView.getHeight() * scale); } @@ -190,11 +187,10 @@ public class DragPreviewProvider { public float getScaleAndPosition(Bitmap preview, int[] outPos) { float scale = Launcher.getLauncher(mView.getContext()) .getDragLayer().getLocationInDragLayer(mView, outPos); - DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); if (mView instanceof LauncherAppWidgetHostView) { // App widgets are technically scaled, but are drawn at their expected size -- so the // app widget scale should not affect the scale of the preview. - scale /= Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); + scale /= ((LauncherAppWidgetHostView) mView).getScaleToFit(); } outPos[0] = Math.round(outPos[0] - From c9c57631a985a8e1a4eac17ef0952bd344e281a2 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 12 Oct 2016 20:35:59 -0700 Subject: [PATCH 163/382] Fix clipping of drag outline by increasing padding. Low resolution will be addressed in future CL. Bug: 31915722 Change-Id: I6bdd32b7a30819fde1f15473a63ac280029b6715 --- src/com/android/launcher3/Workspace.java | 1 - .../launcher3/dragndrop/DragLayer.java | 2 +- .../android/launcher3/dragndrop/DragView.java | 7 +++++ .../ExternalDragPreviewProvider.java | 8 +++--- .../graphics/DragPreviewProvider.java | 28 ++++++++++++------- .../ShortcutDragPreviewProvider.java | 6 ++-- .../widget/PendingItemPreviewProvider.java | 4 +-- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 8a423e3a59..43a1a2252a 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -247,7 +247,6 @@ public class Workspace extends PagedView private boolean mStripScreensOnPageStopMoving = false; private DragPreviewProvider mOutlineProvider = null; - public static final int DRAG_BITMAP_PADDING = DragPreviewProvider.DRAG_BITMAP_PADDING; private boolean mWorkspaceFadeInAdjacentScreens; final WallpaperOffsetInterpolator mWallpaperOffset; diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index d656c8446a..4279cc3197 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -655,7 +655,7 @@ public class DragLayer extends InsettableFrameLayout { } else if (child instanceof FolderIcon) { // Account for holographic blur padding on the drag view toY += Math.round(scale * (child.getPaddingTop() - dragView.getDragRegionTop())); - toY -= scale * Workspace.DRAG_BITMAP_PADDING / 2; + toY -= scale * dragView.getBlurSizeOutline() / 2; toY -= (1 - scale) * dragView.getMeasuredHeight() / 2; // Center in the x coordinate about the target's drawable toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2; diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 22e077bb17..a35863921b 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -52,6 +52,7 @@ public class DragView extends View { private Bitmap mBitmap; private Bitmap mCrossFadeBitmap; @Thunk Paint mPaint; + private final int mBlurSizeOutline; private final int mRegistrationX; private final int mRegistrationY; private final float mInitialScale; @@ -144,6 +145,8 @@ public class DragView extends View { measure(ms, ms); mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); + mBlurSizeOutline = getResources().getDimensionPixelSize(R.dimen.blur_size_medium_outline); + if (Utilities.ATLEAST_LOLLIPOP) { setElevation(getResources().getDimension(R.dimen.drag_elevation)); } @@ -397,4 +400,8 @@ public class DragView extends View { target.setScale(Color.red(color) / 255f, Color.green(color) / 255f, Color.blue(color) / 255f, Color.alpha(color) / 255f); } + + public int getBlurSizeOutline() { + return mBlurSizeOutline; + } } diff --git a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java index 37cc9ad306..e558487b83 100644 --- a/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java +++ b/src/com/android/launcher3/dragndrop/ExternalDragPreviewProvider.java @@ -41,7 +41,7 @@ public class ExternalDragPreviewProvider extends DragPreviewProvider { private final int[] mOutlineSize; public ExternalDragPreviewProvider(Launcher launcher, ItemInfo addInfo) { - super(null); + super(null, launcher); mLauncher = launcher; mAddInfo = addInfo; @@ -51,7 +51,7 @@ public class ExternalDragPreviewProvider extends DragPreviewProvider { public Rect getPreviewBounds() { Rect rect = new Rect(); DeviceProfile dp = mLauncher.getDeviceProfile(); - rect.left = DRAG_BITMAP_PADDING / 2; + rect.left = blurSizeOutline / 2; rect.top = (mOutlineSize[1] - dp.cellHeightPx) / 2; rect.right = rect.left + dp.iconSizePx; rect.bottom = rect.top + dp.iconSizePx; @@ -69,8 +69,8 @@ public class ExternalDragPreviewProvider extends DragPreviewProvider { // Use 0.9f times the radius for the actual circle to account for icon normalization. float radius = getPreviewBounds().width() * 0.5f; - canvas.drawCircle(DRAG_BITMAP_PADDING / 2 + radius, - DRAG_BITMAP_PADDING / 2 + radius, radius * 0.9f, paint); + canvas.drawCircle(blurSizeOutline / 2 + radius, + blurSizeOutline / 2 + radius, radius * 0.9f, paint); HolographicOutlineHelper.getInstance(mLauncher).applyExpensiveOutlineWithBlur(b, canvas); canvas.setBitmap(null); diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index e205c42113..7f1790a12d 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -16,6 +16,7 @@ package com.android.launcher3.graphics; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; @@ -28,6 +29,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PreloadIconDrawable; +import com.android.launcher3.R; import com.android.launcher3.Workspace; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.folder.FolderIcon; @@ -37,8 +39,6 @@ import com.android.launcher3.folder.FolderIcon; */ public class DragPreviewProvider { - public static final int DRAG_BITMAP_PADDING = 2; - private final Rect mTempRect = new Rect(); protected final View mView; @@ -46,17 +46,25 @@ public class DragPreviewProvider { // The padding added to the drag view during the preview generation. public final int previewPadding; + protected final int blurSizeOutline; + public Bitmap generatedDragOutline; public DragPreviewProvider(View view) { + this(view, view.getContext()); + } + + public DragPreviewProvider(View view, Context context) { mView = view; + blurSizeOutline = + context.getResources().getDimensionPixelSize(R.dimen.blur_size_medium_outline); if (mView instanceof TextView) { Drawable d = Workspace.getTextViewIcon((TextView) mView); Rect bounds = getDrawableBounds(d); - previewPadding = DRAG_BITMAP_PADDING - bounds.left - bounds.top; + previewPadding = blurSizeOutline - bounds.left - bounds.top; } else { - previewPadding = DRAG_BITMAP_PADDING; + previewPadding = blurSizeOutline; } } @@ -68,8 +76,8 @@ public class DragPreviewProvider { if (mView instanceof TextView) { Drawable d = Workspace.getTextViewIcon((TextView) mView); Rect bounds = getDrawableBounds(d); - destCanvas.translate(DRAG_BITMAP_PADDING / 2 - bounds.left, - DRAG_BITMAP_PADDING / 2 - bounds.top); + destCanvas.translate(blurSizeOutline / 2 - bounds.left, + blurSizeOutline / 2 - bounds.top); d.draw(destCanvas); } else { final Rect clipRect = mTempRect; @@ -84,8 +92,8 @@ public class DragPreviewProvider { textVisible = true; } } - destCanvas.translate(-mView.getScrollX() + DRAG_BITMAP_PADDING / 2, - -mView.getScrollY() + DRAG_BITMAP_PADDING / 2); + destCanvas.translate(-mView.getScrollX() + blurSizeOutline / 2, + -mView.getScrollY() + blurSizeOutline / 2); destCanvas.clipRect(clipRect, Op.REPLACE); mView.draw(destCanvas); @@ -118,7 +126,7 @@ public class DragPreviewProvider { height = (int) (mView.getHeight() * scale); } - Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING, + Bitmap b = Bitmap.createBitmap(width + blurSizeOutline, height + blurSizeOutline, Bitmap.Config.ARGB_8888); canvas.setBitmap(b); @@ -156,7 +164,7 @@ public class DragPreviewProvider { height = (int) Math.floor(mView.getHeight() * scale); } - Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING, + Bitmap b = Bitmap.createBitmap(width + blurSizeOutline, height + blurSizeOutline, Bitmap.Config.ALPHA_8); canvas.setBitmap(b); diff --git a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java index fc474f5270..ab8de6bd5e 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java +++ b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java @@ -64,13 +64,13 @@ public class ShortcutDragPreviewProvider extends DragPreviewProvider { int size = Launcher.getLauncher(mView.getContext()).getDeviceProfile().iconSizePx; final Bitmap b = Bitmap.createBitmap( - size + DRAG_BITMAP_PADDING, - size + DRAG_BITMAP_PADDING, + size + blurSizeOutline, + size + blurSizeOutline, config); canvas.setBitmap(b); canvas.save(Canvas.MATRIX_SAVE_FLAG); - canvas.translate(DRAG_BITMAP_PADDING / 2, DRAG_BITMAP_PADDING / 2); + canvas.translate(blurSizeOutline / 2, blurSizeOutline / 2); canvas.scale(((float) size) / bounds.width(), ((float) size) / bounds.height(), 0, 0); canvas.translate(bounds.left, bounds.top); d.draw(canvas); diff --git a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java index 722fbb8872..3a49a6cdd5 100644 --- a/src/com/android/launcher3/widget/PendingItemPreviewProvider.java +++ b/src/com/android/launcher3/widget/PendingItemPreviewProvider.java @@ -53,8 +53,8 @@ public class PendingItemPreviewProvider extends DragPreviewProvider { canvas.setBitmap(b); Rect src = new Rect(0, 0, mPreviewBitmap.getWidth(), mPreviewBitmap.getHeight()); - float scaleFactor = Math.min((w - DRAG_BITMAP_PADDING) / (float) mPreviewBitmap.getWidth(), - (h - DRAG_BITMAP_PADDING) / (float) mPreviewBitmap.getHeight()); + float scaleFactor = Math.min((w - blurSizeOutline) / (float) mPreviewBitmap.getWidth(), + (h - blurSizeOutline) / (float) mPreviewBitmap.getHeight()); int scaledWidth = (int) (scaleFactor * mPreviewBitmap.getWidth()); int scaledHeight = (int) (scaleFactor * mPreviewBitmap.getHeight()); Rect dst = new Rect(0, 0, scaledWidth, scaledHeight); From dcc26fc69362c8b7a29dab75fc5df767d6edbf31 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 21 Dec 2016 11:48:48 -0800 Subject: [PATCH 164/382] Fixes a bug where the user ends in freescroll state even for regular workspace mode. The bug happened while reordering pages in overview mode and clicking the back button. The fix is to check the precodition in enableFreeScroll if we are in a valid state for enabling freescroll (currently only overview mode). Bug: 33347786 Change-Id: Icc3005fd431569e2b9e3f52d2249de8ba8d13eab --- src/com/android/launcher3/PagedView.java | 22 ++++++++++------------ src/com/android/launcher3/Workspace.java | 10 ++++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index ee7f9f805c..3180f27225 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1372,8 +1372,12 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc dampedOverScroll(amount); } - public void enableFreeScroll() { + /** + * return true if freescroll has been enabled, false otherwise + */ + public boolean enableFreeScroll() { setEnableFreeScroll(true); + return true; } public void disableFreeScroll() { @@ -2074,20 +2078,14 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (!mReorderingStarted) return; mReorderingStarted = false; - // If we haven't flung-to-delete the current child, then we just animate the drag view - // back into position - final Runnable onCompleteRunnable = new Runnable() { - @Override - public void run() { - onEndReordering(); - } - }; - mPostReorderingPreZoomInRunnable = new Runnable() { public void run() { - onCompleteRunnable.run(); + // If we haven't flung-to-delete the current child, + // then we just animate the drag view back into position + onEndReordering(); + enableFreeScroll(); - }; + } }; mPostReorderingPreZoomInRemainingAnimationCount = diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 43a1a2252a..8280ea5aac 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -4115,6 +4115,16 @@ public class Workspace extends PagedView } } + @Override + public boolean enableFreeScroll() { + if (getState() == State.OVERVIEW) { + return super.enableFreeScroll(); + } else { + Log.w(TAG, "enableFreeScroll called but not in overview: state=" + getState()); + return false; + } + } + /** * Used as a workaround to ensure that the AppWidgetService receives the * PACKAGE_ADDED broadcast before updating widgets. From 8ad02b8f3f3512cdb8eafba6da4483641bf24efc Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 29 Dec 2016 13:31:43 -0800 Subject: [PATCH 165/382] Removing static access to Context through LauncherAppState Bug: 33032833 Change-Id: I09baaa6d79187b3096a2ab3a89d7dcaeaf9eee68 --- src/com/android/launcher3/InfoDropTarget.java | 8 ++-- src/com/android/launcher3/Launcher.java | 4 +- .../launcher3/LauncherAppWidgetHost.java | 2 +- .../LauncherAppWidgetProviderInfo.java | 38 ++++++++++--------- .../android/launcher3/LauncherProvider.java | 2 +- .../LauncherAccessibilityDelegate.java | 2 +- .../launcher3/provider/LauncherDbUtils.java | 7 ++-- .../launcher3/util/PendingRequestArgs.java | 15 +++++--- 8 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/com/android/launcher3/InfoDropTarget.java b/src/com/android/launcher3/InfoDropTarget.java index 6a6d2859ab..db14e2e81b 100644 --- a/src/com/android/launcher3/InfoDropTarget.java +++ b/src/com/android/launcher3/InfoDropTarget.java @@ -18,7 +18,6 @@ package com.android.launcher3; import android.content.ActivityNotFoundException; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.provider.Settings; import android.util.AttributeSet; @@ -90,13 +89,12 @@ public class InfoDropTarget extends UninstallDropTarget { @Override protected boolean supportsDrop(DragSource source, ItemInfo info) { - return source.supportsAppInfoDropTarget() && supportsDrop(info); + return source.supportsAppInfoDropTarget() && supportsDrop(getContext(), info); } - public static boolean supportsDrop(ItemInfo info) { + public static boolean supportsDrop(Context context, ItemInfo info) { // Only show the App Info drop target if developer settings are enabled. - ContentResolver resolver = LauncherAppState.getInstance().getContext().getContentResolver(); - boolean developmentSettingsEnabled = Settings.Global.getInt(resolver, + boolean developmentSettingsEnabled = Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1; return developmentSettingsEnabled && (info instanceof AppInfo || info instanceof ShortcutInfo diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f618546c5d..7dd8450165 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -735,7 +735,7 @@ public class Launcher extends Activity } else if (resultCode == RESULT_OK) { addAppWidgetImpl( appWidgetId, requestArgs, null, - requestArgs.getWidgetProvider(), + requestArgs.getWidgetProvider(this), ON_ACTIVITY_RESULT_ANIMATION_DELAY); } return; @@ -894,7 +894,7 @@ public class Launcher extends Activity if (resultCode == RESULT_OK) { animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION; final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId, - requestArgs.getWidgetProvider()); + requestArgs.getWidgetProvider(this)); boundWidget = layout; onCompleteRunnable = new Runnable() { @Override diff --git a/src/com/android/launcher3/LauncherAppWidgetHost.java b/src/com/android/launcher3/LauncherAppWidgetHost.java index 657b024d98..6e8c59b66c 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHost.java +++ b/src/com/android/launcher3/LauncherAppWidgetHost.java @@ -128,7 +128,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost { super.onProviderChanged(appWidgetId, info); // The super method updates the dimensions of the providerInfo. Update the // launcher spans accordingly. - info.initSpans(); + info.initSpans(mLauncher); } @Override diff --git a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java index 01e26241eb..ab8f395b3b 100644 --- a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java @@ -29,22 +29,27 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { public static LauncherAppWidgetProviderInfo fromProviderInfo(Context context, AppWidgetProviderInfo info) { + final LauncherAppWidgetProviderInfo launcherInfo; + if (info instanceof LauncherAppWidgetProviderInfo) { + launcherInfo = (LauncherAppWidgetProviderInfo) info; + } else { - // In lieu of a public super copy constructor, we first write the AppWidgetProviderInfo - // into a parcel, and then construct a new LauncherAppWidgetProvider info from the - // associated super parcel constructor. This allows us to copy non-public members without - // using reflection. - Parcel p = Parcel.obtain(); - info.writeToParcel(p, 0); - p.setDataPosition(0); - LauncherAppWidgetProviderInfo lawpi = new LauncherAppWidgetProviderInfo(p); - p.recycle(); - return lawpi; + // In lieu of a public super copy constructor, we first write the AppWidgetProviderInfo + // into a parcel, and then construct a new LauncherAppWidgetProvider info from the + // associated super parcel constructor. This allows us to copy non-public members without + // using reflection. + Parcel p = Parcel.obtain(); + info.writeToParcel(p, 0); + p.setDataPosition(0); + launcherInfo = new LauncherAppWidgetProviderInfo(p); + p.recycle(); + } + launcherInfo.initSpans(context); + return launcherInfo; } - public LauncherAppWidgetProviderInfo(Parcel in) { + private LauncherAppWidgetProviderInfo(Parcel in) { super(in); - initSpans(); } public LauncherAppWidgetProviderInfo(Context context, CustomAppWidget widget) { @@ -56,12 +61,11 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { previewImage = widget.getPreviewImage(); initialLayout = widget.getWidgetLayout(); resizeMode = widget.getResizeMode(); - initSpans(); + initSpans(context); } - public void initSpans() { - LauncherAppState app = LauncherAppState.getInstance(); - InvariantDeviceProfile idp = app.getInvariantDeviceProfile(); + public void initSpans(Context context) { + InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); Point paddingLand = idp.landscapeProfile.getTotalWorkspacePadding(); Point paddingPort = idp.portraitProfile.getTotalWorkspacePadding(); @@ -80,7 +84,7 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { // We want to account for the extra amount of padding that we are adding to the widget // to ensure that it gets the full amount of space that it has requested. Rect widgetPadding = AppWidgetHostView.getDefaultPaddingForWidget( - app.getContext(), provider, null); + context, provider, null); spanX = Math.max(1, (int) Math.ceil( (minWidth + widgetPadding.left + widgetPadding.right) / smallestCellWidth)); spanY = Math.max(1, (int) Math.ceil( diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 0865925ff4..8f56eb69e4 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -796,7 +796,7 @@ public class LauncherProvider extends ContentProvider { case 26: // QSB was moved to the grid. Clear the first row on screen 0. if (FeatureFlags.QSB_ON_FIRST_SCREEN && - !LauncherDbUtils.prepareScreenZeroToHostQsb(db)) { + !LauncherDbUtils.prepareScreenZeroToHostQsb(mContext, db)) { break; } case 27: { diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index f5ffec7c44..93478523ce 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -115,7 +115,7 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme if (UninstallDropTarget.supportsDrop(host.getContext(), item)) { info.addAction(mActions.get(UNINSTALL)); } - if (InfoDropTarget.supportsDrop(item)) { + if (InfoDropTarget.supportsDrop(host.getContext(), item)) { info.addAction(mActions.get(INFO)); } diff --git a/src/com/android/launcher3/provider/LauncherDbUtils.java b/src/com/android/launcher3/provider/LauncherDbUtils.java index 2f8241907f..89fd99b233 100644 --- a/src/com/android/launcher3/provider/LauncherDbUtils.java +++ b/src/com/android/launcher3/provider/LauncherDbUtils.java @@ -17,6 +17,7 @@ package com.android.launcher3.provider; import android.content.ContentValues; +import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; @@ -42,7 +43,7 @@ public class LauncherDbUtils { * the first row. The items in the first screen are moved and resized but the carry-forward * items are simply deleted. */ - public static boolean prepareScreenZeroToHostQsb(SQLiteDatabase db) { + public static boolean prepareScreenZeroToHostQsb(Context context, SQLiteDatabase db) { db.beginTransaction(); try { // Get the existing screens @@ -75,8 +76,8 @@ public class LauncherDbUtils { } } - LauncherAppState app = LauncherAppState.getInstance(); - new LossyScreenMigrationTask(app.getContext(), app.getInvariantDeviceProfile(), db) + new LossyScreenMigrationTask( + context, LauncherAppState.getInstance().getInvariantDeviceProfile(), db) .migrateScreen0(); db.setTransactionSuccessful(); return true; diff --git a/src/com/android/launcher3/util/PendingRequestArgs.java b/src/com/android/launcher3/util/PendingRequestArgs.java index 8eea28bb88..9452fbd056 100644 --- a/src/com/android/launcher3/util/PendingRequestArgs.java +++ b/src/com/android/launcher3/util/PendingRequestArgs.java @@ -15,7 +15,9 @@ */ package com.android.launcher3.util; +import android.appwidget.AppWidgetProviderInfo; import android.content.ContentValues; +import android.content.Context; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; @@ -57,9 +59,8 @@ public class PendingRequestArgs extends ItemInfo implements Parcelable { mArg1 = parcel.readInt(); mObjectType = parcel.readInt(); if (parcel.readInt() != 0) { - mObject = mObjectType == TYPE_INTENT - ? Intent.CREATOR.createFromParcel(parcel) - : new LauncherAppWidgetProviderInfo(parcel); + mObject = (mObjectType == TYPE_INTENT ? Intent.CREATOR : AppWidgetProviderInfo.CREATOR) + .createFromParcel(parcel); } else { mObject = null; } @@ -86,8 +87,10 @@ public class PendingRequestArgs extends ItemInfo implements Parcelable { } } - public LauncherAppWidgetProviderInfo getWidgetProvider() { - return mObjectType == TYPE_APP_WIDGET ? (LauncherAppWidgetProviderInfo) mObject : null; + public LauncherAppWidgetProviderInfo getWidgetProvider(Context context) { + return mObjectType == TYPE_APP_WIDGET ? + LauncherAppWidgetProviderInfo.fromProviderInfo( + context, (AppWidgetProviderInfo) mObject) : null; } public int getWidgetId() { @@ -103,7 +106,7 @@ public class PendingRequestArgs extends ItemInfo implements Parcelable { } public static PendingRequestArgs forWidgetInfo( - int appWidgetId, LauncherAppWidgetProviderInfo widgetInfo, ItemInfo info) { + int appWidgetId, AppWidgetProviderInfo widgetInfo, ItemInfo info) { PendingRequestArgs args = new PendingRequestArgs(appWidgetId, TYPE_APP_WIDGET, widgetInfo); args.copyFrom(info); return args; From 097a725bb8d5a4c7322b3ddfb1861e52a1ba457c Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 28 Dec 2016 10:49:55 -0800 Subject: [PATCH 166/382] Fixed mw bug where resize frame is off when resizing. When a widget resizes in multi-window mode (ie. user is dragging the resize frame), the frame is misaligned until the user lets go. This is because the translation value to center fit the resized widget is not taken into consideration. Bug: 32176631 Change-Id: I6f9ee7be12d3266f021796576c771f86f6120246 --- .../launcher3/AppWidgetResizeFrame.java | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 90dcc80deb..9b9d6e6d48 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -212,6 +212,23 @@ public class AppWidgetResizeFrame extends FrameLayout lp.height = mTempRange1.size(); resizeWidgetIfNeeded(false); + + // When the widget resizes in multi-window mode, the translation value changes to maintain + // a center fit. These overrides ensure the resize frame always aligns with the widget view. + getSnappedRectRelativeToDragLayer(sTmpRect); + if (mLeftBorderActive) { + lp.width = sTmpRect.width() + sTmpRect.left - lp.x; + } + if (mTopBorderActive) { + lp.height = sTmpRect.height() + sTmpRect.top - lp.y; + } + if (mRightBorderActive) { + lp.x = sTmpRect.left; + } + if (mBottomBorderActive) { + lp.y = sTmpRect.top; + } + requestLayout(); } @@ -340,8 +357,8 @@ public class AppWidgetResizeFrame extends FrameLayout int xThreshold = mCellLayout.getCellWidth(); int yThreshold = mCellLayout.getCellHeight(); - mDeltaXAddOn = mRunningHInc * xThreshold; - mDeltaYAddOn = mRunningVInc * yThreshold; + mDeltaXAddOn = mRunningHInc * xThreshold; + mDeltaYAddOn = mRunningVInc * yThreshold; mDeltaX = 0; mDeltaY = 0; @@ -353,18 +370,35 @@ public class AppWidgetResizeFrame extends FrameLayout }); } - public void snapToWidget(boolean animate) { + /** + * Returns the rect of this view when the frame is snapped around the widget, with the bounds + * relative to the {@link DragLayer}. + */ + private void getSnappedRectRelativeToDragLayer(Rect out) { float scale = mWidgetView.getScaleToFit(); - mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect); + mDragLayer.getViewRectRelativeToSelf(mWidgetView, out); - int newWidth = 2 * mBackgroundPadding - + (int) (scale * (sTmpRect.width() - mWidgetPadding.left - mWidgetPadding.right)); - int newHeight = 2 * mBackgroundPadding - + (int) (scale * (sTmpRect.height() - mWidgetPadding.top - mWidgetPadding.bottom)); + int width = 2 * mBackgroundPadding + + (int) (scale * (out.width() - mWidgetPadding.left - mWidgetPadding.right)); + int height = 2 * mBackgroundPadding + + (int) (scale * (out.height() - mWidgetPadding.top - mWidgetPadding.bottom)); - int newX = (int) (sTmpRect.left - mBackgroundPadding + scale * mWidgetPadding.left); - int newY = (int) (sTmpRect.top - mBackgroundPadding + scale * mWidgetPadding.top); + int x = (int) (out.left - mBackgroundPadding + scale * mWidgetPadding.left); + int y = (int) (out.top - mBackgroundPadding + scale * mWidgetPadding.top); + + out.left = x; + out.top = y; + out.right = out.left + width; + out.bottom = out.top + height; + } + + public void snapToWidget(boolean animate) { + getSnappedRectRelativeToDragLayer(sTmpRect); + int newWidth = sTmpRect.width(); + int newHeight = sTmpRect.height(); + int newX = sTmpRect.left; + int newY = sTmpRect.top; // We need to make sure the frame's touchable regions lie fully within the bounds of the // DragLayer. We allow the actual handles to be clipped, but we shift the touch regions From 9f33cb2ce23a8474a707ddd6ccc86f9f1aa6a397 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 3 Jan 2017 09:30:00 -0800 Subject: [PATCH 167/382] Bind the out IntRange using its start and end values. In applyDeltaAndBound, we add the current IntRange values + delta param to the outbound IntRange -- but then we only bind based on the current IntRange values, so the out IntRange values can end be out of bounds. Change-Id: Ibbaae8c2c2734107d1fd7ce8a59a4c66d83068ad --- src/com/android/launcher3/AppWidgetResizeFrame.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 90dcc80deb..f8792163c7 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -518,10 +518,10 @@ public class AppWidgetResizeFrame extends FrameLayout public int applyDeltaAndBound(boolean moveStart, boolean moveEnd, int delta, int minSize, int maxEnd, IntRange out) { applyDelta(moveStart, moveEnd, delta, out); - if (start < 0) { + if (out.start < 0) { out.start = 0; } - if (end > maxEnd) { + if (out.end > maxEnd) { out.end = maxEnd; } if (out.size() < minSize) { From ee4ee424b42f76ce41dfd659a92f249af8ccd0e1 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 27 Dec 2016 15:41:24 -0800 Subject: [PATCH 168/382] Enables direct scrolling on the fastscroll bar. This enables to touch anywhere in the scrollbar to directly scroll to that particular point without the need of exactly touching the thumb to start fastscrolling. This feature is currently behind a feature flag LAUNCHER3_DIRECT_SCROLL and enabled by default. Change-Id: I5b86c6acb71ff0c88476343657da221c7bdc59c3 --- .../BaseRecyclerViewFastScrollBar.java | 65 +++++++++++++------ .../launcher3/config/FeatureFlags.java | 2 + 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java index 40c5ed65db..4fecc3da5f 100644 --- a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java +++ b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java @@ -28,6 +28,8 @@ import android.view.View; import android.view.ViewConfiguration; import android.widget.TextView; +import com.android.launcher3.config.FeatureFlags; + /** * The track and scrollbar that shows when you scroll the list. */ @@ -198,6 +200,11 @@ public class BaseRecyclerViewFastScrollBar { case MotionEvent.ACTION_DOWN: if (isNearThumb(downX, downY)) { mTouchOffsetY = downY - mThumbOffsetY; + } else if (FeatureFlags.LAUNCHER3_DIRECT_SCROLL + && mRv.supportsFastScrolling() + && isNearScrollBar(downX)) { + calcTouchOffsetAndPrepToFastScroll(downY, lastY); + updateFastScrollSectionNameAndThumbOffset(lastY, y); } break; case MotionEvent.ACTION_MOVE: @@ -207,28 +214,10 @@ public class BaseRecyclerViewFastScrollBar { if (!mIsDragging && !mIgnoreDragGesture && mRv.supportsFastScrolling() && isNearThumb(downX, lastY) && Math.abs(y - downY) > config.getScaledTouchSlop()) { - mRv.getParent().requestDisallowInterceptTouchEvent(true); - mIsDragging = true; - if (mCanThumbDetach) { - mIsThumbDetached = true; - } - mTouchOffsetY += (lastY - downY); - animatePopupVisibility(true); - showActiveScrollbar(true); + calcTouchOffsetAndPrepToFastScroll(downY, lastY); } if (mIsDragging) { - // Update the fastscroller section name at this touch position - int bottom = mRv.getScrollbarTrackHeight() - mThumbHeight; - float boundedY = (float) Math.max(0, Math.min(bottom, y - mTouchOffsetY)); - String sectionName = mRv.scrollToPositionAtProgress(boundedY / bottom); - if (!sectionName.equals(mPopupSectionName)) { - mPopupSectionName = sectionName; - mPopupView.setText(sectionName); - } - animatePopupVisibility(!sectionName.isEmpty()); - updatePopupY(lastY); - mLastTouchY = boundedY; - setThumbOffsetY((int) mLastTouchY); + updateFastScrollSectionNameAndThumbOffset(lastY, y); } break; case MotionEvent.ACTION_UP: @@ -245,6 +234,32 @@ public class BaseRecyclerViewFastScrollBar { } } + private void calcTouchOffsetAndPrepToFastScroll(int downY, int lastY) { + mRv.getParent().requestDisallowInterceptTouchEvent(true); + mIsDragging = true; + if (mCanThumbDetach) { + mIsThumbDetached = true; + } + mTouchOffsetY += (lastY - downY); + animatePopupVisibility(true); + showActiveScrollbar(true); + } + + private void updateFastScrollSectionNameAndThumbOffset(int lastY, int y) { + // Update the fastscroller section name at this touch position + int bottom = mRv.getScrollbarTrackHeight() - mThumbHeight; + float boundedY = (float) Math.max(0, Math.min(bottom, y - mTouchOffsetY)); + String sectionName = mRv.scrollToPositionAtProgress(boundedY / bottom); + if (!sectionName.equals(mPopupSectionName)) { + mPopupSectionName = sectionName; + mPopupView.setText(sectionName); + } + animatePopupVisibility(!sectionName.isEmpty()); + updatePopupY(lastY); + mLastTouchY = boundedY; + setThumbOffsetY((int) mLastTouchY); + } + public void draw(Canvas canvas) { if (mThumbOffsetY < 0) { return; @@ -277,7 +292,7 @@ public class BaseRecyclerViewFastScrollBar { } /** - * Returns whether the specified points are near the scroll bar bounds. + * Returns whether the specified point is inside the thumb bounds. */ public boolean isNearThumb(int x, int y) { int left = getDrawLeft(); @@ -286,6 +301,14 @@ public class BaseRecyclerViewFastScrollBar { return mTmpRect.contains(x, y); } + /** + * Returns whether the specified x position is near the scroll bar. + */ + public boolean isNearScrollBar(int x) { + int left = getDrawLeft(); + return x >= left && x <= left + mMaxWidth; + } + private void animatePopupVisibility(boolean visible) { if (mPopupVisible != visible) { mPopupVisible = visible; diff --git a/src_config/com/android/launcher3/config/FeatureFlags.java b/src_config/com/android/launcher3/config/FeatureFlags.java index 99d2654a49..4cad836c35 100644 --- a/src_config/com/android/launcher3/config/FeatureFlags.java +++ b/src_config/com/android/launcher3/config/FeatureFlags.java @@ -37,4 +37,6 @@ public final class FeatureFlags { public static final boolean PULLDOWN_SEARCH = false; // When enabled the status bar may show dark icons based on the top of the wallpaper. public static final boolean LIGHT_STATUS_BAR = false; + // When enabled allows to use any point on the fast scrollbar to start dragging. + public static final boolean LAUNCHER3_DIRECT_SCROLL = true; } From 3fe4a146cf774261ab3552dd8ab392439c771e54 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 15 Dec 2016 17:40:07 -0800 Subject: [PATCH 169/382] Simplifying IconCache access code Providing a way to access icon cache without LauncherAcitivtiyInfo. This allows fetching LauncherActivityInfo only when required, thus avoiding system RPC when the icon is already in cache. Change-Id: I92918c7a0d0d0796e5f7b70d4ecb6787c52c6600 --- src/com/android/launcher3/AppInfo.java | 19 +- src/com/android/launcher3/IconCache.java | 189 ++++++++---------- .../android/launcher3/ItemInfoWithIcon.java | 41 ++++ src/com/android/launcher3/Launcher.java | 2 +- src/com/android/launcher3/LauncherModel.java | 16 +- src/com/android/launcher3/ShortcutInfo.java | 42 +--- .../compat/DeferredLauncherActivityInfo.java | 83 -------- .../android/launcher3/model/BgDataModel.java | 4 +- .../launcher3/model/CacheDataUpdatedTask.java | 2 +- .../launcher3/model/PackageItemInfo.java | 18 +- .../launcher3/model/PackageUpdatedTask.java | 6 +- .../launcher3/model/ShortcutsChangedTask.java | 2 +- .../model/UserLockStateChangedTask.java | 3 +- .../shortcuts/ShortcutInfoCompat.java | 6 - .../launcher3/shortcuts/ShortcutKey.java | 6 +- .../launcher3/util/ItemInfoMatcher.java | 2 +- 16 files changed, 163 insertions(+), 278 deletions(-) create mode 100644 src/com/android/launcher3/ItemInfoWithIcon.java delete mode 100644 src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index f7c51847e8..9c9dcc5f91 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -19,7 +19,6 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.os.UserHandle; import android.util.Log; @@ -33,23 +32,13 @@ import java.util.ArrayList; /** * Represents an app in AllAppsView. */ -public class AppInfo extends ItemInfo { +public class AppInfo extends ItemInfoWithIcon { /** * The intent used to start the application. */ public Intent intent; - /** - * A bitmap version of the application icon. - */ - public Bitmap iconBitmap; - - /** - * Indicates whether we're using a low res icon - */ - boolean usingLowResIcon; - public ComponentName componentName; /** @@ -66,10 +55,6 @@ public class AppInfo extends ItemInfo { return intent; } - protected Intent getRestoredIntent() { - return null; - } - /** * Must not hold the Context. */ @@ -96,8 +81,8 @@ public class AppInfo extends ItemInfo { isDisabled |= ShortcutInfo.FLAG_DISABLED_QUIET_USER; } - iconCache.getTitleAndIcon(this, info, useLowResIcon); intent = makeLaunchIntent(context, info, user); + iconCache.getTitleAndIcon(this, info, useLowResIcon); } public AppInfo(AppInfo info) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 3557447f53..b22cb7c1a0 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -41,6 +41,7 @@ import android.os.Handler; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; +import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; @@ -51,6 +52,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.Provider; import com.android.launcher3.util.SQLiteCacheHelper; import com.android.launcher3.util.Thunk; @@ -409,16 +411,10 @@ public class IconCache { @Override public void run() { - if (info instanceof AppInfo) { - getTitleAndIcon((AppInfo) info, null, false); - } else if (info instanceof ShortcutInfo) { - ShortcutInfo st = (ShortcutInfo) info; - getTitleAndIcon(st, - st.promisedIntent != null ? st.promisedIntent : st.intent, - st.user, false); + if (info instanceof AppInfo || info instanceof ShortcutInfo) { + getTitleAndIcon((ItemInfoWithIcon) info, false); } else if (info instanceof PackageItemInfo) { - PackageItemInfo pti = (PackageItemInfo) info; - getTitleAndIconForApp(pti, false); + getTitleAndIconForApp((PackageItemInfo) info, false); } mMainThreadExecutor.execute(new Runnable() { @@ -433,38 +429,6 @@ public class IconCache { return new IconLoadRequest(request, mWorkerHandler); } - private Bitmap getNonNullIcon(CacheEntry entry, UserHandle user) { - return entry.icon == null ? getDefaultIcon(user) : entry.icon; - } - - /** - * Fill in "application" with the icon and label for "info." - */ - public synchronized void getTitleAndIcon(AppInfo application, - LauncherActivityInfoCompat info, boolean useLowResIcon) { - UserHandle user = info == null ? application.user : info.getUser(); - CacheEntry entry = cacheLocked(application.componentName, info, user, - false, useLowResIcon); - application.title = Utilities.trim(entry.title); - application.contentDescription = entry.contentDescription; - application.iconBitmap = getNonNullIcon(entry, user); - application.usingLowResIcon = entry.isLowResIcon; - } - - /** - * Updates {@param application} only if a valid entry is found. - */ - public synchronized void updateTitleAndIcon(AppInfo application) { - CacheEntry entry = cacheLocked(application.componentName, null, application.user, - false, application.usingLowResIcon); - if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { - application.title = Utilities.trim(entry.title); - application.contentDescription = entry.contentDescription; - application.iconBitmap = entry.icon; - application.usingLowResIcon = entry.isLowResIcon; - } - } - /** * Returns a high res icon for the given intent and user */ @@ -475,43 +439,59 @@ public class IconCache { if (component == null) { return getDefaultIcon(user); } - - LauncherActivityInfoCompat launcherActInfo = mLauncherApps.resolveActivity(intent, user); - CacheEntry entry = cacheLocked(component, launcherActInfo, user, true, false /* useLowRes */); - return entry.icon; + return cacheLocked(component, new ActivityInfoProvider(intent, user), + user, true, false /* useLowRes */).icon; } /** - * Fill in {@param shortcutInfo} with the icon and label for {@param intent}. If the + * Updates {@param application} only if a valid entry is found. + */ + public synchronized void updateTitleAndIcon(AppInfo application) { + CacheEntry entry = cacheLocked(application.componentName, + Provider.of(null), + application.user, false, application.usingLowResIcon); + if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { + applyCacheEntry(entry, application); + } + } + + /** + * Fill in {@param info} with the icon and label for {@param activityInfo} + */ + public synchronized void getTitleAndIcon(ItemInfoWithIcon info, + LauncherActivityInfoCompat activityInfo, boolean useLowResIcon) { + // If we already have activity info, no need to use package icon + getTitleAndIcon(info, Provider.of(activityInfo), false, useLowResIcon); + } + + /** + * Fill in {@param info} with the icon and label. If the * corresponding activity is not found, it reverts to the package icon. */ - public synchronized void getTitleAndIcon(ShortcutInfo shortcutInfo, Intent intent, - UserHandle user, boolean useLowResIcon) { - ComponentName component = intent.getComponent(); + public synchronized void getTitleAndIcon(ItemInfoWithIcon info, boolean useLowResIcon) { // null info means not installed, but if we have a component from the intent then // we should still look in the cache for restored app icons. - if (component == null) { - shortcutInfo.iconBitmap = getDefaultIcon(user); - shortcutInfo.title = ""; - shortcutInfo.contentDescription = ""; - shortcutInfo.usingLowResIcon = false; + if (info.getTargetComponent() == null) { + info.iconBitmap = getDefaultIcon(info.user); + info.title = ""; + info.contentDescription = ""; + info.usingLowResIcon = false; } else { - LauncherActivityInfoCompat info = mLauncherApps.resolveActivity(intent, user); - getTitleAndIcon(shortcutInfo, component, info, user, true, useLowResIcon); + getTitleAndIcon(info, new ActivityInfoProvider(info.getIntent(), info.user), + true, useLowResIcon); } } /** * Fill in {@param shortcutInfo} with the icon and label for {@param info} */ - public synchronized void getTitleAndIcon( - ShortcutInfo shortcutInfo, ComponentName component, LauncherActivityInfoCompat info, - UserHandle user, boolean usePkgIcon, boolean useLowResIcon) { - CacheEntry entry = cacheLocked(component, info, user, usePkgIcon, useLowResIcon); - shortcutInfo.iconBitmap = getNonNullIcon(entry, user); - shortcutInfo.title = Utilities.trim(entry.title); - shortcutInfo.contentDescription = entry.contentDescription; - shortcutInfo.usingLowResIcon = entry.isLowResIcon; + private synchronized void getTitleAndIcon( + @NonNull ItemInfoWithIcon infoInOut, + @NonNull Provider activityInfoProvider, + boolean usePkgIcon, boolean useLowResIcon) { + CacheEntry entry = cacheLocked(infoInOut.getTargetComponent(), activityInfoProvider, + infoInOut.user, usePkgIcon, useLowResIcon); + applyCacheEntry(entry, infoInOut); } /** @@ -521,10 +501,14 @@ public class IconCache { PackageItemInfo infoInOut, boolean useLowResIcon) { CacheEntry entry = getEntryForPackageLocked( infoInOut.packageName, infoInOut.user, useLowResIcon); - infoInOut.title = Utilities.trim(entry.title); - infoInOut.contentDescription = entry.contentDescription; - infoInOut.iconBitmap = getNonNullIcon(entry, infoInOut.user); - infoInOut.usingLowResIcon = entry.isLowResIcon; + applyCacheEntry(entry, infoInOut); + } + + private void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { + info.title = Utilities.trim(entry.title); + info.contentDescription = entry.contentDescription; + info.iconBitmap = entry.icon == null ? getDefaultIcon(info.user) : entry.icon; + info.usingLowResIcon = entry.isLowResIcon; } public synchronized Bitmap getDefaultIcon(UserHandle user) { @@ -542,7 +526,9 @@ public class IconCache { * Retrieves the entry from the cache. If the entry is not present, it creates a new entry. * This method is not thread safe, it must be called from a synchronized method. */ - protected CacheEntry cacheLocked(ComponentName componentName, LauncherActivityInfoCompat info, + protected CacheEntry cacheLocked( + @NonNull ComponentName componentName, + @NonNull Provider infoProfider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { ComponentKey cacheKey = new ComponentKey(componentName, user); CacheEntry entry = mCache.get(cacheKey); @@ -551,7 +537,13 @@ public class IconCache { mCache.put(cacheKey, entry); // Check the DB first. + LauncherActivityInfoCompat info = null; + boolean providerFetchedOnce = false; + if (!getEntryFromDB(cacheKey, entry, useLowResIcon) || DEBUG_IGNORE_CACHE) { + info = infoProfider.get(); + providerFetchedOnce = true; + if (info != null) { entry.icon = LauncherIcons.createBadgedIconBitmap( mIconProvider.getIcon(info, mIconDpi), info.getUser(), @@ -576,9 +568,15 @@ public class IconCache { } } - if (TextUtils.isEmpty(entry.title) && info != null) { - entry.title = info.getLabel(); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + if (TextUtils.isEmpty(entry.title)) { + if (info == null && !providerFetchedOnce) { + info = infoProfider.get(); + providerFetchedOnce = true; + } + if (info != null) { + entry.title = info.getLabel(); + entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + } } } return entry; @@ -668,37 +666,6 @@ public class IconCache { return entry; } - /** - * Pre-load an icon into the persistent cache. - * - *

Queries for a component that does not exist in the package manager - * will be answered by the persistent cache. - * - * @param componentName the icon should be returned for this component - * @param icon the icon to be persisted - * @param dpi the native density of the icon - */ - public void preloadIcon(ComponentName componentName, Bitmap icon, int dpi, String label, - long userSerial, InvariantDeviceProfile idp) { - // TODO rescale to the correct native DPI - try { - PackageManager packageManager = mContext.getPackageManager(); - packageManager.getActivityIcon(componentName); - // component is present on the system already, do nothing - return; - } catch (PackageManager.NameNotFoundException e) { - // pass - } - - icon = Bitmap.createScaledBitmap(icon, idp.iconBitmapSize, idp.iconBitmapSize, true); - Bitmap lowResIcon = generateLowResIcon(icon, Color.TRANSPARENT); - ContentValues values = newContentValues(icon, lowResIcon, label, - componentName.getPackageName()); - values.put(IconDB.COLUMN_COMPONENT, componentName.flattenToString()); - values.put(IconDB.COLUMN_USER, userSerial); - mIconDb.insertOrReplace(values); - } - private boolean getEntryFromDB(ComponentKey cacheKey, CacheEntry entry, boolean lowRes) { Cursor c = null; try { @@ -885,4 +852,20 @@ public class IconCache { return null; } } + + private class ActivityInfoProvider extends Provider { + + private final Intent mIntent; + private final UserHandle mUser; + + public ActivityInfoProvider(Intent intent, UserHandle user) { + mIntent = intent; + mUser = user; + } + + @Override + public LauncherActivityInfoCompat get() { + return mLauncherApps.resolveActivity(mIntent, mUser); + } + } } diff --git a/src/com/android/launcher3/ItemInfoWithIcon.java b/src/com/android/launcher3/ItemInfoWithIcon.java new file mode 100644 index 0000000000..a3d8c6a9d4 --- /dev/null +++ b/src/com/android/launcher3/ItemInfoWithIcon.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 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.launcher3; + +import android.graphics.Bitmap; + +/** + * Represents an ItemInfo which also holds an icon. + */ +public abstract class ItemInfoWithIcon extends ItemInfo { + + /** + * A bitmap version of the application icon. + */ + public Bitmap iconBitmap; + + /** + * Indicates whether we're using a low res icon + */ + public boolean usingLowResIcon; + + protected ItemInfoWithIcon() { } + + protected ItemInfoWithIcon(ItemInfo info) { + super(info); + } +} diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 7dd8450165..8e28912dbb 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3799,7 +3799,7 @@ public class Launcher extends Activity for (ShortcutInfo si : removed) { if (si.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) { - removedDeepShortcuts.add(ShortcutKey.fromShortcutInfo(si)); + removedDeepShortcuts.add(ShortcutKey.fromItemInfo(si)); } else { removedComponents.add(si.getTargetComponent()); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 0dc91e3a8e..58a74951c1 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1794,8 +1794,7 @@ public class LauncherModel extends BroadcastReceiver for (ShortcutInfo info : folder.contents) { if (info.usingLowResIcon && info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - mIconCache.getTitleAndIcon( - info, info.getPromisedIntent(), info.user, false); + mIconCache.getTitleAndIcon(info, false); } pos ++; if (pos >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { @@ -2520,10 +2519,12 @@ public class LauncherModel extends BroadcastReceiver int promiseType, int itemType, CursorIconInfo iconInfo) { final ShortcutInfo info = new ShortcutInfo(); info.user = Process.myUserHandle(); + info.promisedIntent = intent; + info.iconBitmap = iconInfo.loadIcon(c, info); // the fallback icon if (info.iconBitmap == null) { - mIconCache.getTitleAndIcon(info, intent, info.user, false /* useLowResIcon */); + mIconCache.getTitleAndIcon(info, false /* useLowResIcon */); } if ((promiseType & ShortcutInfo.FLAG_RESTORED_ICON) != 0) { @@ -2541,7 +2542,6 @@ public class LauncherModel extends BroadcastReceiver info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); info.itemType = itemType; - info.promisedIntent = intent; info.status = promiseType; return info; } @@ -2592,7 +2592,11 @@ public class LauncherModel extends BroadcastReceiver } final ShortcutInfo info = new ShortcutInfo(); - mIconCache.getTitleAndIcon(info, componentName, lai, user, false, useLowResIcon); + info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; + info.user = user; + info.intent = newIntent; + + mIconCache.getTitleAndIcon(info, lai, useLowResIcon); if (mIconCache.isDefaultIcon(info.iconBitmap, user) && c != null) { Bitmap icon = iconInfo.loadIcon(c); info.iconBitmap = icon != null ? icon : mIconCache.getDefaultIcon(user); @@ -2612,8 +2616,6 @@ public class LauncherModel extends BroadcastReceiver info.title = componentName.getClassName(); } - info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; - info.user = user; info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); return info; } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index b9010c76e2..05fb1ed782 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -17,7 +17,6 @@ package com.android.launcher3; import android.annotation.TargetApi; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -37,7 +36,7 @@ import com.android.launcher3.util.ContentWriter; /** * Represents a launchable icon on the workspaces and in folders. */ -public class ShortcutInfo extends ItemInfo { +public class ShortcutInfo extends ItemInfoWithIcon { public static final int DEFAULT = 0; @@ -76,22 +75,12 @@ public class ShortcutInfo extends ItemInfo { */ public Intent intent; - /** - * Indicates whether we're using a low res icon - */ - public boolean usingLowResIcon; - /** * If isShortcut=true and customIcon=false, this contains a reference to the * shortcut icon as an application's resource. */ public Intent.ShortcutIconResource iconResource; - /** - * The application icon. - */ - public Bitmap iconBitmap; - /** * Indicates that the icon is disabled due to safe mode restrictions. */ @@ -152,16 +141,6 @@ public class ShortcutInfo extends ItemInfo { itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_SHORTCUT; } - @Override - public Intent getIntent() { - return intent; - } - - /** Returns {@link #promisedIntent}, or {@link #intent} if promisedIntent is null. */ - public Intent getPromisedIntent() { - return promisedIntent != null ? promisedIntent : intent; - } - public ShortcutInfo(ShortcutInfo info) { super(info); title = info.title; @@ -197,7 +176,7 @@ public class ShortcutInfo extends ItemInfo { void onAddToDatabase(ContentWriter writer) { super.onAddToDatabase(writer); writer.put(LauncherSettings.BaseLauncherColumns.TITLE, title) - .put(LauncherSettings.BaseLauncherColumns.INTENT, getPromisedIntent()) + .put(LauncherSettings.BaseLauncherColumns.INTENT, getIntent()) .put(LauncherSettings.Favorites.RESTORED, status); if (!usingLowResIcon) { @@ -210,8 +189,12 @@ public class ShortcutInfo extends ItemInfo { } } - public ComponentName getTargetComponent() { - return getPromisedIntent().getComponent(); + /** + * Returns {@link #promisedIntent}, or {@link #intent} if promisedIntent is null. + */ + @Override + public Intent getIntent() { + return promisedIntent != null ? promisedIntent : intent; } public boolean hasStatusFlag(int flag) { @@ -270,19 +253,14 @@ public class ShortcutInfo extends ItemInfo { AppInfo appInfo = new AppInfo(); appInfo.user = user; appInfo.componentName = shortcutInfo.getActivity(); - try { - cache.getTitleAndIcon(appInfo, shortcutInfo.getActivityInfo(context), false); - } catch (NullPointerException e) { - // This may happen when we fail to load the activity info. Worst case ignore badging. - return LauncherIcons.badgeIconForUser(unbadgedBitmap, user, context); - } + cache.getTitleAndIcon(appInfo, false); return LauncherIcons.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ public String getDeepShortcutId() { return itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT ? - getPromisedIntent().getStringExtra(ShortcutInfoCompat.EXTRA_SHORTCUT_ID) : null; + getIntent().getStringExtra(ShortcutInfoCompat.EXTRA_SHORTCUT_ID) : null; } @Override diff --git a/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java b/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java deleted file mode 100644 index 4dd05bb00d..0000000000 --- a/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2016 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.launcher3.compat; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.graphics.drawable.Drawable; -import android.os.UserHandle; - -/** - * {@link LauncherActivityInfoCompat} which loads its data only when needed. - */ -public class DeferredLauncherActivityInfo extends LauncherActivityInfoCompat { - - private final ComponentName mComponent; - private final UserHandle mUser; - private final Context mContext; - - private LauncherActivityInfoCompat mActualInfo; - - public DeferredLauncherActivityInfo( - ComponentName component, UserHandle user, Context context) { - mComponent = component; - mUser = user; - mContext = context; - } - - @Override - public ComponentName getComponentName() { - return mComponent; - } - - @Override - public UserHandle getUser() { - return mUser; - } - - private synchronized LauncherActivityInfoCompat getActualInfo() { - if (mActualInfo == null) { - Intent intent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_LAUNCHER) - .setComponent(mComponent); - mActualInfo = LauncherAppsCompat.getInstance(mContext).resolveActivity(intent, mUser); - } - return mActualInfo; - } - - @Override - public CharSequence getLabel() { - return getActualInfo().getLabel(); - } - - @Override - public Drawable getIcon(int density) { - return getActualInfo().getIcon(density); - } - - @Override - public ApplicationInfo getApplicationInfo() { - return getActualInfo().getApplicationInfo(); - } - - @Override - public long getFirstInstallTime() { - return getActualInfo().getFirstInstallTime(); - } -} diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 05f43aff4c..6dc5a365d7 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -123,7 +123,7 @@ public class BgDataModel { break; case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: { // Decrement pinned shortcut count - ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); + ShortcutKey pinnedShortcut = ShortcutKey.fromItemInfo(item); MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); Context context = LauncherAppState.getInstance().getContext(); if ((count == null || --count.value == 0) @@ -155,7 +155,7 @@ public class BgDataModel { break; case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: { // Increment the count for the given shortcut - ShortcutKey pinnedShortcut = ShortcutKey.fromShortcutInfo((ShortcutInfo) item); + ShortcutKey pinnedShortcut = ShortcutKey.fromItemInfo(item); MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); if (count == null) { count = new MutableInt(1); diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index 9d693a40ee..46130fc0b1 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -65,7 +65,7 @@ public class CacheDataUpdatedTask extends ExtendedModelTask { if (si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && isValidShortcut(si) && cn != null && mPackages.contains(cn.getPackageName())) { - iconCache.getTitleAndIcon(si, si.getPromisedIntent(), si.user, si.usingLowResIcon); + iconCache.getTitleAndIcon(si, si.usingLowResIcon); updatedShortcuts.add(si); } } diff --git a/src/com/android/launcher3/model/PackageItemInfo.java b/src/com/android/launcher3/model/PackageItemInfo.java index 00470e1eaa..e05bf1e90a 100644 --- a/src/com/android/launcher3/model/PackageItemInfo.java +++ b/src/com/android/launcher3/model/PackageItemInfo.java @@ -16,27 +16,15 @@ package com.android.launcher3.model; -import android.graphics.Bitmap; - -import com.android.launcher3.ItemInfo; +import com.android.launcher3.ItemInfoWithIcon; /** * Represents a {@link Package} in the widget tray section. */ -public class PackageItemInfo extends ItemInfo { +public class PackageItemInfo extends ItemInfoWithIcon { /** - * A bitmap version of the application icon. - */ - public Bitmap iconBitmap; - - /** - * Indicates whether we're using a low res icon. - */ - public boolean usingLowResIcon; - - /** - * Package name of the {@link ItemInfo}. + * Package name of the {@link PackageItemInfo}. */ public String packageName; diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index bafa95b6c6..f5de6508e1 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -251,15 +251,13 @@ public class PackageUpdatedTask extends ExtendedModelTask { si.status = ShortcutInfo.DEFAULT; infoUpdated = true; if (si.itemType == Favorites.ITEM_TYPE_APPLICATION) { - iconCache.getTitleAndIcon(si, si.getPromisedIntent(), - si.user, si.usingLowResIcon); + iconCache.getTitleAndIcon(si, si.usingLowResIcon); } } if (appInfo != null && Intent.ACTION_MAIN.equals(si.intent.getAction()) && si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - iconCache.getTitleAndIcon( - si, si.getPromisedIntent(), si.user, si.usingLowResIcon); + iconCache.getTitleAndIcon(si, si.usingLowResIcon); infoUpdated = true; } diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 3750a7e638..67bec64379 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -61,7 +61,7 @@ public class ShortcutsChangedTask extends ExtendedModelTask { for (ItemInfo itemInfo : dataModel.itemsIdMap) { if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { ShortcutInfo si = (ShortcutInfo) itemInfo; - if (si.getPromisedIntent().getPackage().equals(mPackageName) + if (si.getIntent().getPackage().equals(mPackageName) && si.user.equals(mUser)) { idsToWorkspaceShortcutInfos.addToList(si.getDeepShortcutId(), si); } diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index 15496b8963..a214a2915e 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -76,8 +76,7 @@ public class UserLockStateChangedTask extends ExtendedModelTask { && mUser.equals(itemInfo.user)) { ShortcutInfo si = (ShortcutInfo) itemInfo; if (isUserUnlocked) { - ShortcutInfoCompat shortcut = - pinnedShortcuts.get(ShortcutKey.fromShortcutInfo(si)); + ShortcutInfoCompat shortcut = pinnedShortcuts.get(ShortcutKey.fromItemInfo(si)); // We couldn't verify the shortcut during loader. If its no longer available // (probably due to clear data), delete the workspace item as well if (shortcut == null) { diff --git a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java index acc632c36f..dac2160546 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java +++ b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java @@ -25,8 +25,6 @@ import android.os.Build; import android.os.UserHandle; import com.android.launcher3.ItemInfo; -import com.android.launcher3.compat.DeferredLauncherActivityInfo; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserManagerCompat; /** @@ -122,8 +120,4 @@ public class ShortcutInfoCompat { public String toString() { return mShortcutInfo.toString(); } - - public LauncherActivityInfoCompat getActivityInfo(Context context) { - return new DeferredLauncherActivityInfo(getActivity(), getUserHandle(), context); - } } diff --git a/src/com/android/launcher3/shortcuts/ShortcutKey.java b/src/com/android/launcher3/shortcuts/ShortcutKey.java index 8f72666323..e86bfb2b2e 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutKey.java +++ b/src/com/android/launcher3/shortcuts/ShortcutKey.java @@ -4,7 +4,7 @@ import android.content.ComponentName; import android.content.Intent; import android.os.UserHandle; -import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.ItemInfo; import com.android.launcher3.util.ComponentKey; /** @@ -32,7 +32,7 @@ public class ShortcutKey extends ComponentKey { return new ShortcutKey(intent.getPackage(), user, shortcutId); } - public static ShortcutKey fromShortcutInfo(ShortcutInfo info) { - return fromIntent(info.getPromisedIntent(), info.user); + public static ShortcutKey fromItemInfo(ItemInfo info) { + return fromIntent(info.getIntent(), info.user); } } diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index b6e0e6e295..42de284665 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -100,7 +100,7 @@ public abstract class ItemInfoMatcher { @Override public boolean matches(ItemInfo info, ComponentName cn) { return info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT && - keys.contains(ShortcutKey.fromShortcutInfo((ShortcutInfo) info)); + keys.contains(ShortcutKey.fromItemInfo(info)); } }; } From 76dbf6fafd73d67b9987b53a2544abddb03c5ca7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 3 Jan 2017 14:55:47 -0800 Subject: [PATCH 170/382] Fixing onPageBeginTransition not being called when scrolling overlay Bug: 33693546 Change-Id: If212a196648fbb2c725ca4800a157ec24f278ca8 --- src/com/android/launcher3/PagedView.java | 3 ++- src/com/android/launcher3/Workspace.java | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 7aed15599b..76e2073f2e 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -563,7 +563,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc protected boolean computeScrollHelper(boolean shouldInvalidate) { if (mScroller.computeScrollOffset()) { // Don't bother scrolling if the page does not need to be moved - if (getScrollX() != mScroller.getCurrX() + if (getUnboundedScrollX() != mScroller.getCurrX() || getScrollY() != mScroller.getCurrY()) { float scaleX = mFreeScroll ? getScaleX() : 1f; int scrollX = (int) (mScroller.getCurrX() * (1 / scaleX)); @@ -1945,6 +1945,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Trigger a compute() to finish switching pages if necessary if (immediate) { computeScroll(); + pageEndTransition(); } invalidate(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index fccff6cf44..cf6b025059 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1386,12 +1386,10 @@ public class Workspace extends PagedView // it's own settling, and every gesture to the overlay should be self-contained and start // from 0, so we zero it out here. if (isScrollingOverlay()) { - int finalScroll = mIsRtl ? mMaxScrollX : 0; - // We reset mWasInOverscroll so that PagedView doesn't zero out the overscroll - // interaction when we call scrollTo. + // interaction when we call snapToPageImmediately. mWasInOverscroll = false; - scrollTo(finalScroll, getScrollY()); + snapToPageImmediately(0); } else { super.snapToDestination(); } From 72dbd91a56b02a4e8ce23741c2b906963dd3d054 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 4 Jan 2017 14:03:07 -0800 Subject: [PATCH 171/382] Reset initial animation values before completing reorder animation. In some reorder cases, the icons would stop in a transient position. Change-Id: I9d358e74ab403989929dee87542d3dde78c2f229 --- src/com/android/launcher3/CellLayout.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 70c8739bee..da12e67de1 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -2096,6 +2096,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { a.cancel(); } + setInitialAnimationValues(true); a = new LauncherViewPropertyAnimator(child) .scaleX(initScale) .scaleY(initScale) From b0d77fe35f0d2e84154f4e1c4426ed3845361998 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 5 Jan 2017 10:55:42 -0800 Subject: [PATCH 172/382] Revert "Build empty test apk until junit dependency issue is sorted out." This reverts commit 4c82c33a64b9f6719a0a1457361362cf70e2c9ac. Change-Id: I39c142e2b0e882245a6928264465578e4ddc12c9 --- tests/Android.mk | 4 ++-- .../launcher3/model/BaseModelUpdateTaskTestCase.java | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/Android.mk b/tests/Android.mk index 466146e3b4..5103ced7cf 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -17,9 +17,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests -#LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 -#LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SDK_VERSION := current LOCAL_MIN_SDK_VERSION := 21 diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index f23a574e95..1d092ab043 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -8,6 +8,7 @@ import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Process; import android.os.UserHandle; +import android.support.annotation.NonNull; import android.support.test.InstrumentationRegistry; import android.test.ProviderTestCase2; @@ -24,6 +25,7 @@ import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.Provider; import com.android.launcher3.util.TestLauncherProvider; import org.mockito.ArgumentCaptor; @@ -184,9 +186,10 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 infoProvider, + UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { CacheEntry entry = mCache.get(new ComponentKey(componentName, user)); if (entry == null) { entry = new CacheEntry(); From 2d7cca1e052b982a1fd1d28c0174ad4e6f2d22d3 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 3 Jan 2017 16:52:43 -0800 Subject: [PATCH 173/382] Updating PendingAppWidgetHostView to load icon on the background thread Bug: 21325319 Change-Id: I0886eec5a3f36f5e1ac18020c54891a56bdb5ed2 --- src/com/android/launcher3/BubbleTextView.java | 22 ++++--------- src/com/android/launcher3/IconCache.java | 33 ++++++++----------- .../launcher3/PendingAppWidgetHostView.java | 20 +++++++---- .../launcher3/model/PackageItemInfo.java | 2 +- 4 files changed, 34 insertions(+), 43 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 5e9e7e2074..b8b43c9c30 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -38,6 +38,7 @@ import android.view.ViewParent; import android.widget.TextView; import com.android.launcher3.IconCache.IconLoadRequest; +import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; @@ -51,7 +52,7 @@ import java.text.NumberFormat; * too aggressive. */ public class BubbleTextView extends TextView - implements BaseRecyclerViewFastScrollBar.FastScrollFocusableView { + implements BaseRecyclerViewFastScrollBar.FastScrollFocusableView, ItemInfoUpdateReceiver { private static SparseArray sPreloaderThemes = new SparseArray(2); @@ -540,7 +541,8 @@ public class BubbleTextView extends TextView /** * Applies the item info if it is same as what the view is pointing to currently. */ - public void reapplyItemInfo(final ItemInfo info) { + @Override + public void reapplyItemInfo(ItemInfoWithIcon info) { if (getTag() == info) { FastBitmapDrawable.State prevState = FastBitmapDrawable.State.NORMAL; if (mIcon instanceof FastBitmapDrawable) { @@ -582,20 +584,8 @@ public class BubbleTextView extends TextView mIconLoadRequest.cancel(); mIconLoadRequest = null; } - if (getTag() instanceof AppInfo) { - AppInfo info = (AppInfo) getTag(); - if (info.usingLowResIcon) { - mIconLoadRequest = LauncherAppState.getInstance().getIconCache() - .updateIconInBackground(BubbleTextView.this, info); - } - } else if (getTag() instanceof ShortcutInfo) { - ShortcutInfo info = (ShortcutInfo) getTag(); - if (info.usingLowResIcon) { - mIconLoadRequest = LauncherAppState.getInstance().getIconCache() - .updateIconInBackground(BubbleTextView.this, info); - } - } else if (getTag() instanceof PackageItemInfo) { - PackageItemInfo info = (PackageItemInfo) getTag(); + if (getTag() instanceof ItemInfoWithIcon) { + ItemInfoWithIcon info = (ItemInfoWithIcon) getTag(); if (info.usingLowResIcon) { mIconLoadRequest = LauncherAppState.getInstance().getIconCache() .updateIconInBackground(BubbleTextView.this, info); diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index b22cb7c1a0..7c50a5c2a0 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -406,13 +406,14 @@ public class IconCache { * Fetches high-res icon for the provided ItemInfo and updates the caller when done. * @return a request ID that can be used to cancel the request. */ - public IconLoadRequest updateIconInBackground(final BubbleTextView caller, final ItemInfo info) { + public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller, + final ItemInfoWithIcon info) { Runnable request = new Runnable() { @Override public void run() { if (info instanceof AppInfo || info instanceof ShortcutInfo) { - getTitleAndIcon((ItemInfoWithIcon) info, false); + getTitleAndIcon(info, false); } else if (info instanceof PackageItemInfo) { getTitleAndIconForApp((PackageItemInfo) info, false); } @@ -429,20 +430,6 @@ public class IconCache { return new IconLoadRequest(request, mWorkerHandler); } - /** - * Returns a high res icon for the given intent and user - */ - public synchronized Bitmap getIcon(Intent intent, UserHandle user) { - ComponentName component = intent.getComponent(); - // null info means not installed, but if we have a component from the intent then - // we should still look in the cache for restored app icons. - if (component == null) { - return getDefaultIcon(user); - } - return cacheLocked(component, new ActivityInfoProvider(intent, user), - user, true, false /* useLowRes */).icon; - } - /** * Updates {@param application} only if a valid entry is found. */ @@ -528,7 +515,7 @@ public class IconCache { */ protected CacheEntry cacheLocked( @NonNull ComponentName componentName, - @NonNull Provider infoProfider, + @NonNull Provider infoProvider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { ComponentKey cacheKey = new ComponentKey(componentName, user); CacheEntry entry = mCache.get(cacheKey); @@ -541,7 +528,7 @@ public class IconCache { boolean providerFetchedOnce = false; if (!getEntryFromDB(cacheKey, entry, useLowResIcon) || DEBUG_IGNORE_CACHE) { - info = infoProfider.get(); + info = infoProvider.get(); providerFetchedOnce = true; if (info != null) { @@ -570,7 +557,7 @@ public class IconCache { if (TextUtils.isEmpty(entry.title)) { if (info == null && !providerFetchedOnce) { - info = infoProfider.get(); + info = infoProvider.get(); providerFetchedOnce = true; } if (info != null) { @@ -868,4 +855,12 @@ public class IconCache { return mLauncherApps.resolveActivity(mIntent, mUser); } } + + /** + * Interface for receiving itemInfo with high-res icon. + */ + public interface ItemInfoUpdateReceiver { + + void reapplyItemInfo(ItemInfoWithIcon info); + } } diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java index 2976807a4a..3256df6fe9 100644 --- a/src/com/android/launcher3/PendingAppWidgetHostView.java +++ b/src/com/android/launcher3/PendingAppWidgetHostView.java @@ -17,7 +17,6 @@ package com.android.launcher3; import android.content.Context; -import android.content.Intent; import android.content.res.Resources.Theme; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -35,8 +34,11 @@ import android.view.View; import android.view.View.OnClickListener; import com.android.launcher3.graphics.DrawableFactory; +import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; +import com.android.launcher3.model.PackageItemInfo; -public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implements OnClickListener { +public class PendingAppWidgetHostView extends LauncherAppWidgetHostView + implements OnClickListener, ItemInfoUpdateReceiver { private static final float SETUP_ICON_SIZE_FACTOR = 2f / 5; private static final float MIN_SATUNATION = 0.7f; @@ -47,7 +49,6 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen private OnClickListener mClickListener; private final LauncherAppWidgetInfo mInfo; private final int mStartState; - private final Intent mIconLookupIntent; private final boolean mDisabledForSafeMode; private Launcher mLauncher; @@ -68,7 +69,6 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen mLauncher = Launcher.getLauncher(context); mInfo = info; mStartState = info.restoreStatus; - mIconLookupIntent = new Intent().setComponent(info.providerName); mDisabledForSafeMode = disabledForSafeMode; mPaint = new TextPaint(); @@ -79,9 +79,13 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen setWillNotDraw(false); setElevation(getResources().getDimension(R.dimen.pending_widget_elevation)); - updateIcon(cache); updateAppWidget(null); setOnClickListener(mLauncher); + + // Load icon + PackageItemInfo item = new PackageItemInfo(info.providerName.getPackageName()); + item.user = info.user; + cache.updateIconInBackground(this, item); } @Override @@ -117,8 +121,9 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen mDrawableSizeChanged = true; } - private void updateIcon(IconCache cache) { - Bitmap icon = cache.getIcon(mIconLookupIntent, mInfo.user); + @Override + public void reapplyItemInfo(ItemInfoWithIcon info) { + Bitmap icon = info.iconBitmap; if (mIcon == icon) { return; } @@ -157,6 +162,7 @@ public class PendingAppWidgetHostView extends LauncherAppWidgetHostView implemen } mDrawableSizeChanged = true; } + invalidate(); } private void updateSettingColor() { diff --git a/src/com/android/launcher3/model/PackageItemInfo.java b/src/com/android/launcher3/model/PackageItemInfo.java index e05bf1e90a..baeaa94923 100644 --- a/src/com/android/launcher3/model/PackageItemInfo.java +++ b/src/com/android/launcher3/model/PackageItemInfo.java @@ -28,7 +28,7 @@ public class PackageItemInfo extends ItemInfoWithIcon { */ public String packageName; - PackageItemInfo(String packageName) { + public PackageItemInfo(String packageName) { this.packageName = packageName; } From a32bf9b1816efc154dea6ab8de1a41aba80eedb3 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 5 Jan 2017 14:03:59 -0800 Subject: [PATCH 174/382] Removing logic around replacing icon during restore This logic was dependent on key-value based backup. Since we are using full-backup, the appropriate flags are never set. Bug: 18764649 Change-Id: I95a93eee63ac9c82acfb66abfdd1a5407974df46 --- res/xml/app_target_browser.xml | 23 --- res/xml/app_target_camera.xml | 23 --- res/xml/app_target_email.xml | 23 --- res/xml/app_target_gallery.xml | 23 --- res/xml/app_target_messenger.xml | 26 --- res/xml/app_target_phone.xml | 24 --- .../launcher3/CommonAppTypeParser.java | 157 ------------------ .../launcher3/DefaultLayoutParser.java | 5 - src/com/android/launcher3/LauncherModel.java | 31 +--- src/com/android/launcher3/ShortcutInfo.java | 1 + 10 files changed, 2 insertions(+), 334 deletions(-) delete mode 100644 res/xml/app_target_browser.xml delete mode 100644 res/xml/app_target_camera.xml delete mode 100644 res/xml/app_target_email.xml delete mode 100644 res/xml/app_target_gallery.xml delete mode 100644 res/xml/app_target_messenger.xml delete mode 100644 res/xml/app_target_phone.xml delete mode 100644 src/com/android/launcher3/CommonAppTypeParser.java diff --git a/res/xml/app_target_browser.xml b/res/xml/app_target_browser.xml deleted file mode 100644 index d7c3ed5fd5..0000000000 --- a/res/xml/app_target_browser.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/xml/app_target_camera.xml b/res/xml/app_target_camera.xml deleted file mode 100644 index f65a2b1689..0000000000 --- a/res/xml/app_target_camera.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/xml/app_target_email.xml b/res/xml/app_target_email.xml deleted file mode 100644 index 44f0a407d2..0000000000 --- a/res/xml/app_target_email.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/xml/app_target_gallery.xml b/res/xml/app_target_gallery.xml deleted file mode 100644 index c9d34924af..0000000000 --- a/res/xml/app_target_gallery.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/xml/app_target_messenger.xml b/res/xml/app_target_messenger.xml deleted file mode 100644 index 278eb5ca82..0000000000 --- a/res/xml/app_target_messenger.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/res/xml/app_target_phone.xml b/res/xml/app_target_phone.xml deleted file mode 100644 index 5d6ca316e7..0000000000 --- a/res/xml/app_target_phone.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/com/android/launcher3/CommonAppTypeParser.java b/src/com/android/launcher3/CommonAppTypeParser.java deleted file mode 100644 index c2bd8832c2..0000000000 --- a/src/com/android/launcher3/CommonAppTypeParser.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2008 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.launcher3; - -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.res.XmlResourceParser; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; -import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.util.Thunk; - -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; - -/** - * A class that parses content values corresponding to some common app types. - */ -public class CommonAppTypeParser implements LayoutParserCallback { - private static final String TAG = "CommonAppTypeParser"; - - // Including TARGET_NONE - public static final int SUPPORTED_TYPE_COUNT = 7; - - private static final int RESTORE_FLAG_BIT_SHIFT = 4; - - public static final int TARGET_PHONE = 1; - public static final int TARGET_MESSENGER = 2; - public static final int TARGET_EMAIL = 3; - public static final int TARGET_BROWSER = 4; - public static final int TARGET_GALLERY = 5; - public static final int TARGET_CAMERA = 6; - - private final long mItemId; - @Thunk final int mResId; - @Thunk final Context mContext; - - ContentValues parsedValues; - Intent parsedIntent; - String parsedTitle; - - public CommonAppTypeParser(long itemId, int itemType, Context context) { - mItemId = itemId; - mContext = context; - mResId = getResourceForItemType(itemType); - } - - @Override - public long generateNewItemId() { - return mItemId; - } - - @Override - public long insertAndCheck(SQLiteDatabase db, ContentValues values) { - parsedValues = values; - - // Remove unwanted values - values.put(Favorites.ICON_PACKAGE, (String) null); - values.put(Favorites.ICON_RESOURCE, (String) null); - values.put(Favorites.ICON, (byte[]) null); - return 1; - } - - /** - * Tries to find a suitable app to the provided app type. - */ - public boolean findDefaultApp() { - if (mResId == 0) { - return false; - } - - parsedIntent = null; - parsedValues = null; - new MyLayoutParser().parseValues(); - return (parsedValues != null) && (parsedIntent != null); - } - - private class MyLayoutParser extends DefaultLayoutParser { - - public MyLayoutParser() { - super(CommonAppTypeParser.this.mContext, null, CommonAppTypeParser.this, - CommonAppTypeParser.this.mContext.getResources(), mResId, TAG_RESOLVE); - } - - @Override - protected long addShortcut(String title, Intent intent, int type) { - if (type == Favorites.ITEM_TYPE_APPLICATION) { - parsedIntent = intent; - parsedTitle = title; - } - return super.addShortcut(title, intent, type); - } - - public void parseValues() { - XmlResourceParser parser = mSourceRes.getXml(mLayoutId); - try { - beginDocument(parser, mRootTag); - new ResolveParser().parseAndAdd(parser); - } catch (IOException | XmlPullParserException e) { - Log.e(TAG, "Unable to parse default app info", e); - } - parser.close(); - } - } - - public static int getResourceForItemType(int type) { - switch (type) { - case TARGET_PHONE: - return R.xml.app_target_phone; - - case TARGET_MESSENGER: - return R.xml.app_target_messenger; - - case TARGET_EMAIL: - return R.xml.app_target_email; - - case TARGET_BROWSER: - return R.xml.app_target_browser; - - case TARGET_GALLERY: - return R.xml.app_target_gallery; - - case TARGET_CAMERA: - return R.xml.app_target_camera; - - default: - return 0; - } - } - - public static int encodeItemTypeToFlag(int itemType) { - return itemType << RESTORE_FLAG_BIT_SHIFT; - } - - public static int decodeItemTypeFromFlag(int flag) { - return (flag & ShortcutInfo.FLAG_RESTORED_APP_TYPE) >> RESTORE_FLAG_BIT_SHIFT; - } - -} diff --git a/src/com/android/launcher3/DefaultLayoutParser.java b/src/com/android/launcher3/DefaultLayoutParser.java index ef28d1e8c0..05911ab7fa 100644 --- a/src/com/android/launcher3/DefaultLayoutParser.java +++ b/src/com/android/launcher3/DefaultLayoutParser.java @@ -54,11 +54,6 @@ public class DefaultLayoutParser extends AutoInstallsLayout { super(context, appWidgetHost, callback, sourceRes, layoutId, TAG_FAVORITES); } - public DefaultLayoutParser(Context context, AppWidgetHost appWidgetHost, - LayoutParserCallback callback, Resources sourceRes, int layoutId, String rootTag) { - super(context, appWidgetHost, callback, sourceRes, layoutId, rootTag); - } - @Override protected HashMap getFolderElementsMap() { return getFolderElementsMap(mSourceRes); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 58a74951c1..daa910fc8f 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1338,7 +1338,6 @@ public class LauncherModel extends BroadcastReceiver user = allUsers.get(serialNumber); int promiseType = c.getInt(restoredIndex); int disabledState = 0; - boolean itemReplaced = false; targetPackage = null; if (user == null) { // User has been deleted remove the item. @@ -1406,25 +1405,6 @@ public class LauncherModel extends BroadcastReceiver values.put(LauncherSettings.Favorites.RESTORED, promiseType); updateItem(id, values); - } else if ((promiseType & ShortcutInfo.FLAG_RESTORED_APP_TYPE) != 0) { - // This is a common app. Try to replace this. - int appType = CommonAppTypeParser.decodeItemTypeFromFlag(promiseType); - CommonAppTypeParser parser = new CommonAppTypeParser(id, appType, context); - if (parser.findDefaultApp()) { - // Default app found. Replace it. - intent = parser.parsedIntent; - cn = intent.getComponent(); - ContentValues values = parser.parsedValues; - values.put(LauncherSettings.Favorites.RESTORED, 0); - updateItem(id, values); - restored = false; - itemReplaced = true; - - } else { - FileLog.d(TAG, "Unrestored package removed: " + cn); - itemsToRemove.add(id); - continue; - } } else { FileLog.d(TAG, "Unrestored package removed: " + cn); itemsToRemove.add(id); @@ -1464,16 +1444,7 @@ public class LauncherModel extends BroadcastReceiver boolean useLowResIcon = container >= 0 && c.getInt(rankIndex) >= FolderIcon.NUM_ITEMS_IN_PREVIEW; - if (itemReplaced) { - if (user.equals(Process.myUserHandle())) { - info = getAppShortcutInfo(intent, user, null, - cursorIconInfo, false, useLowResIcon); - } else { - // Don't replace items for other profiles. - itemsToRemove.add(id); - continue; - } - } else if (restored) { + if (restored) { if (user.equals(Process.myUserHandle())) { info = getRestoredItemInfo(c, intent, promiseType, itemType, cursorIconInfo); diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 05fb1ed782..7f9bc2ba85 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -68,6 +68,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { * Indicates if it represents a common type mentioned in {@link CommonAppTypeParser}. * Upto 15 different types supported. */ + @Deprecated public static final int FLAG_RESTORED_APP_TYPE = 0B0011110000; /** From 260b07fa86865481ab3e1c6d4fec3ef52ba0a621 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sun, 8 Jan 2017 13:13:47 -0800 Subject: [PATCH 175/382] Creating AllAppsBackgroundDrawable using DrawableFactory to allow easier overriding using derivative projects Change-Id: I7265d888876ea0928391f76ec1bcb7d928c0f27a --- .../allapps/AllAppsBackgroundDrawable.java | 112 +++++++++--------- .../allapps/AllAppsRecyclerView.java | 15 ++- .../launcher3/graphics/DrawableFactory.java | 5 + 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java index bc602f37b6..c71bc3166b 100644 --- a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java +++ b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java @@ -23,62 +23,10 @@ import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; - import android.view.Gravity; + import com.android.launcher3.R; -/** - * A helper class to positon and orient a drawable to be drawn. - */ -class TransformedImageDrawable { - private Drawable mImage; - private float mXPercent; - private float mYPercent; - private int mGravity; - private int mAlpha; - - /** - * @param gravity If one of the Gravity center values, the x and y offset will take the width - * and height of the image into account to center the image to the offset. - */ - public TransformedImageDrawable(Resources res, int resourceId, float xPct, float yPct, - int gravity) { - mImage = res.getDrawable(resourceId); - mXPercent = xPct; - mYPercent = yPct; - mGravity = gravity; - } - - public void setAlpha(int alpha) { - mImage.setAlpha(alpha); - mAlpha = alpha; - } - - public int getAlpha() { - return mAlpha; - } - - public void updateBounds(Rect bounds) { - int width = mImage.getIntrinsicWidth(); - int height = mImage.getIntrinsicHeight(); - int left = bounds.left + (int) (mXPercent * bounds.width()); - int top = bounds.top + (int) (mYPercent * bounds.height()); - if ((mGravity & Gravity.CENTER_HORIZONTAL) == Gravity.CENTER_HORIZONTAL) { - left -= (width / 2); - } - if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) { - top -= (height / 2); - } - mImage.setBounds(left, top, left + width, top + height); - } - - public void draw(Canvas canvas) { - int c = canvas.save(Canvas.MATRIX_SAVE_FLAG); - mImage.draw(canvas); - canvas.restoreToCount(c); - } -} - /** * This is a custom composite drawable that has a fixed virtual size and dynamically lays out its * children images relatively within its bounds. This way, we can reduce the memory usage of a @@ -86,8 +34,62 @@ class TransformedImageDrawable { */ public class AllAppsBackgroundDrawable extends Drawable { - private final TransformedImageDrawable mHand; - private final TransformedImageDrawable[] mIcons; + /** + * A helper class to positon and orient a drawable to be drawn. + */ + protected static class TransformedImageDrawable { + private Drawable mImage; + private float mXPercent; + private float mYPercent; + private int mGravity; + private int mAlpha; + + /** + * @param gravity If one of the Gravity center values, the x and y offset will take the width + * and height of the image into account to center the image to the offset. + */ + public TransformedImageDrawable(Resources res, int resourceId, float xPct, float yPct, + int gravity) { + mImage = res.getDrawable(resourceId); + mXPercent = xPct; + mYPercent = yPct; + mGravity = gravity; + } + + public void setAlpha(int alpha) { + mImage.setAlpha(alpha); + mAlpha = alpha; + } + + public int getAlpha() { + return mAlpha; + } + + public void updateBounds(Rect bounds) { + int width = mImage.getIntrinsicWidth(); + int height = mImage.getIntrinsicHeight(); + int left = bounds.left + (int) (mXPercent * bounds.width()); + int top = bounds.top + (int) (mYPercent * bounds.height()); + if ((mGravity & Gravity.CENTER_HORIZONTAL) == Gravity.CENTER_HORIZONTAL) { + left -= (width / 2); + } + if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) { + top -= (height / 2); + } + mImage.setBounds(left, top, left + width, top + height); + } + + public void draw(Canvas canvas) { + mImage.draw(canvas); + } + + public Rect getBounds() { + return mImage.getBounds(); + } + } + + protected final TransformedImageDrawable mHand; + protected final TransformedImageDrawable[] mIcons; private final int mWidth; private final int mHeight; diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index 10d4c1506a..a41d832445 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -22,6 +22,7 @@ import android.graphics.drawable.Drawable; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.SparseIntArray; +import android.view.MotionEvent; import android.view.View; import com.android.launcher3.BaseRecyclerView; @@ -29,6 +30,7 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.R; +import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import java.util.List; @@ -207,7 +209,8 @@ public class AllAppsRecyclerView extends BaseRecyclerView { if (mApps.hasNoFilteredResults()) { if (mEmptySearchBackground == null) { - mEmptySearchBackground = new AllAppsBackgroundDrawable(getContext()); + mEmptySearchBackground = DrawableFactory.get(getContext()) + .getAllAppsBackground(getContext()); mEmptySearchBackground.setAlpha(0); mEmptySearchBackground.setCallback(this); updateEmptySearchBackgroundBounds(); @@ -220,6 +223,16 @@ public class AllAppsRecyclerView extends BaseRecyclerView { } } + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + boolean result = super.onInterceptTouchEvent(e); + if (!result && e.getAction() == MotionEvent.ACTION_DOWN + && mEmptySearchBackground != null && mEmptySearchBackground.getAlpha() > 0) { + mEmptySearchBackground.setHotspot(e.getX(), e.getY()); + } + return result; + } + /** * Maps the touch (from 0..1) to the adapter position that should be visible. */ diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index f6a4b844f9..693df7ad87 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -23,6 +23,7 @@ import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.AllAppsBackgroundDrawable; /** * Factory for creating new drawables. @@ -50,4 +51,8 @@ public class DrawableFactory { d.setFilterBitmap(true); return d; } + + public AllAppsBackgroundDrawable getAllAppsBackground(Context context) { + return new AllAppsBackgroundDrawable(context); + } } From 49f19f0af96ccf9da78b62a4ac9f51e40b40adc5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 5 Jan 2017 14:36:02 -0800 Subject: [PATCH 176/382] Adding some logging around launcher restore > Also enabling fileLog when the device is debug build (even when launcher is not dogfood build) Bug: 30735662 Change-Id: Ieab2c962d57f6f7f972f8111070d4ecbef06b3e7 --- src/com/android/launcher3/LauncherBackupAgent.java | 8 ++++++++ src/com/android/launcher3/Utilities.java | 6 ++++++ src/com/android/launcher3/logging/FileLog.java | 2 +- src/com/android/launcher3/provider/ImportDataTask.java | 3 +++ src/com/android/launcher3/provider/RestoreDbTask.java | 1 + 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/LauncherBackupAgent.java b/src/com/android/launcher3/LauncherBackupAgent.java index b3e73f7689..140794b074 100644 --- a/src/com/android/launcher3/LauncherBackupAgent.java +++ b/src/com/android/launcher3/LauncherBackupAgent.java @@ -5,10 +5,18 @@ import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; import android.os.ParcelFileDescriptor; +import com.android.launcher3.logging.FileLog; import com.android.launcher3.provider.RestoreDbTask; public class LauncherBackupAgent extends BackupAgent { + @Override + public void onCreate() { + super.onCreate(); + // Set the log dir as LauncherAppState is not initialized during restore. + FileLog.setDir(getFilesDir()); + } + @Override public void onRestore( BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) { diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 2cb913858c..89ffd315da 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -104,6 +104,12 @@ public final class Utilities { public static final boolean ATLEAST_LOLLIPOP_MR1 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1; + /** + * Indicates if the device has a debug build. Should only be used to store additional info or + * add extra logging and not for changing the app behavior. + */ + public static final boolean IS_DEBUG_DEVICE = Build.TYPE.toLowerCase().contains("debug"); + // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; diff --git a/src/com/android/launcher3/logging/FileLog.java b/src/com/android/launcher3/logging/FileLog.java index 8629e9266c..ffb41b76bf 100644 --- a/src/com/android/launcher3/logging/FileLog.java +++ b/src/com/android/launcher3/logging/FileLog.java @@ -40,7 +40,7 @@ public final class FileLog { private static File sLogsDirectory = null; public static void setDir(File logsDir) { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (ProviderConfig.IS_DOGFOOD_BUILD || Utilities.IS_DEBUG_DEVICE) { synchronized (DATE_FORMAT) { // If the target directory changes, stop any active thread. if (sHandler != null && !logsDir.equals(sLogsDirectory)) { diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 9d8e62ae5f..808e6e3ac2 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -89,10 +89,12 @@ public class ImportDataTask { ArrayList allScreens = LauncherDbUtils.getScreenIdsFromCursor( mContext.getContentResolver().query(mOtherScreensUri, null, null, null, LauncherSettings.WorkspaceScreens.SCREEN_RANK)); + FileLog.d(TAG, "Importing DB from " + mOtherFavoritesUri); // During import we reset the screen IDs to 0-indexed values. if (allScreens.isEmpty()) { // No thing to migrate + FileLog.e(TAG, "No data found to import"); return false; } @@ -293,6 +295,7 @@ public class ImportDataTask { } } } + FileLog.d(TAG, totalItemsOnWorkspace + " items imported from external source"); if (totalItemsOnWorkspace < MIN_ITEM_COUNT_FOR_SUCCESSFUL_MIGRATION) { throw new Exception("Insufficient data"); } diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 47bee0669c..a200a8526b 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -142,6 +142,7 @@ public class RestoreDbTask { } public static void setPending(Context context, boolean isPending) { + FileLog.d(TAG, "Restore data received through full backup"); Utilities.getPrefs(context).edit().putBoolean(RESTORE_TASK_PENDING, isPending).commit(); } } From cd0f67903015a9dcea098e5fdcf65040ffdbf66f Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 4 Jan 2017 16:31:57 -0800 Subject: [PATCH 177/382] This enables to slide up All Apps from anywhere in the workspace, not only over the hotseat. The tricky part handling with scrollable widgets is solved by setting requestDisallowInterceptTouchEvent from within the widget view host (and resetting it upon performing long click). Change-Id: I8b60e7ea2c1e8ae830b4737e94ed2d796265fa24 --- res/values/dimens.xml | 2 - .../launcher3/LauncherAppWidgetHostView.java | 53 ++++++++++++++++--- .../allapps/AllAppsTransitionController.java | 28 +--------- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/res/values/dimens.xml b/res/values/dimens.xml index a8a25af3e2..1a09fa0029 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -81,8 +81,6 @@ 8dp - 24dp - 8dp 8dp diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index 49bbfd0972..1429df5d35 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -33,9 +33,11 @@ import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.AdapterView; import android.widget.Advanceable; import android.widget.RemoteViews; +import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragLayer.TouchCompleteListener; import java.lang.reflect.Method; @@ -45,7 +47,8 @@ import java.util.concurrent.Executor; /** * {@inheritDoc} */ -public class LauncherAppWidgetHostView extends AppWidgetHostView implements TouchCompleteListener { +public class LauncherAppWidgetHostView extends AppWidgetHostView + implements TouchCompleteListener, View.OnLongClickListener { private static final String TAG = "LauncherWidgetHostView"; @@ -56,11 +59,12 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc // Maintains a list of widget ids which are supposed to be auto advanced. private static final SparseBooleanArray sAutoAdvanceWidgetIds = new SparseBooleanArray(); - LayoutInflater mInflater; + protected final LayoutInflater mInflater; + + private final CheckLongPressHelper mLongPressHelper; + private final StylusEventHelper mStylusEventHelper; + private final Context mContext; - private CheckLongPressHelper mLongPressHelper; - private StylusEventHelper mStylusEventHelper; - private Context mContext; @ViewDebug.ExportedProperty(category = "launcher") private int mPreviousOrientation; @@ -69,6 +73,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc @ViewDebug.ExportedProperty(category = "launcher") private boolean mChildrenFocused; + private boolean mIsScrollable; private boolean mIsAttachedToWindow; private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; @@ -86,7 +91,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; - mLongPressHelper = new CheckLongPressHelper(this); + mLongPressHelper = new CheckLongPressHelper(this, this); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); mInflater = LayoutInflater.from(context); setAccessibilityDelegate(Launcher.getLauncher(context).getAccessibilityDelegate()); @@ -103,6 +108,16 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc } } + @Override + public boolean onLongClick(View view) { + if (mIsScrollable) { + DragLayer dragLayer = Launcher.getLauncher(getContext()).getDragLayer(); + dragLayer.requestDisallowInterceptTouchEvent(false); + } + view.performLongClick(); + return true; + } + @Override protected View getErrorView() { return mInflater.inflate(R.layout.appwidget_error, this, false); @@ -120,6 +135,24 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc // The provider info or the views might have changed. checkIfAutoAdvance(); + + mIsScrollable = checkScrollableRecursively(this); + } + + private boolean checkScrollableRecursively(ViewGroup viewGroup) { + if (viewGroup instanceof AdapterView) { + return true; + } else { + for (int i=0; i < viewGroup.getChildCount(); i++) { + View child = viewGroup.getChildAt(i); + if (child instanceof ViewGroup) { + if (checkScrollableRecursively((ViewGroup) child)) { + return true; + } + } + } + } + return false; } public boolean isReinflateRequired() { @@ -150,12 +183,18 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc mLongPressHelper.cancelLongPress(); return true; } + switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: { + DragLayer dragLayer = Launcher.getLauncher(getContext()).getDragLayer(); + + if (mIsScrollable) { + dragLayer.requestDisallowInterceptTouchEvent(true); + } if (!mStylusEventHelper.inStylusButtonPressed()) { mLongPressHelper.postCheckForLongPress(); } - Launcher.getLauncher(getContext()).getDragLayer().setTouchCompleteListener(this); + dragLayer.setTouchCompleteListener(this); break; } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index c199fef09b..547ab2b34a 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -18,15 +18,12 @@ import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import com.android.launcher3.AbstractFloatingView; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; -import com.android.launcher3.shortcuts.DeepShortcutsContainer; -import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.TouchController; @@ -88,7 +85,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private static final float RECATCH_REJECTION_FRACTION = .0875f; - private int mBezelSwipeUpHeight; private long mAnimationDuration; private AnimatorSet mCurrentAnimation; @@ -104,8 +100,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mDetector.setListener(this); mShiftRange = DEFAULT_SHIFT_RANGE; mProgress = 1f; - mBezelSwipeUpHeight = l.getResources().getDimensionPixelSize( - R.dimen.all_apps_bezel_swipe_height); mEvaluator = new ArgbEvaluator(); mAllAppsBackgroundColor = ContextCompat.getColor(l, R.color.all_apps_container_color); @@ -120,8 +114,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul } else if (mLauncher.isAllAppsVisible() && !mAppsView.shouldContainerScroll(ev)) { mNoIntercept = true; - } else if (!mLauncher.isAllAppsVisible() && !shouldPossiblyIntercept(ev)) { - mNoIntercept = true; } else if (AbstractFloatingView.getTopOpenView(mLauncher) != null) { mNoIntercept = true; } else { @@ -150,6 +142,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul ignoreSlopWhenSettling); } } + if (mNoIntercept) { return false; } @@ -160,25 +153,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul return mDetector.isDraggingOrSettling(); } - private boolean shouldPossiblyIntercept(MotionEvent ev) { - DeviceProfile grid = mLauncher.getDeviceProfile(); - if (mDetector.isIdleState()) { - if (grid.isVerticalBarLayout()) { - if (ev.getY() > mLauncher.getDeviceProfile().heightPx - mBezelSwipeUpHeight) { - return true; - } - } else { - if (mLauncher.getDragLayer().isEventOverHotseat(ev) || - mLauncher.getDragLayer().isEventOverPageIndicator(ev)) { - return true; - } - } - return false; - } else { - return true; - } - } - @Override public boolean onControllerTouchEvent(MotionEvent ev) { return mDetector.onTouchEvent(ev); From aa29244754a4b726ec9f9f928bf19cc2363658a7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Jan 2017 13:49:59 -0800 Subject: [PATCH 178/382] Fixing AppInfo missing intent when loading icon Bug: 34199268 Change-Id: I7223d1d408e7b48f9c63c9801c2805aaf7363038 --- src/com/android/launcher3/ShortcutInfo.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 7f9bc2ba85..77c6837d07 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -254,6 +254,9 @@ public class ShortcutInfo extends ItemInfoWithIcon { AppInfo appInfo = new AppInfo(); appInfo.user = user; appInfo.componentName = shortcutInfo.getActivity(); + appInfo.intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(shortcutInfo.getActivity()); cache.getTitleAndIcon(appInfo, false); return LauncherIcons.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); } From aaf86fe9a0406720cca7cfe204f28e2d2de085eb Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 5 Jan 2017 21:50:27 -0800 Subject: [PATCH 179/382] Refactoring some loadWorkspace logic in a separate class Bug: 34112546 Change-Id: I8a43ed1646056aa1957ac3d6ea82018691df6386 --- .../launcher3/AppWidgetsRestoredReceiver.java | 13 +- .../launcher3/InstallShortcutReceiver.java | 42 +- src/com/android/launcher3/Launcher.java | 5 +- src/com/android/launcher3/LauncherModel.java | 556 +++--------------- .../launcher3/graphics/LauncherIcons.java | 12 - .../android/launcher3/model/LoaderCursor.java | 445 ++++++++++++++ .../android/launcher3/util/ContentWriter.java | 28 + .../launcher3/util/CursorIconInfo.java | 86 --- .../launcher3/util/PackageManagerHelper.java | 10 + .../launcher3/model/LoaderCursorTest.java | 234 ++++++++ 10 files changed, 851 insertions(+), 580 deletions(-) create mode 100644 src/com/android/launcher3/model/LoaderCursor.java delete mode 100644 src/com/android/launcher3/util/CursorIconInfo.java create mode 100644 tests/src/com/android/launcher3/model/LoaderCursorTest.java diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index c5b31046c5..c6f1c48b90 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -5,13 +5,13 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; import android.content.ContentResolver; -import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.util.ContentWriter; public class AppWidgetsRestoredReceiver extends BroadcastReceiver { @@ -50,14 +50,13 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { state = LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY; } - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.APPWIDGET_ID, newWidgetIds[i]); - values.put(LauncherSettings.Favorites.RESTORED, state); - String[] widgetIdParams = new String[] { Integer.toString(oldWidgetIds[i]) }; + int result = new ContentWriter(context, new ContentWriter.CommitParams( + "appWidgetId=? and (restored & 1) = 1", widgetIdParams)) + .put(LauncherSettings.Favorites.APPWIDGET_ID, newWidgetIds[i]) + .put(LauncherSettings.Favorites.RESTORED, state) + .commit(); - int result = cr.update(Favorites.CONTENT_URI, values, - "appWidgetId=? and (restored & 1) = 1", widgetIdParams); if (result == 0) { Cursor cursor = cr.query(Favorites.CONTENT_URI, new String[] {Favorites.APPWIDGET_ID}, diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index df2deb8ca6..ecbfe38235 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -26,6 +26,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; @@ -35,6 +36,7 @@ import android.util.Log; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; @@ -454,7 +456,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { widgetInfo.spanY = Math.min(info.spanY, idp.numRows); return widgetInfo; } else { - return LauncherAppState.getInstance().getModel().infoFromShortcutIntent(mContext, data); + return createShortcutInfo(data, LauncherAppState.getInstance()); } } @@ -598,4 +600,42 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return installQueue; } } + + private static ShortcutInfo createShortcutInfo(Intent data, LauncherAppState app) { + Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); + String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); + Parcelable bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); + + if (intent == null) { + // If the intent is null, we can't construct a valid ShortcutInfo, so we return null + Log.e(TAG, "Can't construct ShorcutInfo with null intent"); + return null; + } + + final ShortcutInfo info = new ShortcutInfo(); + + // Only support intents for current user for now. Intents sent from other + // users wouldn't get here without intent forwarding anyway. + info.user = Process.myUserHandle(); + + if (bitmap instanceof Bitmap) { + info.iconBitmap = LauncherIcons.createIconBitmap((Bitmap) bitmap, app.getContext()); + } else { + Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); + if (extra instanceof Intent.ShortcutIconResource) { + info.iconResource = (Intent.ShortcutIconResource) extra; + info.iconBitmap = LauncherIcons.createIconBitmap(info.iconResource, app.getContext()); + } + } + if (info.iconBitmap == null) { + info.iconBitmap = app.getIconCache().getDefaultIcon(info.user); + } + + info.title = Utilities.trim(name); + info.contentDescription = UserManagerCompat.getInstance(app.getContext()) + .getBadgedLabelForUser(info.title, info.user); + info.intent = intent; + return info; + } + } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8e28912dbb..d6c8cfb95e 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2337,13 +2337,14 @@ public class Launcher extends Activity showBrokenAppInstallDialog(packageName, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - startActivitySafely(v, LauncherModel.getMarketIntent(packageName), info); + startActivitySafely( + v, PackageManagerHelper.getMarketIntent(packageName), info); } }); } else { // Download has started. final String packageName = info.providerName.getPackageName(); - startActivitySafely(v, LauncherModel.getMarketIntent(packageName), info); + startActivitySafely(v, PackageManagerHelper.getMarketIntent(packageName), info); } } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index daa910fc8f..616b2c7dda 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -24,21 +24,16 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; -import android.content.Intent.ShortcutIconResource; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.Bitmap; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; -import android.os.Parcelable; import android.os.Process; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; -import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; import android.util.LongSparseArray; @@ -50,18 +45,17 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; -import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; import com.android.launcher3.model.BgDataModel; import com.android.launcher3.model.CacheDataUpdatedTask; import com.android.launcher3.model.ExtendedModelTask; import com.android.launcher3.model.GridSizeMigrationTask; +import com.android.launcher3.model.LoaderCursor; import com.android.launcher3.model.PackageInstallStateChangedTask; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.PackageUpdatedTask; @@ -77,10 +71,7 @@ import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.ContentWriter; -import com.android.launcher3.util.CursorIconInfo; -import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; @@ -91,7 +82,6 @@ import com.android.launcher3.util.ViewOnDrawExecutor; import java.lang.ref.WeakReference; import java.net.URISyntaxException; -import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -1096,96 +1086,6 @@ public class LauncherModel extends BroadcastReceiver } } - // check & update map of what's occupied; used to discard overlapping/invalid items - private boolean checkItemPlacement(LongArrayMap occupied, ItemInfo item, - ArrayList workspaceScreens) { - LauncherAppState app = LauncherAppState.getInstance(); - InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); - - long containerIndex = item.screenId; - if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - // Return early if we detect that an item is under the hotseat button - if (!FeatureFlags.NO_ALL_APPS_ICON && - profile.isAllAppsButtonRank((int) item.screenId)) { - Log.e(TAG, "Error loading shortcut into hotseat " + item - + " into position (" + item.screenId + ":" + item.cellX + "," - + item.cellY + ") occupied by all apps"); - return false; - } - - final GridOccupancy hotseatOccupancy = - occupied.get((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT); - - if (item.screenId >= profile.numHotseatIcons) { - Log.e(TAG, "Error loading shortcut " + item - + " into hotseat position " + item.screenId - + ", position out of bounds: (0 to " + (profile.numHotseatIcons - 1) - + ")"); - return false; - } - - if (hotseatOccupancy != null) { - if (hotseatOccupancy.cells[(int) item.screenId][0]) { - Log.e(TAG, "Error loading shortcut into hotseat " + item - + " into position (" + item.screenId + ":" + item.cellX + "," - + item.cellY + ") already occupied"); - return false; - } else { - hotseatOccupancy.cells[(int) item.screenId][0] = true; - return true; - } - } else { - final GridOccupancy occupancy = new GridOccupancy(profile.numHotseatIcons, 1); - occupancy.cells[(int) item.screenId][0] = true; - occupied.put((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT, occupancy); - return true; - } - } else if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - if (!workspaceScreens.contains((Long) item.screenId)) { - // The item has an invalid screen id. - return false; - } - } else { - // Skip further checking if it is not the hotseat or workspace container - return true; - } - - final int countX = profile.numColumns; - final int countY = profile.numRows; - if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && - item.cellX < 0 || item.cellY < 0 || - item.cellX + item.spanX > countX || item.cellY + item.spanY > countY) { - Log.e(TAG, "Error loading shortcut " + item - + " into cell (" + containerIndex + "-" + item.screenId + ":" - + item.cellX + "," + item.cellY - + ") out of screen bounds ( " + countX + "x" + countY + ")"); - return false; - } - - if (!occupied.containsKey(item.screenId)) { - GridOccupancy screen = new GridOccupancy(countX + 1, countY + 1); - if (item.screenId == Workspace.FIRST_SCREEN_ID) { - // Mark the first row as occupied (if the feature is enabled) - // in order to account for the QSB. - screen.markCells(0, 0, countX + 1, 1, FeatureFlags.QSB_ON_FIRST_SCREEN); - } - occupied.put(item.screenId, screen); - } - final GridOccupancy occupancy = occupied.get(item.screenId); - - // Check if any workspace icons overlap with each other - if (occupancy.isRegionVacant(item.cellX, item.cellY, item.spanX, item.spanY)) { - occupancy.markCells(item, true); - return true; - } else { - Log.e(TAG, "Error loading shortcut " + item - + " into cell (" + containerIndex + "-" + item.screenId + ":" - + item.cellX + "," + item.cellX + "," + item.spanX + "," + item.spanY - + ") already occupied"); - return false; - } - } - private void loadWorkspace() { if (LauncherAppState.PROFILE_STARTUP) { Trace.beginSection("Loading Workspace"); @@ -1237,37 +1137,19 @@ public class LauncherModel extends BroadcastReceiver .getInstance(mContext).updateAndGetActiveSessionCache(); sBgDataModel.workspaceScreens.addAll(loadWorkspaceScreensDb(mContext)); - final ArrayList itemsToRemove = new ArrayList<>(); - final ArrayList restoredRows = new ArrayList<>(); Map shortcutKeyToPinnedShortcuts = new HashMap<>(); - final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI; - if (DEBUG_LOADERS) Log.d(TAG, "loading model from " + contentUri); - final Cursor c = contentResolver.query(contentUri, null, null, null, null); + final LoaderCursor c = new LoaderCursor(contentResolver.query( + LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp); - // +1 for the hotseat (it can be larger than the workspace) - // Load workspace in reverse order to ensure that latest items are loaded first (and - // before any earlier duplicates) - final LongArrayMap occupied = new LongArrayMap<>(); HashMap widgetProvidersMap = null; try { - final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID); final int intentIndex = c.getColumnIndexOrThrow (LauncherSettings.Favorites.INTENT); - final int containerIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.CONTAINER); - final int itemTypeIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.ITEM_TYPE); final int appWidgetIdIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.APPWIDGET_ID); final int appWidgetProviderIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.APPWIDGET_PROVIDER); - final int screenIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.SCREEN); - final int cellXIndex = c.getColumnIndexOrThrow - (LauncherSettings.Favorites.CELLX); - final int cellYIndex = c.getColumnIndexOrThrow - (LauncherSettings.Favorites.CELLY); final int spanXIndex = c.getColumnIndexOrThrow (LauncherSettings.Favorites.SPANX); final int spanYIndex = c.getColumnIndexOrThrow( @@ -1276,13 +1158,10 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites.RANK); final int restoredIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.RESTORED); - final int profileIdIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.PROFILE_ID); final int optionsIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.OPTIONS); - final CursorIconInfo cursorIconInfo = new CursorIconInfo(mContext, c); - final LongSparseArray allUsers = new LongSparseArray<>(); + final LongSparseArray allUsers = c.allUsers; final LongSparseArray quietMode = new LongSparseArray<>(); final LongSparseArray unlockedUsers = new LongSparseArray<>(); for (UserHandle user : mUserManager.getUserProfiles()) { @@ -1314,44 +1193,42 @@ public class LauncherModel extends BroadcastReceiver ShortcutInfo info; String intentDescription; LauncherAppWidgetInfo appWidgetInfo; - int container; - long id; - long serialNumber; Intent intent; - UserHandle user; String targetPackage; while (!mStopped && c.moveToNext()) { try { - int itemType = c.getInt(itemTypeIndex); + if (c.user == null) { + // User has been deleted, remove the item. + c.markDeleted("User has been deleted"); + continue; + } + boolean restored = 0 != c.getInt(restoredIndex); boolean allowMissingTarget = false; - container = c.getInt(containerIndex); - - switch (itemType) { + switch (c.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: { + if (!Process.myUserHandle().equals(c.user)) { + c.markDeleted("Legacy shortcuts are only allowed for default user"); + continue; + } + // Follow through. + } case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - id = c.getLong(idIndex); intentDescription = c.getString(intentIndex); - serialNumber = c.getInt(profileIdIndex); - user = allUsers.get(serialNumber); int promiseType = c.getInt(restoredIndex); int disabledState = 0; targetPackage = null; - if (user == null) { - // User has been deleted remove the item. - itemsToRemove.add(id); - continue; - } + try { intent = Intent.parseUri(intentDescription, 0); ComponentName cn = intent.getComponent(); if (cn != null && cn.getPackageName() != null) { boolean validPkg = launcherApps.isPackageEnabledForProfile( - cn.getPackageName(), user); + cn.getPackageName(), c.user); boolean validComponent = validPkg && - launcherApps.isActivityEnabledForProfile(cn, user); + launcherApps.isActivityEnabledForProfile(cn, c.user); if (validPkg) { targetPackage = cn.getPackageName(); } @@ -1359,10 +1236,10 @@ public class LauncherModel extends BroadcastReceiver if (validComponent) { if (restored) { // no special handling necessary for this item - restoredRows.add(id); + c.markRestored(); restored = false; } - if (quietMode.get(serialNumber)) { + if (quietMode.get(c.serialNumber)) { disabledState = ShortcutInfo.FLAG_DISABLED_QUIET_USER; } } else if (validPkg) { @@ -1373,22 +1250,20 @@ public class LauncherModel extends BroadcastReceiver intent = manager.getLaunchIntentForPackage( cn.getPackageName()); if (intent != null) { - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.INTENT, - intent.toUri(0)); - updateItem(id, values); + c.updater().put( + LauncherSettings.Favorites.INTENT, + intent.toUri(0)).commit(); } } if (intent == null) { // The app is installed but the component is no // longer available. - FileLog.d(TAG, "Invalid component removed: " + cn); - itemsToRemove.add(id); + c.markDeleted("Invalid component removed: " + cn); continue; } else { // no special handling necessary for this item - restoredRows.add(id); + c.markRestored(); restored = false; } } else if (restored) { @@ -1401,13 +1276,11 @@ public class LauncherModel extends BroadcastReceiver } else if (installingPkgs.containsKey(cn.getPackageName())) { // App restore has started. Update the flag promiseType |= ShortcutInfo.FLAG_RESTORE_STARTED; - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.RESTORED, - promiseType); - updateItem(id, values); + c.updater().put( + LauncherSettings.Favorites.RESTORED, + promiseType).commit(); } else { - FileLog.d(TAG, "Unrestored package removed: " + cn); - itemsToRemove.add(id); + c.markDeleted("Unrestored package removed: " + cn); continue; } } else if (PackageManagerHelper.isAppOnSdcard( @@ -1419,70 +1292,64 @@ public class LauncherModel extends BroadcastReceiver // SdCard is not ready yet. Package might get available, // once it is ready. Log.d(TAG, "Invalid package: " + cn + " (check again later)"); - pendingPackages.addToList(user, cn.getPackageName()); + pendingPackages.addToList(c.user, cn.getPackageName()); allowMissingTarget = true; // Add the icon on the workspace anyway. } else { // Do not wait for external media load anymore. // Log the invalid package, and remove it - FileLog.d(TAG, "Invalid package removed: " + cn); - itemsToRemove.add(id); + c.markDeleted("Invalid package removed: " + cn); continue; } } else if (cn == null) { // For shortcuts with no component, keep them as they are - restoredRows.add(id); + c.markRestored(); restored = false; } } catch (URISyntaxException e) { - FileLog.d(TAG, "Invalid uri: " + intentDescription); - itemsToRemove.add(id); + c.markDeleted("Invalid uri: " + intentDescription); continue; } - boolean useLowResIcon = container >= 0 && + boolean useLowResIcon = !c.isOnWorkspaceOrHotseat() && c.getInt(rankIndex) >= FolderIcon.NUM_ITEMS_IN_PREVIEW; if (restored) { - if (user.equals(Process.myUserHandle())) { - info = getRestoredItemInfo(c, intent, - promiseType, itemType, cursorIconInfo); - intent = getRestoredItemIntent(c, context, intent); + if (c.user.equals(Process.myUserHandle())) { + info = c.getRestoredItemInfo(intent, promiseType); + intent = PackageManagerHelper.getMarketIntent( + intent.getComponent().getPackageName()); } else { // Don't restore items for other profiles. - itemsToRemove.add(id); + c.markDeleted("Restore from managed profile not supported"); continue; } - } else if (itemType == + } else if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - info = getAppShortcutInfo(intent, user, c, - cursorIconInfo, allowMissingTarget, useLowResIcon); - } else if (itemType == + info = c.getAppShortcutInfo( + intent, allowMissingTarget, useLowResIcon); + } else if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { - ShortcutKey key = ShortcutKey.fromIntent(intent, user); - if (unlockedUsers.get(serialNumber)) { + ShortcutKey key = ShortcutKey.fromIntent(intent, c.user); + if (unlockedUsers.get(c.serialNumber)) { ShortcutInfoCompat pinnedShortcut = shortcutKeyToPinnedShortcuts.get(key); if (pinnedShortcut == null) { // The shortcut is no longer valid. - itemsToRemove.add(id); + c.markDeleted("Pinned shortcut not found"); continue; } info = new ShortcutInfo(pinnedShortcut, context); intent = info.intent; } else { // Create a shortcut info in disabled mode for now. - info = new ShortcutInfo(); - info.user = user; - info.itemType = itemType; - loadInfoFromCursor(info, c, cursorIconInfo); - + info = c.loadSimpleShortcut(); info.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; } } else { // item type == ITEM_TYPE_SHORTCUT - info = getShortcutInfo(c, cursorIconInfo); + info = c.loadSimpleShortcut(); // Shortcuts are only available on the primary profile if (PackageManagerHelper.isAppSuspended(manager, targetPackage)) { @@ -1503,30 +1370,23 @@ public class LauncherModel extends BroadcastReceiver } if (info != null) { - info.id = id; + c.applyCommonProperties(info); + info.intent = intent; - info.container = container; - info.screenId = c.getInt(screenIndex); - info.cellX = c.getInt(cellXIndex); - info.cellY = c.getInt(cellYIndex); info.rank = c.getInt(rankIndex); info.spanX = 1; info.spanY = 1; - info.intent.putExtra(ItemInfo.EXTRA_PROFILE, serialNumber); + // TODO: Remove this extra. Instead we should be using + // itemInfo#user. + info.intent.putExtra(ItemInfo.EXTRA_PROFILE, c.serialNumber); if (info.promisedIntent != null) { - info.promisedIntent.putExtra(ItemInfo.EXTRA_PROFILE, serialNumber); + info.promisedIntent.putExtra(ItemInfo.EXTRA_PROFILE, c.serialNumber); } info.isDisabled |= disabledState; if (isSafeMode && !Utilities.isSystemApp(context, intent)) { info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; } - // check & update map of what's occupied - if (!checkItemPlacement(occupied, info, sBgDataModel.workspaceScreens)) { - itemsToRemove.add(id); - break; - } - if (restored) { ComponentName cn = info.getTargetComponent(); if (cn != null) { @@ -1539,55 +1399,38 @@ public class LauncherModel extends BroadcastReceiver } } - sBgDataModel.addItem(info, false); + c.checkAndAddItem(info, sBgDataModel); } else { throw new RuntimeException("Unexpected null ShortcutInfo"); } break; case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - id = c.getLong(idIndex); - FolderInfo folderInfo = sBgDataModel.findOrMakeFolder(id); + FolderInfo folderInfo = sBgDataModel.findOrMakeFolder(c.id); + c.applyCommonProperties(folderInfo); // Do not trim the folder label, as is was set by the user. - folderInfo.title = c.getString(cursorIconInfo.titleIndex); - folderInfo.id = id; - folderInfo.container = container; - folderInfo.screenId = c.getInt(screenIndex); - folderInfo.cellX = c.getInt(cellXIndex); - folderInfo.cellY = c.getInt(cellYIndex); + folderInfo.title = c.getString(c.titleIndex); folderInfo.spanX = 1; folderInfo.spanY = 1; folderInfo.options = c.getInt(optionsIndex); - // check & update map of what's occupied - if (!checkItemPlacement(occupied, folderInfo, sBgDataModel.workspaceScreens)) { - itemsToRemove.add(id); - break; - } if (restored) { // no special handling required for restored folders - restoredRows.add(id); + c.markRestored(); } - sBgDataModel.addItem(folderInfo, false); + c.checkAndAddItem(folderInfo, sBgDataModel); break; case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: // Read all Launcher-specific widget details - boolean customWidget = itemType == + boolean customWidget = c.itemType == LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; int appWidgetId = c.getInt(appWidgetIdIndex); - serialNumber = c.getLong(profileIdIndex); String savedProvider = c.getString(appWidgetProviderIndex); - id = c.getLong(idIndex); - user = allUsers.get(serialNumber); - if (user == null) { - itemsToRemove.add(id); - continue; - } final ComponentName component = ComponentName.unflattenFromString(savedProvider); @@ -1605,14 +1448,14 @@ public class LauncherModel extends BroadcastReceiver final AppWidgetProviderInfo provider = widgetProvidersMap.get( new ComponentKey( ComponentName.unflattenFromString(savedProvider), - user)); + c.user)); final boolean isProviderReady = isValidProvider(provider); if (!isSafeMode && !customWidget && wasProviderReady && !isProviderReady) { - FileLog.d(TAG, "Deleting widget that isn't installed anymore: " + c.markDeleted( + "Deleting widget that isn't installed anymore: " + provider); - itemsToRemove.add(id); } else { if (isProviderReady) { appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, @@ -1637,7 +1480,7 @@ public class LauncherModel extends BroadcastReceiver } appWidgetInfo.restoreStatus = status; } else { - Log.v(TAG, "Widget restore pending id=" + id + Log.v(TAG, "Widget restore pending id=" + c.id + " appWidgetId=" + appWidgetId + " status =" + restoreStatus); appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, @@ -1652,8 +1495,7 @@ public class LauncherModel extends BroadcastReceiver appWidgetInfo.restoreStatus |= LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; } else if (!isSafeMode) { - FileLog.d(TAG, "Unrestored widget removed: " + component); - itemsToRemove.add(id); + c.markDeleted("Unrestored widget removed: " + component); continue; } @@ -1669,44 +1511,31 @@ public class LauncherModel extends BroadcastReceiver } } - appWidgetInfo.id = id; - appWidgetInfo.screenId = c.getInt(screenIndex); - appWidgetInfo.cellX = c.getInt(cellXIndex); - appWidgetInfo.cellY = c.getInt(cellYIndex); + c.applyCommonProperties(appWidgetInfo); appWidgetInfo.spanX = c.getInt(spanXIndex); appWidgetInfo.spanY = c.getInt(spanYIndex); - appWidgetInfo.user = user; + appWidgetInfo.user = c.user; - if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP && - container != LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - Log.e(TAG, "Widget found where container != " + + if (!c.isOnWorkspaceOrHotseat()) { + c.markDeleted("Widget found where container != " + "CONTAINER_DESKTOP nor CONTAINER_HOTSEAT - ignoring!"); - itemsToRemove.add(id); continue; } - appWidgetInfo.container = container; - // check & update map of what's occupied - if (!checkItemPlacement(occupied, appWidgetInfo, sBgDataModel.workspaceScreens)) { - itemsToRemove.add(id); - break; - } - if (!customWidget) { String providerName = appWidgetInfo.providerName.flattenToString(); if (!providerName.equals(savedProvider) || (appWidgetInfo.restoreStatus != restoreStatus)) { - ContentValues values = new ContentValues(); - values.put( - LauncherSettings.Favorites.APPWIDGET_PROVIDER, - providerName); - values.put(LauncherSettings.Favorites.RESTORED, - appWidgetInfo.restoreStatus); - updateItem(id, values); + c.updater() + .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, + providerName) + .put(LauncherSettings.Favorites.RESTORED, + appWidgetInfo.restoreStatus) + .commit(); } } - sBgDataModel.addItem(appWidgetInfo, false); + c.checkAndAddItem(appWidgetInfo, sBgDataModel); } break; } @@ -1724,16 +1553,8 @@ public class LauncherModel extends BroadcastReceiver return; } - if (itemsToRemove.size() > 0) { - // Remove dead items - contentResolver.delete(LauncherSettings.Favorites.CONTENT_URI, - Utilities.createDbSelectionQuery( - LauncherSettings.Favorites._ID, itemsToRemove), null); - if (DEBUG_LOADERS) { - Log.d(TAG, "Removed = " + Utilities.createDbSelectionQuery( - LauncherSettings.Favorites._ID, itemsToRemove)); - } - + // Remove dead items + if (c.commitDeleted()) { // Remove any empty folder ArrayList deletedFolderIds = (ArrayList) LauncherSettings.Settings .call(contentResolver, @@ -1774,15 +1595,7 @@ public class LauncherModel extends BroadcastReceiver } } - if (restoredRows.size() > 0) { - // Update restored items that no longer require special handling - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.RESTORED, 0); - contentResolver.update(LauncherSettings.Favorites.CONTENT_URI, values, - Utilities.createDbSelectionQuery( - LauncherSettings.Favorites._ID, restoredRows), null); - } - + c.commitRestoredItems(); if (!isSdCardReady && !pendingPackages.isEmpty()) { context.registerReceiver( new SdCardAvailableReceiver( @@ -1793,7 +1606,7 @@ public class LauncherModel extends BroadcastReceiver } // Remove any empty screens - ArrayList unusedScreens = new ArrayList(sBgDataModel.workspaceScreens); + ArrayList unusedScreens = new ArrayList<>(sBgDataModel.workspaceScreens); for (ItemInfo item: sBgDataModel.itemsIdMap) { long screenId = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && @@ -1807,40 +1620,12 @@ public class LauncherModel extends BroadcastReceiver sBgDataModel.workspaceScreens.removeAll(unusedScreens); updateWorkspaceScreenOrder(context, sBgDataModel.workspaceScreens); } - - if (DEBUG_LOADERS) { - Log.d(TAG, "loaded workspace in " + (SystemClock.uptimeMillis()-t) + "ms"); - Log.d(TAG, "workspace layout: "); - int nScreens = occupied.size(); - for (int y = 0; y < countY; y++) { - String line = ""; - - for (int i = 0; i < nScreens; i++) { - long screenId = occupied.keyAt(i); - if (screenId > 0) { - line += " | "; - } - } - Log.d(TAG, "[ " + line + " ]"); - } - } } if (LauncherAppState.PROFILE_STARTUP) { Trace.endSection(); } } - /** - * Partially updates the item without any notification. Must be called on the worker thread. - */ - private void updateItem(long itemId, ContentValues update) { - mContext.getContentResolver().update( - LauncherSettings.Favorites.CONTENT_URI, - update, - BaseColumns._ID + "= ?", - new String[]{Long.toString(itemId)}); - } - /** Filters the set of items who are directly or indirectly (via another container) on the * specified screen. */ private void filterCurrentWorkspaceItems(long currentScreenId, @@ -2482,179 +2267,6 @@ public class LauncherModel extends BroadcastReceiver }); } - /** - * Make an ShortcutInfo object for a restored application or shortcut item that points - * to a package that is not yet installed on the system. - */ - public ShortcutInfo getRestoredItemInfo(Cursor c, Intent intent, - int promiseType, int itemType, CursorIconInfo iconInfo) { - final ShortcutInfo info = new ShortcutInfo(); - info.user = Process.myUserHandle(); - info.promisedIntent = intent; - - info.iconBitmap = iconInfo.loadIcon(c, info); - // the fallback icon - if (info.iconBitmap == null) { - mIconCache.getTitleAndIcon(info, false /* useLowResIcon */); - } - - if ((promiseType & ShortcutInfo.FLAG_RESTORED_ICON) != 0) { - String title = iconInfo.getTitle(c); - if (!TextUtils.isEmpty(title)) { - info.title = Utilities.trim(title); - } - } else if ((promiseType & ShortcutInfo.FLAG_AUTOINTALL_ICON) != 0) { - if (TextUtils.isEmpty(info.title)) { - info.title = iconInfo.getTitle(c); - } - } else { - throw new InvalidParameterException("Invalid restoreType " + promiseType); - } - - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); - info.itemType = itemType; - info.status = promiseType; - return info; - } - - /** - * Make an Intent object for a restored application or shortcut item that points - * to the market page for the item. - */ - @Thunk Intent getRestoredItemIntent(Cursor c, Context context, Intent intent) { - ComponentName componentName = intent.getComponent(); - return getMarketIntent(componentName.getPackageName()); - } - - static Intent getMarketIntent(String packageName) { - return new Intent(Intent.ACTION_VIEW) - .setData(new Uri.Builder() - .scheme("market") - .authority("details") - .appendQueryParameter("id", packageName) - .build()); - } - - /** - * Make an ShortcutInfo object for a shortcut that is an application. - * - * If c is not null, then it will be used to fill in missing data like the title and icon. - */ - public ShortcutInfo getAppShortcutInfo(Intent intent, UserHandle user, Cursor c, - CursorIconInfo iconInfo, boolean allowMissingTarget, boolean useLowResIcon) { - if (user == null) { - Log.d(TAG, "Null user found in getShortcutInfo"); - return null; - } - - ComponentName componentName = intent.getComponent(); - if (componentName == null) { - Log.d(TAG, "Missing component found in getShortcutInfo"); - return null; - } - - Intent newIntent = new Intent(intent.getAction(), null); - newIntent.addCategory(Intent.CATEGORY_LAUNCHER); - newIntent.setComponent(componentName); - LauncherActivityInfoCompat lai = mLauncherApps.resolveActivity(newIntent, user); - if ((lai == null) && !allowMissingTarget) { - Log.d(TAG, "Missing activity found in getShortcutInfo: " + componentName); - return null; - } - - final ShortcutInfo info = new ShortcutInfo(); - info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; - info.user = user; - info.intent = newIntent; - - mIconCache.getTitleAndIcon(info, lai, useLowResIcon); - if (mIconCache.isDefaultIcon(info.iconBitmap, user) && c != null) { - Bitmap icon = iconInfo.loadIcon(c); - info.iconBitmap = icon != null ? icon : mIconCache.getDefaultIcon(user); - } - - if (lai != null && PackageManagerHelper.isAppSuspended(lai.getApplicationInfo())) { - info.isDisabled = ShortcutInfo.FLAG_DISABLED_SUSPENDED; - } - - // from the db - if (TextUtils.isEmpty(info.title) && c != null) { - info.title = iconInfo.getTitle(c); - } - - // fall back to the class name of the activity - if (info.title == null) { - info.title = componentName.getClassName(); - } - - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); - return info; - } - - /** - * Make an ShortcutInfo object for a shortcut that isn't an application. - */ - @Thunk ShortcutInfo getShortcutInfo(Cursor c, CursorIconInfo iconInfo) { - final ShortcutInfo info = new ShortcutInfo(); - // Non-app shortcuts are only supported for current user. - info.user = Process.myUserHandle(); - info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; - - // TODO: If there's an explicit component and we can't install that, delete it. - - loadInfoFromCursor(info, c, iconInfo); - return info; - } - - /** - * Make an ShortcutInfo object for a shortcut that isn't an application. - */ - public void loadInfoFromCursor(ShortcutInfo info, Cursor c, CursorIconInfo iconInfo) { - info.title = iconInfo.getTitle(c); - info.iconBitmap = iconInfo.loadIcon(c, info); - // the fallback icon - if (info.iconBitmap == null) { - info.iconBitmap = mIconCache.getDefaultIcon(info.user); - } - } - - ShortcutInfo infoFromShortcutIntent(Context context, Intent data) { - Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); - String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); - Parcelable bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); - - if (intent == null) { - // If the intent is null, we can't construct a valid ShortcutInfo, so we return null - Log.e(TAG, "Can't construct ShorcutInfo with null intent"); - return null; - } - - final ShortcutInfo info = new ShortcutInfo(); - - // Only support intents for current user for now. Intents sent from other - // users wouldn't get here without intent forwarding anyway. - info.user = Process.myUserHandle(); - - if (bitmap instanceof Bitmap) { - info.iconBitmap = LauncherIcons.createIconBitmap((Bitmap) bitmap, context); - } else { - Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - if (extra instanceof ShortcutIconResource) { - info.iconResource = (ShortcutIconResource) extra; - info.iconBitmap = LauncherIcons.createIconBitmap(info.iconResource, context); - } - } - if (info.iconBitmap == null) { - info.iconBitmap = mIconCache.getDefaultIcon(info.user); - } - - info.title = Utilities.trim(name); - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); - info.intent = intent; - - return info; - } - static boolean isValidProvider(AppWidgetProviderInfo provider) { return (provider != null) && (provider.provider != null) && (provider.provider.getPackageName() != null); diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 3f191bdc35..0619187bdf 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -20,9 +20,7 @@ import android.content.Context; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageManager; import android.content.res.Resources; -import android.database.Cursor; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; @@ -51,16 +49,6 @@ public class LauncherIcons { Paint.FILTER_BITMAP_FLAG)); } - - public static Bitmap createIconBitmap(Cursor c, int iconIndex, Context context) { - byte[] data = c.getBlob(iconIndex); - try { - return createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length), context); - } catch (Exception e) { - return null; - } - } - /** * Returns a bitmap suitable for the all apps view. If the package or the resource do not * exist, it returns null. diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java new file mode 100644 index 0000000000..99a6cdf5e6 --- /dev/null +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -0,0 +1,445 @@ +/* + * Copyright (C) 2017 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.launcher3.model; + +import android.content.ComponentName; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.Intent.ShortcutIconResource; +import android.database.Cursor; +import android.database.CursorWrapper; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.UserHandle; +import android.provider.BaseColumns; +import android.text.TextUtils; +import android.util.Log; +import android.util.LongSparseArray; + +import com.android.launcher3.IconCache; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; +import com.android.launcher3.Workspace; +import com.android.launcher3.compat.LauncherActivityInfoCompat; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.logging.FileLog; +import com.android.launcher3.util.ContentWriter; +import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.LongArrayMap; +import com.android.launcher3.util.PackageManagerHelper; + +import java.security.InvalidParameterException; +import java.util.ArrayList; + +/** + * Extension of {@link Cursor} with utility methods for workspace loading. + */ +public class LoaderCursor extends CursorWrapper { + + private static final String TAG = "LoaderCursor"; + + public final LongSparseArray allUsers = new LongSparseArray<>(); + + private final Context mContext; + private final UserManagerCompat mUserManager; + private final IconCache mIconCache; + private final InvariantDeviceProfile mIDP; + + private final ArrayList itemsToRemove = new ArrayList<>(); + private final ArrayList restoredRows = new ArrayList<>(); + private final LongArrayMap occupied = new LongArrayMap<>(); + + private final int iconPackageIndex; + private final int iconResourceIndex; + private final int iconIndex; + public final int titleIndex; + + private final int idIndex; + private final int containerIndex; + private final int itemTypeIndex; + private final int screenIndex; + private final int cellXIndex; + private final int cellYIndex; + private final int profileIdIndex; + + // Properties loaded per iteration + public long serialNumber; + public UserHandle user; + public long id; + public long container; + public int itemType; + + public LoaderCursor(Cursor c, LauncherAppState app) { + super(c); + mContext = app.getContext(); + mIconCache = app.getIconCache(); + mIDP = app.getInvariantDeviceProfile(); + mUserManager = UserManagerCompat.getInstance(mContext); + + // Init column indices + iconIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ICON); + iconPackageIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_PACKAGE); + iconResourceIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_RESOURCE); + titleIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE); + + idIndex = getColumnIndexOrThrow(LauncherSettings.Favorites._ID); + containerIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER); + itemTypeIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE); + screenIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN); + cellXIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX); + cellYIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY); + profileIdIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.PROFILE_ID); + } + + @Override + public boolean moveToNext() { + boolean result = super.moveToNext(); + if (result) { + // Load common properties. + itemType = getInt(itemTypeIndex); + container = getInt(containerIndex); + id = getLong(idIndex); + serialNumber = getInt(profileIdIndex); + user = allUsers.get(serialNumber); + } + return result; + } + + public ShortcutInfo loadSimpleShortcut() { + final ShortcutInfo info = new ShortcutInfo(); + // Non-app shortcuts are only supported for current user. + info.user = user; + info.itemType = itemType; + info.title = getTitle(); + info.iconBitmap = loadIcon(info); + // the fallback icon + if (info.iconBitmap == null) { + info.iconBitmap = mIconCache.getDefaultIcon(info.user); + } + + // TODO: If there's an explicit component and we can't install that, delete it. + + return info; + } + + /** + * Loads the icon from the cursor and updates the {@param info} if the icon is an app resource. + */ + protected Bitmap loadIcon(ShortcutInfo info) { + Bitmap icon = null; + if (itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { + String packageName = getString(iconPackageIndex); + String resourceName = getString(iconResourceIndex); + if (!TextUtils.isEmpty(packageName) || !TextUtils.isEmpty(resourceName)) { + info.iconResource = new ShortcutIconResource(); + info.iconResource.packageName = packageName; + info.iconResource.resourceName = resourceName; + icon = LauncherIcons.createIconBitmap(info.iconResource, mContext); + } + } + if (icon == null) { + // Failed to load from resource, try loading from DB. + byte[] data = getBlob(iconIndex); + try { + icon = LauncherIcons.createIconBitmap( + BitmapFactory.decodeByteArray(data, 0, data.length), mContext); + } catch (Exception e) { + return null; + } + } + return icon; + } + + /** + * Returns the title or empty string + */ + private String getTitle() { + String title = getString(titleIndex); + return TextUtils.isEmpty(title) ? "" : Utilities.trim(title); + } + + + /** + * Make an ShortcutInfo object for a restored application or shortcut item that points + * to a package that is not yet installed on the system. + */ + public ShortcutInfo getRestoredItemInfo(Intent intent, int promiseType) { + final ShortcutInfo info = new ShortcutInfo(); + info.user = user; + info.promisedIntent = intent; + + info.iconBitmap = loadIcon(info); + // the fallback icon + if (info.iconBitmap == null) { + mIconCache.getTitleAndIcon(info, false /* useLowResIcon */); + } + + if ((promiseType & ShortcutInfo.FLAG_RESTORED_ICON) != 0) { + String title = getTitle(); + if (!TextUtils.isEmpty(title)) { + info.title = Utilities.trim(title); + } + } else if ((promiseType & ShortcutInfo.FLAG_AUTOINTALL_ICON) != 0) { + if (TextUtils.isEmpty(info.title)) { + info.title = getTitle(); + } + } else { + throw new InvalidParameterException("Invalid restoreType " + promiseType); + } + + info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + info.itemType = itemType; + info.status = promiseType; + return info; + } + + /** + * Make an ShortcutInfo object for a shortcut that is an application. + */ + public ShortcutInfo getAppShortcutInfo( + Intent intent, boolean allowMissingTarget, boolean useLowResIcon) { + if (user == null) { + Log.d(TAG, "Null user found in getShortcutInfo"); + return null; + } + + ComponentName componentName = intent.getComponent(); + if (componentName == null) { + Log.d(TAG, "Missing component found in getShortcutInfo"); + return null; + } + + Intent newIntent = new Intent(Intent.ACTION_MAIN, null); + newIntent.addCategory(Intent.CATEGORY_LAUNCHER); + newIntent.setComponent(componentName); + LauncherActivityInfoCompat lai = LauncherAppsCompat.getInstance(mContext) + .resolveActivity(newIntent, user); + if ((lai == null) && !allowMissingTarget) { + Log.d(TAG, "Missing activity found in getShortcutInfo: " + componentName); + return null; + } + + final ShortcutInfo info = new ShortcutInfo(); + info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; + info.user = user; + info.intent = newIntent; + + mIconCache.getTitleAndIcon(info, lai, useLowResIcon); + if (mIconCache.isDefaultIcon(info.iconBitmap, user)) { + Bitmap icon = loadIcon(info); + info.iconBitmap = icon != null ? icon : info.iconBitmap; + } + + if (lai != null && PackageManagerHelper.isAppSuspended(lai.getApplicationInfo())) { + info.isDisabled = ShortcutInfo.FLAG_DISABLED_SUSPENDED; + } + + // from the db + if (TextUtils.isEmpty(info.title)) { + info.title = getTitle(); + } + + // fall back to the class name of the activity + if (info.title == null) { + info.title = componentName.getClassName(); + } + + info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + return info; + } + + /** + * Returns a {@link ContentWriter} which can be used to update the current item. + */ + public ContentWriter updater() { + return new ContentWriter(mContext, new ContentWriter.CommitParams( + BaseColumns._ID + "= ?", new String[]{Long.toString(id)})); + } + + /** + * Marks the current item for removal + */ + public void markDeleted(String reason) { + FileLog.e(TAG, reason); + itemsToRemove.add(id); + } + + /** + * Removes any items marked for removal. + * @return true is any item was removed. + */ + public boolean commitDeleted() { + if (itemsToRemove.size() > 0) { + // Remove dead items + mContext.getContentResolver().delete(LauncherSettings.Favorites.CONTENT_URI, + Utilities.createDbSelectionQuery( + LauncherSettings.Favorites._ID, itemsToRemove), null); + return true; + } + return false; + } + + /** + * Marks the current item as restored + */ + public void markRestored() { + restoredRows.add(id); + } + + public void commitRestoredItems() { + if (restoredRows.size() > 0) { + // Update restored items that no longer require special handling + ContentValues values = new ContentValues(); + values.put(LauncherSettings.Favorites.RESTORED, 0); + mContext.getContentResolver().update(LauncherSettings.Favorites.CONTENT_URI, values, + Utilities.createDbSelectionQuery( + LauncherSettings.Favorites._ID, restoredRows), null); + } + } + + /** + * Returns true is the item is on workspace or hotseat + */ + public boolean isOnWorkspaceOrHotseat() { + return container == LauncherSettings.Favorites.CONTAINER_DESKTOP || + container == LauncherSettings.Favorites.CONTAINER_HOTSEAT; + } + + /** + * Applies the following properties: + * {@link ItemInfo#id} + * {@link ItemInfo#container} + * {@link ItemInfo#screenId} + * {@link ItemInfo#cellX} + * {@link ItemInfo#cellY} + */ + public void applyCommonProperties(ItemInfo info) { + info.id = id; + info.container = container; + info.screenId = getInt(screenIndex); + info.cellX = getInt(cellXIndex); + info.cellY = getInt(cellYIndex); + } + + /** + * Adds the {@param info} to {@param dataModel} if it does not overlap with any other item, + * otherwise marks it for deletion. + */ + public void checkAndAddItem(ItemInfo info, BgDataModel dataModel) { + if (checkItemPlacement(info, dataModel.workspaceScreens)) { + dataModel.addItem(info, false); + } else { + markDeleted("Item position overlap"); + } + } + + /** + * check & update map of what's occupied; used to discard overlapping/invalid items + */ + protected boolean checkItemPlacement(ItemInfo item, ArrayList workspaceScreens) { + long containerIndex = item.screenId; + if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + // Return early if we detect that an item is under the hotseat button + if (!FeatureFlags.NO_ALL_APPS_ICON && + mIDP.isAllAppsButtonRank((int) item.screenId)) { + Log.e(TAG, "Error loading shortcut into hotseat " + item + + " into position (" + item.screenId + ":" + item.cellX + "," + + item.cellY + ") occupied by all apps"); + return false; + } + + final GridOccupancy hotseatOccupancy = + occupied.get((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT); + + if (item.screenId >= mIDP.numHotseatIcons) { + Log.e(TAG, "Error loading shortcut " + item + + " into hotseat position " + item.screenId + + ", position out of bounds: (0 to " + (mIDP.numHotseatIcons - 1) + + ")"); + return false; + } + + if (hotseatOccupancy != null) { + if (hotseatOccupancy.cells[(int) item.screenId][0]) { + Log.e(TAG, "Error loading shortcut into hotseat " + item + + " into position (" + item.screenId + ":" + item.cellX + "," + + item.cellY + ") already occupied"); + return false; + } else { + hotseatOccupancy.cells[(int) item.screenId][0] = true; + return true; + } + } else { + final GridOccupancy occupancy = new GridOccupancy(mIDP.numHotseatIcons, 1); + occupancy.cells[(int) item.screenId][0] = true; + occupied.put((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT, occupancy); + return true; + } + } else if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + if (!workspaceScreens.contains((Long) item.screenId)) { + // The item has an invalid screen id. + return false; + } + } else { + // Skip further checking if it is not the hotseat or workspace container + return true; + } + + final int countX = mIDP.numColumns; + final int countY = mIDP.numRows; + if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && + item.cellX < 0 || item.cellY < 0 || + item.cellX + item.spanX > countX || item.cellY + item.spanY > countY) { + Log.e(TAG, "Error loading shortcut " + item + + " into cell (" + containerIndex + "-" + item.screenId + ":" + + item.cellX + "," + item.cellY + + ") out of screen bounds ( " + countX + "x" + countY + ")"); + return false; + } + + if (!occupied.containsKey(item.screenId)) { + GridOccupancy screen = new GridOccupancy(countX + 1, countY + 1); + if (item.screenId == Workspace.FIRST_SCREEN_ID) { + // Mark the first row as occupied (if the feature is enabled) + // in order to account for the QSB. + screen.markCells(0, 0, countX + 1, 1, FeatureFlags.QSB_ON_FIRST_SCREEN); + } + occupied.put(item.screenId, screen); + } + final GridOccupancy occupancy = occupied.get(item.screenId); + + // Check if any workspace icons overlap with each other + if (occupancy.isRegionVacant(item.cellX, item.cellY, item.spanX, item.spanY)) { + occupancy.markCells(item, true); + return true; + } else { + Log.e(TAG, "Error loading shortcut " + item + + " into cell (" + containerIndex + "-" + item.screenId + ":" + + item.cellX + "," + item.cellX + "," + item.spanX + "," + item.spanY + + ") already occupied"); + return false; + } + } +} diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java index 1c347c0a41..76ba9d63a0 100644 --- a/src/com/android/launcher3/util/ContentWriter.java +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -20,6 +20,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.net.Uri; import android.os.UserHandle; import com.android.launcher3.LauncherAppState; @@ -35,9 +36,15 @@ public class ContentWriter { private final ContentValues mValues; private final Context mContext; + private CommitParams mCommitParams; private Bitmap mIcon; private UserHandle mUser; + public ContentWriter(Context context, CommitParams commitParams) { + this(context); + mCommitParams = commitParams; + } + public ContentWriter(Context context) { this(new ContentValues(), context); } @@ -95,4 +102,25 @@ public class ContentWriter { } return mValues; } + + public int commit() { + if (mCommitParams != null) { + return mContext.getContentResolver().update(mCommitParams.mUri, getValues(), + mCommitParams.mWhere, mCommitParams.mSelectionArgs); + } + return 0; + } + + public static final class CommitParams { + + final Uri mUri = LauncherSettings.Favorites.CONTENT_URI; + String mWhere; + String[] mSelectionArgs; + + public CommitParams(String where, String[] selectionArgs) { + mWhere = where; + mSelectionArgs = selectionArgs; + } + + } } diff --git a/src/com/android/launcher3/util/CursorIconInfo.java b/src/com/android/launcher3/util/CursorIconInfo.java deleted file mode 100644 index 3bc4eabc5a..0000000000 --- a/src/com/android/launcher3/util/CursorIconInfo.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.util; - -import android.content.Context; -import android.content.Intent.ShortcutIconResource; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.text.TextUtils; - -import com.android.launcher3.LauncherSettings; -import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.Utilities; -import com.android.launcher3.graphics.LauncherIcons; - -/** - * Utility class to load icon from a cursor. - */ -public class CursorIconInfo { - public final int iconPackageIndex; - public final int iconResourceIndex; - public final int iconIndex; - - public final int titleIndex; - - private final Context mContext; - - public CursorIconInfo(Context context, Cursor c) { - mContext = context; - - iconIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON); - iconPackageIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_PACKAGE); - iconResourceIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_RESOURCE); - - titleIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE); - } - - /** - * Loads the icon from the cursor and updates the {@param info} if the icon is an app resource. - */ - public Bitmap loadIcon(Cursor c, ShortcutInfo info) { - Bitmap icon = null; - String packageName = c.getString(iconPackageIndex); - String resourceName = c.getString(iconResourceIndex); - if (!TextUtils.isEmpty(packageName) || !TextUtils.isEmpty(resourceName)) { - info.iconResource = new ShortcutIconResource(); - info.iconResource.packageName = packageName; - info.iconResource.resourceName = resourceName; - icon = LauncherIcons.createIconBitmap(info.iconResource, mContext); - } - if (icon == null) { - // Failed to load from resource, try loading from DB. - icon = loadIcon(c); - } - return icon; - } - - /** - * Loads the fixed bitmap from the icon if available. - */ - public Bitmap loadIcon(Cursor c) { - return LauncherIcons.createIconBitmap(c, iconIndex, mContext); - } - - /** - * Returns the title or empty string - */ - public String getTitle(Cursor c) { - String title = c.getString(titleIndex); - return TextUtils.isEmpty(title) ? "" : Utilities.trim(c.getString(titleIndex)); - } -} diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java index b61d6095f2..33a9fc68d7 100644 --- a/src/com/android/launcher3/util/PackageManagerHelper.java +++ b/src/com/android/launcher3/util/PackageManagerHelper.java @@ -23,6 +23,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; +import android.net.Uri; import android.os.Build; import android.text.TextUtils; @@ -124,4 +125,13 @@ public class PackageManagerHelper { return false; } + + public static Intent getMarketIntent(String packageName) { + return new Intent(Intent.ACTION_VIEW) + .setData(new Uri.Builder() + .scheme("market") + .authority("details") + .appendQueryParameter("id", packageName) + .build()); + } } diff --git a/tests/src/com/android/launcher3/model/LoaderCursorTest.java b/tests/src/com/android/launcher3/model/LoaderCursorTest.java new file mode 100644 index 0000000000..d40e6c2fc5 --- /dev/null +++ b/tests/src/com/android/launcher3/model/LoaderCursorTest.java @@ -0,0 +1,234 @@ +package com.android.launcher3.model; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.database.MatrixCursor; +import android.graphics.Bitmap; +import android.os.Process; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.launcher3.IconCache; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; +import com.android.launcher3.compat.LauncherAppsCompat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.Arrays; + +import static com.android.launcher3.LauncherSettings.Favorites.CELLX; +import static com.android.launcher3.LauncherSettings.Favorites.CELLY; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT; +import static com.android.launcher3.LauncherSettings.Favorites.ICON; +import static com.android.launcher3.LauncherSettings.Favorites.ICON_PACKAGE; +import static com.android.launcher3.LauncherSettings.Favorites.ICON_RESOURCE; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; +import static com.android.launcher3.LauncherSettings.Favorites.PROFILE_ID; +import static com.android.launcher3.LauncherSettings.Favorites.SCREEN; +import static com.android.launcher3.LauncherSettings.Favorites.TITLE; +import static com.android.launcher3.LauncherSettings.Favorites._ID; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link LoaderCursor} + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class LoaderCursorTest { + + private LauncherAppState mMockApp; + private IconCache mMockIconCache; + + private MatrixCursor mCursor; + private InvariantDeviceProfile mIDP; + private Context mContext; + private LauncherAppsCompat mLauncherApps; + + private LoaderCursor mLoaderCursor; + + @Before + public void setup() { + mIDP = new InvariantDeviceProfile(); + mCursor = new MatrixCursor(new String[] { + ICON, ICON_PACKAGE, ICON_RESOURCE, TITLE, + _ID, CONTAINER, ITEM_TYPE, PROFILE_ID, + SCREEN, CELLX, CELLY, + }); + mContext = InstrumentationRegistry.getTargetContext(); + + mMockApp = mock(LauncherAppState.class); + mMockIconCache = mock(IconCache.class); + when(mMockApp.getIconCache()).thenReturn(mMockIconCache); + when(mMockApp.getInvariantDeviceProfile()).thenReturn(mIDP); + when(mMockApp.getContext()).thenReturn(mContext); + mLauncherApps = LauncherAppsCompat.getInstance(mContext); + + mLoaderCursor = new LoaderCursor(mCursor, mMockApp); + mLoaderCursor.allUsers.put(0, Process.myUserHandle()); + } + + private void initCursor(int itemType, String title) { + mCursor.newRow() + .add(_ID, 1) + .add(PROFILE_ID, 0) + .add(ITEM_TYPE, itemType) + .add(TITLE, title) + .add(CONTAINER, CONTAINER_DESKTOP); + } + + @Test + public void getAppShortcutInfo_dontAllowMissing_invalidComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + ComponentName cn = new ComponentName(mContext.getPackageName(), "dummy-do"); + assertNull(mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), false /* allowMissingTarget */, true)); + } + + @Test + public void getAppShortcutInfo_dontAllowMissing_validComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + + ComponentName cn = mLauncherApps.getActivityList(null, mLoaderCursor.user) + .get(0).getComponentName(); + ShortcutInfo info = mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), false /* allowMissingTarget */, true); + assertNotNull(info); + assertTrue(Utilities.isLauncherAppTarget(info.intent)); + } + + @Test + public void getAppShortcutInfo_allowMissing_invalidComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + + ComponentName cn = new ComponentName(mContext.getPackageName(), "dummy-do"); + ShortcutInfo info = mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), true /* allowMissingTarget */, true); + assertNotNull(info); + assertTrue(Utilities.isLauncherAppTarget(info.intent)); + } + + @Test + public void loadSimpleShortcut() { + initCursor(ITEM_TYPE_SHORTCUT, "my-shortcut"); + assertTrue(mLoaderCursor.moveToNext()); + + Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + when(mMockIconCache.getDefaultIcon(eq(mLoaderCursor.user))).thenReturn(icon); + ShortcutInfo info = mLoaderCursor.loadSimpleShortcut(); + assertEquals(icon, info.iconBitmap); + assertEquals("my-shortcut", info.title); + assertEquals(ITEM_TYPE_SHORTCUT, info.itemType); + } + + @Test + public void checkItemPlacement_wrongWorkspaceScreen() { + ArrayList workspaceScreens = new ArrayList<>(Arrays.asList(1L, 3L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Item on unknown screen are not placed + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 4L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 5L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 3L), workspaceScreens)); + + } + @Test + public void checkItemPlacement_outsideBounds() { + ArrayList workspaceScreens = new ArrayList<>(Arrays.asList(1L, 2L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Item outside screen bounds are not placed + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(4, 4, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + } + + @Test + public void checkItemPlacement_overlappingItems() { + ArrayList workspaceScreens = new ArrayList<>(Arrays.asList(1L, 2L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Overlapping items are not placed + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(1, 1, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(2, 2, 2, 2, CONTAINER_DESKTOP, 1L), workspaceScreens)); + + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 2, 1, 2, CONTAINER_DESKTOP, 1L), workspaceScreens)); + } + + @Test + public void checkItemPlacement_hotseat() { + ArrayList workspaceScreens = new ArrayList<>(); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Hotseat items are only placed based on screenId + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 2L), workspaceScreens)); + + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 3L), workspaceScreens)); + } + + private ItemInfo newItemInfo(int cellX, int cellY, int spanX, int spanY, + long container, long screenId) { + ItemInfo info = new ItemInfo(); + info.cellX = cellX; + info.cellY = cellY; + info.spanX = spanX; + info.spanY = spanY; + info.container = container; + info.screenId = screenId; + return info; + } +} From 1cc1c9ad83014ec8af54a44112138339c52795b0 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 6 Jan 2017 16:32:57 -0800 Subject: [PATCH 180/382] Enforcing background thread when accessing iconCacheDb. > Moving any icon cache access to background thread > Updating Apps list to avoid loading icons for ignored apps Bug: 21325319 Change-Id: Id72755100f1176ccfcc99249c5e02873cc249a13 --- src/com/android/launcher3/AllAppsList.java | 8 ++++--- src/com/android/launcher3/AppInfo.java | 14 +++-------- src/com/android/launcher3/IconCache.java | 5 +++- .../launcher3/InstallShortcutReceiver.java | 24 +++++++++++++++---- src/com/android/launcher3/LauncherModel.java | 11 ++++----- .../launcher3/shortcuts/DeepShortcutView.java | 12 ++++++++-- .../util/ManagedProfileHeuristic.java | 5 ++-- .../res/raw/cache_data_updated_task_data.txt | 8 +++---- .../model/BaseModelUpdateTaskTestCase.java | 10 ++++++-- .../model/CacheDataUpdatedTaskTest.java | 5 ++++ 10 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 34a44fc052..2bf014ad55 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -65,13 +65,15 @@ public class AllAppsList { * * If the app is already in the list, doesn't add it. */ - public void add(AppInfo info) { + public void add(AppInfo info, LauncherActivityInfoCompat activityInfo) { if (!mAppFilter.shouldShowApp(info.componentName)) { return; } if (findActivity(data, info.componentName, info.user)) { return; } + mIconCache.getTitleAndIcon(info, activityInfo, true /* useLowResIcon */); + data.add(info); added.add(info); } @@ -101,7 +103,7 @@ public class AllAppsList { user); for (LauncherActivityInfoCompat info : matches) { - add(new AppInfo(context, info, user, mIconCache)); + add(new AppInfo(context, info, user), info); } } @@ -171,7 +173,7 @@ public class AllAppsList { info.getComponentName().getPackageName(), user, info.getComponentName().getClassName()); if (applicationInfo == null) { - add(new AppInfo(context, info, user, mIconCache)); + add(new AppInfo(context, info, user), info); } else { mIconCache.getTitleAndIcon(applicationInfo, info, true /* useLowResIcon */); modified.add(applicationInfo); diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 9c9dcc5f91..9b23df391c 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -58,19 +58,12 @@ public class AppInfo extends ItemInfoWithIcon { /** * Must not hold the Context. */ - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache) { - this(context, info, user, iconCache, - UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user) { + this(context, info, user, UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); } public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache, boolean quietModeEnabled) { - this(context, info, user, iconCache, quietModeEnabled, true /* useLowResIcon */); - } - - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache, boolean quietModeEnabled, boolean useLowResIcon) { + boolean quietModeEnabled) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; this.user = user; @@ -82,7 +75,6 @@ public class AppInfo extends ItemInfoWithIcon { } intent = makeLaunchIntent(context, info, user); - iconCache.getTitleAndIcon(this, info, useLowResIcon); } public AppInfo(AppInfo info) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 7c50a5c2a0..603d25a740 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -52,6 +52,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; import com.android.launcher3.util.SQLiteCacheHelper; import com.android.launcher3.util.Thunk; @@ -188,7 +189,7 @@ public class IconCache { return getFullResDefaultActivityIcon(); } - private Bitmap makeDefaultIcon(UserHandle user) { + protected Bitmap makeDefaultIcon(UserHandle user) { Drawable unbadged = getFullResDefaultActivityIcon(); return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext); } @@ -517,6 +518,7 @@ public class IconCache { @NonNull ComponentName componentName, @NonNull Provider infoProvider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { + Preconditions.assertWorkerThread(); ComponentKey cacheKey = new ComponentKey(componentName, user); CacheEntry entry = mCache.get(cacheKey); if (entry == null || (entry.isLowResIcon && !useLowResIcon)) { @@ -604,6 +606,7 @@ public class IconCache { */ private CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, boolean useLowResIcon) { + Preconditions.assertWorkerThread(); ComponentKey cacheKey = getPackageKey(packageName, user); CacheEntry entry = mCache.get(cacheKey); diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index ecbfe38235..cba7cfe4f2 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -26,6 +26,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Looper; import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; @@ -436,10 +437,25 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public ItemInfo getItemInfo() { if (activityInfo != null) { - return new AppInfo(mContext, activityInfo, user, - LauncherAppState.getInstance().getIconCache(), - UserManagerCompat.getInstance(mContext).isQuietModeEnabled(user), - false /* useLowResIcon */).makeShortcut(); + AppInfo appInfo = new AppInfo(mContext, activityInfo, user); + final LauncherAppState app = LauncherAppState.getInstance(); + // Set default values until proper values is loaded. + appInfo.title = ""; + appInfo.iconBitmap = app.getIconCache().getDefaultIcon(user); + final ShortcutInfo si = appInfo.makeShortcut(); + if (Looper.myLooper() == LauncherModel.getWorkerLooper()) { + app.getIconCache().getTitleAndIcon(si, activityInfo, false /* useLowResIcon */); + } else { + app.getModel().updateAndBindShortcutInfo(new Provider() { + @Override + public ShortcutInfo get() { + app.getIconCache().getTitleAndIcon( + si, activityInfo, false /* useLowResIcon */); + return si; + } + }); + } + return si; } else if (shortcutInfo != null) { return new ShortcutInfo(shortcutInfo, mContext); } else if (providerInfo != null) { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 616b2c7dda..56892ff214 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -2029,7 +2029,7 @@ public class LauncherModel extends BroadcastReceiver for (int i = 0; i < apps.size(); i++) { LauncherActivityInfoCompat app = apps.get(i); // This builds the icon bitmaps. - mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, quietMode)); + mBgAllAppsList.add(new AppInfo(mContext, app, user, quietMode), app); } final ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(mContext, user); @@ -2221,17 +2221,16 @@ public class LauncherModel extends BroadcastReceiver } /** - * Repopulates the shortcut info, possibly updating any icon already on the workspace. + * Utility method to update a shortcut on the background thread. */ - public void updateShortcutInfo(final ShortcutInfoCompat fullDetail, final ShortcutInfo info) { + public void updateAndBindShortcutInfo(final Provider shortcutProvider) { enqueueModelUpdateTask(new ExtendedModelTask() { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { - info.updateFromDeepShortcutInfo(fullDetail, app.getContext()); - + ShortcutInfo info = shortcutProvider.get(); ArrayList update = new ArrayList<>(); update.add(info); - bindUpdatedShortcuts(update, fullDetail.getUserHandle()); + bindUpdatedShortcuts(update, info.user); } }); } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 6796137894..04c71ecd2d 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -34,6 +34,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.shortcuts.DeepShortcutsContainer.UnbadgedShortcutInfo; import com.android.launcher3.util.PillRevealOutlineProvider; import com.android.launcher3.util.PillWidthRevealOutlineProvider; +import com.android.launcher3.util.Provider; /** * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}. @@ -114,10 +115,17 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima * Returns the shortcut info that is suitable to be added on the homescreen */ public ShortcutInfo getFinalInfo() { - ShortcutInfo badged = new ShortcutInfo(mInfo); + final ShortcutInfo badged = new ShortcutInfo(mInfo); // Queue an update task on the worker thread. This ensures that the badged // shortcut eventually gets its icon updated. - Launcher.getLauncher(getContext()).getModel().updateShortcutInfo(mInfo.mDetail, badged); + Launcher.getLauncher(getContext()).getModel().updateAndBindShortcutInfo( + new Provider() { + @Override + public ShortcutInfo get() { + badged.updateFromDeepShortcutInfo(mInfo.mDetail, getContext()); + return badged; + } + }); return badged; } diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index ce42bcd60a..c27a3b5460 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -116,8 +116,9 @@ public class ManagedProfileHeuristic { .isQuietModeEnabled(user); for (int i = 0; i < count; i++) { LauncherActivityInstallInfo info = apps.get(i); - ShortcutInfo si = new AppInfo(mContext, info.info, user, mIconCache, - quietModeEnabled, false /* useLowResIcon */).makeShortcut(); + AppInfo appInfo = new AppInfo(mContext, info.info, user, quietModeEnabled); + mIconCache.getTitleAndIcon(appInfo, info.info, false /* useLowResIcon */); + ShortcutInfo si = appInfo.makeShortcut(); ((info.installTime <= folderCreationTime) ? workFolderApps : homescreenApps).add(si); } diff --git a/tests/res/raw/cache_data_updated_task_data.txt b/tests/res/raw/cache_data_updated_task_data.txt index 9095476f66..8199687090 100644 --- a/tests/res/raw/cache_data_updated_task_data.txt +++ b/tests/res/raw/cache_data_updated_task_data.txt @@ -22,7 +22,7 @@ bgItem s itemType=1 title=app4-shrt intent=component=app4/class1 id=8 bgItem s itemType=1 status=1 title=app3-shrt intent=component=app3/class3 id=9 bgItem s itemType=1 status=1 title=app5-shrt intent=component=app5/class1 id=10 -allApps componentName=app1/class1 -allApps componentName=app1/class2 -allApps componentName=app2/class1 -allApps componentName=app2/class2 \ No newline at end of file +allApps componentName=app1/class1 intent=component=app1/class1 +allApps componentName=app1/class2 intent=component=app1/class2 +allApps componentName=app2/class1 intent=component=app2/class1 +allApps componentName=app2/class2 intent=component=app2/class2 \ No newline at end of file diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 1d092ab043..3a27d0dbf0 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -13,6 +13,7 @@ import android.support.test.InstrumentationRegistry; import android.test.ProviderTestCase2; import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; import com.android.launcher3.DeferredHandler; import com.android.launcher3.IconCache; @@ -76,7 +77,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 Date: Wed, 11 Jan 2017 10:48:34 -0800 Subject: [PATCH 181/382] Removing static Context access using LauncherAppState > This ensures that LauncherAppState is only accessed in the presence of a valid context Bug: 33032833 Change-Id: I955e5cb022f8bd6374681ae6c0720a2666d5b750 --- .../launcher3/AppWidgetResizeFrame.java | 2 +- .../android/launcher3/AutoInstallsLayout.java | 4 +-- src/com/android/launcher3/BubbleTextView.java | 2 +- src/com/android/launcher3/IconCache.java | 2 +- .../launcher3/InstallShortcutReceiver.java | 11 ++++---- src/com/android/launcher3/Launcher.java | 4 +-- .../android/launcher3/LauncherAppState.java | 9 ++++++- .../LauncherAppWidgetProviderInfo.java | 5 ++-- src/com/android/launcher3/LauncherModel.java | 24 +++++++++-------- .../android/launcher3/LauncherProvider.java | 3 +-- src/com/android/launcher3/ShortcutInfo.java | 4 +-- src/com/android/launcher3/Workspace.java | 3 +-- .../compat/PackageInstallerCompatVL.java | 2 +- .../launcher3/folder/FolderPagedView.java | 4 +-- .../launcher3/graphics/IconNormalizer.java | 9 ++++--- .../launcher3/graphics/LauncherIcons.java | 21 ++++++--------- .../launcher3/graphics/ShadowGenerator.java | 9 ++++--- .../android/launcher3/model/BgDataModel.java | 12 ++++----- .../model/GridSizeMigrationTask.java | 14 +++++----- .../android/launcher3/model/LoaderCursor.java | 2 +- .../android/launcher3/model/WidgetItem.java | 8 +++--- .../android/launcher3/model/WidgetsModel.java | 12 +++++---- .../launcher3/provider/ImportDataTask.java | 8 +++--- .../launcher3/provider/LauncherDbUtils.java | 3 +-- .../launcher3/qsb/QsbContainerView.java | 2 +- .../testing/ToggleWeightWatcher.java | 2 +- .../android/launcher3/util/ContentWriter.java | 6 ++--- .../util/ManagedProfileHeuristic.java | 4 +-- .../widget/WidgetsContainerView.java | 4 +-- .../launcher3/widget/WidgetsListAdapter.java | 2 +- .../com/android/launcher3/BindWidgetTest.java | 16 ++---------- .../model/AddWorkspaceItemsTaskTest.java | 2 +- .../model/BaseModelUpdateTaskTestCase.java | 2 +- .../ui/LauncherInstrumentationTestCase.java | 26 ++++++++++++------- 34 files changed, 117 insertions(+), 126 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 92da9b7edd..1a405f934e 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -320,7 +320,7 @@ public class AppWidgetResizeFrame extends FrameLayout public static Rect getWidgetSizeRanges(Context context, int spanX, int spanY, Rect rect) { if (sCellSize == null) { - InvariantDeviceProfile inv = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile inv = LauncherAppState.getIDP(context); // Initiate cell sizes. sCellSize = new Point[2]; diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 2a4212a2dd..2e017df9cb 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -79,7 +79,7 @@ public class AutoInstallsLayout { static AutoInstallsLayout get(Context context, String pkg, Resources targetRes, AppWidgetHost appWidgetHost, LayoutParserCallback callback) { - InvariantDeviceProfile grid = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile grid = LauncherAppState.getIDP(context); // Try with grid size and hotseat count String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT, @@ -182,7 +182,7 @@ public class AutoInstallsLayout { mSourceRes = res; mLayoutId = layoutId; - mIdp = LauncherAppState.getInstance().getInvariantDeviceProfile(); + mIdp = LauncherAppState.getIDP(context); mRowCount = mIdp.numRows; mColumnCount = mIdp.numColumns; } diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index b8b43c9c30..32c3ac8be8 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -587,7 +587,7 @@ public class BubbleTextView extends TextView if (getTag() instanceof ItemInfoWithIcon) { ItemInfoWithIcon info = (ItemInfoWithIcon) getTag(); if (info.usingLowResIcon) { - mIconLoadRequest = LauncherAppState.getInstance().getIconCache() + mIconLoadRequest = LauncherAppState.getInstance(getContext()).getIconCache() .updateIconInBackground(BubbleTextView.this, info); } } diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 603d25a740..0c0c53dad7 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -734,7 +734,7 @@ public class IconCache { if (mAppsToUpdate.isEmpty() && !mUpdatedPackages.isEmpty()) { // No more app to update. Notify model. - LauncherAppState.getInstance().getModel().onPackageIconsUpdated( + LauncherAppState.getInstance(mContext).getModel().onPackageIconsUpdated( mUpdatedPackages, mUserManager.getUserForSerialNumber(mUserSerial)); } diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index cba7cfe4f2..09b33297e8 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -241,7 +241,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static void queuePendingShortcutInfo(PendingInstallShortcutInfo info, Context context) { // Queue the item up for adding if launcher has not loaded properly yet - LauncherAppState app = LauncherAppState.getInstance(); + LauncherAppState app = LauncherAppState.getInstance(context); boolean launcherNotLoaded = app.getModel().getCallback() == null; addToInstallQueue(Utilities.getPrefs(context), info); @@ -261,7 +261,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { static void flushInstallQueue(Context context) { ArrayList items = getAndClearInstallQueue(context); if (!items.isEmpty()) { - LauncherAppState.getInstance().getModel().addAndBindAddedWorkspaceItems( + LauncherAppState.getInstance(context).getModel().addAndBindAddedWorkspaceItems( new LazyShortcutsProvider(context.getApplicationContext(), items)); } } @@ -438,7 +438,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public ItemInfo getItemInfo() { if (activityInfo != null) { AppInfo appInfo = new AppInfo(mContext, activityInfo, user); - final LauncherAppState app = LauncherAppState.getInstance(); + final LauncherAppState app = LauncherAppState.getInstance(mContext); // Set default values until proper values is loaded. appInfo.title = ""; appInfo.iconBitmap = app.getIconCache().getDefaultIcon(user); @@ -464,15 +464,14 @@ public class InstallShortcutReceiver extends BroadcastReceiver { LauncherAppWidgetInfo widgetInfo = new LauncherAppWidgetInfo( launchIntent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0), info.provider); - InvariantDeviceProfile idp = LauncherAppState.getInstance() - .getInvariantDeviceProfile(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); widgetInfo.minSpanX = info.minSpanX; widgetInfo.minSpanY = info.minSpanY; widgetInfo.spanX = Math.min(info.spanX, idp.numColumns); widgetInfo.spanY = Math.min(info.spanY, idp.numRows); return widgetInfo; } else { - return createShortcutInfo(data, LauncherAppState.getInstance()); + return createShortcutInfo(data, LauncherAppState.getInstance(mContext)); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d6c8cfb95e..8322f66cd5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -356,7 +356,7 @@ public class Launcher extends Activity super.onCreate(savedInstanceState); - LauncherAppState app = LauncherAppState.getInstance(); + LauncherAppState app = LauncherAppState.getInstance(this); // Load configuration-specific DeviceProfile mDeviceProfile = @@ -1815,7 +1815,7 @@ public class Launcher extends Activity // been created. In this case, don't interfere with the new Launcher. if (mModel.isCurrentCallbacks(this)) { mModel.stopLoader(); - LauncherAppState.getInstance().setLauncher(null); + LauncherAppState.getInstance(this).setLauncher(null); } if (mRotationPrefChangeHandler != null) { diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 00e4bf4dc9..4dc5a97275 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -48,7 +48,7 @@ public class LauncherAppState { private InvariantDeviceProfile mInvariantDeviceProfile; - public static LauncherAppState getInstance() { + public static LauncherAppState getInstance(Context context) { if (INSTANCE == null) { INSTANCE = new LauncherAppState(); } @@ -159,4 +159,11 @@ public class LauncherAppState { public InvariantDeviceProfile getInvariantDeviceProfile() { return mInvariantDeviceProfile; } + + /** + * Shorthand for {@link #getInvariantDeviceProfile()} + */ + public static InvariantDeviceProfile getIDP(Context context) { + return LauncherAppState.getInstance(context).getInvariantDeviceProfile(); + } } diff --git a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java index ab8f395b3b..6cb703b43a 100644 --- a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java @@ -65,7 +65,7 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { } public void initSpans(Context context) { - InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(context); Point paddingLand = idp.landscapeProfile.getTotalWorkspacePadding(); Point paddingPort = idp.portraitProfile.getTotalWorkspacePadding(); @@ -107,8 +107,7 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { if (isCustomWidget) { return cache.getFullResIcon(provider.getPackageName(), icon); } - return super.loadIcon(context, - LauncherAppState.getInstance().getInvariantDeviceProfile().fillResIconDpi); + return super.loadIcon(context, LauncherAppState.getIDP(context).fillResIconDpi); } public String toString(PackageManager pm) { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 56892ff214..af22ab7494 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -336,9 +336,10 @@ public class LauncherModel extends BroadcastReceiver final ContentResolver cr = context.getContentResolver(); final StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + final Context appContext = context.getApplicationContext(); Runnable r = new Runnable() { public void run() { - cr.update(uri, writer.getValues(), null, null); + cr.update(uri, writer.getValues(appContext), null, null); updateItemArrays(item, itemId, stackTrace); } }; @@ -553,13 +554,14 @@ public class LauncherModel extends BroadcastReceiver writer.put(LauncherSettings.Favorites._ID, item.id); final StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + final Context appContext = context.getApplicationContext(); Runnable r = new Runnable() { public void run() { - cr.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues()); + cr.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues(appContext)); synchronized (sBgDataModel) { checkItemInfoLocked(item.id, item, stackTrace); - sBgDataModel.addItem(item, true); + sBgDataModel.addItem(appContext, item, true); } } }; @@ -588,13 +590,14 @@ public class LauncherModel extends BroadcastReceiver public static void deleteItemsFromDatabase(Context context, final Iterable items) { final ContentResolver cr = context.getContentResolver(); + final Context appContext = context.getApplicationContext(); Runnable r = new Runnable() { public void run() { for (ItemInfo item : items) { final Uri uri = LauncherSettings.Favorites.getContentUri(item.id); cr.delete(uri, null, null); - sBgDataModel.removeItem(item); + sBgDataModel.removeItem(appContext, item); } } }; @@ -654,16 +657,17 @@ public class LauncherModel extends BroadcastReceiver */ public static void deleteFolderAndContentsFromDatabase(Context context, final FolderInfo info) { final ContentResolver cr = context.getContentResolver(); + final Context appContext = context.getApplicationContext(); Runnable r = new Runnable() { public void run() { cr.delete(LauncherSettings.Favorites.CONTENT_URI, LauncherSettings.Favorites.CONTAINER + "=" + info.id, null); - sBgDataModel.removeItem(info.contents); + sBgDataModel.removeItem(appContext, info.contents); info.contents.clear(); cr.delete(LauncherSettings.Favorites.getContentUri(info.id), null, null); - sBgDataModel.removeItem(info); + sBgDataModel.removeItem(appContext, info); } }; runOnWorkerThread(r); @@ -1101,8 +1105,7 @@ public class LauncherModel extends BroadcastReceiver final boolean isSdCardReady = Utilities.isBootCompleted(); final MultiHashMap pendingPackages = new MultiHashMap<>(); - LauncherAppState app = LauncherAppState.getInstance(); - InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); + InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); int countX = profile.numColumns; int countY = profile.numRows; @@ -1693,8 +1696,7 @@ public class LauncherModel extends BroadcastReceiver /** Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to * right) */ private void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { - final LauncherAppState app = LauncherAppState.getInstance(); - final InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); + final InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); final int screenCols = profile.numColumns; final int screenCellCount = profile.numColumns * profile.numRows; Collections.sort(workspaceItems, new Comparator() { @@ -2261,7 +2263,7 @@ public class LauncherModel extends BroadcastReceiver bindWidgetsModel(callbacks); // update the Widget entries inside DB on the worker thread. - LauncherAppState.getInstance().getWidgetCache().removeObsoletePreviews(allWidgets); + mApp.getWidgetCache().removeObsoletePreviews(allWidgets); } }); } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 8f56eb69e4..6266fae8fb 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -556,8 +556,7 @@ public class LauncherProvider extends ContentProvider { } private DefaultLayoutParser getDefaultLayoutParser(AppWidgetHost widgetHost) { - int defaultLayout = LauncherAppState.getInstance() - .getInvariantDeviceProfile().defaultLayoutId; + int defaultLayout = LauncherAppState.getIDP(getContext()).defaultLayoutId; return new DefaultLayoutParser(getContext(), widgetHost, mOpenHelper, getContext().getResources(), defaultLayout); } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 77c6837d07..8c83dff2b2 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -235,7 +235,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { disabledMessage = shortcutInfo.getDisabledMessage(); // TODO: Use cache for this - LauncherAppState launcherAppState = LauncherAppState.getInstance(); + LauncherAppState launcherAppState = LauncherAppState.getInstance(context); Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) .getShortcutIconDrawable(shortcutInfo, launcherAppState.getInvariantDeviceProfile().fillResIconDpi); @@ -249,7 +249,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, IconCache cache, Context context) { - unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap); + unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); // Get the app info for the source activity. AppInfo appInfo = new AppInfo(); appInfo.user = user; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index cf6b025059..1030779539 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1613,8 +1613,7 @@ public class Workspace extends PagedView Utilities.THREAD_POOL_EXECUTOR.execute(new Runnable() { @Override public void run() { - final Point size = LauncherAppState.getInstance() - .getInvariantDeviceProfile().defaultWallpaperSize; + final Point size = LauncherAppState.getIDP(getContext()).defaultWallpaperSize; if (size.x != mWallpaperManager.getDesiredMinimumWidth() || size.y != mWallpaperManager.getDesiredMinimumHeight()) { mWallpaperManager.suggestDesiredDimensions(size.x, size.y); diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 953d93df9c..b87582f552 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -42,7 +42,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { PackageInstallerCompatVL(Context context) { mInstaller = context.getPackageManager().getPackageInstaller(); - mCache = LauncherAppState.getInstance().getIconCache(); + mCache = LauncherAppState.getInstance(context).getIconCache(); mWorker = new Handler(LauncherModel.getWorkerLooper()); mInstaller.registerSessionCallback(mCallback, mWorker); diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 4c12032811..4a2a7350b4 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -96,9 +96,7 @@ public class FolderPagedView extends PagedView { public FolderPagedView(Context context, AttributeSet attrs) { super(context, attrs); - LauncherAppState app = LauncherAppState.getInstance(); - - InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); + InvariantDeviceProfile profile = LauncherAppState.getIDP(context); mMaxCountX = profile.numFolderColumns; mMaxCountY = profile.numFolderRows; diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index 14109172b2..70b3dd6c93 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -16,6 +16,7 @@ package com.android.launcher3.graphics; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -53,9 +54,9 @@ public class IconNormalizer { private final float[] mLeftBorder; private final float[] mRightBorder; - private IconNormalizer() { + private IconNormalizer(Context context) { // Use twice the icon size as maximum size to avoid scaling down twice. - mMaxSize = LauncherAppState.getInstance().getInvariantDeviceProfile().iconBitmapSize * 2; + mMaxSize = LauncherAppState.getIDP(context).iconBitmapSize * 2; mBitmap = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ALPHA_8); mCanvas = new Canvas(mBitmap); mPixels = new byte[mMaxSize * mMaxSize]; @@ -239,10 +240,10 @@ public class IconNormalizer { } } - public static IconNormalizer getInstance() { + public static IconNormalizer getInstance(Context context) { synchronized (LOCK) { if (sIconNormalizer == null) { - sIconNormalizer = new IconNormalizer(); + sIconNormalizer = new IconNormalizer(context); } } return sIconNormalizer; diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 0619187bdf..01bae0e66b 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -60,9 +60,8 @@ public class LauncherIcons { Resources resources = packageManager.getResourcesForApplication(iconRes.packageName); if (resources != null) { final int id = resources.getIdentifier(iconRes.resourceName, null, null); - return createIconBitmap( - resources.getDrawableForDensity(id, LauncherAppState.getInstance() - .getInvariantDeviceProfile().fillResIconDpi), context); + return createIconBitmap(resources.getDrawableForDensity( + id, LauncherAppState.getIDP(context).fillResIconDpi), context); } } catch (Exception e) { // Icon not found. @@ -70,15 +69,11 @@ public class LauncherIcons { return null; } - private static int getIconBitmapSize() { - return LauncherAppState.getInstance().getInvariantDeviceProfile().iconBitmapSize; - } - /** * Returns a bitmap which is of the appropriate size to be displayed as an icon */ public static Bitmap createIconBitmap(Bitmap icon, Context context) { - final int iconBitmapSize = getIconBitmapSize(); + final int iconBitmapSize = LauncherAppState.getIDP(context).iconBitmapSize; if (iconBitmapSize == icon.getWidth() && iconBitmapSize == icon.getHeight()) { return icon; } @@ -92,7 +87,7 @@ public class LauncherIcons { public static Bitmap createBadgedIconBitmap( Drawable icon, UserHandle user, Context context) { float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance().getScale(icon, null); + 1 : IconNormalizer.getInstance(context).getScale(icon, null); Bitmap bitmap = createIconBitmap(icon, context, scale); return badgeIconForUser(bitmap, user, context); } @@ -122,7 +117,7 @@ public class LauncherIcons { public static Bitmap createScaledBitmapWithoutShadow(Drawable icon, Context context) { RectF iconBounds = new RectF(); float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance().getScale(icon, iconBounds); + 1 : IconNormalizer.getInstance(context).getScale(icon, iconBounds); scale = Math.min(scale, ShadowGenerator.getScaleForBounds(iconBounds)); return createIconBitmap(icon, context, scale); } @@ -131,8 +126,8 @@ public class LauncherIcons { * Adds a shadow to the provided icon. It assumes that the icon has already been scaled using * {@link #createScaledBitmapWithoutShadow(Drawable, Context)} */ - public static Bitmap addShadowToIcon(Bitmap icon) { - return ShadowGenerator.getInstance().recreateIcon(icon); + public static Bitmap addShadowToIcon(Bitmap icon, Context context) { + return ShadowGenerator.getInstance(context).recreateIcon(icon); } /** @@ -163,7 +158,7 @@ public class LauncherIcons { */ public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { synchronized (sCanvas) { - final int iconBitmapSize = getIconBitmapSize(); + final int iconBitmapSize = LauncherAppState.getIDP(context).iconBitmapSize; int width = iconBitmapSize; int height = iconBitmapSize; diff --git a/src/com/android/launcher3/graphics/ShadowGenerator.java b/src/com/android/launcher3/graphics/ShadowGenerator.java index 2b24ec932f..8aea5a0399 100644 --- a/src/com/android/launcher3/graphics/ShadowGenerator.java +++ b/src/com/android/launcher3/graphics/ShadowGenerator.java @@ -16,6 +16,7 @@ package com.android.launcher3.graphics; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BlurMaskFilter; @@ -52,8 +53,8 @@ public class ShadowGenerator { private final Paint mBlurPaint; private final Paint mDrawPaint; - private ShadowGenerator() { - mIconSize = LauncherAppState.getInstance().getInvariantDeviceProfile().iconBitmapSize; + private ShadowGenerator(Context context) { + mIconSize = LauncherAppState.getIDP(context).iconBitmapSize; mCanvas = new Canvas(); mBlurPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); mBlurPaint.setMaskFilter(new BlurMaskFilter(mIconSize * BLUR_FACTOR, Blur.NORMAL)); @@ -82,11 +83,11 @@ public class ShadowGenerator { return result; } - public static ShadowGenerator getInstance() { + public static ShadowGenerator getInstance(Context context) { Preconditions.assertNonUiThread(); synchronized (LOCK) { if (sShadowGenerator == null) { - sShadowGenerator = new ShadowGenerator(); + sShadowGenerator = new ShadowGenerator(context); } } return sShadowGenerator; diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 6dc5a365d7..2ac33eaefa 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -99,11 +99,11 @@ public class BgDataModel { deepShortcutMap.clear(); } - public synchronized void removeItem(ItemInfo... items) { - removeItem(Arrays.asList(items)); + public synchronized void removeItem(Context context, ItemInfo... items) { + removeItem(context, Arrays.asList(items)); } - public synchronized void removeItem(Iterable items) { + public synchronized void removeItem(Context context, Iterable items) { for (ItemInfo item : items) { switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: @@ -125,7 +125,6 @@ public class BgDataModel { // Decrement pinned shortcut count ShortcutKey pinnedShortcut = ShortcutKey.fromItemInfo(item); MutableInt count = pinnedShortcutCounts.get(pinnedShortcut); - Context context = LauncherAppState.getInstance().getContext(); if ((count == null || --count.value == 0) && !InstallShortcutReceiver.getPendingShortcuts(context) .contains(pinnedShortcut)) { @@ -146,7 +145,7 @@ public class BgDataModel { } } - public synchronized void addItem(ItemInfo item, boolean newItem) { + public synchronized void addItem(Context context, ItemInfo item, boolean newItem) { itemsIdMap.put(item.id, item); switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: @@ -166,8 +165,7 @@ public class BgDataModel { // Since this is a new item, pin the shortcut in the system server. if (newItem && count.value == 1) { - DeepShortcutManager.getInstance(LauncherAppState.getInstance().getContext()) - .pinShortcut(pinnedShortcut); + DeepShortcutManager.getInstance(context).pinShortcut(pinnedShortcut); } // Fall through } diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java index 599dcd0d3e..bbc7ae4612 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationTask.java +++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java @@ -895,7 +895,7 @@ public class GridSizeMigrationTask { */ public static boolean migrateGridIfNeeded(Context context) { SharedPreferences prefs = Utilities.getPrefs(context); - InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(context); String gridSizeString = getPointString(idp.numColumns, idp.numRows); @@ -915,8 +915,7 @@ public class GridSizeMigrationTask { if (srcHotseatCount != idp.numHotseatIcons) { // Migrate hotseat. - dbChanged = new GridSizeMigrationTask(context, - LauncherAppState.getInstance().getInvariantDeviceProfile(), + dbChanged = new GridSizeMigrationTask(context, LauncherAppState.getIDP(context), validPackages, srcHotseatCount, idp.numHotseatIcons).migrateHotseat(); } @@ -978,9 +977,9 @@ public class GridSizeMigrationTask { * @return a map with occupied hotseat position set to non-null value. */ public static LongArrayMap removeBrokenHotseatItems(Context context) throws Exception { - GridSizeMigrationTask task = new GridSizeMigrationTask(context, - LauncherAppState.getInstance().getInvariantDeviceProfile(), - getValidPackages(context), Integer.MAX_VALUE, Integer.MAX_VALUE); + GridSizeMigrationTask task = new GridSizeMigrationTask( + context, LauncherAppState.getIDP(context), getValidPackages(context), + Integer.MAX_VALUE, Integer.MAX_VALUE); // Load all the valid entries ArrayList items = task.loadHotseatEntries(); @@ -1038,8 +1037,7 @@ public class GridSizeMigrationTask { } protected boolean runStepTask(Point sourceSize, Point nextSize) throws Exception { - return new GridSizeMigrationTask(mContext, - LauncherAppState.getInstance().getInvariantDeviceProfile(), + return new GridSizeMigrationTask(mContext, LauncherAppState.getIDP(mContext), mValidPackages, sourceSize, nextSize).migrateWorkspace(); } } diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 99a6cdf5e6..0dfb1c7ac2 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -349,7 +349,7 @@ public class LoaderCursor extends CursorWrapper { */ public void checkAndAddItem(ItemInfo info, BgDataModel dataModel) { if (checkItemPlacement(info, dataModel.workspaceScreens)) { - dataModel.addItem(info, false); + dataModel.addItem(mContext, info, false); } else { markDeleted("Item position overlap"); } diff --git a/src/com/android/launcher3/model/WidgetItem.java b/src/com/android/launcher3/model/WidgetItem.java index 452dbe2ad6..c256176d2b 100644 --- a/src/com/android/launcher3/model/WidgetItem.java +++ b/src/com/android/launcher3/model/WidgetItem.java @@ -31,16 +31,16 @@ public class WidgetItem extends ComponentKey implements Comparable { public final String label; public final int spanX, spanY; - public WidgetItem(LauncherAppWidgetProviderInfo info, PackageManager pm) { + public WidgetItem(LauncherAppWidgetProviderInfo info, PackageManager pm, + InvariantDeviceProfile idp) { super(info.provider, info.getProfile()); label = Utilities.trim(info.getLabel(pm)); widgetInfo = info; activityInfo = null; - InvariantDeviceProfile idv = LauncherAppState.getInstance().getInvariantDeviceProfile(); - spanX = Math.min(info.spanX, idv.numColumns); - spanY = Math.min(info.spanY, idv.numRows); + spanX = Math.min(info.spanX, idp.numColumns); + spanY = Math.min(info.spanY, idp.numRows); } public WidgetItem(ResolveInfo info, PackageManager pm) { diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 2565985544..2c62f896b3 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -60,12 +60,13 @@ public class WidgetsModel { final ArrayList widgetsAndShortcuts = new ArrayList<>(); try { PackageManager pm = context.getPackageManager(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(context); // Widgets for (AppWidgetProviderInfo widgetInfo : AppWidgetManagerCompat.getInstance(context).getAllProviders()) { - widgetsAndShortcuts.add(new WidgetItem( - LauncherAppWidgetProviderInfo.fromProviderInfo(context, widgetInfo), pm)); + widgetsAndShortcuts.add(new WidgetItem(LauncherAppWidgetProviderInfo + .fromProviderInfo(context, widgetInfo), pm, idp)); } // Shortcuts @@ -73,7 +74,7 @@ public class WidgetsModel { pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0)) { widgetsAndShortcuts.add(new WidgetItem(info, pm)); } - setWidgetsAndShortcuts(widgetsAndShortcuts); + setWidgetsAndShortcuts(widgetsAndShortcuts, context); } catch (Exception e) { if (!ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) { // the returned value may be incomplete and will not be refreshed until the next @@ -87,7 +88,8 @@ public class WidgetsModel { return widgetsAndShortcuts; } - private void setWidgetsAndShortcuts(ArrayList rawWidgetsShortcuts) { + private void setWidgetsAndShortcuts(ArrayList rawWidgetsShortcuts, + Context context) { if (DEBUG) { Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + rawWidgetsShortcuts.size()); } @@ -99,7 +101,7 @@ public class WidgetsModel { // clear the lists. mWidgetsList.clear(); - InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(context); UserHandle myUser = Process.myUserHandle(); // add and update. diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 808e6e3ac2..b0482f8b20 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -306,7 +306,7 @@ public class ImportDataTask { } LongArrayMap hotseatItems = GridSizeMigrationTask.removeBrokenHotseatItems(mContext); - int myHotseatCount = LauncherAppState.getInstance().getInvariantDeviceProfile().numHotseatIcons; + int myHotseatCount = LauncherAppState.getIDP(mContext).numHotseatIcons; if (!FeatureFlags.NO_ALL_APPS_ICON) { myHotseatCount--; } @@ -381,8 +381,8 @@ public class ImportDataTask { return c.getSharedPreferences(LauncherFiles.DEVICE_PREFERENCES_KEY, Context.MODE_PRIVATE); } - private static final int getMyHotseatLayoutId() { - return LauncherAppState.getInstance().getInvariantDeviceProfile().numHotseatIcons <= 5 + private static final int getMyHotseatLayoutId(Context context) { + return LauncherAppState.getIDP(context).numHotseatIcons <= 5 ? R.xml.dw_phone_hotseat : R.xml.dw_tablet_hotseat; } @@ -392,7 +392,7 @@ public class ImportDataTask { */ private static class HotseatLayoutParser extends DefaultLayoutParser { public HotseatLayoutParser(Context context, LayoutParserCallback callback) { - super(context, null, callback, context.getResources(), getMyHotseatLayoutId()); + super(context, null, callback, context.getResources(), getMyHotseatLayoutId(context)); } @Override diff --git a/src/com/android/launcher3/provider/LauncherDbUtils.java b/src/com/android/launcher3/provider/LauncherDbUtils.java index 89fd99b233..175835011e 100644 --- a/src/com/android/launcher3/provider/LauncherDbUtils.java +++ b/src/com/android/launcher3/provider/LauncherDbUtils.java @@ -76,8 +76,7 @@ public class LauncherDbUtils { } } - new LossyScreenMigrationTask( - context, LauncherAppState.getInstance().getInvariantDeviceProfile(), db) + new LossyScreenMigrationTask(context, LauncherAppState.getIDP(context), db) .migrateScreen0(); db.setTransactionSuccessful(); return true; diff --git a/src/com/android/launcher3/qsb/QsbContainerView.java b/src/com/android/launcher3/qsb/QsbContainerView.java index c83143be9e..38a3e1f58c 100644 --- a/src/com/android/launcher3/qsb/QsbContainerView.java +++ b/src/com/android/launcher3/qsb/QsbContainerView.java @@ -102,7 +102,7 @@ public class QsbContainerView extends FrameLayout { } AppWidgetManagerCompat widgetManager = AppWidgetManagerCompat.getInstance(activity); - InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile idp = LauncherAppState.getIDP(activity); Bundle opts = new Bundle(); Rect size = AppWidgetResizeFrame.getWidgetSizeRanges(activity, idp.numColumns, 1, null); diff --git a/src/com/android/launcher3/testing/ToggleWeightWatcher.java b/src/com/android/launcher3/testing/ToggleWeightWatcher.java index e08ec3aca0..f0c39202ba 100644 --- a/src/com/android/launcher3/testing/ToggleWeightWatcher.java +++ b/src/com/android/launcher3/testing/ToggleWeightWatcher.java @@ -22,7 +22,7 @@ public class ToggleWeightWatcher extends Activity { show = !show; sp.edit().putBoolean(TestingUtils.SHOW_WEIGHT_WATCHER, show).apply(); - Launcher launcher = (Launcher) LauncherAppState.getInstance().getModel().getCallback(); + Launcher launcher = (Launcher) LauncherAppState.getInstance(this).getModel().getCallback(); if (launcher != null && launcher.mWeightWatcher != null) { launcher.mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); } diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java index 76ba9d63a0..4384328912 100644 --- a/src/com/android/launcher3/util/ContentWriter.java +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -93,9 +93,9 @@ public class ContentWriter { * Commits any pending validation and returns the final values. * Must not be called on UI thread. */ - public ContentValues getValues() { + public ContentValues getValues(Context context) { Preconditions.assertNonUiThread(); - if (mIcon != null && !LauncherAppState.getInstance().getIconCache() + if (mIcon != null && !LauncherAppState.getInstance(context).getIconCache() .isDefaultIcon(mIcon, mUser)) { mValues.put(LauncherSettings.Favorites.ICON, Utilities.flattenBitmap(mIcon)); mIcon = null; @@ -105,7 +105,7 @@ public class ContentWriter { public int commit() { if (mCommitParams != null) { - return mContext.getContentResolver().update(mCommitParams.mUri, getValues(), + return mContext.getContentResolver().update(mCommitParams.mUri, getValues(mContext), mCommitParams.mWhere, mCommitParams.mSelectionArgs); } return 0; diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index c27a3b5460..76378d1547 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -72,8 +72,8 @@ public class ManagedProfileHeuristic { private ManagedProfileHeuristic(Context context, UserHandle user) { mContext = context; mUser = user; - mModel = LauncherAppState.getInstance().getModel(); - mIconCache = LauncherAppState.getInstance().getIconCache(); + mModel = LauncherAppState.getInstance(context).getModel(); + mIconCache = LauncherAppState.getInstance(context).getIconCache(); } public void processPackageRemoved(String[] packages) { diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 310c1dfb96..be4f6351fc 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -87,7 +87,7 @@ public class WidgetsContainerView extends BaseContainerView mLauncher = Launcher.getLauncher(context); mDragController = mLauncher.getDragController(); mAdapter = new WidgetsListAdapter(this, this, context); - mIconCache = (LauncherAppState.getInstance()).getIconCache(); + mIconCache = LauncherAppState.getInstance(context).getIconCache(); if (LOGD) { Log.d(TAG, "WidgetsContainerView constructor"); } @@ -303,7 +303,7 @@ public class WidgetsContainerView extends BaseContainerView private WidgetPreviewLoader getWidgetPreviewLoader() { if (mWidgetPreviewLoader == null) { - mWidgetPreviewLoader = LauncherAppState.getInstance().getWidgetCache(); + mWidgetPreviewLoader = LauncherAppState.getInstance(getContext()).getWidgetCache(); } return mWidgetPreviewLoader; } diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index f18313fdf3..2d746d762f 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -68,7 +68,7 @@ public class WidgetsListAdapter extends Adapter { View.OnLongClickListener iconLongClickListener, Context context) { mLayoutInflater = LayoutInflater.from(context); - mWidgetPreviewLoader = LauncherAppState.getInstance().getWidgetCache(); + mWidgetPreviewLoader = LauncherAppState.getInstance(context).getWidgetCache(); mIndexer = new AlphabeticIndexCompat(context); diff --git a/tests/src/com/android/launcher3/BindWidgetTest.java b/tests/src/com/android/launcher3/BindWidgetTest.java index 72533e7e15..575b42b870 100644 --- a/tests/src/com/android/launcher3/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/BindWidgetTest.java @@ -16,7 +16,6 @@ import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.ui.LauncherInstrumentationTestCase; import com.android.launcher3.util.ContentWriter; -import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.WidgetHostViewLoader; @@ -223,20 +222,9 @@ public class BindWidgetTest extends LauncherInstrumentationTestCase { item.screenId = screenId; item.onAddToDatabase(writer); writer.put(LauncherSettings.Favorites._ID, item.id); - mResolver.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues()); + mResolver.insert(LauncherSettings.Favorites.CONTENT_URI, writer.getValues(mTargetContext)); + resetLoaderState(); - // Reset loader - try { - runTestOnUiThread(new Runnable() { - @Override - public void run() { - ManagedProfileHeuristic.markExistingUsersForNoFolderCreation(mTargetContext); - LauncherAppState.getInstance().getModel().resetLoadedState(true, true); - } - }); - } catch (Throwable t) { - throw new IllegalArgumentException(t); - } // Launch the home activity startLauncher(); // Verify UI diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index b2f0cbbbc7..2071389406 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -164,7 +164,7 @@ public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { info.cellX = x; info.cellY = y; info.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; - bgDataModel.addItem(info, false); + bgDataModel.addItem(targetContext, info, false); } } return startId; diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 3a27d0dbf0..73c90dadea 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -128,7 +128,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2() { @Override public LauncherAppWidgetProviderInfo call() throws Exception { - InvariantDeviceProfile idv = - LauncherAppState.getInstance().getInvariantDeviceProfile(); + InvariantDeviceProfile idv = LauncherAppState.getIDP(mTargetContext); ComponentName searchComponent = ((SearchManager) mTargetContext .getSystemService(Context.SEARCH_SERVICE)).getGlobalSearchActivity(); From 3e9be43b6ea75c8b82b57aa58508a0c3e8e1d721 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 5 Jan 2017 15:22:41 -0800 Subject: [PATCH 182/382] No more LauncherActivityInfoCompat Bug: 32745285 Change-Id: I00f13794d5dc0a2b1fe03ec74de36018f22eb386 --- build.gradle | 2 +- src/com/android/launcher3/AllAppsList.java | 16 +++--- src/com/android/launcher3/AppInfo.java | 8 +-- src/com/android/launcher3/IconCache.java | 48 ++++++++-------- src/com/android/launcher3/IconProvider.java | 5 +- .../launcher3/InstallShortcutReceiver.java | 10 ++-- src/com/android/launcher3/LauncherModel.java | 6 +- .../launcher3/UninstallDropTarget.java | 4 +- .../compat/LauncherActivityInfoCompat.java | 35 ------------ .../compat/LauncherActivityInfoCompatVL.java | 56 ------------------- .../launcher3/compat/LauncherAppsCompat.java | 5 +- .../compat/LauncherAppsCompatVL.java | 22 ++------ .../android/launcher3/model/LoaderCursor.java | 4 +- .../launcher3/util/CachedPackageTracker.java | 14 ++--- .../util/ManagedProfileHeuristic.java | 4 +- .../model/BaseModelUpdateTaskTestCase.java | 4 +- .../launcher3/ui/AllAppsAppLaunchTest.java | 4 +- .../launcher3/ui/AllAppsIconToHomeTest.java | 4 +- .../launcher3/ui/ShortcutsLaunchTest.java | 4 +- .../launcher3/ui/ShortcutsToHomeTest.java | 4 +- 20 files changed, 77 insertions(+), 182 deletions(-) delete mode 100644 src/com/android/launcher3/compat/LauncherActivityInfoCompat.java delete mode 100644 src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java diff --git a/build.gradle b/build.gradle index 00667f17df..3a812a9d04 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ dependencies { androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - androidTestCompile 'com.android.support:support-annotations:23.2.0' + androidTestCompile "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}" } protobuf { diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 2bf014ad55..9cce9b188e 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -18,9 +18,9 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; +import android.content.pm.LauncherActivityInfo; import android.os.UserHandle; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; @@ -65,7 +65,7 @@ public class AllAppsList { * * If the app is already in the list, doesn't add it. */ - public void add(AppInfo info, LauncherActivityInfoCompat activityInfo) { + public void add(AppInfo info, LauncherActivityInfo activityInfo) { if (!mAppFilter.shouldShowApp(info.componentName)) { return; } @@ -99,10 +99,10 @@ public class AllAppsList { */ public void addPackage(Context context, String packageName, UserHandle user) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - final List matches = launcherApps.getActivityList(packageName, + final List matches = launcherApps.getActivityList(packageName, user); - for (LauncherActivityInfoCompat info : matches) { + for (LauncherActivityInfo info : matches) { add(new AppInfo(context, info, user), info); } } @@ -150,7 +150,7 @@ public class AllAppsList { */ public void updatePackage(Context context, String packageName, UserHandle user) { final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - final List matches = launcherApps.getActivityList(packageName, + final List matches = launcherApps.getActivityList(packageName, user); if (matches.size() > 0) { // Find disabled/removed activities and remove them from data and add them @@ -168,7 +168,7 @@ public class AllAppsList { // Find enabled activities and add them to the adapter // Also updates existing activities with new labels/icons - for (final LauncherActivityInfoCompat info : matches) { + for (final LauncherActivityInfo info : matches) { AppInfo applicationInfo = findApplicationInfoLocked( info.getComponentName().getPackageName(), user, info.getComponentName().getClassName()); @@ -197,9 +197,9 @@ public class AllAppsList { /** * Returns whether apps contains component. */ - private static boolean findActivity(List apps, + private static boolean findActivity(List apps, ComponentName component) { - for (LauncherActivityInfoCompat info : apps) { + for (LauncherActivityInfo info : apps) { if (info.getComponentName().equals(component)) { return true; } diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 9b23df391c..6bec997a81 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -19,10 +19,10 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherActivityInfo; import android.os.UserHandle; import android.util.Log; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageManagerHelper; @@ -58,11 +58,11 @@ public class AppInfo extends ItemInfoWithIcon { /** * Must not hold the Context. */ - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user) { + public AppInfo(Context context, LauncherActivityInfo info, UserHandle user) { this(context, info, user, UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); } - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, + public AppInfo(Context context, LauncherActivityInfo info, UserHandle user, boolean quietModeEnabled) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; @@ -110,7 +110,7 @@ public class AppInfo extends ItemInfoWithIcon { return new ComponentKey(componentName, user); } - public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info, + public static Intent makeLaunchIntent(Context context, LauncherActivityInfo info, UserHandle user) { long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); return new Intent(Intent.ACTION_MAIN) diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 0c0c53dad7..6535d65a4a 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -45,7 +46,6 @@ import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; @@ -226,7 +226,7 @@ public class IconCache { PackageInfo info = mPackageManager.getPackageInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); long userSerial = mUserManager.getSerialNumberForUser(user); - for (LauncherActivityInfoCompat app : mLauncherApps.getActivityList(packageName, user)) { + for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) { addIconToDBAndMemCache(app, info, userSerial, false /*replace existing*/); } } catch (NameNotFoundException e) { @@ -253,7 +253,7 @@ public class IconCache { mIconProvider.updateSystemStateString(); for (UserHandle user : mUserManager.getUserProfiles()) { // Query for the set of apps - final List apps = mLauncherApps.getActivityList(null, user); + final List apps = mLauncherApps.getActivityList(null, user); // Fail if we don't have any apps // TODO: Fix this. Only fail for the current user. if (apps == null || apps.isEmpty()) { @@ -272,7 +272,7 @@ public class IconCache { * the DB and are updated. * @return The set of packages for which icons have updated. */ - private void updateDBIcons(UserHandle user, List apps, + private void updateDBIcons(UserHandle user, List apps, Set ignorePackages) { long userSerial = mUserManager.getSerialNumberForUser(user); PackageManager pm = mContext.getPackageManager(); @@ -281,13 +281,13 @@ public class IconCache { pkgInfoMap.put(info.packageName, info); } - HashMap componentMap = new HashMap<>(); - for (LauncherActivityInfoCompat app : apps) { + HashMap componentMap = new HashMap<>(); + for (LauncherActivityInfo app : apps) { componentMap.put(app.getComponentName(), app); } HashSet itemsToRemove = new HashSet(); - Stack appsToUpdate = new Stack<>(); + Stack appsToUpdate = new Stack<>(); Cursor c = null; try { @@ -322,7 +322,7 @@ public class IconCache { long updateTime = c.getLong(indexLastUpdate); int version = c.getInt(indexVersion); - LauncherActivityInfoCompat app = componentMap.remove(component); + LauncherActivityInfo app = componentMap.remove(component); if (version == info.versionCode && updateTime == info.lastUpdateTime && TextUtils.equals(c.getString(systemStateIndex), mIconProvider.getIconSystemState(info.packageName))) { @@ -350,7 +350,7 @@ public class IconCache { // Insert remaining apps. if (!componentMap.isEmpty() || !appsToUpdate.isEmpty()) { - Stack appsToAdd = new Stack<>(); + Stack appsToAdd = new Stack<>(); appsToAdd.addAll(componentMap.values()); new SerializedIconUpdateTask(userSerial, pkgInfoMap, appsToAdd, appsToUpdate).scheduleNext(); @@ -363,7 +363,7 @@ public class IconCache { * the memory. This is useful then the previous bitmap was created using * old data. */ - @Thunk synchronized void addIconToDBAndMemCache(LauncherActivityInfoCompat app, + @Thunk synchronized void addIconToDBAndMemCache(LauncherActivityInfo app, PackageInfo info, long userSerial, boolean replaceExisting) { final ComponentKey key = new ComponentKey(app.getComponentName(), app.getUser()); CacheEntry entry = null; @@ -436,7 +436,7 @@ public class IconCache { */ public synchronized void updateTitleAndIcon(AppInfo application) { CacheEntry entry = cacheLocked(application.componentName, - Provider.of(null), + Provider.of(null), application.user, false, application.usingLowResIcon); if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { applyCacheEntry(entry, application); @@ -447,7 +447,7 @@ public class IconCache { * Fill in {@param info} with the icon and label for {@param activityInfo} */ public synchronized void getTitleAndIcon(ItemInfoWithIcon info, - LauncherActivityInfoCompat activityInfo, boolean useLowResIcon) { + LauncherActivityInfo activityInfo, boolean useLowResIcon) { // If we already have activity info, no need to use package icon getTitleAndIcon(info, Provider.of(activityInfo), false, useLowResIcon); } @@ -475,7 +475,7 @@ public class IconCache { */ private synchronized void getTitleAndIcon( @NonNull ItemInfoWithIcon infoInOut, - @NonNull Provider activityInfoProvider, + @NonNull Provider activityInfoProvider, boolean usePkgIcon, boolean useLowResIcon) { CacheEntry entry = cacheLocked(infoInOut.getTargetComponent(), activityInfoProvider, infoInOut.user, usePkgIcon, useLowResIcon); @@ -516,7 +516,7 @@ public class IconCache { */ protected CacheEntry cacheLocked( @NonNull ComponentName componentName, - @NonNull Provider infoProvider, + @NonNull Provider infoProvider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { Preconditions.assertWorkerThread(); ComponentKey cacheKey = new ComponentKey(componentName, user); @@ -526,7 +526,7 @@ public class IconCache { mCache.put(cacheKey, entry); // Check the DB first. - LauncherActivityInfoCompat info = null; + LauncherActivityInfo info = null; boolean providerFetchedOnce = false; if (!getEntryFromDB(cacheKey, entry, useLowResIcon) || DEBUG_IGNORE_CACHE) { @@ -704,19 +704,19 @@ public class IconCache { /** * A runnable that updates invalid icons and adds missing icons in the DB for the provided - * LauncherActivityInfoCompat list. Items are updated/added one at a time, so that the + * LauncherActivityInfo list. Items are updated/added one at a time, so that the * worker thread doesn't get blocked. */ @Thunk class SerializedIconUpdateTask implements Runnable { private final long mUserSerial; private final HashMap mPkgInfoMap; - private final Stack mAppsToAdd; - private final Stack mAppsToUpdate; + private final Stack mAppsToAdd; + private final Stack mAppsToUpdate; private final HashSet mUpdatedPackages = new HashSet(); @Thunk SerializedIconUpdateTask(long userSerial, HashMap pkgInfoMap, - Stack appsToAdd, - Stack appsToUpdate) { + Stack appsToAdd, + Stack appsToUpdate) { mUserSerial = userSerial; mPkgInfoMap = pkgInfoMap; mAppsToAdd = appsToAdd; @@ -726,7 +726,7 @@ public class IconCache { @Override public void run() { if (!mAppsToUpdate.isEmpty()) { - LauncherActivityInfoCompat app = mAppsToUpdate.pop(); + LauncherActivityInfo app = mAppsToUpdate.pop(); String pkg = app.getComponentName().getPackageName(); PackageInfo info = mPkgInfoMap.get(pkg); addIconToDBAndMemCache(app, info, mUserSerial, true /*replace existing*/); @@ -741,7 +741,7 @@ public class IconCache { // Let it run one more time. scheduleNext(); } else if (!mAppsToAdd.isEmpty()) { - LauncherActivityInfoCompat app = mAppsToAdd.pop(); + LauncherActivityInfo app = mAppsToAdd.pop(); PackageInfo info = mPkgInfoMap.get(app.getComponentName().getPackageName()); // We do not check the mPkgInfoMap when generating the mAppsToAdd. Although every // app should have package info, this is not guaranteed by the api @@ -843,7 +843,7 @@ public class IconCache { } } - private class ActivityInfoProvider extends Provider { + private class ActivityInfoProvider extends Provider { private final Intent mIntent; private final UserHandle mUser; @@ -854,7 +854,7 @@ public class IconCache { } @Override - public LauncherActivityInfoCompat get() { + public LauncherActivityInfo get() { return mLauncherApps.resolveActivity(mIntent, mUser); } } diff --git a/src/com/android/launcher3/IconProvider.java b/src/com/android/launcher3/IconProvider.java index 005bbaa02c..a5d399013e 100644 --- a/src/com/android/launcher3/IconProvider.java +++ b/src/com/android/launcher3/IconProvider.java @@ -1,9 +1,8 @@ package com.android.launcher3; +import android.content.pm.LauncherActivityInfo; import android.graphics.drawable.Drawable; -import com.android.launcher3.compat.LauncherActivityInfoCompat; - import java.util.Locale; public class IconProvider { @@ -26,7 +25,7 @@ public class IconProvider { } - public Drawable getIcon(LauncherActivityInfoCompat info, int iconDpi) { + public Drawable getIcon(LauncherActivityInfo info, int iconDpi) { return info.getIcon(iconDpi); } } diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 09b33297e8..ad10523ef5 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; +import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -34,7 +35,6 @@ import android.text.TextUtils; import android.util.Base64; import android.util.Log; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.LauncherIcons; @@ -285,7 +285,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static class PendingInstallShortcutInfo { - final LauncherActivityInfoCompat activityInfo; + final LauncherActivityInfo activityInfo; final ShortcutInfoCompat shortcutInfo; final AppWidgetProviderInfo providerInfo; @@ -315,7 +315,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { /** * Initializes a PendingInstallShortcutInfo to represent a launcher target. */ - public PendingInstallShortcutInfo(LauncherActivityInfoCompat info, Context context) { + public PendingInstallShortcutInfo(LauncherActivityInfo info, Context context) { activityInfo = info; shortcutInfo = null; providerInfo = null; @@ -489,7 +489,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { try { Decoder decoder = new Decoder(encoded, context); if (decoder.optBoolean(APP_SHORTCUT_TYPE_KEY)) { - LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(context) + LauncherActivityInfo info = LauncherAppsCompat.getInstance(context) .resolveActivity(decoder.launcherIntent, decoder.user); return info == null ? null : new PendingInstallShortcutInfo(info, context); } else if (decoder.optBoolean(DEEPSHORTCUT_TYPE_KEY)) { @@ -571,7 +571,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return original; } - LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(original.mContext) + LauncherActivityInfo info = LauncherAppsCompat.getInstance(original.mContext) .resolveActivity(original.launchIntent, original.user); if (info == null) { return original; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index af22ab7494..0907c8cad8 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -25,6 +25,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Handler; @@ -40,7 +41,6 @@ import android.util.LongSparseArray; import android.util.MutableInt; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; @@ -2015,7 +2015,7 @@ public class LauncherModel extends BroadcastReceiver for (UserHandle user : profiles) { // Query for the set of apps final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; - final List apps = mLauncherApps.getActivityList(null, user); + final List apps = mLauncherApps.getActivityList(null, user); if (DEBUG_LOADERS) { Log.d(TAG, "getActivityList took " + (SystemClock.uptimeMillis()-qiaTime) + "ms for user " + user); @@ -2029,7 +2029,7 @@ public class LauncherModel extends BroadcastReceiver boolean quietMode = mUserManager.isQuietModeEnabled(user); // Create the ApplicationInfos for (int i = 0; i < apps.size(); i++) { - LauncherActivityInfoCompat app = apps.get(i); + LauncherActivityInfo app = apps.get(i); // This builds the icon bitmaps. mBgAllAppsList.add(new AppInfo(mContext, app, user, quietMode), app); } diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java index 73a9f6417f..e68a5b0302 100644 --- a/src/com/android/launcher3/UninstallDropTarget.java +++ b/src/com/android/launcher3/UninstallDropTarget.java @@ -4,6 +4,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.LauncherActivityInfo; import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; @@ -11,7 +12,6 @@ import android.os.UserManager; import android.util.AttributeSet; import android.widget.Toast; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; public class UninstallDropTarget extends ButtonDropTarget { @@ -69,7 +69,7 @@ public class UninstallDropTarget extends ButtonDropTarget { } } if (intent != null) { - LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(context) + LauncherActivityInfo info = LauncherAppsCompat.getInstance(context) .resolveActivity(intent, user); if (info != null && (info.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) { diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java deleted file mode 100644 index 830b60acc4..0000000000 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.content.ComponentName; -import android.content.pm.ApplicationInfo; -import android.graphics.drawable.Drawable; -import android.os.UserHandle; - -public abstract class LauncherActivityInfoCompat { - - LauncherActivityInfoCompat() { - } - - public abstract ComponentName getComponentName(); - public abstract UserHandle getUser(); - public abstract CharSequence getLabel(); - public abstract Drawable getIcon(int density); - public abstract ApplicationInfo getApplicationInfo(); - public abstract long getFirstInstallTime(); -} diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java deleted file mode 100644 index c3b9592735..0000000000 --- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2014 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.launcher3.compat; - -import android.content.ComponentName; -import android.content.pm.ApplicationInfo; -import android.content.pm.LauncherActivityInfo; -import android.graphics.drawable.Drawable; -import android.os.UserHandle; - -public class LauncherActivityInfoCompatVL extends LauncherActivityInfoCompat { - private LauncherActivityInfo mLauncherActivityInfo; - - LauncherActivityInfoCompatVL(LauncherActivityInfo launcherActivityInfo) { - super(); - mLauncherActivityInfo = launcherActivityInfo; - } - - public ComponentName getComponentName() { - return mLauncherActivityInfo.getComponentName(); - } - - public UserHandle getUser() { - return mLauncherActivityInfo.getUser(); - } - - public CharSequence getLabel() { - return mLauncherActivityInfo.getLabel(); - } - - public Drawable getIcon(int density) { - return mLauncherActivityInfo.getIcon(density); - } - - public ApplicationInfo getApplicationInfo() { - return mLauncherActivityInfo.getApplicationInfo(); - } - - public long getFirstInstallTime() { - return mLauncherActivityInfo.getFirstInstallTime(); - } -} diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 73ab36c8a3..5c6eef8c6e 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -19,6 +19,7 @@ package com.android.launcher3.compat; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherActivityInfo; import android.graphics.Rect; import android.os.Bundle; import android.os.UserHandle; @@ -56,9 +57,9 @@ public abstract class LauncherAppsCompat { } } - public abstract List getActivityList(String packageName, + public abstract List getActivityList(String packageName, UserHandle user); - public abstract LauncherActivityInfoCompat resolveActivity(Intent intent, + public abstract LauncherActivityInfo resolveActivity(Intent intent, UserHandle user); public abstract void startActivityForProfile(ComponentName component, UserHandle user, Rect sourceBounds, Bundle opts); diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index 60f9fabf02..e2739c10e2 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -29,7 +29,6 @@ import android.os.UserHandle; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,26 +44,13 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat { } @Override - public List getActivityList(String packageName, UserHandle user) { - List list = mLauncherApps.getActivityList(packageName, user); - if (list.size() == 0) { - return Collections.emptyList(); - } - ArrayList compatList = new ArrayList<>(list.size()); - for (LauncherActivityInfo info : list) { - compatList.add(new LauncherActivityInfoCompatVL(info)); - } - return compatList; + public List getActivityList(String packageName, UserHandle user) { + return mLauncherApps.getActivityList(packageName, user); } @Override - public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandle user) { - LauncherActivityInfo activity = mLauncherApps.resolveActivity(intent, user); - if (activity != null) { - return new LauncherActivityInfoCompatVL(activity); - } else { - return null; - } + public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) { + return mLauncherApps.resolveActivity(intent, user); } @Override diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 0dfb1c7ac2..43e1bd6111 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -21,6 +21,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.Intent.ShortcutIconResource; +import android.content.pm.LauncherActivityInfo; import android.database.Cursor; import android.database.CursorWrapper; import android.graphics.Bitmap; @@ -39,7 +40,6 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; @@ -234,7 +234,7 @@ public class LoaderCursor extends CursorWrapper { Intent newIntent = new Intent(Intent.ACTION_MAIN, null); newIntent.addCategory(Intent.CATEGORY_LAUNCHER); newIntent.setComponent(componentName); - LauncherActivityInfoCompat lai = LauncherAppsCompat.getInstance(mContext) + LauncherActivityInfo lai = LauncherAppsCompat.getInstance(mContext) .resolveActivity(newIntent, user); if ((lai == null) && !allowMissingTarget) { Log.d(TAG, "Missing activity found in getShortcutInfo: " + componentName); diff --git a/src/com/android/launcher3/util/CachedPackageTracker.java b/src/com/android/launcher3/util/CachedPackageTracker.java index ab5f44ff24..314b4c0edb 100644 --- a/src/com/android/launcher3/util/CachedPackageTracker.java +++ b/src/com/android/launcher3/util/CachedPackageTracker.java @@ -18,10 +18,10 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.LauncherActivityInfo; import android.os.UserHandle; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.LauncherAppsCompat.OnAppsChangedCallbackCompat; import com.android.launcher3.compat.UserManagerCompat; @@ -55,7 +55,7 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa * Checks the list of user apps, and generates package event accordingly. * {@see #onLauncherAppsAdded}, {@see #onLauncherPackageRemoved} */ - public void processUserApps(List apps, UserHandle user) { + public void processUserApps(List apps, UserHandle user) { String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); HashSet oldPackageSet = new HashSet<>(); final boolean userAppsExisted = getUserApps(oldPackageSet, prefKey); @@ -64,7 +64,7 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa HashSet newPackageSet = new HashSet<>(); ArrayList packagesAdded = new ArrayList<>(); - for (LauncherActivityInfoCompat info : apps) { + for (LauncherActivityInfo info : apps) { String packageName = info.getComponentName().getPackageName(); newPackageSet.add(packageName); packagesRemoved.remove(packageName); @@ -123,10 +123,10 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa HashSet packageSet = new HashSet<>(); final boolean userAppsExisted = getUserApps(packageSet, prefKey); if (!packageSet.contains(packageName)) { - List activities = + List activities = mLauncherApps.getActivityList(packageName, user); if (!activities.isEmpty()) { - LauncherActivityInfoCompat activityInfo = activities.get(0); + LauncherActivityInfo activityInfo = activities.get(0); packageSet.add(packageName); mPrefs.edit().putStringSet(prefKey, packageSet).apply(); @@ -172,10 +172,10 @@ public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompa public static class LauncherActivityInstallInfo implements Comparable { - public final LauncherActivityInfoCompat info; + public final LauncherActivityInfo info; public final long installTime; - public LauncherActivityInstallInfo(LauncherActivityInfoCompat info, long installTime) { + public LauncherActivityInstallInfo(LauncherActivityInfo info, long installTime) { this.info = info; this.installTime = installTime; } diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index 76378d1547..af61554d09 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -18,6 +18,7 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.LauncherActivityInfo; import android.os.Process; import android.os.UserHandle; @@ -31,7 +32,6 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -92,7 +92,7 @@ public class ManagedProfileHeuristic { } } - public void processUserApps(List apps) { + public void processUserApps(List apps) { Preconditions.assertWorkerThread(); new ManagedProfilePackageHandler().processUserApps(apps, mUser); } diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 73c90dadea..9b7fc6ebf1 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -3,6 +3,7 @@ package com.android.launcher3.model; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherActivityInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; @@ -23,7 +24,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.BaseModelUpdateTask; import com.android.launcher3.LauncherModel.Callbacks; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.Provider; @@ -189,7 +189,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 infoProvider, + @NonNull Provider infoProvider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { CacheEntry entry = mCache.get(new ComponentKey(componentName, user)); if (entry == null) { diff --git a/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java b/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java index 4a80735bd7..0ced7cf33a 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java @@ -1,12 +1,12 @@ package com.android.launcher3.ui; +import android.content.pm.LauncherActivityInfo; import android.os.Process; import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; import android.test.suitebuilder.annotation.LargeTest; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; @@ -17,7 +17,7 @@ import com.android.launcher3.util.Wait; @LargeTest public class AllAppsAppLaunchTest extends LauncherInstrumentationTestCase { - private LauncherActivityInfoCompat mSettingsApp; + private LauncherActivityInfo mSettingsApp; @Override protected void setUp() throws Exception { diff --git a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java index 8837b00862..3f77bfdcd8 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java @@ -1,12 +1,12 @@ package com.android.launcher3.ui; +import android.content.pm.LauncherActivityInfo; import android.os.Process; import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; import android.test.suitebuilder.annotation.LargeTest; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; @@ -17,7 +17,7 @@ import com.android.launcher3.util.Wait; @LargeTest public class AllAppsIconToHomeTest extends LauncherInstrumentationTestCase { - private LauncherActivityInfoCompat mSettingsApp; + private LauncherActivityInfo mSettingsApp; @Override protected void setUp() throws Exception { diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index 02d938cb23..c6828f0649 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -1,5 +1,6 @@ package com.android.launcher3.ui; +import android.content.pm.LauncherActivityInfo; import android.graphics.Point; import android.os.Process; import android.support.test.uiautomator.By; @@ -9,7 +10,6 @@ import android.test.suitebuilder.annotation.LargeTest; import android.view.MotionEvent; import com.android.launcher3.R; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; @@ -20,7 +20,7 @@ import com.android.launcher3.util.Wait; @LargeTest public class ShortcutsLaunchTest extends LauncherInstrumentationTestCase { - private LauncherActivityInfoCompat mSettingsApp; + private LauncherActivityInfo mSettingsApp; @Override protected void setUp() throws Exception { diff --git a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java index afe4832fde..d573eeaecf 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java @@ -1,5 +1,6 @@ package com.android.launcher3.ui; +import android.content.pm.LauncherActivityInfo; import android.graphics.Point; import android.os.Process; import android.support.test.uiautomator.By; @@ -9,7 +10,6 @@ import android.test.suitebuilder.annotation.LargeTest; import android.view.MotionEvent; import com.android.launcher3.R; -import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; @@ -20,7 +20,7 @@ import com.android.launcher3.util.Wait; @LargeTest public class ShortcutsToHomeTest extends LauncherInstrumentationTestCase { - private LauncherActivityInfoCompat mSettingsApp; + private LauncherActivityInfo mSettingsApp; @Override protected void setUp() throws Exception { From 2eb9cc48a6a0d3a1dd6c6c5f098d903de2845cab Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Jan 2017 15:29:18 -0800 Subject: [PATCH 183/382] Fixing AppWidgetsRestoredReceiver updating model on UI thread Bug: 34203314 Change-Id: If2c149f353109350e45e581a654956bec78bce96 --- .../launcher3/AppWidgetsRestoredReceiver.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index c6f1c48b90..7bc36921e2 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -8,6 +8,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; +import android.os.Handler; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; @@ -18,12 +19,19 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { private static final String TAG = "AWRestoredReceiver"; @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(final Context context, Intent intent) { if (AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED.equals(intent.getAction())) { - int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS); - int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); + final int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS); + final int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); if (oldIds.length == newIds.length) { - restoreAppWidgetIds(context, oldIds, newIds); + final PendingResult asyncResult = goAsync(); + new Handler(LauncherModel.getWorkerLooper()) + .postAtFrontOfQueue(new Runnable() { + @Override + public void run() { + restoreAppWidgetIds(context, asyncResult, oldIds, newIds); + } + }); } else { Log.e(TAG, "Invalid host restored received"); } @@ -33,7 +41,8 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { /** * Updates the app widgets whose id has changed during the restore process. */ - static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) { + static void restoreAppWidgetIds(Context context, PendingResult asyncResult, + int[] oldWidgetIds, int[] newWidgetIds) { final ContentResolver cr = context.getContentResolver(); final AppWidgetManager widgets = AppWidgetManager.getInstance(context); AppWidgetHost appWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID); @@ -76,5 +85,6 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { if (app != null) { app.reloadWorkspace(); } + asyncResult.finish(); } } From f745b925b4ab9ce037a31fc41277c638df4964db Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 11 Jan 2017 14:20:20 -0800 Subject: [PATCH 184/382] Loading proper app icon if the associated activity is null Bug: 34123342 Change-Id: Ibb80c6e442beea34c612fb4ce5246260714820e2 --- src/com/android/launcher3/ShortcutInfo.java | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 8c83dff2b2..ccdbfbae96 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -17,6 +17,7 @@ package com.android.launcher3; import android.annotation.TargetApi; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -29,6 +30,7 @@ import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ContentWriter; @@ -250,15 +252,25 @@ public class ShortcutInfo extends ItemInfoWithIcon { protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, IconCache cache, Context context) { unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); - // Get the app info for the source activity. - AppInfo appInfo = new AppInfo(); - appInfo.user = user; - appInfo.componentName = shortcutInfo.getActivity(); - appInfo.intent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_LAUNCHER) - .setComponent(shortcutInfo.getActivity()); - cache.getTitleAndIcon(appInfo, false); - return LauncherIcons.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); + + final Bitmap badgeBitmap; + ComponentName cn = shortcutInfo.getActivity(); + if (cn != null) { + // Get the app info for the source activity. + AppInfo appInfo = new AppInfo(); + appInfo.user = user; + appInfo.componentName = cn; + appInfo.intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(cn); + cache.getTitleAndIcon(appInfo, false); + badgeBitmap = appInfo.iconBitmap; + } else { + PackageItemInfo pkgInfo = new PackageItemInfo(shortcutInfo.getPackage()); + cache.getTitleAndIconForApp(pkgInfo, false); + badgeBitmap = pkgInfo.iconBitmap; + } + return LauncherIcons.badgeWithBitmap(unbadgedBitmap, badgeBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ From 9a5203a5391b9ad06ad4e1b806c17cbec2e968dd Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 11 Jan 2017 12:30:45 -0800 Subject: [PATCH 185/382] Use MaskableIconDrawable only in dogfood builds Bug: 32063838 Change-Id: Id0d15c4fff54b9429dbe5f9ee7ef26fd9cf8703d --- .../launcher3/graphics/LauncherIcons.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 3f191bdc35..48f376ffb8 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -36,7 +36,11 @@ import android.os.UserHandle; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.config.ProviderConfig; + +import java.lang.reflect.Method; /** * Helper methods for generating various launcher icons @@ -174,6 +178,7 @@ public class LauncherIcons { * @param scale the scale to apply before drawing {@param icon} on the canvas */ public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { + icon = castToMaskableIconDrawable(icon); synchronized (sCanvas) { final int iconBitmapSize = getIconBitmapSize(); @@ -229,6 +234,19 @@ public class LauncherIcons { } } + static Drawable castToMaskableIconDrawable(Drawable drawable) { + if (!(ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isAtLeastO())) { + return drawable; + } + try { + Class clazz = Class.forName("android.graphics.drawable.MaskableIconDrawable"); + Method method = clazz.getDeclaredMethod("wrap", Drawable.class); + return (Drawable) method.invoke(null, drawable); + } catch (Exception e) { + return drawable; + } + } + /** * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. * This allows the badging to be done based on the action bitmap size rather than From e6e7200791c28472c9335a187a85dbeda1a77d24 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 12 Jan 2017 16:55:36 -0800 Subject: [PATCH 186/382] Removing promiseIntent property from ShortuctInfo > Instead of checking promiseIntent != null, using isPromise() for consistency > Fixing bug where clicking a pending icon does not launch anything > Fixing bug where draging an icon on Info target, permanently hides the icon Change-Id: Ic8f6b56042dba42d5ed9aedb0f5947186e1a4208 --- src/com/android/launcher3/InfoDropTarget.java | 13 ++-- src/com/android/launcher3/Launcher.java | 61 ++++++++++--------- src/com/android/launcher3/LauncherModel.java | 5 -- src/com/android/launcher3/ShortcutInfo.java | 12 +--- .../model/AddWorkspaceItemsTask.java | 6 +- .../android/launcher3/model/LoaderCursor.java | 2 +- .../launcher3/model/PackageUpdatedTask.java | 4 +- 7 files changed, 47 insertions(+), 56 deletions(-) diff --git a/src/com/android/launcher3/InfoDropTarget.java b/src/com/android/launcher3/InfoDropTarget.java index db14e2e81b..d831a3a030 100644 --- a/src/com/android/launcher3/InfoDropTarget.java +++ b/src/com/android/launcher3/InfoDropTarget.java @@ -96,9 +96,14 @@ public class InfoDropTarget extends UninstallDropTarget { // Only show the App Info drop target if developer settings are enabled. boolean developmentSettingsEnabled = Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1; - return developmentSettingsEnabled - && (info instanceof AppInfo || info instanceof ShortcutInfo - || info instanceof PendingAddItemInfo || info instanceof LauncherAppWidgetInfo) - && info.itemType != LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; + if (!developmentSettingsEnabled) { + return false; + } + return info.itemType != LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT && + (info instanceof AppInfo || + (info instanceof ShortcutInfo && !((ShortcutInfo) info).isPromise()) || + (info instanceof LauncherAppWidgetInfo && + ((LauncherAppWidgetInfo) info).restoreStatus == 0) || + info instanceof PendingAddItemInfo); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8322f66cd5..fc112f3802 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2331,20 +2331,9 @@ public class Launcher extends Activity startRestoredWidgetReconfigActivity(appWidgetInfo, info); } } - } else if (info.installProgress < 0) { - // The install has not been queued - final String packageName = info.providerName.getPackageName(); - showBrokenAppInstallDialog(packageName, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - startActivitySafely( - v, PackageManagerHelper.getMarketIntent(packageName), info); - } - }); } else { - // Download has started. final String packageName = info.providerName.getPackageName(); - startActivitySafely(v, PackageManagerHelper.getMarketIntent(packageName), info); + onClickPendingAppItem(v, packageName, info.installProgress >= 0); } } @@ -2381,12 +2370,22 @@ public class Launcher extends Activity } } - private void showBrokenAppInstallDialog(final String packageName, - DialogInterface.OnClickListener onSearchClickListener) { + private void onClickPendingAppItem(final View v, final String packageName, + boolean downloadStarted) { + if (downloadStarted) { + // If the download has started, simply direct to the market app. + startMarketIntentForPackage(v, packageName); + return; + } new AlertDialog.Builder(this) .setTitle(R.string.abandoned_promises_title) .setMessage(R.string.abandoned_promise_explanation) - .setPositiveButton(R.string.abandoned_search, onSearchClickListener) + .setPositiveButton(R.string.abandoned_search, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + startMarketIntentForPackage(v, packageName); + } + }) .setNeutralButton(R.string.abandoned_clean_this, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -2395,7 +2394,16 @@ public class Launcher extends Activity } }) .create().show(); - return; + } + + private void startMarketIntentForPackage(View v, String packageName) { + ItemInfo item = (ItemInfo) v.getTag(); + Intent intent = PackageManagerHelper.getMarketIntent(packageName); + boolean success = startActivitySafely(v, intent, item); + if (success && v instanceof BubbleTextView) { + mWaitingForResume = (BubbleTextView) v; + mWaitingForResume.setStayPressed(true); + } } /** @@ -2439,17 +2447,14 @@ public class Launcher extends Activity } // Check for abandoned promise - if ((v instanceof BubbleTextView) - && shortcut.isPromise() - && !shortcut.hasStatusFlag(ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE)) { - showBrokenAppInstallDialog( - shortcut.getTargetComponent().getPackageName(), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - startAppShortcutOrInfoActivity(v); - } - }); - return; + if ((v instanceof BubbleTextView) && shortcut.isPromise()) { + String packageName = shortcut.intent.getComponent() != null ? + shortcut.intent.getComponent().getPackageName() : shortcut.intent.getPackage(); + if (!TextUtils.isEmpty(packageName)) { + onClickPendingAppItem(v, packageName, + shortcut.hasStatusFlag(ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE)); + return; + } } // Start activities @@ -2715,7 +2720,7 @@ public class Launcher extends Activity if (Utilities.ATLEAST_MARSHMALLOW && item != null && (item.itemType == Favorites.ITEM_TYPE_SHORTCUT || item.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) - && ((ShortcutInfo) item).promisedIntent == null) { + && !((ShortcutInfo) item).isPromise()) { // Shortcuts need some special checks due to legacy reasons. startShortcutIntentSafely(intent, optsBundle, item); } else if (user == null || user.equals(Process.myUserHandle())) { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 0907c8cad8..6938611846 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1321,8 +1321,6 @@ public class LauncherModel extends BroadcastReceiver if (restored) { if (c.user.equals(Process.myUserHandle())) { info = c.getRestoredItemInfo(intent, promiseType); - intent = PackageManagerHelper.getMarketIntent( - intent.getComponent().getPackageName()); } else { // Don't restore items for other profiles. c.markDeleted("Restore from managed profile not supported"); @@ -1382,9 +1380,6 @@ public class LauncherModel extends BroadcastReceiver // TODO: Remove this extra. Instead we should be using // itemInfo#user. info.intent.putExtra(ItemInfo.EXTRA_PROFILE, c.serialNumber); - if (info.promisedIntent != null) { - info.promisedIntent.putExtra(ItemInfo.EXTRA_PROFILE, c.serialNumber); - } info.isDisabled |= disabledState; if (isSafeMode && !Utilities.isSystemApp(context, intent)) { info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 8c83dff2b2..c76217d3df 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -131,13 +131,6 @@ public class ShortcutInfo extends ItemInfoWithIcon { */ private int mInstallProgress; - /** - * If this shortcut is a placeholder, then intent will be a market intent for the package, and - * this will hold the original intent from the database. Otherwise, null. - * Refer {@link #FLAG_RESTORED_ICON}, {@link #FLAG_AUTOINTALL_ICON} - */ - public Intent promisedIntent; - public ShortcutInfo() { itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_SHORTCUT; } @@ -190,12 +183,9 @@ public class ShortcutInfo extends ItemInfoWithIcon { } } - /** - * Returns {@link #promisedIntent}, or {@link #intent} if promisedIntent is null. - */ @Override public Intent getIntent() { - return promisedIntent != null ? promisedIntent : intent; + return intent; } public boolean hasStatusFlag(int flag) { diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index a9ceb0256a..a03dd8f34b 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -163,10 +163,8 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { for (ItemInfo item : dataModel.itemsIdMap) { if (item instanceof ShortcutInfo) { ShortcutInfo info = (ShortcutInfo) item; - Intent targetIntent = info.promisedIntent == null - ? info.intent : info.promisedIntent; - if (targetIntent != null && info.user.equals(user)) { - Intent copyIntent = new Intent(targetIntent); + if (item.getIntent() != null && info.user.equals(user)) { + Intent copyIntent = new Intent(item.getIntent()); copyIntent.setSourceBounds(intent.getSourceBounds()); String s = copyIntent.toUri(0); if (intentWithPkg.equals(s) || intentWithoutPkg.equals(s)) { diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 43e1bd6111..b271e6fbd9 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -188,7 +188,7 @@ public class LoaderCursor extends CursorWrapper { public ShortcutInfo getRestoredItemInfo(Intent intent, int promiseType) { final ShortcutInfo info = new ShortcutInfo(); info.user = user; - info.promisedIntent = intent; + info.intent = intent; info.iconBitmap = loadIcon(info); // the fallback icon diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index f5de6508e1..211b9793f1 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -242,12 +242,10 @@ public class PackageUpdatedTask extends ExtendedModelTask { removedShortcuts.add(si); continue; } - si.promisedIntent = intent; + si.intent = intent; } } - si.intent = si.promisedIntent; - si.promisedIntent = null; si.status = ShortcutInfo.DEFAULT; infoUpdated = true; if (si.itemType == Favorites.ITEM_TYPE_APPLICATION) { From c1ad0ce8aebb76794fdd8b44a0bf50435f0cf39a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 11 Jan 2017 14:33:38 -0800 Subject: [PATCH 187/382] Only marking items not already restored as restore > Moving the restore property to LoaderCursor Bug: 34123089 Change-Id: I1f992ef086d65e0b3cf18d3b2cf37a4f254c97d2 --- src/com/android/launcher3/LauncherModel.java | 58 +++++++------------ .../android/launcher3/model/LoaderCursor.java | 23 ++++++-- .../launcher3/model/LoaderCursorTest.java | 3 +- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 6938611846..2fc1502196 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1105,10 +1105,6 @@ public class LauncherModel extends BroadcastReceiver final boolean isSdCardReady = Utilities.isBootCompleted(); final MultiHashMap pendingPackages = new MultiHashMap<>(); - InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); - int countX = profile.numColumns; - int countY = profile.numRows; - boolean clearDb = false; try { ImportDataTask.performImportIfPossible(context); @@ -1159,8 +1155,6 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites.SPANY); final int rankIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.RANK); - final int restoredIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.RESTORED); final int optionsIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.OPTIONS); @@ -1207,7 +1201,6 @@ public class LauncherModel extends BroadcastReceiver continue; } - boolean restored = 0 != c.getInt(restoredIndex); boolean allowMissingTarget = false; switch (c.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: { @@ -1220,7 +1213,6 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: intentDescription = c.getString(intentIndex); - int promiseType = c.getInt(restoredIndex); int disabledState = 0; targetPackage = null; @@ -1237,17 +1229,14 @@ public class LauncherModel extends BroadcastReceiver } if (validComponent) { - if (restored) { - // no special handling necessary for this item - c.markRestored(); - restored = false; - } + // no special handling necessary for this item + c.markRestored(); if (quietMode.get(c.serialNumber)) { disabledState = ShortcutInfo.FLAG_DISABLED_QUIET_USER; } } else if (validPkg) { intent = null; - if ((promiseType & ShortcutInfo.FLAG_AUTOINTALL_ICON) != 0) { + if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { // We allow auto install apps to have their intent // updated after an install. intent = manager.getLaunchIntentForPackage( @@ -1267,21 +1256,20 @@ public class LauncherModel extends BroadcastReceiver } else { // no special handling necessary for this item c.markRestored(); - restored = false; } - } else if (restored) { + } else if (c.restoreFlag != 0) { // Package is not yet available but might be // installed later. FileLog.d(TAG, "package not yet restored: " + cn); - if ((promiseType & ShortcutInfo.FLAG_RESTORE_STARTED) != 0) { + if (c.hasRestoreFlag(ShortcutInfo.FLAG_RESTORE_STARTED)) { // Restore has started once. } else if (installingPkgs.containsKey(cn.getPackageName())) { // App restore has started. Update the flag - promiseType |= ShortcutInfo.FLAG_RESTORE_STARTED; + c.restoreFlag |= ShortcutInfo.FLAG_RESTORE_STARTED; c.updater().put( LauncherSettings.Favorites.RESTORED, - promiseType).commit(); + c.restoreFlag).commit(); } else { c.markDeleted("Unrestored package removed: " + cn); continue; @@ -1308,7 +1296,6 @@ public class LauncherModel extends BroadcastReceiver } else if (cn == null) { // For shortcuts with no component, keep them as they are c.markRestored(); - restored = false; } } catch (URISyntaxException e) { c.markDeleted("Invalid uri: " + intentDescription); @@ -1318,9 +1305,9 @@ public class LauncherModel extends BroadcastReceiver boolean useLowResIcon = !c.isOnWorkspaceOrHotseat() && c.getInt(rankIndex) >= FolderIcon.NUM_ITEMS_IN_PREVIEW; - if (restored) { + if (c.restoreFlag != 0) { if (c.user.equals(Process.myUserHandle())) { - info = c.getRestoredItemInfo(intent, promiseType); + info = c.getRestoredItemInfo(intent); } else { // Don't restore items for other profiles. c.markDeleted("Restore from managed profile not supported"); @@ -1385,7 +1372,7 @@ public class LauncherModel extends BroadcastReceiver info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; } - if (restored) { + if (c.restoreFlag != 0) { ComponentName cn = info.getTargetComponent(); if (cn != null) { Integer progress = installingPkgs.get(cn.getPackageName()); @@ -1413,10 +1400,8 @@ public class LauncherModel extends BroadcastReceiver folderInfo.spanY = 1; folderInfo.options = c.getInt(optionsIndex); - if (restored) { - // no special handling required for restored folders - c.markRestored(); - } + // no special handling required for restored folders + c.markRestored(); c.checkAndAddItem(folderInfo, sBgDataModel); break; @@ -1433,11 +1418,10 @@ public class LauncherModel extends BroadcastReceiver final ComponentName component = ComponentName.unflattenFromString(savedProvider); - final int restoreStatus = c.getInt(restoredIndex); - final boolean isIdValid = (restoreStatus & - LauncherAppWidgetInfo.FLAG_ID_NOT_VALID) == 0; - final boolean wasProviderReady = (restoreStatus & - LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) == 0; + final boolean isIdValid = !c.hasRestoreFlag( + LauncherAppWidgetInfo.FLAG_ID_NOT_VALID); + final boolean wasProviderReady = !c.hasRestoreFlag( + LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY); if (widgetProvidersMap == null) { widgetProvidersMap = AppWidgetManagerCompat @@ -1462,7 +1446,7 @@ public class LauncherModel extends BroadcastReceiver // The provider is available. So the widget is either // available or not available. We do not need to track // any future restore updates. - int status = restoreStatus & + int status = c.restoreFlag & ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; if (!wasProviderReady) { // If provider was not previously ready, update the @@ -1480,13 +1464,13 @@ public class LauncherModel extends BroadcastReceiver } else { Log.v(TAG, "Widget restore pending id=" + c.id + " appWidgetId=" + appWidgetId - + " status =" + restoreStatus); + + " status =" + c.restoreFlag); appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, component); - appWidgetInfo.restoreStatus = restoreStatus; + appWidgetInfo.restoreStatus = c.restoreFlag; Integer installProgress = installingPkgs.get(component.getPackageName()); - if ((restoreStatus & LauncherAppWidgetInfo.FLAG_RESTORE_STARTED) != 0) { + if (c.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_RESTORE_STARTED)) { // Restore has started once. } else if (installProgress != null) { // App restore has started. Update the flag @@ -1524,7 +1508,7 @@ public class LauncherModel extends BroadcastReceiver String providerName = appWidgetInfo.providerName.flattenToString(); if (!providerName.equals(savedProvider) || - (appWidgetInfo.restoreStatus != restoreStatus)) { + (appWidgetInfo.restoreStatus != c.restoreFlag)) { c.updater() .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, providerName) diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index b271e6fbd9..711be37b4c 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -83,6 +83,7 @@ public class LoaderCursor extends CursorWrapper { private final int cellXIndex; private final int cellYIndex; private final int profileIdIndex; + private final int restoredIndex; // Properties loaded per iteration public long serialNumber; @@ -90,6 +91,7 @@ public class LoaderCursor extends CursorWrapper { public long id; public long container; public int itemType; + public int restoreFlag; public LoaderCursor(Cursor c, LauncherAppState app) { super(c); @@ -111,6 +113,7 @@ public class LoaderCursor extends CursorWrapper { cellXIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX); cellYIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY); profileIdIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.PROFILE_ID); + restoredIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.RESTORED); } @Override @@ -123,6 +126,7 @@ public class LoaderCursor extends CursorWrapper { id = getLong(idIndex); serialNumber = getInt(profileIdIndex); user = allUsers.get(serialNumber); + restoreFlag = getInt(restoredIndex); } return result; } @@ -185,7 +189,7 @@ public class LoaderCursor extends CursorWrapper { * Make an ShortcutInfo object for a restored application or shortcut item that points * to a package that is not yet installed on the system. */ - public ShortcutInfo getRestoredItemInfo(Intent intent, int promiseType) { + public ShortcutInfo getRestoredItemInfo(Intent intent) { final ShortcutInfo info = new ShortcutInfo(); info.user = user; info.intent = intent; @@ -196,22 +200,22 @@ public class LoaderCursor extends CursorWrapper { mIconCache.getTitleAndIcon(info, false /* useLowResIcon */); } - if ((promiseType & ShortcutInfo.FLAG_RESTORED_ICON) != 0) { + if (hasRestoreFlag(ShortcutInfo.FLAG_RESTORED_ICON)) { String title = getTitle(); if (!TextUtils.isEmpty(title)) { info.title = Utilities.trim(title); } - } else if ((promiseType & ShortcutInfo.FLAG_AUTOINTALL_ICON) != 0) { + } else if (hasRestoreFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { if (TextUtils.isEmpty(info.title)) { info.title = getTitle(); } } else { - throw new InvalidParameterException("Invalid restoreType " + promiseType); + throw new InvalidParameterException("Invalid restoreType " + restoreFlag); } info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); info.itemType = itemType; - info.status = promiseType; + info.status = restoreFlag; return info; } @@ -305,7 +309,14 @@ public class LoaderCursor extends CursorWrapper { * Marks the current item as restored */ public void markRestored() { - restoredRows.add(id); + if (restoreFlag != 0) { + restoredRows.add(id); + restoreFlag = 0; + } + } + + public boolean hasRestoreFlag(int flagMask) { + return (restoreFlag & flagMask) != 0; } public void commitRestoredItems() { diff --git a/tests/src/com/android/launcher3/model/LoaderCursorTest.java b/tests/src/com/android/launcher3/model/LoaderCursorTest.java index d40e6c2fc5..b1c34d1070 100644 --- a/tests/src/com/android/launcher3/model/LoaderCursorTest.java +++ b/tests/src/com/android/launcher3/model/LoaderCursorTest.java @@ -37,6 +37,7 @@ import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; import static com.android.launcher3.LauncherSettings.Favorites.PROFILE_ID; +import static com.android.launcher3.LauncherSettings.Favorites.RESTORED; import static com.android.launcher3.LauncherSettings.Favorites.SCREEN; import static com.android.launcher3.LauncherSettings.Favorites.TITLE; import static com.android.launcher3.LauncherSettings.Favorites._ID; @@ -72,7 +73,7 @@ public class LoaderCursorTest { mCursor = new MatrixCursor(new String[] { ICON, ICON_PACKAGE, ICON_RESOURCE, TITLE, _ID, CONTAINER, ITEM_TYPE, PROFILE_ID, - SCREEN, CELLX, CELLY, + SCREEN, CELLX, CELLY, RESTORED }); mContext = InstrumentationRegistry.getTargetContext(); From 9a8d11f930ced4c2706db150b7bbbb21330bd68d Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Jan 2017 09:53:12 -0800 Subject: [PATCH 188/382] FastBitmapDrawable can draw an icon badge (notification count) - Added BadgeInfo to contain data to be shown in a badge (currently just notification count). - Added BadgeRenderer in DeviceProfile to contain things relevant to drawing the badge, such as size and Paint's. - Added IconPalette to compute colors for the badge based on a dominant color (will also be used for notifications) - FastBitmapDrawable uses these classes to draw the badge. Bug: 32410600 Change-Id: I6595a4879943357590f7d20c22594691a573ecaf --- res/values/dimens.xml | 4 ++ src/com/android/launcher3/BubbleTextView.java | 17 +++-- src/com/android/launcher3/DeviceProfile.java | 9 ++- .../android/launcher3/FastBitmapDrawable.java | 30 ++++++++ src/com/android/launcher3/Utilities.java | 2 +- src/com/android/launcher3/Workspace.java | 2 +- .../android/launcher3/badge/BadgeInfo.java | 33 +++++++++ .../launcher3/badge/BadgeRenderer.java | 70 +++++++++++++++++++ .../launcher3/graphics/IconPalette.java | 63 +++++++++++++++++ 9 files changed, 223 insertions(+), 7 deletions(-) create mode 100644 src/com/android/launcher3/badge/BadgeInfo.java create mode 100644 src/com/android/launcher3/badge/BadgeRenderer.java create mode 100644 src/com/android/launcher3/graphics/IconPalette.java diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 1a09fa0029..c7bc286415 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -169,6 +169,10 @@ also happens to equal 19dp--> 19dp + + 24dp + 12dp + 24dp diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index b8b43c9c30..77572c7f7e 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -39,6 +39,8 @@ import android.widget.TextView; import com.android.launcher3.IconCache.IconLoadRequest; import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; +import com.android.launcher3.badge.BadgeRenderer; +import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; @@ -164,7 +166,7 @@ public class BubbleTextView extends TextView applyIconAndLabel(info.iconBitmap, info); setTag(info); if (promiseStateChanged || info.isPromise()) { - applyState(promiseStateChanged); + applyPromiseState(promiseStateChanged); } } @@ -470,7 +472,7 @@ public class BubbleTextView extends TextView mLongPressHelper.cancelLongPress(); } - public void applyState(boolean promiseStateChanged) { + public void applyPromiseState(boolean promiseStateChanged) { if (getTag() instanceof ShortcutInfo) { ShortcutInfo info = (ShortcutInfo) getTag(); final boolean isPromise = info.isPromise(); @@ -479,8 +481,8 @@ public class BubbleTextView extends TextView info.getInstallProgress() : 0)) : 100; setContentDescription(progressLevel > 0 ? - getContext().getString(R.string.app_downloading_title, info.title, - NumberFormat.getPercentInstance().format(progressLevel * 0.01)) : + getContext().getString(R.string.app_downloading_title, info.title, + NumberFormat.getPercentInstance().format(progressLevel * 0.01)) : getContext().getString(R.string.app_waiting_download_title, info.title)); if (mIcon != null) { @@ -500,6 +502,13 @@ public class BubbleTextView extends TextView } } + public void applyBadgeState(BadgeInfo badgeInfo) { + if (mIcon instanceof FastBitmapDrawable) { + BadgeRenderer badgeRenderer = mLauncher.getDeviceProfile().mBadgeRenderer; + ((FastBitmapDrawable) mIcon).applyIconBadge(badgeInfo, badgeRenderer); + } + } + private Theme getPreloaderTheme() { Object tag = getTag(); int style = ((tag != null) && (tag instanceof ShortcutInfo) && diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 27afdc03dc..34ce92336d 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -31,7 +31,7 @@ import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import com.android.launcher3.CellLayout.ContainerType; -import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.badge.BadgeRenderer; import java.util.ArrayList; @@ -136,6 +136,9 @@ public class DeviceProfile { // Listeners private ArrayList mListeners = new ArrayList<>(); + // Icon badges + public BadgeRenderer mBadgeRenderer; + public DeviceProfile(Context context, InvariantDeviceProfile inv, Point minSize, Point maxSize, int width, int height, boolean isLandscape) { @@ -193,6 +196,10 @@ public class DeviceProfile { hotseatBarBottomPaddingPx = 0; hotseatLandGutterPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_gutter_width); + int badgeSize = res.getDimensionPixelSize(R.dimen.badge_size); + int badgeTextSize = res.getDimensionPixelSize(R.dimen.badge_text_size); + mBadgeRenderer = new BadgeRenderer(badgeSize, badgeTextSize); + // Determine sizes. widthPx = width; heightPx = height; diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 0cefc57392..b3e59f99bf 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -33,6 +33,10 @@ import android.graphics.drawable.Drawable; import android.util.SparseArray; import android.view.animation.DecelerateInterpolator; +import com.android.launcher3.graphics.IconPalette; +import com.android.launcher3.badge.BadgeRenderer; +import com.android.launcher3.badge.BadgeInfo; + public class FastBitmapDrawable extends Drawable { private static final float DISABLED_DESATURATION = 1f; private static final float DISABLED_BRIGHTNESS = 0.5f; @@ -99,6 +103,10 @@ public class FastBitmapDrawable extends Drawable { private State mState = State.NORMAL; private boolean mIsDisabled; + private BadgeInfo mBadgeInfo; + private BadgeRenderer mBadgeRenderer; + private IconPalette mIconPalette; + // The saturation and brightness are values that are mapped to REDUCED_FILTER_VALUE_SPACE and // as a result, can be used to compose the key for the cached ColorMatrixColorFilters private int mDesaturation = 0; @@ -114,9 +122,21 @@ public class FastBitmapDrawable extends Drawable { setBounds(0, 0, b.getWidth(), b.getHeight()); } + public void applyIconBadge(BadgeInfo badgeInfo, BadgeRenderer badgeRenderer) { + mBadgeInfo = badgeInfo; + mBadgeRenderer = badgeRenderer; + if (mIconPalette == null) { + mIconPalette = IconPalette.fromDominantColor(Utilities + .findDominantColorByHue(mBitmap, 20)); + } + invalidateSelf(); + } + @Override public void draw(Canvas canvas) { drawInternal(canvas); + // Draw the icon badge in the top right corner. + drawBadgeIfNecessary(canvas); } public void drawWithBrightness(Canvas canvas, float brightness) { @@ -130,6 +150,16 @@ public class FastBitmapDrawable extends Drawable { canvas.drawBitmap(mBitmap, null, getBounds(), mPaint); } + protected void drawBadgeIfNecessary(Canvas canvas) { + if (hasBadge()) { + mBadgeRenderer.draw(canvas, mIconPalette, mBadgeInfo, getBounds()); + } + } + + private boolean hasBadge() { + return mBadgeInfo != null && mBadgeInfo.getNotificationCount() != null; + } + @Override public void setColorFilter(ColorFilter cf) { // No op diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 89ffd315da..8ad0144c31 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -306,7 +306,7 @@ public final class Utilities { * @param bitmap The bitmap to scan * @param samples The approximate max number of samples to use. */ - static int findDominantColorByHue(Bitmap bitmap, int samples) { + public static int findDominantColorByHue(Bitmap bitmap, int samples) { final int height = bitmap.getHeight(); final int width = bitmap.getWidth(); int sampleStride = (int) Math.sqrt((height * width) / samples); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index cf6b025059..1ba6520be5 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3972,7 +3972,7 @@ public class Workspace extends PagedView public boolean evaluate(ItemInfo info, View v) { if (info instanceof ShortcutInfo && v instanceof BubbleTextView && updates.contains(info)) { - ((BubbleTextView) v).applyState(false); + ((BubbleTextView) v).applyPromiseState(false /* promiseStateChanged */); } else if (v instanceof PendingAppWidgetHostView && info instanceof LauncherAppWidgetInfo && updates.contains(info)) { diff --git a/src/com/android/launcher3/badge/BadgeInfo.java b/src/com/android/launcher3/badge/BadgeInfo.java new file mode 100644 index 0000000000..0a9f87c6e5 --- /dev/null +++ b/src/com/android/launcher3/badge/BadgeInfo.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2017 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.launcher3.badge; + +/** + * Contains data to be used in an icon badge. + */ +public class BadgeInfo { + + private int mNotificationCount; + + public void setNotificationCount(int count) { + mNotificationCount = count; + } + + public String getNotificationCount() { + return mNotificationCount == 0 ? null : String.valueOf(mNotificationCount); + } +} diff --git a/src/com/android/launcher3/badge/BadgeRenderer.java b/src/com/android/launcher3/badge/BadgeRenderer.java new file mode 100644 index 0000000000..238b9188fb --- /dev/null +++ b/src/com/android/launcher3/badge/BadgeRenderer.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2017 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.launcher3.badge; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; + +import com.android.launcher3.graphics.IconPalette; + +/** + * Contains parameters necessary to draw a badge for an icon (e.g. the size of the badge). + * @see BadgeInfo for the data to draw + */ +public class BadgeRenderer { + + public int size; + public int textSize; + + private final RectF mBackgroundRect = new RectF(); + private final Paint mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final int mTextHeight; + + public BadgeRenderer(int size, int textSize) { + this.size = size; + this.textSize = textSize; + mTextPaint.setTextAlign(Paint.Align.CENTER); + mTextPaint.setTextSize(textSize); + // Measure the text height. + Rect temp = new Rect(); + mTextPaint.getTextBounds("0", 0, 1, temp); + mTextHeight = temp.height(); + } + + /** + * Draw a circle in the top right corner of the given bounds, and draw + * {@link BadgeInfo#getNotificationCount()} on top of the circle. + * @param palette The colors (based on the icon) to use for the badge. + * @param badgeInfo Contains data to draw on the badge. + * @param iconBounds The bounds of the icon being badged. + */ + public void draw(Canvas canvas, IconPalette palette, BadgeInfo badgeInfo, Rect iconBounds) { + mBackgroundPaint.setColor(palette.backgroundColor); + mTextPaint.setColor(palette.textColor); + mBackgroundRect.set(iconBounds.right - size, iconBounds.top, iconBounds.right, + iconBounds.top + size); + canvas.drawOval(mBackgroundRect, mBackgroundPaint); + String notificationCount = badgeInfo.getNotificationCount(); + canvas.drawText(notificationCount, + mBackgroundRect.centerX(), + mBackgroundRect.centerY() + mTextHeight / 2, + mTextPaint); + } +} diff --git a/src/com/android/launcher3/graphics/IconPalette.java b/src/com/android/launcher3/graphics/IconPalette.java new file mode 100644 index 0000000000..dcc5fcb14c --- /dev/null +++ b/src/com/android/launcher3/graphics/IconPalette.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2017 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.launcher3.graphics; + +import android.graphics.Color; +import android.support.v4.graphics.ColorUtils; + +/** + * Contains colors based on the dominant color of an icon. + */ +public class IconPalette { + + public int backgroundColor; + public int textColor; + + public static IconPalette fromDominantColor(int dominantColor) { + IconPalette palette = new IconPalette(); + palette.backgroundColor = getMutedColor(dominantColor); + palette.textColor = getTextColorForBackground(palette.backgroundColor); + return palette; + } + + private static int getMutedColor(int color) { + int alpha = (int) (255 * 0.2f); + return ColorUtils.compositeColors(ColorUtils.setAlphaComponent(color, alpha), Color.WHITE); + } + + private static int getTextColorForBackground(int backgroundColor) { + return getLighterOrDarkerVersionOfColor(backgroundColor, 3f); + } + + private static int getLowContrastColor(int color) { + return getLighterOrDarkerVersionOfColor(color, 1.5f); + } + + private static int getLighterOrDarkerVersionOfColor(int color, float contrastRatio) { + int whiteMinAlpha = ColorUtils.calculateMinimumAlpha(Color.WHITE, color, contrastRatio); + int blackMinAlpha = ColorUtils.calculateMinimumAlpha(Color.BLACK, color, contrastRatio); + int translucentWhiteOrBlack; + if (whiteMinAlpha >= 0) { + translucentWhiteOrBlack = ColorUtils.setAlphaComponent(Color.WHITE, whiteMinAlpha); + } else if (blackMinAlpha >= 0) { + translucentWhiteOrBlack = ColorUtils.setAlphaComponent(Color.BLACK, blackMinAlpha); + } else { + translucentWhiteOrBlack = Color.WHITE; + } + return ColorUtils.compositeColors(translucentWhiteOrBlack, color); + } +} From 8e98cb876f1c913c256ce6d542a1f975f59f1e2e Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 17 Jan 2017 15:04:37 -0800 Subject: [PATCH 189/382] Fixes a bug where in Android O the all apps search icon appears on screen rotation. The fix is by applying a "different" transparent (transparent white instead of transparent black) for the hint color in focus state. The root problem lies in DynamicDrawableSpan and restoring state in EditText if hint color is #000000. Bug: b/34259116 Change-Id: Id3c46b2af4d5cdb18c0510504f2fe66dece7056f --- res/drawable/all_apps_search_hint.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/drawable/all_apps_search_hint.xml b/res/drawable/all_apps_search_hint.xml index b2ff7a428e..36a0f03738 100644 --- a/res/drawable/all_apps_search_hint.xml +++ b/res/drawable/all_apps_search_hint.xml @@ -15,6 +15,6 @@ limitations under the License. --> - + \ No newline at end of file From 1b0726359b5157db8d3d96c52a37f05fce065618 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Jan 2017 11:30:23 -0800 Subject: [PATCH 190/382] Moving icon generation out of ShortcutInfo constructor so that it can be created on the UI thread Change-Id: If84e52041eb4ab20807f5cfd4b7f31d7b5f381ed --- .../launcher3/InstallShortcutReceiver.java | 4 +- src/com/android/launcher3/LauncherModel.java | 14 ++++++ src/com/android/launcher3/ShortcutInfo.java | 44 ----------------- .../launcher3/graphics/LauncherIcons.java | 47 +++++++++++++++++++ .../launcher3/model/ShortcutsChangedTask.java | 3 ++ .../model/UserLockStateChangedTask.java | 2 + .../launcher3/shortcuts/DeepShortcutView.java | 23 ++++----- .../shortcuts/DeepShortcutsContainer.java | 40 ++++++---------- 8 files changed, 92 insertions(+), 85 deletions(-) diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index ad10523ef5..a35469e0cf 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -457,7 +457,9 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } return si; } else if (shortcutInfo != null) { - return new ShortcutInfo(shortcutInfo, mContext); + ShortcutInfo si = new ShortcutInfo(shortcutInfo, mContext); + si.iconBitmap = LauncherIcons.createShortcutIcon(shortcutInfo, mContext); + return si; } else if (providerInfo != null) { LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo .fromProviderInfo(mContext, providerInfo); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2fc1502196..247a295d65 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -49,6 +49,7 @@ import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; import com.android.launcher3.model.BgDataModel; @@ -1330,6 +1331,8 @@ public class LauncherModel extends BroadcastReceiver continue; } info = new ShortcutInfo(pinnedShortcut, context); + info.iconBitmap = LauncherIcons + .createShortcutIcon(pinnedShortcut, context); intent = info.intent; } else { // Create a shortcut info in disabled mode for now. @@ -2201,6 +2204,17 @@ public class LauncherModel extends BroadcastReceiver } } + public void updateAndBindShortcutInfo(final ShortcutInfo si, final ShortcutInfoCompat info) { + updateAndBindShortcutInfo(new Provider() { + @Override + public ShortcutInfo get() { + si.updateFromDeepShortcutInfo(info, mApp.getContext()); + si.iconBitmap = LauncherIcons.createShortcutIcon(info, mApp.getContext()); + return si; + } + }); + } + /** * Utility method to update a shortcut on the background thread. */ diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 976d733443..1a423957a5 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -17,21 +17,13 @@ package com.android.launcher3; import android.annotation.TargetApi; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.Process; -import android.os.UserHandle; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.graphics.LauncherIcons; -import com.android.launcher3.model.PackageItemInfo; -import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ContentWriter; @@ -225,42 +217,6 @@ public class ShortcutInfo extends ItemInfoWithIcon { isDisabled |= FLAG_DISABLED_BY_PUBLISHER; } disabledMessage = shortcutInfo.getDisabledMessage(); - - // TODO: Use cache for this - LauncherAppState launcherAppState = LauncherAppState.getInstance(context); - Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) - .getShortcutIconDrawable(shortcutInfo, - launcherAppState.getInvariantDeviceProfile().fillResIconDpi); - - IconCache cache = launcherAppState.getIconCache(); - Bitmap unbadgedBitmap = unbadgedDrawable == null - ? cache.getDefaultIcon(Process.myUserHandle()) - : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); - iconBitmap = getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context); - } - - protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, - IconCache cache, Context context) { - unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); - - final Bitmap badgeBitmap; - ComponentName cn = shortcutInfo.getActivity(); - if (cn != null) { - // Get the app info for the source activity. - AppInfo appInfo = new AppInfo(); - appInfo.user = user; - appInfo.componentName = cn; - appInfo.intent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_LAUNCHER) - .setComponent(cn); - cache.getTitleAndIcon(appInfo, false); - badgeBitmap = appInfo.iconBitmap; - } else { - PackageItemInfo pkgInfo = new PackageItemInfo(shortcutInfo.getPackage()); - cache.getTitleAndIconForApp(pkgInfo, false); - badgeBitmap = pkgInfo.iconBitmap; - } - return LauncherIcons.badgeWithBitmap(unbadgedBitmap, badgeBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 8d8f3d9141..2ae7a4af49 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -16,7 +16,9 @@ package com.android.launcher3.graphics; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -32,11 +34,16 @@ import android.graphics.drawable.PaintDrawable; import android.os.Process; import android.os.UserHandle; +import com.android.launcher3.AppInfo; +import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.model.PackageItemInfo; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; import java.lang.reflect.Method; @@ -230,6 +237,46 @@ public class LauncherIcons { } } + public static Bitmap createShortcutIcon(ShortcutInfoCompat shortcutInfo, Context context) { + return createShortcutIcon(shortcutInfo, context, true /* badged */); + } + + public static Bitmap createShortcutIcon(ShortcutInfoCompat shortcutInfo, Context context, + boolean badged) { + LauncherAppState app = LauncherAppState.getInstance(context); + Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) + .getShortcutIconDrawable(shortcutInfo, + app.getInvariantDeviceProfile().fillResIconDpi); + IconCache cache = app.getIconCache(); + Bitmap unbadgedBitmap = unbadgedDrawable == null + ? cache.getDefaultIcon(Process.myUserHandle()) + : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); + + if (!badged) { + return unbadgedBitmap; + } + unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); + + final Bitmap badgeBitmap; + ComponentName cn = shortcutInfo.getActivity(); + if (cn != null) { + // Get the app info for the source activity. + AppInfo appInfo = new AppInfo(); + appInfo.user = shortcutInfo.getUserHandle(); + appInfo.componentName = cn; + appInfo.intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(cn); + cache.getTitleAndIcon(appInfo, false); + badgeBitmap = appInfo.iconBitmap; + } else { + PackageItemInfo pkgInfo = new PackageItemInfo(shortcutInfo.getPackage()); + cache.getTitleAndIconForApp(pkgInfo, false); + badgeBitmap = pkgInfo.iconBitmap; + } + return badgeWithBitmap(unbadgedBitmap, badgeBitmap, context); + } + /** * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. * This allows the badging to be done based on the action bitmap size rather than diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 67bec64379..ba7112fd9f 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -24,6 +24,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.MultiHashMap; @@ -87,6 +88,8 @@ public class ShortcutsChangedTask extends ExtendedModelTask { } for (ShortcutInfo shortcutInfo : shortcutInfos) { shortcutInfo.updateFromDeepShortcutInfo(fullDetails, context); + shortcutInfo.iconBitmap = + LauncherIcons.createShortcutIcon(fullDetails, context); updatedShortcutInfos.add(shortcutInfo); } } diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index a214a2915e..25f2f9d50f 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -25,6 +25,7 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; @@ -85,6 +86,7 @@ public class UserLockStateChangedTask extends ExtendedModelTask { } si.isDisabled &= ~ShortcutInfo.FLAG_DISABLED_LOCKED_USER; si.updateFromDeepShortcutInfo(shortcut, context); + si.iconBitmap = LauncherIcons.createShortcutIcon(shortcut, context); } else { si.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 04c71ecd2d..6e98100077 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -31,10 +31,8 @@ import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; -import com.android.launcher3.shortcuts.DeepShortcutsContainer.UnbadgedShortcutInfo; import com.android.launcher3.util.PillRevealOutlineProvider; import com.android.launcher3.util.PillWidthRevealOutlineProvider; -import com.android.launcher3.util.Provider; /** * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}. @@ -50,7 +48,8 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima private View mIconView; private float mOpenAnimationProgress; - private UnbadgedShortcutInfo mInfo; + private ShortcutInfo mInfo; + private ShortcutInfoCompat mDetail; public DeepShortcutView(Context context) { this(context, null, 0); @@ -92,18 +91,20 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima } /** package private **/ - void applyShortcutInfo(UnbadgedShortcutInfo info, DeepShortcutsContainer container) { + void applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail, + DeepShortcutsContainer container) { mInfo = info; + mDetail = detail; mBubbleText.applyFromShortcutInfo(info); mIconView.setBackground(mBubbleText.getIcon()); // Use the long label as long as it exists and fits. - CharSequence longLabel = info.mDetail.getLongLabel(); + CharSequence longLabel = mDetail.getLongLabel(); int availableWidth = mBubbleText.getWidth() - mBubbleText.getTotalPaddingLeft() - mBubbleText.getTotalPaddingRight(); boolean usingLongLabel = !TextUtils.isEmpty(longLabel) && mBubbleText.getPaint().measureText(longLabel.toString()) <= availableWidth; - mBubbleText.setText(usingLongLabel ? longLabel : info.mDetail.getShortLabel()); + mBubbleText.setText(usingLongLabel ? longLabel : mDetail.getShortLabel()); // TODO: Add the click handler to this view directly and not the child view. mBubbleText.setOnClickListener(Launcher.getLauncher(getContext())); @@ -118,14 +119,8 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima final ShortcutInfo badged = new ShortcutInfo(mInfo); // Queue an update task on the worker thread. This ensures that the badged // shortcut eventually gets its icon updated. - Launcher.getLauncher(getContext()).getModel().updateAndBindShortcutInfo( - new Provider() { - @Override - public ShortcutInfo get() { - badged.updateFromDeepShortcutInfo(mInfo.mDetail, getContext()); - return badged; - } - }); + Launcher.getLauncher(getContext()).getModel() + .updateAndBindShortcutInfo(badged, mDetail); return badged; } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index e547f44689..172954e536 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -25,7 +25,6 @@ import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Point; import android.graphics.PointF; @@ -49,7 +48,6 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; -import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; @@ -65,6 +63,7 @@ import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType; @@ -174,8 +173,11 @@ public class DeepShortcutsContainer extends AbstractFloatingView } for (int i = 0; i < shortcuts.size(); i++) { final ShortcutInfoCompat shortcut = shortcuts.get(i); - uiHandler.post(new UpdateShortcutChild( - i, new UnbadgedShortcutInfo(shortcut, mLauncher))); + ShortcutInfo si = new ShortcutInfo(shortcut, mLauncher); + // Use unbadged icon for the menu. + si.iconBitmap = LauncherIcons.createShortcutIcon( + shortcut, mLauncher, false /* badged */); + uiHandler.post(new UpdateShortcutChild(i, si, shortcut)); } } }); @@ -183,18 +185,22 @@ public class DeepShortcutsContainer extends AbstractFloatingView /** Updates the child of this container at the given index based on the given shortcut info. */ private class UpdateShortcutChild implements Runnable { - private int mShortcutChildIndex; - private UnbadgedShortcutInfo mShortcutChildInfo; + private final int mShortcutChildIndex; + private final ShortcutInfo mShortcutChildInfo; + private final ShortcutInfoCompat mDetail; - public UpdateShortcutChild(int shortcutChildIndex, UnbadgedShortcutInfo shortcutChildInfo) { + + public UpdateShortcutChild(int shortcutChildIndex, ShortcutInfo shortcutChildInfo, + ShortcutInfoCompat detail) { mShortcutChildIndex = shortcutChildIndex; mShortcutChildInfo = shortcutChildInfo; + mDetail = detail; } @Override public void run() { getShortcutAt(mShortcutChildIndex) - .applyShortcutInfo(mShortcutChildInfo, DeepShortcutsContainer.this); + .applyShortcutInfo(mShortcutChildInfo, mDetail, DeepShortcutsContainer.this); } } @@ -676,24 +682,6 @@ public class DeepShortcutsContainer extends AbstractFloatingView return null; } - /** - * Extension of {@link ShortcutInfo} which does not badge the icons. - */ - static class UnbadgedShortcutInfo extends ShortcutInfo { - public final ShortcutInfoCompat mDetail; - - public UnbadgedShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { - super(shortcutInfo, context); - mDetail = shortcutInfo; - } - - @Override - protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, - IconCache cache, Context context) { - return unbadgedBitmap; - } - } - /** * Returns a DeepShortcutsContainer which is already open or null */ From 278359539c02ca160caf1df54ce96053a2a2ef59 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Jan 2017 12:15:53 -0800 Subject: [PATCH 191/382] Adding support for requesting addition of shortcut/widget on the workspace. Bug: 33584624 Change-Id: I664366822fe8088742faff2cce006239ab0771bc --- AndroidManifest-common.xml | 8 + res/drawable/bg_drag_box.xml | 25 +++ res/layout/add_item_confirmation_activity.xml | 55 +++++ res/values/strings.xml | 4 + src/com/android/launcher3/BaseActivity.java | 42 ++++ .../launcher3/InstallShortcutReceiver.java | 4 +- .../launcher3/InvariantDeviceProfile.java | 6 + src/com/android/launcher3/Launcher.java | 18 +- .../launcher3/WidgetPreviewLoader.java | 8 +- .../compat/PinItemRequestCompat.java | 83 +++++++ .../launcher3/dragndrop/AddItemActivity.java | 207 ++++++++++++++++++ .../model/AddWorkspaceItemsTask.java | 7 +- .../android/launcher3/widget/WidgetCell.java | 12 +- 13 files changed, 451 insertions(+), 28 deletions(-) create mode 100644 res/drawable/bg_drag_box.xml create mode 100644 res/layout/add_item_confirmation_activity.xml create mode 100644 src/com/android/launcher3/BaseActivity.java create mode 100644 src/com/android/launcher3/compat/PinItemRequestCompat.java create mode 100644 src/com/android/launcher3/dragndrop/AddItemActivity.java diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index bbe1f4a88d..974b0df455 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -79,5 +79,13 @@ + + + + + + diff --git a/res/drawable/bg_drag_box.xml b/res/drawable/bg_drag_box.xml new file mode 100644 index 0000000000..49b3b86186 --- /dev/null +++ b/res/drawable/bg_drag_box.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/res/layout/add_item_confirmation_activity.xml b/res/layout/add_item_confirmation_activity.xml new file mode 100644 index 0000000000..46d34447dd --- /dev/null +++ b/res/layout/add_item_confirmation_activity.xml @@ -0,0 +1,55 @@ + + + + + + + + +