From 1d016ed10ded3b55edb6c84e7cb181954b146fa1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 13 Jun 2019 08:59:49 -0700 Subject: [PATCH 01/12] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Id8c281d336d4108a120004a58b53153a888c24e1 --- quickstep/res/values-ar/strings.xml | 2 +- quickstep/res/values-as/strings.xml | 3 +++ quickstep/res/values-de/strings.xml | 2 +- quickstep/res/values-gl/strings.xml | 2 +- quickstep/res/values-or/strings.xml | 5 ++++- res/values-ar/strings.xml | 4 ++-- res/values-b+sr+Latn/strings.xml | 2 +- res/values-bn/strings.xml | 4 ++-- res/values-bs/strings.xml | 4 ++-- res/values-ca/strings.xml | 4 ++-- res/values-da/strings.xml | 8 ++++---- res/values-de/strings.xml | 8 ++++---- res/values-en-rAU/strings.xml | 2 +- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-es/strings.xml | 8 ++++---- res/values-et/strings.xml | 20 ++++++++++---------- res/values-eu/strings.xml | 10 +++++----- res/values-fa/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 2 +- res/values-fr/strings.xml | 2 +- res/values-gl/strings.xml | 8 ++++---- res/values-hi/strings.xml | 14 +++++++------- res/values-in/strings.xml | 6 +++--- res/values-iw/strings.xml | 4 ++-- res/values-kk/strings.xml | 2 +- res/values-km/strings.xml | 4 ++-- res/values-kn/strings.xml | 2 +- res/values-ky/strings.xml | 4 ++-- res/values-ml/strings.xml | 2 +- res/values-mn/strings.xml | 2 +- res/values-mr/strings.xml | 2 +- res/values-my/strings.xml | 4 ++-- res/values-nl/strings.xml | 4 ++-- res/values-pl/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 2 +- res/values-pt/strings.xml | 4 ++-- res/values-ro/strings.xml | 6 +++--- res/values-ru/strings.xml | 4 ++-- res/values-si/strings.xml | 4 ++-- res/values-sk/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-sw/strings.xml | 2 +- res/values-ta/strings.xml | 24 ++++++++++++------------ res/values-te/strings.xml | 2 +- res/values-tl/strings.xml | 2 +- res/values-uk/strings.xml | 6 +++--- res/values-ur/strings.xml | 2 +- res/values-uz/strings.xml | 14 +++++++------- res/values-vi/strings.xml | 4 ++-- res/values-zh-rCN/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- res/values-zh-rTW/strings.xml | 4 ++-- 53 files changed, 126 insertions(+), 120 deletions(-) diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 73c7c5c033..b036bc1ebd 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -27,7 +27,7 @@ "إغلاق" "إعدادات استخدام التطبيق" "محو الكل" - "التطبيقات التي تمّ استخدامها مؤخرًا" + "التطبيقات المستخدمة مؤخرًا" "%1$s، %2$s" "أقل من دقيقة" "يتبقى اليوم %1$s." diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index a33973b218..c188493e59 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -31,4 +31,7 @@ "%1$s, %2$s" "< ১ মিনিট" "আজি %1$s বাকী আছ" + "এপৰ পৰামৰ্শসমূহ" + "সকলো এপ্" + "আপোনাৰ অনুমানিক এপ্" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 7f4e56d260..449cc8c11d 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -20,7 +20,7 @@ "Splitscreen" - "Fixieren" + "Anpinnen" "Freeform-Modus" "Übersicht" "Keine kürzlich verwendeten Elemente" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index c6698bb480..356d10d5da 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -27,7 +27,7 @@ "Pecha a aplicación" "Configuración do uso de aplicacións" "Borrar todo" - "Aplicacións recentes" + "Apps recentes" "%1$s (%2$s)" "<1 min" "Tempo restante hoxe %1$s" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index bd88671938..2ebec4e7c7 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -27,8 +27,11 @@ "ବନ୍ଦ କରନ୍ତୁ" "ଆପ୍‍ ବ୍ୟବହାର ସେଟିଂସ୍‍" "ସବୁ ଖାଲି କରନ୍ତୁ" - "ସାମ୍ପ୍ରତିକ ଆପ୍‌" + "ବର୍ତ୍ତମାନର ଆପ୍‌" "%1$s %2$s" "< 1 ମିନିଟ୍" "ଆଜି %1$s ବାକି ଅଛି" + "ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ" + "ସମସ୍ତ ଆପ୍ସ" + "ଆପଣ ପୂର୍ବାନୁମାନ କରିଥିବା ଆପ୍ସ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index bf00e9541d..a80ecb0b14 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -85,7 +85,7 @@ "الأدوات" "الخلفيات" "الأنماط والخلفيات" - "إعدادات الصفحة الرئيسية" + "إعدادات الشاشة الرئيسية" "أوقف المشرف هذه الميزة" "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" @@ -108,7 +108,7 @@ "أدوات %1$s" "قائمة الأدوات" "تم إغلاق قائمة الأدوات." - "إضافة إلى الشاشة الرئيسية" + "الإضافة إلى الشاشة الرئيسية" "نقل العنصر إلى هنا" "تمت إضافة العنصر إلى الشاشة الرئيسية" "تم حذف العنصر" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 5158a78164..883003c5c0 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -105,7 +105,7 @@ "Vidžeti za %1$s" "Lista vidžeta" "Lista vidžeta je zatvorena" - "Dodaj na početni ekran" + "Dodajte na početni ekran" "Premesti stavku ovde" "Stavka je dodata na početni ekran" "Stavka je uklonjena" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 6d80329988..775885caac 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -83,7 +83,7 @@ "স্টাইল এবং ওয়ালপেপার" "হোম সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" - "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" + "হোম স্ক্রিন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বিজ্ঞপ্তি ডট" "চালু" @@ -104,7 +104,7 @@ "%1$s উইজেট" "উইজেটের তালিকা" "উইজেটের তালিকা বন্ধ করা হয়েছে" - "হোম স্ক্রীনে যোগ করুন" + "হোম স্ক্রিনে যোগ করুন" "এখানে আইটেম সরান" "হোম স্ক্রীনে আইটেম যোগ করা হয়েছে" "আইটেম সরানো হয়েছে" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 53bdeb2d7b..5650457071 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -79,7 +79,7 @@ "Folder je zatvoren" "Ime foldera je promijenjeno u %1$s" "Folder: %1$s" - "Dodaci" + "Vidžeti" "Pozadinske slike" "Stilovi i pozadinske slike" "Postavke početnog ekrana" @@ -90,7 +90,7 @@ "Uključeno" "Isključeno" "Potreban je pristup obavještenjima" - "Za prikaz tačaka obavještenja, uključite obavještenja za aplikacije za aplikaciju %1$s" + "Za prikaz tačaka za obavještenja, uključite obavještenja za aplikacije za aplikaciju %1$s" "Promijeni postavke" "Prikaži tačke za obavještenja" "Dodaj ikonu na početni ekran" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 19f537ffbd..c0859d3b4d 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -81,7 +81,7 @@ "Widgets" "Fons de pantalla" "Estils i fons de pantalla" - "Configuració de pantalla d\'inici" + "Config. pantalla d\'inici" "Desactivada per l\'administrador" "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" @@ -92,7 +92,7 @@ "Per veure els punts de notificació, activa les notificacions de l\'aplicació %1$s" "Canvia la configuració" "Mostra els punts de notificació" - "Afegeix la icona a la pantalla d\'inici" + "Afegeix icona a la pantalla d\'inici" "Per a les aplicacions noves" "Desconegut" "Suprimeix" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 008910dc93..dc17516bce 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,7 +33,7 @@ "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" - "Tryk og hold nede for at placere manuelt" + "Tryk og hold for at placere manuelt" "Tilføj automatisk" "Søg efter apps" "Indlæser apps…" @@ -48,7 +48,7 @@ "Liste med apps" "Liste over personlige apps" "Liste over apps til arbejdet" - "Startskærm" + "Hjem" "Fjern" "Afinstaller" "Appinfo" @@ -80,8 +80,8 @@ "Mappe: %1$s" "Widgets" "Baggrunde" - "Stilarter og baggrunde" - "Indstillinger for startskærmen" + "Stil og baggrunde" + "Startskærmindstillinger" "Deaktiveret af din administrator" "Tillad rotation af startskærmen" "Når telefonen roteres" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 1b7cd22c31..a345babd5c 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -80,11 +80,11 @@ "Ordner: %1$s" "Widgets" "Hintergründe" - "Stile und Hintergründe" - "Einstellungen für den Startbildschirm" + "Designs und Hintergründe" + "Startbildschirm-Einstellungen" "Von deinem Administrator deaktiviert" "Drehung des Startbildschirms zulassen" - "Bei Drehung des Smartphones" + "Beim Drehen des Smartphones" "App-Benachrichtigungspunkte" "An" "Aus" @@ -93,7 +93,7 @@ "Einstellungen ändern" "App-Benachrichtigungspunkte anzeigen" "Symbol zum Startbildschirm hinzufügen" - "Für neue Apps" + "Bei neuen Apps" "Unbekannt" "Entfernen" "Suchen" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 6692370896..0c48b5d2cb 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -83,7 +83,7 @@ "Styles & wallpapers" "Home settings" "Disabled by your admin" - "Allow Homescreen rotation" + "Allow Home screen rotation" "When phone is rotated" "Notification dots" "On" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 6692370896..0c48b5d2cb 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -83,7 +83,7 @@ "Styles & wallpapers" "Home settings" "Disabled by your admin" - "Allow Homescreen rotation" + "Allow Home screen rotation" "When phone is rotated" "Notification dots" "On" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 6692370896..0c48b5d2cb 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -83,7 +83,7 @@ "Styles & wallpapers" "Home settings" "Disabled by your admin" - "Allow Homescreen rotation" + "Allow Home screen rotation" "When phone is rotated" "Notification dots" "On" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ac6ffaa35f..09b1239972 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -85,13 +85,13 @@ "Inhabilitado por el administrador" "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" - "Burbujas de notificación" - "Activadas" + "Puntos de notificación" + "Activados" "Desactivadas" "Se necesita acceso a las notificaciones" - "Para mostrar burbujas de notificación, activa las notificaciones de %1$s" + "Para mostrar puntos de notificación, activa las notificaciones de %1$s" "Cambiar ajustes" - "Mostrar burbujas de notificación" + "Mostrar puntos de notificación" "Añadir icono a la pantalla de inicio" "Para aplicaciones nuevas" "Desconocido" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index cea321da27..1e470e15a7 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -27,7 +27,7 @@ "Allalaetud rakendus on turvarežiimis keelatud" "Turvarežiimis on vidinad keelatud" "Otsetee pole saadaval" - "Avaekraan" + "Avakuva" "Kohandatud toimingud" "Vidina valimiseks vajutage ja hoidke seda all." "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." @@ -48,16 +48,16 @@ "Rakenduste loend" "Isiklike rakenduste loend" "Töörakenduste loend" - "Avaekraan" + "Avakuva" "Eemalda" "Desinstalli" "Rakenduse teave" "Installimine" "installi otseteed" "Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta." - "loe avaekraani seadeid ja otseteid" + "avakuva seadete ja otseteede lugemine" "Võimaldab rakendusel lugeda avaekraanil seadeid ja otseteid." - "kirjuta avaekraani seaded ja otseteed" + "avakuva seadete ja otseteede kirjutamine" "Võimaldab rakendusel muuta avaekraanil seadeid ja otseteid." "Rakendusel %1$s pole lubatud helistada" "Probleem vidina laadimisel" @@ -70,8 +70,8 @@ %1$s, %2$d märguanne "Leht %1$d/%2$d" - "Avaekraan %1$d/%2$d" - "Uus avaekraan" + "Avakuva %1$d/%2$d" + "Uus avakuva leht" "Kaust on avatud, %1$d x %2$d" "Puudutage kausta sulgemiseks" "Puudutage ümbernimetamise salvestamiseks" @@ -81,9 +81,9 @@ "Vidinad" "Taustapildid" "Stiilid ja taustapildid" - "Avaekraani seaded" + "Avakuva seaded" "Keelas administraator" - "Luba avaekraani pööramine" + "Luba avakuva pööramine" "Kui telefoni pööratakse" "Märguandetäpid" "Sees" @@ -92,7 +92,7 @@ "Märguandetäppide kuvamiseks lülitage sisse rakenduse %1$s märguanded" "Seadete muutmine" "Kuva märguandetäpid" - "Lisa ikoon avaekraanile" + "Lisa ikoon avakuvasse" "Uute rakenduste puhul" "Teadmata" "Eemalda" @@ -104,7 +104,7 @@ "Teenuse %1$s vidinad" "Vidinate loend" "Vidinate loend on suletud" - "Lisa avaekraanile" + "Lisa avakuvasse" "Teisalda üksus siia" "Üksus lisati avaekraanile" "Üksus eemaldati" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 18af2fb0fc..9ba46c171d 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -54,11 +54,11 @@ "Aplikazioaren datuak" "Instalatu" "Instalatu lasterbideak" - "Erabiltzaileak ezer egin gabe lasterbideak gehitzea baimentzen die aplikazioei." + "Erabiltzaileak ezer egin gabe lasterbideak gehitzeko baimena ematen die aplikazioei." "Irakurri hasierako ezarpenak eta lasterbideak" - "Hasierako pantailako ezarpenak eta lasterbideak irakurtzea baimentzen die aplikazioei." + "Hasierako pantailako ezarpenak eta lasterbideak irakurtzeko baimena ematen die aplikazioei." "Idatzi hasierako ezarpenak eta lasterbideak" - "Hasierako pantailako ezarpenak eta lasterbideak aldatzea baimentzen die aplikazioei." + "Hasierako pantailako ezarpenak eta lasterbideak aldatzeko baimena ematen die aplikazioei." "%1$s aplikazioak ez du telefono-deiak egiteko baimenik" "Arazo bat izan da widgeta kargatzean" "Konfigurazioa" @@ -83,7 +83,7 @@ "Estiloak eta horma-paperak" "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" - "Baimendu hasierako pantaila biratzea" + "Eman hasierako pantaila biratzeko baimena" "Telefonoa biratzen denean" "Jakinarazpen-biribiltxoak" "Aktibatuta" @@ -93,7 +93,7 @@ "Aldatu ezarpenak" "Erakutsi jakinarazpen-biribiltxoak" "Gehitu ikonoa hasierako pantailan" - "Aplikazio berrietan" + "Aplikazio berrien kasuan" "Ezezaguna" "Kendu" "Bilatu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 7e3cbdc810..926cdb9b1c 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -33,7 +33,7 @@ "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از کنش‌های سفارشی استفاده کنید." "%1$d × %2$d" "‏%1$d عرض در %2$d طول" - "برای قرار دادن به‌صورت دستی لمس کنید و بکشید" + "آن را لمس کنید و بکشید تا به‌صورت دستی اضافه شود" "افزودن خودکار" "جستجوی برنامه‌ها" "درحال بارگیری برنامه‌‌ها…" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 9d0e3a0b0c..5ac514d448 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -51,7 +51,7 @@ "Accueil" "Supprimer" "Désinstaller" - "Détails de l\'appli" + "Détails de l\'application" "Installer" "installer des raccourcis" "Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 585139c758..7b4bcb1d82 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -81,7 +81,7 @@ "Widgets" "Fonds d\'écran" "Styles et fonds d\'écran" - "Paramètres accueil" + "Paramètres d\'écran d\'accueil" "Désactivé par votre administrateur" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 769586e78a..e115a72624 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -80,14 +80,14 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - "Estilos e fondos de pantalla" - "Configuración da pantalla de Inicio" + "Estilos/fondos de pantalla" + "Axustes de Inicio" "Función desactivada polo administrador" "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "Puntos de notificacións" - "Opción activada" - "Opción desactivada" + "Activados" + "Desactivados" "Necesítase acceso ás notificacións" "Para que se mostren os puntos de notificacións, activa as notificacións da aplicación %1$s" "Cambiar configuración" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 5f24b05210..b796140e5e 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -22,9 +22,9 @@ "Launcher3" "कार्यस्‍थल" - "एप्‍लिकेशन इंस्‍टॉल नहीं है." - "ऐप्स उपलब्ध नहीं है" - "डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है" + "ऐप्‍लिकेशन इंस्‍टॉल नहीं है." + "ऐप्लिकेशन उपलब्ध नहीं है" + "डाउनलोड किए गए ऐप्लिकेशन सुरक्षित मोड में अक्षम है" "विजेट सुरक्षित मोड में अक्षम हैं" "शॉर्टकट उपलब्ध नहीं है" "होम स्क्रीन" @@ -78,7 +78,7 @@ "फ़ोल्डर बंद किया गया" "फ़ोल्डर का नाम बदलकर %1$s किया गया" "फ़ोल्डर: %1$s" - "शॉर्टकट" + "विजेट" "वॉलपेपर" "स्टाइल और वॉलपेपर" "होम पेज की सेटिंग" @@ -97,9 +97,9 @@ "अज्ञात" "निकालें" "सर्च करें" - "यह ऐप्स इंस्टॉल नहीं है" + "यह ऐप्लिकेशन इंस्टॉल नहीं है" "इस आइकॉन का ऐप इंस्टॉल नहीं है. आप उसे निकाल सकते हैं या ऐप को खोज कर उसे मैन्युअल रूप से इंस्टॉल कर सकते हैं." - "%1$s डाउनलोड हो रहा है, %2$s पूर्ण" + "%1$s डाउनलोड हो रहा है, %2$s पूरी हुई" "%1$s के इंस्टॉल होने की प्रतीक्षा की जा रही है" "%1$s विजेट" "विजेट की सूची" @@ -132,7 +132,7 @@ "सूचना को खारिज किया गया" "निजी ऐप" "काम से जुड़े ऐप" - "कार्य प्रोफ़ाइल" + "वर्क प्रोफ़ाइल" "काम से जुड़े सभी ऐप्लिकेशन यहां पाएं" "काम से जुड़े हर ऐप्लिकेशन पर एक बैज (निशान) होता है और इन ऐप्लिकेशन की सुरक्षा आपका संगठन करता है. आसानी से इस्तेमाल करने के लिए ऐप्लिकेशन को अपनी होम स्क्रीन पर ले जाएं." "आपका संगठन प्रबंधित कर रहा है" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 0841be0fd1..3054214b5e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -33,7 +33,7 @@ "Tap dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "lebar %1$d x tinggi %2$d" - "Sentuh & tahan untuk menempatkan secara manual" + "Tap lama untuk menempatkan secara manual" "Tambahkan otomatis" "Telusuri aplikasi" "Memuat aplikasi…" @@ -81,9 +81,9 @@ "Widget" "Wallpaper" "Gaya & wallpaper" - "Setelan layar Utama" + "Setelan layar utama" "Dinonaktifkan oleh admin" - "Izinkan layar Utama diputar" + "Izinkan Layar utama diputar" "Saat ponsel diputar" "Titik notifikasi" "Aktif" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 6f5a4009ee..c25e8795f7 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -50,7 +50,7 @@ "רשימת אפליקציות עבודה" "דף הבית" "הסר" - "הסר התקנה" + "להסרת התקנה" "פרטי אפליקציה" "התקנה" "התקן קיצורי דרך" @@ -61,7 +61,7 @@ "מאפשר לאפליקציה לשנות את ההגדרות וקיצורי הדרך בדף הבית." "%1$s אינו רשאי להתקשר" "בעיה בטעינת ווידג\'ט" - "הגדר" + "הגדרה" "זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה." "תיקיה ללא שם" "%1$s מושבתת" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 2e953a6cdd..1cd9045b76 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -34,7 +34,7 @@ "%1$d × %2$d" "Ені: %1$d, биіктігі: %2$d" "Қолмен қою үшін басып тұрыңыз" - "Автоматты енгізу" + "Автоматты қосу" "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" "\"%1$s\" сұрауына сәйкес келетін қолданбалар жоқ" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index b953ea337b..f4a328df14 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -84,7 +84,7 @@ "ការកំណត់​ទំព័រដើម" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" - "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" + "នៅពេលដែលបង្វិលទូរសព្ទ" "ស្លាកជូនដំណឹង" "បើក" "បិទ" @@ -104,7 +104,7 @@ "ធាតុ​ក្រាហ្វិក %1$s" "បញ្ជីធាតុ​ក្រាហ្វិក" "បាន​បិទ​បញ្ជីធាតុ​ក្រាហ្វិក" - "បន្ថែមទៅអេក្រង់ដើម" + "បញ្ចូលទៅអេក្រង់ដើម" "ផ្លាស់ធាតុមកទីនេះ" "ធាតុដែលត្រូវបានបន្ថែមទៅអេក្រង់ដើម" "ធាតុដែលបានដកចេញ" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 2e96a7ce19..14c830064b 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -104,7 +104,7 @@ "%1$s ವಿಜೆಟ್‌ಗಳು" "ವಿಜೆಟ್ ಪಟ್ಟಿ" "ವಿಜೆಟ್ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" - "ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು" + "ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸಿ" "ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ" "ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ" "ಐಟಂ ತೆಗೆದುಹಾಕಲಾಗಿದೆ" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 36b63851c5..046a66253e 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -33,7 +33,7 @@ "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Туурасы: %1$d, бийиктиги: %2$d" - "Кол менен жайгаштыруу үчүн басып туруп, таштаңыз" + "Кол менен кошуу үчүн кое бербей басып туруңуз" "Автоматтык түрдө кошуу" "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" @@ -81,7 +81,7 @@ "Виджеттер" "Тушкагаздар" "Стилдер жана тушкагаздар" - "Башкы беттин жөндөөлөрү" + "Башкы бет жөндөөлөрү" "Администраторуңуз өчүрүп койгон" "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index e03340bdb1..4362e7cca5 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -78,7 +78,7 @@ "ഫോൾഡർ അടച്ചു" "ഫോൾഡറിന്റെ പേര് %1$s എന്നായി മാറ്റി" "ഫോൾഡർ: %1$s" - "വിജറ്റുകൾ" + "വിഡ്ജെറ്റുകൾ" "വാൾപേപ്പർ" "സ്‌റ്റൈലുകളും വാൾപേപ്പറുകളും" "ഹോം ക്രമീകരണം" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index f52f46171c..ab02ac655c 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -104,7 +104,7 @@ "%1$s жижиг хэрэгсэл" "Жижиг хэрэгслийн жагсаалт" "Жижиг хэрэгслийн жагсаалтыг хаасан" - "Нүүр дэлгэц нэмэх" + "Нүүр дэлгэцэд нэмэх" "Энд байршуулах" "Нүүр дэлгэцэнд нэмсэн зүйл" "Арилгасан зүйл" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index f6eac53997..19c06976b0 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -66,8 +66,8 @@ "अनामित फोल्डर" "%1$s अक्षम केला आहे" - %1$sसाठी%2$dसूचना आहेत %1$sसाठी %2$d सूचना आहेत + %1$sसाठी%2$dसूचना आहे "%2$d पैकी %1$d पृष्ठ" "%2$d पैकी %1$d मुख्य स्क्रीन" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 7ae4446d5f..fd1f7d9535 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -50,7 +50,7 @@ "အလုပ်သုံး အက်ပ်စာရင်း" "ပင်မစာမျက်နှာ" "ဖယ်ရှားမည်" - "ဖယ်ထုတ်မည်" + "ဖြုတ်ရန်" "အက်ပ်အချက်အလက်များ" "ထည့်သွင်းရန်" "အတိုကောက်မှတ်သားမှုများအား ထည့်သွင်းခြင်း" @@ -94,7 +94,7 @@ "သတိပေးချက် အစက်များ ပြရန်" "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" - "မသိရ" + "မသိ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" "အက်ပ်မတပ်ဆင်ရသေးပါ" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bc1b45036c..ec30d8c6b2 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -33,7 +33,7 @@ "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" - "Tik op een item en houd dit vast om het handmatig te plaatsen" + "Tik en houd vast om handmatig te plaatsen" "Automatisch toevoegen" "Apps zoeken" "Apps laden…" @@ -80,7 +80,7 @@ "Map: %1$s" "Widgets" "Achtergrond" - "Stijlen en achtergronden" + "Stijl en achtergrond" "Instellingen startscherm" "Uitgeschakeld door je beheerder" "Draaien van startscherm toestaan" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e33ef7da70..68859605fb 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -106,7 +106,7 @@ "%1$s – widżety" "Lista widgetów" "Lista widgetów zamknięta" - "Dodaj do strony głównej" + "Dodaj do ekranu głównego" "Przenieś element tutaj" "Element został dodany do ekranu głównego" "Element został usunięty" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 68a08a9eb5..071b71e38f 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -81,7 +81,7 @@ "Widgets" "Imagens de fundo" "Estilos e imagens de fundo" - "Definições da página inicial" + "Definições de início" "Desativada pelo gestor" "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 1744fa16cc..e88ff18b42 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,7 +33,7 @@ "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" - "Toque e mantenha pressionado para posicionar manualmente" + "Toque e mantenha pressionado para mover manualmente" "Adicionar automaticamente" "Apps de pesquisa" "Carregando apps…" @@ -81,7 +81,7 @@ "Widgets" "Planos de fundo" "Estilos e planos de fundo" - "Configurações da tela inicial" + "Config. tela inicial" "Desativado pelo administrador" "Permitir rotação da tela inicial" "Quando o smartphone for girado" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index a7e8f05844..1251d7e3f8 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -51,7 +51,7 @@ "Ecran de pornire" "Eliminați" "Dezinstalați" - "Informații aplicație" + "Informații despre aplicații" "Instalați" "instalează comenzi rapide" "Permite unei aplicații să adauge comenzi rapide fără intervenția utilizatorului." @@ -82,9 +82,9 @@ "Widgeturi" "Imagini de fundal" "Stiluri și imagini de fundal" - "Setări pentru ecranul de pornire" + "Setări ecran de pornire" "Dezactivată de administrator" - "Permiteți rotirea ecranului de pornire" + "Permite rotirea ecranului de pornire" "Când telefonul este rotit" "Puncte de notificare" "Activate" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 9030a75eed..34e267da9b 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -82,8 +82,8 @@ "Папка: %1$s" "Виджеты" "Обои" - "Темы и обои" - "Настройки главного экрана" + "Стили и обои" + "Главный экран" "Функция отключена администратором" "Разрешить поворачивать главный экран" "Когда телефон повернут" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 574d3ede01..ef99a59e4e 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -80,8 +80,8 @@ "ෆෝල්ඩරය: %1$s" "විජට්" "වෝල්පේපර" - "විලාස සහ බිතුපත්" - "Home සැකසීම්" + "විලාස සහ වෝල්පේපර" + "නිවසේ සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 77eeab25ec..340a128d2b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -83,7 +83,7 @@ "Miniaplikácie" "Tapety" "Štýly a tapety" - "Nastavenia Home" + "Nastavenia plochy" "Zakázané vaším správcom" "Povoliť otáčanie plochy" "Pri otočení telefónu" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f74fde2eb8..4e52592687 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -105,7 +105,7 @@ "Виџети за %1$s" "Листа виџета" "Листа виџета је затворена" - "Додај на почетни екран" + "Додајте на почетни екран" "Премести ставку овде" "Ставка је додата на почетни екран" "Ставка је уклоњена" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 7b84ed3c1d..6f33c4f046 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -106,7 +106,7 @@ "Wijeti za %1$s" "Orodha ya wijeti" "Orodha ya wijeti imefungwa" - "Ongeza kwenye skrini ya Kwanza" + "Ongeza kwenye Skrini ya Kwanza" "Hamishia kipengee hapa" "Kipengee kimeongezwa kwenye skrini ya kwanza" "Kipengee kimeondolewa" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 47b25816fb..672665e430 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -22,9 +22,9 @@ "Launcher3" "பணியிடம்" - "பயன்பாடு நிறுவப்படவில்லை." - "பயன்பாடு இல்லை" - "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" + "ஆப்ஸ் நிறுவப்படவில்லை." + "ஆப்ஸ் இல்லை" + "இறக்கிய ஆப்ஸ் பாதுகாப்பு முறையில் முடக்கப்பட்டது" "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" "ஷார்ட்கட் இல்லை" "முகப்புத் திரை" @@ -51,18 +51,18 @@ "முகப்பு" "அகற்று" "நிறுவல் நீக்கு" - "பயன்பாட்டுத் தகவல்" + "ஆப்ஸ் தகவல்" "நிறுவு" "குறுக்குவழிகளை நிறுவுதல்" - "பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது." + "பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் ஆப்ஸை அனுமதிக்கிறது." "முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளைப் படித்தல்" - "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது." + "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க ஆப்ஸை அனுமதிக்கிறது." "முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளை எழுதுதல்" - "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற பயன்பாட்டை அனுமதிக்கிறது." + "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற ஆப்ஸை அனுமதிக்கிறது." "ஃபோன் அழைப்புகள் செய்ய, %1$s அனுமதிக்கப்படவில்லை" "விட்ஜெட்டை ஏற்றுவதில் சிக்கல்" "அமைவு" - "இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது." + "இது அமைப்பு ஆப்ஸ் என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது." "பெயரிடப்படாத கோப்புறை" "%1$s முடக்கப்பட்டது" @@ -78,7 +78,7 @@ "கோப்புறை மூடப்பட்டது" "கோப்புறை %1$s என மறுபெயரிடப்பட்டது" "கோப்புறை: %1$s" - "ஷார்ட்கட்ஸ்" + "விட்ஜெட்கள்" "வால்பேப்பர்கள்" "ஸ்டைல்கள் & வால்பேப்பர்கள்" "முகப்பு அமைப்புகள்" @@ -93,12 +93,12 @@ "அமைப்புகளை மாற்று" "அறிவிப்புப் புள்ளிகளைக் காட்டு" "முகப்புத் திரையில் ஐகானைச் சேர்" - "புதிய பயன்பாடுகளுக்கு" + "புதிய ஆப்ஸை நிறுவும்போது" "தெரியாதது" "அகற்று" "தேடு" - "பயன்பாடு நிறுவப்படவில்லை" - "ஐகானுக்கான பயன்பாடு நிறுவப்படவில்லை. இதை அகற்றலாம் அல்லது பயன்பாட்டைத் தேடி கைமுறையாக நிறுவலாம்." + "ஆப்ஸ் நிறுவப்படவில்லை" + "ஐகானுக்கான ஆப்ஸ் நிறுவப்படவில்லை. இதை அகற்றலாம் அல்லது பயன்பாட்டைத் தேடி கைமுறையாக நிறுவலாம்." "%1$sஐப் பதிவிறக்குகிறது, %2$s முடிந்தது" "%1$sஐ நிறுவுவதற்காகக் காத்திருக்கிறது" "%1$s விட்ஜெட்டுகள்" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 528ce481bd..c8f70fe058 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -80,7 +80,7 @@ "ఫోల్డర్: %1$s" "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" - "శైలులు & వాల్‌పేపర్‌లు" + "స్ట‌యిల్స్‌ & వాల్‌పేపర్‌లు" "హోమ్ సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index f0c241e9e8..0df94c7104 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -98,7 +98,7 @@ "Alisin" "Maghanap" "Hindi naka-install ang app na ito" - "Hindi naka-install ang app para sa icon na ito. Maaari mo itong alisin, o maaari mong hanapin ang app at i-install ito nang manu-mano." + "Hindi naka-install ang app para sa icon na ito. Puwede mo itong alisin, o maaari mong hanapin ang app at i-install ito nang manual." "Dina-download na ang %1$s, tapos na ang %2$s" "Hinihintay nang mag-install ang %1$s" "Mga widget ng %1$s" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index ad51464a32..13ba701815 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -82,8 +82,8 @@ "Папка %1$s" "Віджети" "Фонові малюнки" - "Стилі й фонові малюнки" - "Налаштування Home" + "Стиль і фон" + "Налаштування головного екрана" "Вимкнув адміністратор" "Дозволити обертання головного екрана" "Коли телефон обертається" @@ -94,7 +94,7 @@ "Щоб показувати значки сповіщень, увімкніть сповіщення в додатку %1$s" "Змінити налаштування" "Показувати значки сповіщень" - "Додати значок на головний екран" + "Додавати значок на головний екран" "Для нових додатків" "Невідомо" "Прибрати" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 5d7218d37e..4f776701e5 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -33,7 +33,7 @@ "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "‏%1$d چوڑا اور ‎%2$d اونچا" - "‏دستی طور پر رکھنے کیلئے ‎& ٹچ کرکے ہولڈ کریں" + "‏دستی طور پر رکھنے کیلئے ‎ٹچ کر کے دبائے رکھیں" "خود کار طور پر شامل کریں" "ایپس تلاش کریں" "ایپس لوڈ کی جا رہی ہیں…" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index d34a64f93a..69084d7041 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -33,7 +33,7 @@ "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Eni %1$d, bo‘yi %2$d" - "Qo‘lda joylashtirish uchun bosib turing" + "Joylash uchun bosib turing" "Avtomatik chiqarish" "Ilovalarni qidirish" "Ilovalar yuklanmoqda…" @@ -83,7 +83,7 @@ "Mavzu va fon rasmlari" "Bosh ekran sozlamalari" "Administrator tomonidan o‘chirilgan" - "Asosiy ekranni aylantirishga ruxsat berish" + "Bosh ekranni burishga ruxsat" "Telefon burilganda" "Bildirishnoma belgilari" "Yoniq" @@ -95,7 +95,7 @@ "Bosh ekranga ikonka chiqarish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" "Noma’lum" - "O‘chirish" + "Olib tashlash" "Qidirish" "Ushbu ilova o‘rnatilmagan" "Ilova o‘rnatilmagan. Belgini o‘chirib tashlashingiz yoki ilovani topib, uni qo‘lda o‘rnatishingiz mumkin." @@ -104,15 +104,15 @@ "%1$s vidjetlari" "Vidjetlar ro‘yxati" "Vidjetlar ro‘yxati yopildi" - "Bosh ekranga qo‘shish" + "Bosh ekranga chiqarish" "Obyektni bu yerga ko‘chirish" "Obyekt bosh ekranga qo‘shildi" "Obyekt o‘chirib tashlandi" "Qaytarish" "Obyektni ko‘chirib o‘tkazish" - "%1$s %2$s katakka ko‘chirib o‘tkazish" - "%1$s-joyga ko‘chirib o‘tkazish" - "Sevimlilarga (%1$s) ko‘chirib o‘tkazish" + "%1$s %2$s katakka olish" + "%1$s-joyga olish" + "Sevimlilarga olish (%1$s)" "Element ko‘chirib o‘tkazildi" "%1$s jildiga qo‘shish" "%1$s ilovasi bor jildga qo‘shish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 174ec7fe95..71decfca68 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -33,7 +33,7 @@ "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" - "Chạm và giữ để đặt theo cách thủ công" + "Chạm và giữ để thêm theo cách thủ công" "Tự động thêm" "Tìm kiếm ứng dụng" "Đang tải ứng dụng…" @@ -78,7 +78,7 @@ "Đã đóng thư mục" "Đã đổi tên thư mục thành %1$s" "Thư mục: %1$s" - "Tiện ích con" + "Tiện ích" "Hình nền" "Kiểu và hình nền" "Cài đặt màn hình chính" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index fd31875a98..9804af1e89 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -33,7 +33,7 @@ "点按两次并按住微件即可选择微件,您也可以使用自定义操作。" "%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 de0fa89a0c..e7377440c1 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -81,7 +81,7 @@ "小工具" "桌布" "樣式和桌布" - "主螢幕設定" + "主畫面設定" "已由您的管理員停用" "允許主畫面旋轉" "當手機旋轉時" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 4d37d721f7..e971b69f1f 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -33,7 +33,7 @@ "輕觸兩下並按住小工具即可選取,你也可以使用自訂動作。" "%1$d × %2$d" "寬度為 %1$d,高度為 %2$d" - "按住即可手動放置" + "按住圖示即可手動新增" "自動新增" "搜尋應用程式" "正在載入應用程式…" @@ -81,7 +81,7 @@ "小工具" "桌布" "樣式和桌布" - "Home 設定" + "主螢幕設定" "已由你的管理員停用" "允許旋轉主螢幕" "當手機旋轉時" From 0b20a11d66b36980dd8e99bf9168f3e56cdc4aea Mon Sep 17 00:00:00 2001 From: vadimt Date: Wed, 26 Jun 2019 13:40:42 -0700 Subject: [PATCH 02/12] Converting even more tests to TAPL Bug: 131116002 Bug: 115582915 Change-Id: Id36fca232b5aff5f6692142ce4a0c937d0531f4e --- .../launcher3/ui/AbstractLauncherUiTest.java | 31 ----- .../launcher3/ui/TaplTestsLauncher3.java | 19 +-- .../android/launcher3/ui/TestViewHelpers.java | 114 ------------------ .../ui/widget/AddConfigWidgetTest.java | 16 +-- .../launcher3/ui/widget/AddWidgetTest.java | 32 ++--- .../android/launcher3/tapl/Launchable.java | 6 +- .../tapl/LauncherInstrumentation.java | 4 +- .../com/android/launcher3/tapl/Widget.java | 13 +- .../com/android/launcher3/tapl/Widgets.java | 29 +++++ 9 files changed, 62 insertions(+), 202 deletions(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 4a0ca5c245..abaad20b2a 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -20,7 +20,6 @@ import static androidx.test.InstrumentationRegistry.getInstrumentation; import static com.android.launcher3.ui.TaplTestsLauncher3.getAppPackageName; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import static java.lang.System.exit; @@ -38,10 +37,7 @@ import android.util.Log; import androidx.test.InstrumentationRegistry; import androidx.test.uiautomator.By; -import androidx.test.uiautomator.BySelector; -import androidx.test.uiautomator.Direction; import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; import com.android.launcher3.Launcher; @@ -50,7 +46,6 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherState; import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.ResourceUtils; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.model.AppLaunchTracker; @@ -86,7 +81,6 @@ public abstract class AbstractLauncherUiTest { public static final long DEFAULT_ACTIVITY_TIMEOUT = TimeUnit.SECONDS.toMillis(10); public static final long DEFAULT_BROADCAST_TIMEOUT_SECS = 5; - public static final long SHORT_UI_TIMEOUT = 300; public static final long DEFAULT_UI_TIMEOUT = 10000; private static final String TAG = "AbstractLauncherUiTest"; @@ -180,31 +174,6 @@ public abstract class AbstractLauncherUiTest { } } - /** - * Scrolls the {@param container} until it finds an object matching {@param condition}. - * - * @return the matching object. - */ - protected UiObject2 scrollAndFind(UiObject2 container, BySelector condition) { - final int margin = ResourceUtils.getNavbarSize( - ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mLauncher.getResources()) + 1; - container.setGestureMargins(0, 0, 0, margin); - - int i = 0; - for (; ; ) { - // findObject can only execute after spring settles. - mDevice.wait(Until.findObject(condition), SHORT_UI_TIMEOUT); - UiObject2 widget = container.findObject(condition); - if (widget != null && widget.getVisibleBounds().intersects( - 0, 0, mDevice.getDisplayWidth(), - mDevice.getDisplayHeight() - margin)) { - return widget; - } - if (++i > 40) fail("Too many attempts"); - container.scroll(Direction.DOWN, 1f); - } - } - /** * Removes all icons from homescreen and hotseat. */ diff --git a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java index c3168f812e..4dab44fadd 100644 --- a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java +++ b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java @@ -216,7 +216,8 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest { final AppIcon app = allApps.getAppIcon("TestActivity7"); assertNotNull("AppIcon.launch returned null", app.launch(getAppPackageName())); test.executeOnLauncher(launcher -> assertTrue( - "Launcher activity is the top activity; expecting another activity to be the top " + "Launcher activity is the top activity; expecting another activity to be the " + + "top " + "one", test.isInBackground(launcher))); } finally { @@ -304,11 +305,8 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest { switchToAllApps(); allApps.freeze(); try { - allApps. - getAppIcon(APP_NAME). - dragToWorkspace(). - getWorkspaceAppIcon(APP_NAME). - launch(getAppPackageName()); + allApps.getAppIcon(APP_NAME).dragToWorkspace(); + mLauncher.getWorkspace().getWorkspaceAppIcon(APP_NAME).launch(getAppPackageName()); } finally { allApps.unfreeze(); } @@ -335,13 +333,8 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest { getMenuItem(0); final String shortcutName = menuItem.getText(); - // 4. Drag the first shortcut to the home screen. - // 5. Verify that the shortcut works on home screen - // (the app opens and has the same text as the shortcut). - menuItem. - dragToWorkspace(). - getWorkspaceAppIcon(shortcutName). - launch(getAppPackageName()); + menuItem.dragToWorkspace(); + mLauncher.getWorkspace().getWorkspaceAppIcon(shortcutName).launch(getAppPackageName()); } finally { allApps.unfreeze(); } diff --git a/tests/src/com/android/launcher3/ui/TestViewHelpers.java b/tests/src/com/android/launcher3/ui/TestViewHelpers.java index d13d319525..d0df66485e 100644 --- a/tests/src/com/android/launcher3/ui/TestViewHelpers.java +++ b/tests/src/com/android/launcher3/ui/TestViewHelpers.java @@ -18,28 +18,15 @@ package com.android.launcher3.ui; import static androidx.test.InstrumentationRegistry.getInstrumentation; import static androidx.test.InstrumentationRegistry.getTargetContext; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - import android.content.ComponentName; -import android.content.Context; -import android.graphics.Point; import android.os.Process; -import android.os.SystemClock; import android.util.Log; -import android.view.KeyEvent; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.R; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.testcomponent.AppWidgetNoConfig; import com.android.launcher3.testcomponent.AppWidgetWithConfig; @@ -50,21 +37,6 @@ import java.util.function.Function; public class TestViewHelpers { private static final String TAG = "TestViewHelpers"; - private static UiDevice getDevice() { - return UiDevice.getInstance(getInstrumentation()); - } - - public static UiObject2 findViewById(int id) { - return getDevice().wait(Until.findObject(getSelectorForId(id)), - AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT); - } - - public static BySelector getSelectorForId(int id) { - final Context targetContext = getTargetContext(); - String name = targetContext.getResources().getResourceEntryName(id); - return By.res(targetContext.getPackageName(), name); - } - /** * Finds a widget provider which can fit on the home screen. * @@ -91,92 +63,6 @@ public class TestViewHelpers { return info; } - /** - * Drags an icon to the center of homescreen. - * - * @param icon object that is either app icon or shortcut icon - */ - public static void dragToWorkspace(UiObject2 icon, boolean expectedToShowShortcuts) { - Point center = icon.getVisibleCenter(); - - // Action Down - final long downTime = SystemClock.uptimeMillis(); - sendPointer(downTime, MotionEvent.ACTION_DOWN, center); - - UiObject2 dragLayer = findViewById(R.id.drag_layer); - - if (expectedToShowShortcuts) { - // Make sure shortcuts show up, and then move a bit to hide them. - assertNotNull(findViewById(R.id.deep_shortcuts_container)); - - Point moveLocation = new Point(center); - int distanceToMove = - getTargetContext().getResources().getDimensionPixelSize( - R.dimen.deep_shortcuts_start_drag_threshold) + 50; - if (moveLocation.y - distanceToMove >= dragLayer.getVisibleBounds().top) { - moveLocation.y -= distanceToMove; - } else { - moveLocation.y += distanceToMove; - } - movePointer(downTime, center, moveLocation); - - assertNull(findViewById(R.id.deep_shortcuts_container)); - } - - // Wait until Remove/Delete target is visible - assertNotNull(findViewById(R.id.delete_target_text)); - - Point moveLocation = dragLayer.getVisibleCenter(); - - // Move to center - movePointer(downTime, center, moveLocation); - sendPointer(downTime, MotionEvent.ACTION_UP, moveLocation); - - // Wait until remove target is gone. - getDevice().wait(Until.gone(getSelectorForId(R.id.delete_target_text)), - AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT); - } - - private static void movePointer(long downTime, Point from, Point to) { - while (!from.equals(to)) { - try { - Thread.sleep(20); - } catch (InterruptedException e) { - e.printStackTrace(); - } - from.x = getNextMoveValue(to.x, from.x); - from.y = getNextMoveValue(to.y, from.y); - sendPointer(downTime, MotionEvent.ACTION_MOVE, from); - } - } - - private static int getNextMoveValue(int targetValue, int oldValue) { - if (targetValue - oldValue > 10) { - return oldValue + 10; - } else if (targetValue - oldValue < -10) { - return oldValue - 10; - } else { - return targetValue; - } - } - - public static void sendPointer(long downTime, int action, Point point) { - MotionEvent event = MotionEvent.obtain(downTime, - SystemClock.uptimeMillis(), action, point.x, point.y, 0); - getInstrumentation().sendPointerSync(event); - event.recycle(); - } - - /** - * Opens widget tray and returns the recycler view. - */ - public static UiObject2 openWidgetsTray() { - final UiDevice device = getDevice(); - device.pressKeyCode(KeyEvent.KEYCODE_W, KeyEvent.META_CTRL_ON); - device.waitForIdle(); - return findViewById(R.id.widgets_list_view); - } - public static View findChildView(ViewGroup parent, Function condition) { for (int i = 0; i < parent.getChildCount(); ++i) { final View child = parent.getChildAt(i); diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java index 5eb5f19928..dc72bda9a3 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java @@ -27,20 +27,18 @@ import android.view.View; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.Workspace; +import com.android.launcher3.tapl.Widgets; import com.android.launcher3.testcomponent.WidgetConfigActivity; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.ui.TestViewHelpers; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.ShellCommandRule; -import com.android.launcher3.widget.WidgetCell; import org.junit.Before; import org.junit.Ignore; @@ -71,7 +69,6 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { } @Test - // Convert test to TAPL b/131116002 public void testWidgetConfig() throws Throwable { runTest(false, true); } @@ -83,7 +80,6 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { } @Test - // Convert test to TAPL b/131116002 public void testConfigCancelled() throws Throwable { runTest(false, false); } @@ -104,15 +100,13 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { clearHomescreen(); mActivityMonitor.startLauncher(); - // Open widget tray and wait for load complete. - final UiObject2 widgetContainer = TestViewHelpers.openWidgetsTray(); - Wait.atMost(null, Condition.minChildCount(widgetContainer, 2), DEFAULT_UI_TIMEOUT); + final Widgets widgets = mLauncher.getWorkspace().openAllWidgets(); // Drag widget to homescreen WidgetConfigStartupMonitor monitor = new WidgetConfigStartupMonitor(); - UiObject2 widget = scrollAndFind(widgetContainer, By.clazz(WidgetCell.class) - .hasDescendant(By.text(mWidgetInfo.getLabel(mTargetContext.getPackageManager())))); - TestViewHelpers.dragToWorkspace(widget, false); + widgets. + getWidget(mWidgetInfo.getLabel(mTargetContext.getPackageManager())). + dragToWorkspace(); // Widget id for which the config activity was opened mWidgetId = monitor.getWidgetId(); diff --git a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java index 0061568cce..4529a80d1d 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java @@ -19,20 +19,12 @@ import static org.junit.Assert.assertTrue; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; -import android.view.View; -import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.ui.TestViewHelpers; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.ShellCommandRule; -import com.android.launcher3.widget.WidgetCell; import org.junit.Ignore; import org.junit.Rule; @@ -61,7 +53,6 @@ public class AddWidgetTest extends AbstractLauncherUiTest { performTest(); } - // Convert to TAPL b/131116002 private void performTest() throws Throwable { clearHomescreen(); mActivityMonitor.startLauncher(); @@ -69,22 +60,15 @@ public class AddWidgetTest extends AbstractLauncherUiTest { final LauncherAppWidgetProviderInfo widgetInfo = TestViewHelpers.findWidgetProvider(this, false /* hasConfigureScreen */); - // Open widget tray and wait for load complete. - final UiObject2 widgetContainer = TestViewHelpers.openWidgetsTray(); - Wait.atMost(null, Condition.minChildCount(widgetContainer, 2), DEFAULT_UI_TIMEOUT); + mLauncher. + getWorkspace(). + openAllWidgets(). + getWidget(widgetInfo.getLabel(mTargetContext.getPackageManager())). + dragToWorkspace(); - // Drag widget to homescreen - UiObject2 widget = scrollAndFind(widgetContainer, By.clazz(WidgetCell.class) - .hasDescendant(By.text(widgetInfo.getLabel(mTargetContext.getPackageManager())))); - TestViewHelpers.dragToWorkspace(widget, false); - - assertTrue(mActivityMonitor.itemExists(new ItemOperator() { - @Override - public boolean evaluate(ItemInfo info, View view) { - return info instanceof LauncherAppWidgetInfo && + assertTrue(mActivityMonitor.itemExists( + (info, view) -> info instanceof LauncherAppWidgetInfo && ((LauncherAppWidgetInfo) info).providerName.getClassName().equals( - widgetInfo.provider.getClassName()); - } - }).call()); + widgetInfo.provider.getClassName())).call()); } } diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java index d4bdafa764..04b8019450 100644 --- a/tests/tapl/com/android/launcher3/tapl/Launchable.java +++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java @@ -68,7 +68,7 @@ abstract class Launchable { /** * Drags an object to the center of homescreen. */ - public Workspace dragToWorkspace() { + public void dragToWorkspace() { final Point launchableCenter = getObject().getVisibleCenter(); final Point displaySize = mLauncher.getRealDisplaySize(); final int width = displaySize.x / 2; @@ -80,10 +80,6 @@ abstract class Launchable { launchableCenter.x - width / 2 : launchableCenter.x + width / 2, displaySize.y / 2), getLongPressIndicator()); - try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( - "dragged launchable to workspace")) { - return new Workspace(mLauncher); - } } protected abstract String getLongPressIndicator(); diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index a7e6336199..1641d702d3 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -614,12 +614,12 @@ public final class LauncherInstrumentation { @NonNull UiObject2 waitForLauncherObject(BySelector selector) { - return waitForObjectBySelector(selector.pkg(getLauncherPackageName())); + return waitForObjectBySelector(By.copy(selector).pkg(getLauncherPackageName())); } @NonNull UiObject2 tryWaitForLauncherObject(BySelector selector, long timeout) { - return tryWaitForObjectBySelector(selector.pkg(getLauncherPackageName()), timeout); + return tryWaitForObjectBySelector(By.copy(selector).pkg(getLauncherPackageName()), timeout); } @NonNull diff --git a/tests/tapl/com/android/launcher3/tapl/Widget.java b/tests/tapl/com/android/launcher3/tapl/Widget.java index 128789dbc1..1b6d8c4a6e 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widget.java +++ b/tests/tapl/com/android/launcher3/tapl/Widget.java @@ -18,7 +18,16 @@ package com.android.launcher3.tapl; import androidx.test.uiautomator.UiObject2; -public class Widget { - Widget(LauncherInstrumentation launcher, UiObject2 widget) { +/** + * Widget in workspace or a widget list. + */ +public final class Widget extends Launchable { + Widget(LauncherInstrumentation launcher, UiObject2 icon) { + super(launcher, icon); + } + + @Override + protected String getLongPressIndicator() { + return "drop_target_bar"; } } diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java index 94003be919..2495933ac6 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widgets.java +++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java @@ -16,6 +16,12 @@ package com.android.launcher3.tapl; +import static org.junit.Assert.fail; + +import android.graphics.Point; + +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.Direction; import androidx.test.uiautomator.UiObject2; @@ -75,4 +81,27 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { protected LauncherInstrumentation.ContainerType getContainerType() { return LauncherInstrumentation.ContainerType.WIDGETS; } + + public Widget getWidget(String label) { + final int margin = ResourceUtils.getNavbarSize( + ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mLauncher.getResources()) + 1; + final UiObject2 widgetsContainer = verifyActiveContainer(); + widgetsContainer.setGestureMargins(0, 0, 0, margin); + + final Point displaySize = mLauncher.getRealDisplaySize(); + + int i = 0; + final BySelector selector = By. + clazz("com.android.launcher3.widget.WidgetCell"). + hasDescendant(By.text(label)); + + for (; ; ) { + final UiObject2 widget = mLauncher.tryWaitForLauncherObject(selector, 300); + if (widget != null && widget.getVisibleBounds().bottom <= displaySize.y - margin) { + return new Widget(mLauncher, widget); + } + if (++i > 40) fail("Too many attempts"); + widgetsContainer.scroll(Direction.DOWN, 1f); + } + } } From e8a72681163c9eca77608f030a14b1711e469b9d Mon Sep 17 00:00:00 2001 From: vadimt Date: Thu, 27 Jun 2019 11:57:30 -0700 Subject: [PATCH 03/12] Tapl: diagnosing anomalies Bug: 133891845 Change-Id: I7e5afbdec580c6659917aa3e9586930d5f55ea51 --- .../tapl/LauncherInstrumentation.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index a7e6336199..40ab90a47e 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -263,10 +263,26 @@ public final class LauncherInstrumentation { } } + private String getAnomalyMessage() { + final UiObject2 object = mDevice.findObject(By.res("android", "alertTitle")); + if (object != null) { + return "System alert popup is visible: " + object.getText(); + } + + if (!mDevice.hasObject(By.textStartsWith(""))) return "Screen is empty"; + + return null; + } + private void fail(String message) { - log("Hierarchy dump for: " + getContextDescription() + message); + message = "http://go/tapl : " + getContextDescription() + message; + + final String anomaly = getAnomalyMessage(); + if (anomaly != null) message = anomaly + ", which causes:\n" + message; + + log("Hierarchy dump for: " + message); dumpViewHierarchy(); - Assert.fail("http://go/tapl : " + getContextDescription() + message); + Assert.fail(message); } private String getContextDescription() { From bd31868ea7d73d85584b3505b8416410a2c28325 Mon Sep 17 00:00:00 2001 From: vadimt Date: Thu, 27 Jun 2019 14:52:41 -0700 Subject: [PATCH 04/12] Adding system health diags for OOP tests Bug: 133891845 Change-Id: I24aa2b1408b3ffe4105cd4a7892c8b5fec8740e1 --- tests/tapl/AndroidManifest.xml | 2 + .../tapl/LauncherInstrumentation.java | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/tests/tapl/AndroidManifest.xml b/tests/tapl/AndroidManifest.xml index 0207e2be6f..1065446827 100644 --- a/tests/tapl/AndroidManifest.xml +++ b/tests/tapl/AndroidManifest.xml @@ -23,4 +23,6 @@ > + + diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index c613ed5f33..55ccb1c07e 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -39,6 +39,7 @@ import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.DropBoxManager; import android.os.Parcelable; import android.os.SystemClock; import android.text.TextUtils; @@ -274,14 +275,96 @@ public final class LauncherInstrumentation { return null; } + private static String truncateCrash(String text, int maxLines) { + String[] lines = text.split("\\r?\\n"); + StringBuilder ret = new StringBuilder(); + for (int i = 0; i < maxLines && i < lines.length; i++) { + ret.append(lines[i]); + ret.append('\n'); + } + if (lines.length > maxLines) { + ret.append("... "); + ret.append(lines.length - maxLines); + ret.append(" more lines truncated ...\n"); + } + return ret.toString(); + } + + private String checkCrash(String label) { + DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService( + Context.DROPBOX_SERVICE); + Assert.assertNotNull("Unable access the DropBoxManager service", dropbox); + + long timestamp = 0; + DropBoxManager.Entry entry; + int crashCount = 0; + StringBuilder errorDetails = new StringBuilder(); + while (null != (entry = dropbox.getNextEntry(label, timestamp))) { + String dropboxSnippet; + try { + dropboxSnippet = entry.getText(4096); + } finally { + entry.close(); + } + + crashCount++; + errorDetails.append(label); + errorDetails.append(": "); + errorDetails.append(truncateCrash(dropboxSnippet, 40)); + errorDetails.append(" ...\n"); + + timestamp = entry.getTimeMillis(); + } + Assert.assertEquals(errorDetails.toString(), 0, crashCount); + return crashCount > 0 ? errorDetails.toString() : null; + } + + private String getSystemHealthMessage() { + try { + StringBuilder errors = new StringBuilder(); + + final String testPackage = getContext().getPackageName(); + try { + mDevice.executeShellCommand("pm grant " + testPackage + + " android.permission.READ_LOGS"); + mDevice.executeShellCommand("pm grant " + testPackage + + " android.permission.PACKAGE_USAGE_STATS"); + } catch (IOException e) { + e.printStackTrace(); + } + + final String[] labels = { + "system_server_crash", + "system_server_native_crash", + "system_server_anr", + }; + + for (String label : labels) { + final String crash = checkCrash(label); + if (crash != null) errors.append(crash); + } + + return errors.length() != 0 ? errors.toString() : null; + } catch (Exception e) { + return null; + } + } + private void fail(String message) { message = "http://go/tapl : " + getContextDescription() + message; final String anomaly = getAnomalyMessage(); if (anomaly != null) message = anomaly + ", which causes:\n" + message; + final String systemHealth = getSystemHealthMessage(); + if (systemHealth != null) { + message = message + ", which might be a consequence of system health problems:\n<<<\n" + + systemHealth + "\n>>>"; + } + log("Hierarchy dump for: " + message); dumpViewHierarchy(); + Assert.fail(message); } From 73ed3e432ce74912828b5444ed469b49260ef6ca Mon Sep 17 00:00:00 2001 From: vadimt Date: Thu, 27 Jun 2019 19:03:33 -0700 Subject: [PATCH 05/12] Adding tracing for a bug about missing input events Bug: 136215685 Change-Id: I1e735c1e787710ae37b7c7d1a6a06498edd7c525 --- .../src/com/android/quickstep/TouchInteractionService.java | 4 ++++ .../quickstep/inputconsumers/OverviewInputConsumer.java | 5 +++++ src/com/android/launcher3/testing/TestProtocol.java | 1 + src/com/android/launcher3/views/BaseDragLayer.java | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java index 53da0f92dd..9353c04b58 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java @@ -74,6 +74,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.logging.EventLogArray; import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.UiThreadHelper; import com.android.quickstep.SysUINavigationMode.Mode; @@ -502,6 +503,9 @@ public class TouchInteractionService extends Service implements } private void onInputEvent(InputEvent ev) { + if (TestProtocol.sDebugTracing) { + Log.d(TestProtocol.EVENTS_TO_OVERVIEW_MISSING_TAG, "onInputEvent " + ev); + } if (!(ev instanceof MotionEvent)) { Log.e(TAG, "Unknown event " + ev); return; diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java index 56db2095fe..f2e53bb18c 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java @@ -19,6 +19,7 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TI import static com.android.quickstep.TouchInteractionService.TOUCH_INTERACTION_LOG; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; @@ -26,6 +27,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.Utilities; +import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.OverviewCallbacks; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -80,6 +82,9 @@ public class OverviewInputConsumer @Override public void onMotionEvent(MotionEvent ev) { + if (TestProtocol.sDebugTracing) { + Log.d(TestProtocol.EVENTS_TO_OVERVIEW_MISSING_TAG, "onMotionEvent " + ev); + } if (!mProxyTouch) { return; } diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java index 6ffc2d9cd1..3774042c93 100644 --- a/src/com/android/launcher3/testing/TestProtocol.java +++ b/src/com/android/launcher3/testing/TestProtocol.java @@ -78,4 +78,5 @@ public final class TestProtocol { public static final String NO_START_TAG = "b/132900132"; public static final String NO_START_TASK_TAG = "b/133765434"; public static final String NO_OVERVIEW_EVENT_TAG = "b/134532571"; + public static final String EVENTS_TO_OVERVIEW_MISSING_TAG = "b/133867119"; } diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index c1ba780503..53686cae48 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -152,6 +152,9 @@ public abstract class BaseDragLayer } private TouchController findControllerToHandleTouch(MotionEvent ev) { + if (TestProtocol.sDebugTracing) { + Log.d(TestProtocol.EVENTS_TO_OVERVIEW_MISSING_TAG, "findControllerToHandleTouch " + ev); + } if (shouldDisableGestures(ev)) return null; AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mActivity); @@ -314,6 +317,9 @@ public abstract class BaseDragLayer * Proxies the touch events to the gesture handlers */ public boolean proxyTouchEvent(MotionEvent ev) { + if (TestProtocol.sDebugTracing) { + Log.d(TestProtocol.EVENTS_TO_OVERVIEW_MISSING_TAG, "proxyTouchEvent " + ev); + } boolean handled; if (mProxyTouchController != null) { handled = mProxyTouchController.onControllerTouchEvent(ev); From 83d5eef5a545f386bae0ed4541f27bec4d2bf4eb Mon Sep 17 00:00:00 2001 From: vadimt Date: Fri, 28 Jun 2019 13:12:58 -0700 Subject: [PATCH 06/12] Temporary workarounds to make tests pass on a virtual device Bug: 136278866 Change-Id: I198cb4cdf94c2b1151b4b7249ae10dbcaa99a4fd --- .../android/quickstep/DigitalWellBeingToastTest.java | 2 +- .../quickstep/StartLauncherViaGestureTests.java | 5 +++++ .../android/launcher3/ui/AbstractLauncherUiTest.java | 2 +- .../launcher3/tapl/LauncherInstrumentation.java | 11 +++++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java b/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java index 0c5a6f5b6e..ec3d49afad 100644 --- a/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java +++ b/quickstep/tests/src/com/android/quickstep/DigitalWellBeingToastTest.java @@ -51,7 +51,7 @@ public class DigitalWellBeingToastTest extends AbstractQuickStepTest { mLauncher.pressHome(); final DigitalWellBeingToast toast = getToast(); - assertTrue("Toast is not visible", toast.hasLimit()); + waitForLauncherCondition("Toast is not visible", launcher -> toast.hasLimit()); assertEquals("Toast text: ", "5 minutes left today", toast.getText()); // Unset time limit for app. diff --git a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java index 2111e2ca27..c5b560c3fc 100644 --- a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java +++ b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java @@ -25,6 +25,7 @@ import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.Launcher; +import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.util.RaceConditionReproducer; import com.android.quickstep.NavigationModeSwitchRule.Mode; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; @@ -79,6 +80,8 @@ public class StartLauncherViaGestureTests extends AbstractQuickStepTest { @Test @NavigationModeSwitch public void testStressPressHome() { + if (LauncherInstrumentation.isAvd()) return; // b/136278866 + for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) { // Destroy Launcher activity. closeLauncherActivity(); @@ -91,6 +94,8 @@ public class StartLauncherViaGestureTests extends AbstractQuickStepTest { @Test @NavigationModeSwitch public void testStressSwipeToOverview() { + if (LauncherInstrumentation.isAvd()) return; // b/136278866 + for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) { // Destroy Launcher activity. closeLauncherActivity(); diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index abaad20b2a..c03c182b4c 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -81,7 +81,7 @@ public abstract class AbstractLauncherUiTest { public static final long DEFAULT_ACTIVITY_TIMEOUT = TimeUnit.SECONDS.toMillis(10); public static final long DEFAULT_BROADCAST_TIMEOUT_SECS = 5; - public static final long DEFAULT_UI_TIMEOUT = 10000; + public static final long DEFAULT_UI_TIMEOUT = 60000; // b/136278866 private static final String TAG = "AbstractLauncherUiTest"; protected MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 55ccb1c07e..2cda7b7664 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -432,6 +432,17 @@ public final class LauncherInstrumentation { private UiObject2 verifyContainerType(ContainerType containerType) { assertEquals("Unexpected display rotation", mExpectedRotation, mDevice.getDisplayRotation()); + + // b/136278866 + for (int i = 0; i != 100; ++i) { + if (getNavigationModeMismatchError() == null) break; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + final String error = getNavigationModeMismatchError(); assertTrue(error, error == null); log("verifyContainerType: " + containerType); From 615b823c942121ad7601cdbf78311ec5f6f5415b Mon Sep 17 00:00:00 2001 From: vadimt Date: Fri, 28 Jun 2019 13:57:12 -0700 Subject: [PATCH 07/12] Enable debug tracing for AllApps.flingBackward Bug: 136280872 Change-Id: I128ee7b0f9c131fd102fce9d81d29fdcb4e8727d --- tests/tapl/com/android/launcher3/tapl/AllApps.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index 9ff354a7eb..0ac5e9f887 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -181,6 +181,7 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { * Flings backward (up) and waits the fling's end. */ public void flingBackward() { + mLauncher.getTestInfo(TestProtocol.REQUEST_ENABLE_DEBUG_TRACING); try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer("want to fling backward in all apps")) { final UiObject2 allAppsContainer = verifyActiveContainer(); @@ -189,6 +190,7 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { allAppsContainer, Direction.UP, 1, new Rect(0, mHeight / 2, 0, 0), 10); verifyActiveContainer(); } + mLauncher.getTestInfo(TestProtocol.REQUEST_DISABLE_DEBUG_TRACING); } /** From 881a31560d79c1fa963c8c9d129cc89f1456cd60 Mon Sep 17 00:00:00 2001 From: vadimt Date: Fri, 28 Jun 2019 14:19:22 -0700 Subject: [PATCH 08/12] Diagnosing launcher visible state in TAPL Bug: 133891845 Change-Id: Ibdd959f50668fd6eeb5e48dacc370a054057b7fc --- .../launcher3/tapl/LauncherInstrumentation.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 55ccb1c07e..22be594851 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -270,11 +270,21 @@ public final class LauncherInstrumentation { return "System alert popup is visible: " + object.getText(); } + if (hasSystemUiObject("keyguard_status_view")) return "Phone is locked"; + if (!mDevice.hasObject(By.textStartsWith(""))) return "Screen is empty"; return null; } + private String getVisibleStateMessage() { + if (hasLauncherObject(WIDGETS_RES_ID)) return "Widgets"; + if (hasLauncherObject(OVERVIEW_RES_ID)) return "Overview"; + if (hasLauncherObject(WORKSPACE_RES_ID)) return "Workspace"; + if (hasLauncherObject(APPS_RES_ID)) return "AllApps"; + return "Background"; + } + private static String truncateCrash(String text, int maxLines) { String[] lines = text.split("\\r?\\n"); StringBuilder ret = new StringBuilder(); @@ -354,7 +364,11 @@ public final class LauncherInstrumentation { message = "http://go/tapl : " + getContextDescription() + message; final String anomaly = getAnomalyMessage(); - if (anomaly != null) message = anomaly + ", which causes:\n" + message; + if (anomaly != null) { + message = anomaly + ", which causes:\n" + message; + } else { + message = message + " (visible state: " + getVisibleStateMessage() + ")"; + } final String systemHealth = getSystemHealthMessage(); if (systemHealth != null) { From 4770e241c997557e1051bc77dd4727d474d900de Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Fri, 28 Jun 2019 16:09:26 -0700 Subject: [PATCH 09/12] Enable swipe down to open shade for non userdebug population Bug: 131356741 Change-Id: I74c682d39c70f785777b5a0804b31a0cc2369759 --- .../src/com/android/launcher3/uioverrides/RecentsUiFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java index 8d5ac50942..8aecaf04e2 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java @@ -163,7 +163,7 @@ public abstract class RecentsUiFactory { } } - if (FeatureFlags.PULL_DOWN_STATUS_BAR && Utilities.IS_DEBUG_DEVICE + if (FeatureFlags.PULL_DOWN_STATUS_BAR && !launcher.getDeviceProfile().isMultiWindowMode && !launcher.getDeviceProfile().isVerticalBarLayout()) { list.add(new StatusBarTouchController(launcher)); From e7a786ee969e6b4a5822087841fbaf73f66aa9c3 Mon Sep 17 00:00:00 2001 From: vadimt Date: Fri, 28 Jun 2019 12:04:36 -0700 Subject: [PATCH 10/12] Tests: Waiting for package-restart events when restarting Launcher Bug: 136215685 Change-Id: Ia947994399220544c90bfc077437fc639e635a33 --- .../launcher3/ui/AbstractLauncherUiTest.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index c03c182b4c..e39fc76a0b 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -51,6 +51,7 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; +import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.FailureWatcher; import com.android.launcher3.util.rule.LauncherActivityRule; @@ -110,6 +111,23 @@ public abstract class AbstractLauncherUiTest { public ShellCommandRule mDisableHeadsUpNotification = ShellCommandRule.disableHeadsUpNotification(); + protected void clearPackageData(String pkg) throws IOException, InterruptedException { + final CountDownLatch count = new CountDownLatch(2); + final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + count.countDown(); + } + }; + mTargetContext.registerReceiver(broadcastReceiver, + PackageManagerHelper.getPackageFilter(pkg, + Intent.ACTION_PACKAGE_RESTARTED, Intent.ACTION_PACKAGE_DATA_CLEARED)); + + mDevice.executeShellCommand("pm clear " + pkg); + assertTrue(pkg + " didn't restart", count.await(10, TimeUnit.SECONDS)); + mTargetContext.unregisterReceiver(broadcastReceiver); + } + // Annotation for tests that need to be run in portrait and landscape modes. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @@ -164,13 +182,13 @@ public abstract class AbstractLauncherUiTest { } } - protected void clearLauncherData() throws IOException { + protected void clearLauncherData() throws IOException, InterruptedException { if (TestHelpers.isInLauncherProcess()) { LauncherSettings.Settings.call(mTargetContext.getContentResolver(), LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); resetLoaderState(); } else { - mDevice.executeShellCommand("pm clear " + mDevice.getLauncherPackageName()); + clearPackageData(mDevice.getLauncherPackageName()); } } From f5e81122a0ce8bb438a7bed199beac5ce16d9d43 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 28 Jun 2019 23:31:24 +0000 Subject: [PATCH 11/12] Revert "Revert "Enable FLAG_SLIPPERY window flag when swipe down on workspace"" This reverts commit c4c8b3c69597ac5fdd0c29124cb1e5fb70873a55. Reason for revert: Re-enabling for R1 Change-Id: Id6706c548dcc9debbfaf2069164636bc22aa9b5e --- .../StatusBarTouchController.java | 68 +++-- .../launcher3/touch/TouchEventTranslator.java | 283 ------------------ 2 files changed, 51 insertions(+), 300 deletions(-) delete mode 100644 src/com/android/launcher3/touch/TouchEventTranslator.java diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java index fee18204ea..f5ba3725df 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java @@ -17,17 +17,22 @@ package com.android.launcher3.uioverrides.touchcontrollers; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; +import static android.view.MotionEvent.ACTION_UP; +import static android.view.MotionEvent.ACTION_CANCEL; +import android.graphics.PointF; import android.os.RemoteException; import android.util.Log; +import android.util.SparseArray; import android.view.MotionEvent; import android.view.ViewConfiguration; +import android.view.Window; +import android.view.WindowManager; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; -import com.android.launcher3.touch.TouchEventTranslator; import com.android.launcher3.util.TouchController; import com.android.quickstep.RecentsModel; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -36,18 +41,29 @@ import java.io.PrintWriter; /** * TouchController for handling touch events that get sent to the StatusBar. Once the - * Once the event delta y passes the touch slop, the events start getting forwarded. + * Once the event delta mDownY passes the touch slop, the events start getting forwarded. * All events are offset by initial Y value of the pointer. */ public class StatusBarTouchController implements TouchController { private static final String TAG = "StatusBarController"; + /** + * Window flag: Enable touches to slide out of a window into neighboring + * windows in mid-gesture instead of being captured for the duration of + * the gesture. + * + * This flag changes the behavior of touch focus for this window only. + * Touches can slide out of the window but they cannot necessarily slide + * back in (unless the other window with touch focus permits it). + */ + private static final int FLAG_SLIPPERY = 0x20000000; + protected final Launcher mLauncher; - protected final TouchEventTranslator mTranslator; private final float mTouchSlop; private ISystemUiProxy mSysUiProxy; private int mLastAction; + private final SparseArray mDownEvents; /* If {@code false}, this controller should not handle the input {@link MotionEvent}.*/ private boolean mCanIntercept; @@ -56,7 +72,7 @@ public class StatusBarTouchController implements TouchController { mLauncher = l; // Guard against TAPs by increasing the touch slop. mTouchSlop = 2 * ViewConfiguration.get(l).getScaledTouchSlop(); - mTranslator = new TouchEventTranslator((MotionEvent ev)-> dispatchTouchEvent(ev)); + mDownEvents = new SparseArray<>(); } @Override @@ -64,7 +80,6 @@ public class StatusBarTouchController implements TouchController { writer.println(prefix + "mCanIntercept:" + mCanIntercept); writer.println(prefix + "mLastAction:" + MotionEvent.actionToString(mLastAction)); writer.println(prefix + "mSysUiProxy available:" + (mSysUiProxy != null)); - } private void dispatchTouchEvent(MotionEvent ev) { @@ -81,26 +96,31 @@ public class StatusBarTouchController implements TouchController { @Override public final boolean onControllerInterceptTouchEvent(MotionEvent ev) { int action = ev.getActionMasked(); + int idx = ev.getActionIndex(); + int pid = ev.getPointerId(idx); if (action == ACTION_DOWN) { mCanIntercept = canInterceptTouch(ev); if (!mCanIntercept) { return false; } - mTranslator.reset(); - mTranslator.setDownParameters(0, ev); + mDownEvents.put(pid, new PointF(ev.getX(), ev.getY())); } else if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { - // Check!! should only set it only when threshold is not entered. - mTranslator.setDownParameters(ev.getActionIndex(), ev); + // Check!! should only set it only when threshold is not entered. + mDownEvents.put(pid, new PointF(ev.getX(idx), ev.getY(idx))); } if (!mCanIntercept) { return false; } if (action == ACTION_MOVE) { - float dy = ev.getY() - mTranslator.getDownY(); - float dx = ev.getX() - mTranslator.getDownX(); - if (dy > mTouchSlop && dy > Math.abs(dx)) { - mTranslator.dispatchDownEvents(ev); - mTranslator.processMotionEvent(ev); + float dy = ev.getY(idx) - mDownEvents.get(pid).y; + float dx = ev.getX(idx) - mDownEvents.get(pid).x; + // Currently input dispatcher will not do touch transfer if there are more than + // one touch pointer. Hence, even if slope passed, only set the slippery flag + // when there is single touch event. (context: InputDispatcher.cpp line 1445) + if (dy > mTouchSlop && dy > Math.abs(dx) && ev.getPointerCount() == 1) { + ev.setAction(ACTION_DOWN); + dispatchTouchEvent(ev); + setWindowSlippery(true); return true; } if (Math.abs(dx) > mTouchSlop) { @@ -110,13 +130,27 @@ public class StatusBarTouchController implements TouchController { return false; } - @Override public final boolean onControllerTouchEvent(MotionEvent ev) { - mTranslator.processMotionEvent(ev); + if (ev.getAction() == ACTION_UP || ev.getAction() == ACTION_CANCEL) { + dispatchTouchEvent(ev); + setWindowSlippery(false); + return true; + } return true; } + private void setWindowSlippery(boolean enable) { + Window w = mLauncher.getWindow(); + WindowManager.LayoutParams wlp = w.getAttributes(); + if (enable) { + wlp.flags |= FLAG_SLIPPERY; + } else { + wlp.flags &= ~FLAG_SLIPPERY; + } + w.setAttributes(wlp); + } + private boolean canInterceptTouch(MotionEvent ev) { if (!mLauncher.isInState(LauncherState.NORMAL) || AbstractFloatingView.getTopOpenViewWithType(mLauncher, @@ -132,4 +166,4 @@ public class StatusBarTouchController implements TouchController { mSysUiProxy = RecentsModel.INSTANCE.get(mLauncher).getSystemUiProxy(); return mSysUiProxy != null; } -} +} \ No newline at end of file diff --git a/src/com/android/launcher3/touch/TouchEventTranslator.java b/src/com/android/launcher3/touch/TouchEventTranslator.java deleted file mode 100644 index 3fcda90848..0000000000 --- a/src/com/android/launcher3/touch/TouchEventTranslator.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.launcher3.touch; - -import android.graphics.PointF; -import android.util.Log; -import android.util.Pair; -import android.util.SparseArray; -import android.view.MotionEvent; -import android.view.MotionEvent.PointerCoords; -import android.view.MotionEvent.PointerProperties; - -import java.util.function.Consumer; - -/** - * To minimize the size of the MotionEvent, historic events are not copied and passed via the - * listener. - */ -public class TouchEventTranslator { - - private static final String TAG = "TouchEventTranslator"; - private static final boolean DEBUG = false; - - private class DownState { - long timeStamp; - float downX; - float downY; - public DownState(long timeStamp, float downX, float downY) { - this.timeStamp = timeStamp; - this.downX = downX; - this.downY = downY; - } - }; - private final DownState ZERO = new DownState(0, 0f, 0f); - - private final Consumer mListener; - - private final SparseArray mDownEvents; - private final SparseArray mFingers; - - private final SparseArray> mCache; - - public TouchEventTranslator(Consumer listener) { - mDownEvents = new SparseArray<>(); - mFingers = new SparseArray<>(); - mCache = new SparseArray<>(); - - mListener = listener; - } - - public void reset() { - mDownEvents.clear(); - mFingers.clear(); - } - - public float getDownX() { - return mDownEvents.get(0).downX; - } - - public float getDownY() { - return mDownEvents.get(0).downY; - } - - public void setDownParameters(int idx, MotionEvent e) { - DownState ev = new DownState(e.getEventTime(), e.getX(idx), e.getY(idx)); - mDownEvents.append(idx, ev); - } - - public void dispatchDownEvents(MotionEvent ev) { - for(int i = 0; i < ev.getPointerCount() && i < mDownEvents.size(); i++) { - int pid = ev.getPointerId(i); - put(pid, i, ev.getX(i), 0, mDownEvents.get(i).timeStamp, ev); - } - } - - public void processMotionEvent(MotionEvent ev) { - if (DEBUG) { - printSamples(TAG + " processMotionEvent", ev); - } - int index = ev.getActionIndex(); - float x = ev.getX(index); - float y = ev.getY(index) - mDownEvents.get(index, ZERO).downY; - switch (ev.getActionMasked()) { - case MotionEvent.ACTION_POINTER_DOWN: - int pid = ev.getPointerId(index); - if(mFingers.get(pid, null) != null) { - for(int i=0; i < ev.getPointerCount(); i++) { - pid = ev.getPointerId(i); - position(pid, x, y); - } - generateEvent(ev.getAction(), ev); - } else { - put(pid, index, x, y, ev); - } - break; - case MotionEvent.ACTION_MOVE: - for(int i=0; i < ev.getPointerCount(); i++) { - pid = ev.getPointerId(i); - position(pid, x, y); - } - generateEvent(ev.getAction(), ev); - break; - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_UP: - pid = ev.getPointerId(index); - lift(pid, index, x, y, ev); - break; - case MotionEvent.ACTION_CANCEL: - cancel(ev); - break; - default: - Log.v(TAG, "Didn't process "); - printSamples(TAG, ev); - - } - } - - private TouchEventTranslator put(int id, int index, float x, float y, MotionEvent ev) { - return put(id, index, x, y, ev.getEventTime(), ev); - } - - private TouchEventTranslator put(int id, int index, float x, float y, long ms, MotionEvent ev) { - checkFingerExistence(id, false); - boolean isInitialDown = (mFingers.size() == 0); - - mFingers.put(id, new PointF(x, y)); - int n = mFingers.size(); - - if (mCache.get(n) == null) { - PointerProperties[] properties = new PointerProperties[n]; - PointerCoords[] coords = new PointerCoords[n]; - for (int i = 0; i < n; i++) { - properties[i] = new PointerProperties(); - coords[i] = new PointerCoords(); - } - mCache.put(n, new Pair(properties, coords)); - } - - int action; - if (isInitialDown) { - action = MotionEvent.ACTION_DOWN; - } else { - action = MotionEvent.ACTION_POINTER_DOWN; - // Set the id of the changed pointer. - action |= index << MotionEvent.ACTION_POINTER_INDEX_SHIFT; - } - generateEvent(action, ms, ev); - return this; - } - - public TouchEventTranslator position(int id, float x, float y) { - checkFingerExistence(id, true); - mFingers.get(id).set(x, y); - return this; - } - - private TouchEventTranslator lift(int id, int index, MotionEvent ev) { - checkFingerExistence(id, true); - boolean isFinalUp = (mFingers.size() == 1); - int action; - if (isFinalUp) { - action = MotionEvent.ACTION_UP; - } else { - action = MotionEvent.ACTION_POINTER_UP; - // Set the id of the changed pointer. - action |= index << MotionEvent.ACTION_POINTER_INDEX_SHIFT; - } - generateEvent(action, ev); - mFingers.remove(id); - return this; - } - - private TouchEventTranslator lift(int id, int index, float x, float y, MotionEvent ev) { - checkFingerExistence(id, true); - mFingers.get(id).set(x, y); - return lift(id, index, ev); - } - - public TouchEventTranslator cancel(MotionEvent ev) { - generateEvent(MotionEvent.ACTION_CANCEL, ev); - mFingers.clear(); - return this; - } - - private void checkFingerExistence(int id, boolean shouldExist) { - if (shouldExist != (mFingers.get(id, null) != null)) { - throw new IllegalArgumentException( - shouldExist ? "Finger does not exist" : "Finger already exists"); - } - } - - - /** - * Used to debug MotionEvents being sent/received. - */ - public void printSamples(String msg, MotionEvent ev) { - System.out.printf("%s %s", msg, MotionEvent.actionToString(ev.getActionMasked())); - final int pointerCount = ev.getPointerCount(); - System.out.printf("#%d/%d", ev.getActionIndex(), pointerCount); - System.out.printf(" t=%d:", ev.getEventTime()); - for (int p = 0; p < pointerCount; p++) { - System.out.printf(" id=%d: (%f,%f)", - ev.getPointerId(p), ev.getX(p), ev.getY(p)); - } - System.out.println(); - } - - private void generateEvent(int action, MotionEvent ev) { - generateEvent(action, ev.getEventTime(), ev); - } - - private void generateEvent(int action, long ms, MotionEvent ev) { - Pair state = getFingerState(); - MotionEvent event = MotionEvent.obtain( - mDownEvents.get(0).timeStamp, - ms, - action, - state.first.length, - state.first, - state.second, - ev.getMetaState(), - ev.getButtonState() /* buttonState */, - ev.getXPrecision() /* xPrecision */, - ev.getYPrecision() /* yPrecision */, - ev.getDeviceId(), - ev.getEdgeFlags(), - ev.getSource(), - ev.getFlags() /* flags */); - if (DEBUG) { - printSamples(TAG + " generateEvent", event); - } - if (event.getPointerId(event.getActionIndex()) < 0) { - printSamples(TAG + "generateEvent", event); - throw new IllegalStateException(event.getActionIndex() + " not found in MotionEvent"); - } - mListener.accept(event); - event.recycle(); - } - - /** - * Returns the description of the fingers' state expected by MotionEvent. - */ - private Pair getFingerState() { - int nFingers = mFingers.size(); - - Pair result = mCache.get(nFingers); - PointerProperties[] properties = result.first; - PointerCoords[] coordinates = result.second; - - int index = 0; - for (int i = 0; i < mFingers.size(); i++) { - int id = mFingers.keyAt(i); - PointF location = mFingers.get(id); - - PointerProperties property = properties[i]; - property.id = id; - property.toolType = MotionEvent.TOOL_TYPE_FINGER; - properties[index] = property; - - PointerCoords coordinate = coordinates[i]; - coordinate.x = location.x; - coordinate.y = location.y; - coordinate.pressure = 1.0f; - coordinates[index] = coordinate; - - index++; - } - return mCache.get(nFingers); - } -} From 70697e48a8e0c16a9d7c4231767a213cbaa9df47 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 27 Jun 2019 00:37:38 -0600 Subject: [PATCH 12/12] Preload overview activity in background To reduce the jank when swiping-up the overview which is not ready yet, we restart the overview activity if the process was died and update its configuration if there is change. Bug: 127350205 Test: manual - Enable 2-button or gesture navigation. Swipe-up overview after: Case 1: Other app is in foreground and kill the process of launcher. Case 2: Change configuration, e.g. font size, language. Change-Id: Ia6e365cc0faf3765781484d040bdddd4e10a2650 --- .../quickstep/TouchInteractionService.java | 53 +++++++++++ .../quickstep/OverviewComponentObserver.java | 91 +++++++++++++------ 2 files changed, 116 insertions(+), 28 deletions(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java index 9353c04b58..bf9d531061 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java @@ -43,6 +43,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; import android.graphics.Point; import android.graphics.RectF; import android.graphics.Region; @@ -74,6 +76,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.logging.EventLogArray; import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.UiThreadHelper; @@ -92,6 +95,7 @@ import com.android.quickstep.inputconsumers.ScreenPinnedInputConsumer; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.InputMonitorCompat; @@ -153,6 +157,7 @@ public class TouchInteractionService extends Service implements .asInterface(bundle.getBinder(KEY_EXTRA_SYSUI_PROXY)); MAIN_THREAD_EXECUTOR.execute(TouchInteractionService.this::initInputMonitor); MAIN_THREAD_EXECUTOR.execute(TouchInteractionService.this::onSystemUiProxySet); + MAIN_THREAD_EXECUTOR.execute(() -> preloadOverview(true /* fromInit */)); } @Override @@ -688,6 +693,54 @@ public class TouchInteractionService extends Service implements } } + private void preloadOverview(boolean fromInit) { + if (!mIsUserUnlocked) { + return; + } + + final ActivityControlHelper activityControl = + mOverviewComponentObserver.getActivityControlHelper(); + if (activityControl.getCreatedActivity() == null) { + // Make sure that UI states will be initialized. + activityControl.createActivityInitListener((activity, wasVisible) -> { + AppLaunchTracker.INSTANCE.get(activity); + return false; + }).register(); + } else if (fromInit) { + // The activity has been created before the initialization of overview service. It is + // usually happens when booting or launcher is the top activity, so we should already + // have the latest state. + return; + } + + // Pass null animation handler to indicate this start is preload. + BackgroundExecutor.get().submit( + () -> ActivityManagerWrapper.getInstance().startRecentsActivity( + mOverviewComponentObserver.getOverviewIntentIgnoreSysUiState(), + null /* assistDataReceiver */, null /* animationHandler */, + null /* resultCallback */, null /* resultCallbackHandler */)); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (!mIsUserUnlocked) { + return; + } + final ActivityControlHelper activityControl = + mOverviewComponentObserver.getActivityControlHelper(); + final BaseDraggingActivity activity = activityControl.getCreatedActivity(); + if (activity == null || activity.isStarted()) { + // We only care about the existing background activity. + return; + } + if (mOverviewComponentObserver.canHandleConfigChanges(activity.getComponentName(), + activity.getResources().getConfiguration().diff(newConfig))) { + return; + } + + preloadOverview(false /* fromInit */); + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] rawArgs) { if (rawArgs.length > 0 && Utilities.IS_DEBUG_DEVICE) { diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java index 0738affa93..4a2ed3a3d1 100644 --- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java +++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java @@ -29,11 +29,15 @@ 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.ResolveInfo; +import android.util.SparseIntArray; import com.android.systemui.shared.system.PackageManagerWrapper; import java.util.ArrayList; +import java.util.Objects; /** * Class to keep track of the current overview component based off user preferences and app updates @@ -53,22 +57,41 @@ public final class OverviewComponentObserver { } }; private final Context mContext; - private final ComponentName mMyHomeComponent; + private final Intent mCurrentHomeIntent; + private final Intent mMyHomeIntent; + private final Intent mFallbackIntent; + private final SparseIntArray mConfigChangesMap = new SparseIntArray(); private String mUpdateRegisteredPackage; private ActivityControlHelper mActivityControlHelper; private Intent mOverviewIntent; - private Intent mHomeIntent; private int mSystemUiStateFlags; private boolean mIsHomeAndOverviewSame; + private boolean mIsDefaultHome; public OverviewComponentObserver(Context context) { mContext = context; - Intent myHomeIntent = new Intent(Intent.ACTION_MAIN) + mCurrentHomeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) - .setPackage(mContext.getPackageName()); - ResolveInfo info = context.getPackageManager().resolveActivity(myHomeIntent, 0); - mMyHomeComponent = new ComponentName(context.getPackageName(), info.activityInfo.name); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mMyHomeIntent = new Intent(mCurrentHomeIntent).setPackage(mContext.getPackageName()); + ResolveInfo info = context.getPackageManager().resolveActivity(mMyHomeIntent, 0); + ComponentName myHomeComponent = + new ComponentName(context.getPackageName(), info.activityInfo.name); + mMyHomeIntent.setComponent(myHomeComponent); + mConfigChangesMap.append(myHomeComponent.hashCode(), info.activityInfo.configChanges); + + ComponentName fallbackComponent = new ComponentName(mContext, RecentsActivity.class); + mFallbackIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_DEFAULT) + .setComponent(fallbackComponent) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + try { + ActivityInfo fallbackInfo = context.getPackageManager().getActivityInfo( + mFallbackIntent.getComponent(), 0 /* flags */); + mConfigChangesMap.append(fallbackComponent.hashCode(), fallbackInfo.configChanges); + } catch (PackageManager.NameNotFoundException ignored) { /* Impossible */ } mContext.registerReceiver(mUserPreferenceChangeReceiver, new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED)); @@ -92,17 +115,14 @@ public final class OverviewComponentObserver { ComponentName defaultHome = PackageManagerWrapper.getInstance() .getHomeActivities(new ArrayList<>()); - final String overviewIntentCategory; - ComponentName overviewComponent; - mHomeIntent = null; - - if ((mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED) == 0 && - (defaultHome == null || mMyHomeComponent.equals(defaultHome))) { + mIsDefaultHome = Objects.equals(mMyHomeIntent.getComponent(), defaultHome); + if ((mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED) == 0 + && (defaultHome == null || mIsDefaultHome)) { // User default home is same as out home app. Use Overview integrated in Launcher. - overviewComponent = mMyHomeComponent; mActivityControlHelper = new LauncherActivityControllerHelper(); mIsHomeAndOverviewSame = true; - overviewIntentCategory = Intent.CATEGORY_HOME; + mOverviewIntent = mMyHomeIntent; + mCurrentHomeIntent.setComponent(mMyHomeIntent.getComponent()); if (mUpdateRegisteredPackage != null) { // Remove any update listener as we don't care about other packages. @@ -111,14 +131,11 @@ public final class OverviewComponentObserver { } } else { // The default home app is a different launcher. Use the fallback Overview instead. - overviewComponent = new ComponentName(mContext, RecentsActivity.class); mActivityControlHelper = new FallbackActivityControllerHelper(); mIsHomeAndOverviewSame = false; - overviewIntentCategory = Intent.CATEGORY_DEFAULT; + mOverviewIntent = mFallbackIntent; + mCurrentHomeIntent.setComponent(defaultHome); - mHomeIntent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_HOME) - .setComponent(defaultHome); // User's default home app can change as a result of package updates of this app (such // as uninstalling the app or removing the "Launcher" feature in an update). // Listen for package updates of this app (and remove any previously attached @@ -138,14 +155,6 @@ public final class OverviewComponentObserver { ACTION_PACKAGE_REMOVED)); } } - - mOverviewIntent = new Intent(Intent.ACTION_MAIN) - .addCategory(overviewIntentCategory) - .setComponent(overviewComponent) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (mHomeIntent == null) { - mHomeIntent = mOverviewIntent; - } } /** @@ -160,6 +169,32 @@ public final class OverviewComponentObserver { } } + /** + * @return {@code true} if the overview component is able to handle the configuration changes. + */ + boolean canHandleConfigChanges(ComponentName component, int changes) { + final int orientationChange = + ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_SCREEN_SIZE; + if ((changes & orientationChange) == orientationChange) { + // This is just an approximate guess for simple orientation change because the changes + // may contain non-public bits (e.g. window configuration). + return true; + } + + int configMask = mConfigChangesMap.get(component.hashCode()); + return configMask != 0 && (~configMask & changes) == 0; + } + + /** + * Get the intent for overview activity. It is used when lockscreen is shown and home was died + * in background, we still want to restart the one that will be used after unlock. + * + * @return the overview intent + */ + Intent getOverviewIntentIgnoreSysUiState() { + return mIsDefaultHome ? mMyHomeIntent : mOverviewIntent; + } + /** * Get the current intent for going to the overview activity. * @@ -173,7 +208,7 @@ public final class OverviewComponentObserver { * Get the current intent for going to the home activity. */ public Intent getHomeIntent() { - return mHomeIntent; + return mCurrentHomeIntent; } /**